Есть у меня недорогая ISA звуковая карта, которую я сломал и починил.
Карта ELine SM718 построена на базе чипа Yamaha YMF719E-S. На плате есть надпись "SM718 Rev. 3.00". На плату запаяна микросхема в корпусе DIP8, на ней написано "ATMEL916 93C56 PC27".
Поддерживает ISAPnP, отлично работает под DOS и Windows.
Мне хотелось сделать так, чтобы карте выделялись одни и те же ресурсы (I/O port range, DMA, IRQ) в DOS и Windows, и не было необходимости переназначать их каждый раз, когда я переключаюсь между ОС. Нашёл программу на бейсике от Tiido, SETYMF, которая умеет менять параметры карты, и обнаружил там возможность зафиксировать текущие ресурсы в EEPROM.
После попытки записи данных в карту и перезагрузки, она перестала загружаться совсем. Я выпаял с неё микросхему EEPROM, после чего машина стала грузиться, но звуковая карта перестала определяться в Windows, а SETYMF могла обнаружить её только с ключом /FORCEPNP. В Doom и Warcraft II не работает цифровой звук, но музыка выводится через MIDI, подключенный в игровой порт.
На программаторе содержимое EEPROM прочиталось так: "c4 10 70 15 1c 80 0a 2a 0a 2a ... 0a 2a 0a 2a" (256 байт). Я связался с автором программы, и он выслал мне дамп со своей карты. И тут я понял, в чём дело - его дамп имеет размер 512 байт, а на мою карту, видимо в целях удешевления, поставили микросхему меньшей ёмкости. Программа, записав первые 256 байт, продолжила запись, и затёрла последующими 256 байтами те, что были уже записаны - в результате я получил вторую половину без первой.
Стал искать дампы с похожих карт в интернете, но у всех оказывались EEPROM на 512 байт. К счастью, имея рабочий дамп на 512 байт, было несложно догадаться, какова его структура. Если перевернуть ("00100011" -> "11000100") каждый байт, то получится Serial Identifier and Resource Data, описываемые документом Plug and Play ISA Specification 1994 года от Microsoft.
Собрал по спецификации описание для своей карты, перевернул каждый байт. Затем собрал импровизированную "кроватку" для микросхемы из кусочков однорядной цанговой панели, переставил EEPROM в неё и стал экспериментировать. С первого раза у меня получилось нечто, что определялось Windows, как неизвестное устройство, но система отказывалась самостоятельно выбирать драйвер, а при указании драйвера вручную - работать с устройством. С четвёртого раза я улучшил своё понимание спецификации и собрал правильный файл, с которым всё работает, как надо.
К сообщению прикладываю написанный мной на NASM
генератор таких описаний (до переворачивания) и уже
готовый (перевёрнутый) bin для записи в 256-байтный EEPROM. Моей карте нужен всего один IRQ, и у меня нет IDE и последовательного порта - для более продвинутых вариантов с большем объёмом EEPROM нужно будет раскомментировать (убрать %if 0..%endif) соответствующие секции и подправить размер filler в конце, чтобы получился файл нужного размера.