Barmaley wrote:Я уже думаю в сторону правильности работы эмулятора 8080... Нужен тест, чтоб без CP/M работал
Любая корректная (т.е без обращений к железу) CP/M-программа, что не лезет к дискете, переделывается для работы без CP/M на любом компьютере на процессоре КР580 Z80 8085 с достаточным объёмом ОЗУ за 20 секунд. Конверсия для РК86 и Специалиста у меня давно отработана. Хотя очень мало CP/M-программ, что не лезут к дискете. Например,
вот сколько буфера имеет MBASIC.COM работающий на ОРИОНЕ без DOS, но неизвестно как "химией" загрузить в буфер этого бейсика программу (помещение бейсик-текста в буфер не помогает).
Чтобы недисковая CP/M-программа работала на машине без CP/M, в её конец просто подставляется блочок кода эмулирующий часть функций CP/M BDOS и CP/M-BIOS (эмулируются только те функции BDOS и подпрограммы BIOS, что работают с экраном и клавиатурой). Если программа не чисто консольно-текстовая, а экранная, т.е использует инверсию и работает с экраном упр.кодами VT52, то приходится подлинковывать и драйвер VT52 для конкретной машины (а это у меня есть только для ОРИОНА на 64 и 80 симв. в строке) или до запуска программы требуется загружать внешний драйвер CP/M-консоли.
Для этого в UltraEdit (версии 9 или 10 из 1998 года) я загружаю эту программу с целью узнать её размер в байтах и изменить 3 байта. Затем в текстовом редакторе в исходник имитатора CP/M BDOS и BIOS подставляю размер этой программы (и ставлю ключ условной компиляции задающий целевую платформу Специалист или РК86, т.к у них разные адреса вх.точек и объём ОЗУ). Затем запускаю BAT-файл, который транслирует код имитатора CP/M для данной программы. Полученный код имитатора UltraEdit-ом вставляю в конец кода CP/M-программы (можно просто склеить 2 файла командой COPY MSDOS). Полученную готовую программу загружаю в эмулятор. Если в свой эмулятор, то ничего больше делать не надо (т.к он понимает формат ORD, в котором не используется КС).
А для EMU и EMU80 надо вручную подставлять в файл контрольную сумму (т.к эти эмуляторы умеют вводить только МГ-файлы, а в формате МГ-файлов присутствует контрольная сумма). Потому запускаю эмулятор EMU80, соответственно по директивам I (для РК86), R (для Специалиста) или Y (для ОРИОНА) ввожу файл и смотрю выведенную КС. Затем подставляю её в конец соответствующего файла RKS или RKR (для ОРИОНА тоже удобнее RKR, а не RKO, т.к МГ-формат РК86 проще, чем МГ-формат ORDOS с именем, МГ-формат РК86 на ОРИОНЕ вводится RK-CHANGER-ом или, что проще и удобнее, директивой Y монитора-3). Подстановка правильной КС в МГ-файл не обязательна, просто, чтобы не было сообщений об ошибке и не возникало вопросов.
Для теста верности эмуляции CPU в эмуляторах я использовал CP/M-тест процессора, как описано выше, переделав его для работы без DOS. Этот тест не проходят все 4 эмулятора CP/M из 80-тых. Но EMU и EMU80 этот тест проходят. Мой эмулятор ОРИОНА его тоже не проходит. Но это не приводит к проблемам при прогоне реальных программ, т.к несоответствие лишь в неиспользуемых в CPU битах регистра флагов. Так получается потому, что в эмуляторах команды 8080/Z80 заменяются эквивалентными командами 8086, в которых неиспользуемые в 8080 биты регистра флагов не обслужены. Но это не играет особой роли, 15 орионовских ZX-игр для голого Z80 работали и на не абсолютно точном Z80.
Этот же CP/M-тест я одновременно использовал в 90-тые годы и для определения скорости работы процессора. Для сравнения: ОРИОН 2.5 МГЦ Z80 без WAIT прогоняет этот тест за
96 секунд. А базовый РК86 1.77 МГЦ КР580 с работающим ПДП прогоняет этот тест за
182 секунды. С помощью этого теста сравнивая с реалом легко убедиться, что почти все эмуляторы искажают скорость прогона. Во вложении версии этого теста скомпонованные
для Специалиста и
для РК86. Естественно, в силу общности входов в ПЗУ версия теста для РК86 работает также на ОРИОНЕ и Микро-80 (при условии, что в нём ОЗУ не 2 кб на 565РУ2, а добавлено не менее 32 кб на двух банках 565РУ3).
Несколько слов о том, как легко вручную адаптировать этот CP/M-тест CPU для любой машины, имеющей ОЗУ более 29.5 кб, т.к версии для РК86 достаточно ОЗУ 0...$7600 (а версия RKS требует наличия ОЗУ 0...$8F00). Для любого терминала вы сами легко можете адаптировать прямо в кодах подставив во входы CP/M-BIOS адреса подпрограмм ввода/вывода для вашей системы (сами ваши I/O-подпрограммы, если их нет в наличии уже готовых в ROM-BIOS-е машины, можно уместить в Zero-Page или поместить выше адреса $7600). Код стартует, как положено с $100, если необходим старт именно с адреса 0, достаточно добавить в файл команду JMP 100 на адресе 0.
Эти адреса подпрограмм CP/M-BIOS начинаются с оффсетом $4C30 от начала кода (т.е не считая 4 байта адреса в начале RKR-файла). И естественно, там стоят 16 стандартных JMP-ов CP/M-BIOS-а. Вам надо менять только адреса консольных подпрограмм, т.е: $4C37 (аналог $F812), $4C3A (аналог $F803) и $4C3C (аналог $F809). Ещё полезно изменить $4C74 (там д.быть аналог $F81B или адрес RET-а) и $4C80 (тут аналог $F86C Warm Boot, т.е адрес выхода), но эти ячейки влияют только на выход уже по завершении теста. Если у Вас ОЗУ меньше, чем $7600, то надо перетранслировать, хотя я не знаю с каким минимальным ОЗУ этот тест процессора ещё сработает.
You do not have the required permissions to view the files attached to this post.