И так, работа над BIOS-ом продолжается.
По поводу доработок, от мультипорта я решил пока отказаться, и ещё не решил, на всегда или может быть к нему вернусь.
Дело в том, что схема, конечно, у меня получилась, но потянуло теневое ОЗУ вместе с мультипортом на 25 микросхем логики плюс второе ПЗУ (BIOS) плюс статическое ОЗУ на 64 Кб. Убрав из схемы мультипорт, количество микросхем логики уменьшилось до 12. Правда, позавчера пришлось добавить 1 для возможности перехода в ПЗУ Gluk Service из BIOS. Пока что я не увидел, есть ли смысл лепить лишние 13 микросхем ради дополнительной поддержки портов #DFFD и #FDFD в комбинации с #7FFD.
На данный момент память до 4Мб у меня расширена следующие образом (в порядке значимости битов расширения)
#7FFD, bit 0 - 32Kb
#7FFD, bit 1 - 64Kb
#7FFD, bit 2 - 128Kb
#1FFD, bit 4 - 256Kb
#1FFD, bit 7 - 512Kb
#7FFD, bit 7 - 1024Kb
#7FFD, bit 6 - 2048Kb
#7FFD, bit 5 - 4096Kb.
Т.е. уже и без мультипорта параллельно доступна память до 1Мб сразу по двум стандартам - "Пентагон-1024" и "Кай-1024". А вместе доступно 4Мб.
На данный момент на макетной плате готовы и уже даже давно полностью проверены следующие узлы:
1) Дешифраторы портов #FC37, #FD37, #FE37 и #FF37.
Т.к. порт #FC37 я планировал использовать под мультипорт, то сам порт я пока не реализовывал.
#FD37 - управление функциями теневого ОЗУ.
#FE37 - дополнительные видеорежимы, которых нет в #EFF7.
#FF37 - переключение ПЗУ BIOS / Spectrum и блокировка триггера 0-й страницы ПЗУ "Gluk Service".
2) Схема управления теневым ОЗУ, включая порт #FD37. Использованы следующие биты:
0 - включение эмуляции 0-й страницы ПЗУ "Gluk Service"
1 - включение эмуляции 1-й страницы ПЗУ "TR-DOS"
2 - включение эмуляции 2-й страницы ПЗУ "Menu-128"
3 - включение эмуляции 3-й страницы ПЗУ "Basic-48"
4 - проецирование теневого ОЗУ в адрес #C000-#FFFF. При этом в данных адресах выбор страницы теневого ОЗУ сделан через порт #7FFD (при выборе страниц 4-7 теневое ОЗУ отключается из адресного пространства "#C000-#FFFF", сделал это для того чтобы можно было загрузить прошивку в него прямо из STS-а.
5 - выбор положения сигнала INT по-вертикали: "Пентагон" или на 16 строк ниже. Сделал это для того, чтобы на фирменных игрушках не мерцали спрайты.
3) Порт #FF37 и коммутация ПЗУ BIOS / Spectrum. BIOS - это отдельный чип ёмкостью 16 Кб. Spectrum - это родное ПЗУ на 64 Кб, в котором прошиты Gluk-Sevice, TR-DOS, Menu-128 и Basic-48. А так же бит блокировки триггера "Gluk Service" для возможности его старта с нулевого адреса после BIOS-а через ОЗУ.
4) Порт #FE37 - реализованы все 8 бит:
0, 1, 2 и 3 - цвет текста для монохромного режима 512х192, включая бит яркости;
4 - включает цветной режим для 512х192 (стандартный - атрибут на 8х8 или мультиколорный, задаётся через порт #EFF7)
5 - включает флеш-колор
6 - зарезервирован для видеорежима Bright+Color. Но сам видеорежим я не реализовывал.
7 - автоматический аппаратный GigaScreen.
Схема же расширения памяти до 4 Мб собрана отдельно ещё пару лет назад.
Теперь по BIOS-у:
В своём BIOSе я решил использовать некоторые наработки из моего старого BIOS-а, который я писал в 98 году для Пентагона-128, расширенного до 1Мб. Однако, т.к. исходники были потеряны и у меня оставалась лишь прошитая ПЗУ, то пришлось с нуля прошивку дизассемблировать, причём полностью вручную, на что потратил около 2 недель.
Хочу показать первые результаты работы над BIOS-ом. Сейчас уже полностью готов 1-й этап - тестирование памяти и оборудования.
Работа BIOS проходит по следующему алгоритму, на пунктах 1,2,3,4 и 6 BIOS не использует ОЗУ для своей работы, вся информация хранится исключительно в регистрах процессора. Таким образом, тест сможет выполнить свою работу и при полностью неисправном ОЗУ, выдав информацию о найденной ошибке на экран, параллельно в обоих экранах. Нажимая любую клавишу можно будет переключать между собой 5-й и 7-й экраны. В случае, если всё совсем плохо и вывод на экран не возможен вообще, то хотя бы изменённый цвет бордюра скажет, на каком этапе обнаружена ошибка: синий - неисправен порт #7FFD в пределах 128 Кб, пурпурный - нет пересечения 5-й и 7-й страниц со своими областями ОЗУ, красный - неисправно ОЗУ, но исправен сам порт #7FFD.
Единственный момент, когда во время теста ОЗУ, оно используется для работы - после того как протестирована самая 1-я страница ОЗУ (тест всегда начинается с 7-й страницы не зависимо от объёма памяти), для вычисления десятичных чисел счётчика Кб. Т.е. когда уже протестированы хотя бы 16 Кб памяти и этой страничке можно доверять.
1) Тестируется расширение ОЗУ до 128 Кб, это минимальная конфигурация, с которой BIOS будет давать старт ПК. Тестируется именно исправность порта и пересечение 2-й и 5-й страницы ОЗУ с областями #8000 и #4000. Перед записью новых данных, старые данные все 8 байт предварительно сохраняются в CMOS-е, а после теста - восстанавливаются обратно в ОЗУ. Таким образом, после теста все данные остаются полностью нетронутыми. В случае отсутствия микросхемы CMOS, 8 байт данных в ОЗУ будут потеряны. Но это адрес #FFFF.
2) Тестируется доступность битов расширения ОЗУ до 4Мб, без проверки на исправность. Все 5 данных предварительно сохраняются в CMOS-е, а после восстанавливаются. В случае отсутствия микросхемы CMOS, 5 байт данных ОЗУ будут потеряны, но это адрес #FFFE.
3) Проверяется наличие настроек BIOS в микросхеме CMOS. Проверяется постоянная сигнатура и контрольная сумма настроек, которая включает обязательную сигнатуру и данные настроек.
Наличие микросхемы CMOS перед этим пунктом не производится умышленно, т.к. у меня предусмотрена аппаратная блокировка записи в CMOS. Если её включить, то тест не найдёт CMOS, а настройки BIOS всё равно будут доступны и должны быть получены на этом этапе.
4) Если актуальные настройки BIOS в CMOS-е не обнаружены, тогда они ищутся в конце предпоследней страницы ОЗУ (занимают 24 байта включая сигнатуру). Предпоследняя страница ОЗУ, это максимальный доступный номер страницы ОЗУ -1. Т.е. если память расширена выше 128 Кб, то с большой долей вероятности, настройки BIOS не будут перетёрты другими программами, до тех пор пока не будет выключено питание ПК.
5) Если настройки BIOS будут обнаружены, тогда будет произведён старт ПК в соответствии с этими настройками:
5.1) - будет включена эмуляция выбранных страниц ПЗУ с помощью теневого ОЗУ
5.2) - будут установлены дополнительные видеорежимы (то что входит в порт #FE37)
5.3) - будет произведён запуск:
а) в Gluk Service
б) в TR-DOS без обнуления памяти
в) в TR-DOS со сбросом
г) в Menu-128
д) в Basic-48
е) Старт с выбранного HDD - DNA-OS
ж) Старт с выбранного HDD - iS-DOS
5-й пункт пока ещё не реализован.
6) Если актуальные настройки BIOSа отсутствуют и в CMOS-е и в ОЗУ, тогда запускается полный тест ОЗУ с полным его обнулением и тест оборудования:
6.1 - тестируется исправность всех бит портов расширений памяти в пределах обнаруженного во 2-м пункте;
6.2 - вся обнаруженная память заполняется значениями #FF (запись циклами PUSH DE, т.е. сразу по 2 байта);
6.3 - проверяется исправность памяти: Считывается пара байт #FFFF, проверяется, записывается пара байт #0000, считывается, опять проверяется. Таким образом, по окончании теста, вся память будет обнулена.
7) - Тестируется оборудование:
а) CMOS-чип, при этом определяется его тип: "MC146818" (Motorolla) или "DS12887" (Dallas). Однако, если включена аппаратная блокировка записи в CMOS, тогда тест просто проверяет наличие в нём актуальных настроек BIOS вместе с контрольной суммой. Если настройки есть, то в результатах будет строчка "Read Only", в противном случае "Отсутствует".
б) Порт атрибутов - "Имеется" или "Отсутствует".
в) Джойстик - "Имеется" или "Отсутствует" (тестирование ведётся по всему диапазону портов #xx1F.
г) Кэмпстон мышь - "Имеется" или "Отсутствует".
д) Муз.Процессор: Определяется наличие, исправность портов и тип - AY 3-8910/12, Yamaha YM-2149F, TurboSound или TurboSound-FM.
е) General Sound: Если обнаружен, то определяется реальный доступный объём памяти до 2048Кб.
ж) Жёсткий диск: Производится инициализация, затем чтение идентификационной информации для Master и Slave. Обнаруженные HDD появляются списком ниже - тип подключения "Master" или "Slave", название и размер в Мб.
8) - Тестируется теневое ОЗУ:
а) его наличие и размер до 64 Кб;
б) исправность теневого ОЗУ по тому же алгоритму, что и основное ОЗУ, в пределах обнаруженного объёма;
в) функциональные возможности теневого ОЗУ: какую страницу ПЗУ может эмулировать каждая страница ОЗУ и доступна ли страница через чтение из портов #FB и #7B.
9) - Производится циклическое измерение производительности процессора отдельно для ПЗУ и отдельно для ОЗУ, параллельно проверяется стабильность шины данных в IM2:
а) Измеряется количество тактов процессора за прерывание для ПЗУ, по ним вычисляется и выводится тактовая частота процессора в МГц, а так же производительность в % (за 100% взято 71680 тактов, т.е. Пентагон-3.5 МГц).
б) Измеряется количество тактов процессора за прерывание для ОЗУ и выводится производительность в %. Если для ОЗУ тактов меньше на 32 и более по сравнению с ПЗУ, тогда выводится дополнительная строчка "WAIT".
10) Далее будет переход в BIOS-Setup, который я ещё не сделал. BIOS-Setup будет использовать дополнительный видеорежим - 512х192, но цветной. Пока ещё не решил, какой вариант использовать - со стандартным цветом или с мультиколором.
Пока что вместо этого пункта я сделал переход в ПЗУ "Gluk Service".
А пока ссылка на видео, которое я снял чтобы показать, как работают тесты в BIOS-е.