Разработка эмулятора Altair 8800 на Arduino

Компьютеры прошлого, не попавшие в другие разделы

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Lavr »

Barmaley wrote:Поэтому в приведённом ниже скриншоте "4096" гарантированно цифра - это то как её эхом вывел бейсик.
А других вариантов нет. Что-то у вас считывается неправильно. И цифры на ваших и моих скриншотах бейсик обрабатывает только после [Enter].
На моём скриншоте 4B00 - тоже нормально выведено, а синтаксическая ошибка вылезает позже,
уже после нажатия [Enter].
iLavr
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Barmaley »

В общем почему то basic цифры распознать не может, а буквы может.

Code: Select all

MEMORY SIZE? 
TERMINAL WIDTH? 
WANT SIN? N
WANT RND? N
WANT SQR? N

5070 BYTES FREE
BASIC VERSION 3.2
[4K VERSION]
OK

10 PRINT "START"
?SN ERROR
OK

PRINT "START"
START
OK

PRINT 100
?SN ERROR
OK

PRINT "100"
100
OK
Last edited by Barmaley on 10 May 2020 07:34, edited 1 time in total.
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Icer »

Может не та "кодировка" цифр? То что терминал воспринимает как цифры, для форта левые символы.

пысы: прочитал тему с начала и увидел :oops:
Lavr wrote:
Barmaley wrote:после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так?
Возможно, в строке цифр есть буква или считывается с терминала НЕцифра.
Bas_err.gif
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Barmaley »

Icer wrote: Может не та "кодировка" цифр? То что терминал воспринимает как цифры, для форта левые символы
я пробовал разные программы-терминалы, везде одинаково.
Выводил код символа которые эхом basic выводит на терминал - всё правильно.

Маловероятно что цифры портятся а буквы нет.

хотя...
PRINT "START" - отработало.
PRINT "100" - отработало.
PRINT 100 - не отработало. :evil:
работа PRINT "100", и не работа PRINT 100 - говорит о том что цифры "портятся"? :o
Как такое может быть, терминалу же всё равно что передавать буквы или цифры?!

Циферки которые генерит сам basic нормально выводятся:
5070 BYTES FREE
BASIC VERSION 3.2

бинарник basic который я использую в виндовом эмуляторе работает.

Я уже думаю в сторону правильности работы эмулятора 8080. Подскажите, пожалуйста, есть какие-либо тесты процессора, которые можно загрузить с нулевого адреса и передать ему управление? Нужен тест, чтоб без CP/M работал, и для ввода/вывода использовал бы терминал. Всё что я нашёл работает из-под CP/M.
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Icer »

Терминалу все равно. А эхо есть эхо.
Ошибка в "PRINT 100" намекает что "100" не воспринимается как число
Попробуйте в терминале скопировать цифирки которые выводит сам бейсик и подставить в print
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Barmaley »

Icer wrote: А эхо есть эхо
я использовал терминал в котором ввод осуществлён в другом поле ввода, отдельном от основного окна терминала. Эхо терминала отключено.Символы которые я ввожу с клавиатуры в основное окно не попадают.
Эхо вводимых символов в основном окне терминала обеспечивает сам basic.
Если basic/терминал/эмулятор начнут искажать символы, то и эхо д.б. искажённое.

Скопировать символы и вставить попробую, но я смотрел коды символов 4096 которые эхом отправлял basic в OUT, они правильные.
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Icer »

Если не жалко приложите файлы вашего эмулятора, а то получается "лечим по фотографии".
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Lavr »

Barmaley wrote:Я уже думаю в сторону правильности работы эмулятора 8080. Подскажите, пожалуйста, есть какие-либо тесты процессора, которые можно загрузить с нулевого адреса и передать ему управление? Нужен тест, чтоб без CP/M работал, и для ввода/вывода использовал бы терминал. Всё что я нашёл работает из-под CP/M.
Такой тест есть и не раз здесь на форуме упоминался:
MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC

Только мне всё же кажется дело в терминале, судя по вашим примерам.
iLavr
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Barmaley »

Исходники в прикреплённом файле к этому сообщению. (авторство на 99.78% Copyright (C) 2017 - Alexey V. Voronin @ FoxyLab ).

Использую Blue pill STM32f103C8T6 с аддоном Роджера Кларка.

Сейчас ещё попробую аддон STM. Слабо верю, что что-то изменится, но почему бы не потанцевать с бубном?
(проверил, (не)работает абсолютно одинаково)

Прихожу к мысли, что неверно работает эмулятор 8080. Ещё один симптом этого: после запуска бейсика, после ввода размера памяти и т.д. basic _очень_ долго выполняет цикл по адресу 0BAA-0BB8
http://altairbasic.org/math_dis_10.htm

Подозреваю, что видимо при вводе цифр с терминала, парсер бейсика не может корректно перевести из строки в число. Например это происходит из-за ошибки эмуляции.

Если это так, то объясняется почему:
PRINT "START" - отработало.
PRINT "100" - отработало.
PRINT 100 - не отработало.

"100" – не надо переводить в число, а 100 надо.
Last edited by Barmaley on 10 May 2020 12:12, edited 2 times in total.
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Barmaley »

файл
You do not have the required permissions to view the files attached to this post.
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Barmaley »

Lav wrote: Такой тест есть и не раз здесь на форуме упоминался:
MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC
Нашёл только asm. Может у кого бинарник есть?
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Lavr »

Barmaley wrote:Исходники в прикреплённом файле к этому сообщению.
(авторство на 99.78% Copyright (C) 2017 - Alexey V. Voronin @ FoxyLab ).
Я почему-то так и подумал, читали мы его здесь:
Arduino Nano - эмулятор компьютера под управлением ОС CP/M
iLavr
User avatar
barsik
Doomed
Posts: 585
Joined: 19 Feb 2017 03:46
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь

Post by barsik »

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.
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Icer »

У бейсика проблемы с числами, а они в десятичном формате. У 8080 Есть команда DAA десятичная коррекция.
Из приложенных вами файлов не понял как она работает, но вызывает не доверие.

Code: Select all

void _I8080_DAA() {
  uint8_t d8;
  d8 = 0;
  if  ( ((_rA & 0x0F) > 9) || (_getFlags_A() == 1))
  {
    if ((_rA & 0x0F) > 9) {
      _setFlags_A(1);
    }
    else
    {
      _setFlags_A(0);
    }
    d8 = 6;
  }
  if  ( ( ((_rA & 0xF0) >> 4) > 9) || (_getFlags_C() == 1) || ( ( ((_rA & 0xF0) >> 4) >= 9) && ((_rA & 0x0F) > 9) )  )
  {
    if ( ( ((_rA & 0xF0) >> 4) > 9) || ( ( ((_rA & 0xF0) >> 4) >= 9) && ((_rA & 0x0F) > 9) ) ) {
      _setFlags_C(1);
    }
    d8 = d8 | 0x60;
  }
  _rA = _rA + d8;
  //SZP flags
  _rF = (_rF & ZP_RESET) | (pgm_read_byte_near(SZP_table + _rA) & B01111111);
  _PC++;
}
Из описания:
DAA (Decimal Adjust Accumulator)
Десятичная коррекция. 8-битное число в аккумуляторе рассматривается как две 4-битные десятичные двоично-кодированные цифры. При этом выполняется коррекция результата операции сложения по следующим правилам:
1. Если значение младших 4 бит аккумулятора больше девяти или если при знак вспомогательного переноса АС равен 1, то к содержимому аккумулятора
добавляется число 6.
2. Если значение старших 4 бит аккумулятора больше десяти или если признак переноса CY равен 1, то к содержимому старших 4 бит аккумулятора
добавляется число 6.
Циклов: 1
Тактов: 4
Признаки: Z, S, Р, CY, АС

п.с. реализация эмулятора ужасна, не зря аврка у автора еле шевелилась.
п.с. 2 заранее извиняюсь перед автором (работа проделана адская) вероятно медленная работа связана из-за fram i2c и генерации видео
(не стал править свое несправедливое замечание)
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

Re: Разработка эмулятора Altair 8800 на Arduino

Post by Barmaley »

Приделал переключатель и тактовую кнопку. Переключателем можно перевести выполнение программы в пошаговый режим, тактовой кнопкой соответственно шагать.
При пошаговом режиме выводятся все регистры, и можно выводить значения переменных.

По исходнику посмотрел, куда складывается строка, принимаемая из терминала. Строка считывается верно.
Где хранится число, полученное из этой строки, разобраться не успел, разберусь обязательно позже.

Сделал точки останова по адресам. Например, можно войти в пошаговый режим при начале работы кода бейсика "LineNumberFromStr". Как работает сама "LineNumberFromStr" тоже пока не разобрался, но в ней для строчки из 4х символов выполняется подозрительно много циклов.

Нашёл одно место исходника, которое выполняется недопустимо долго. Чую, что ошибка точно там! Сейчас нет записей под рукой, потом напишу какие участки кода долго выполняются.
barsik wrote: ...Несколько слов о том как легко вручную адаптировать этот CP/M-тест CPU для любой машины...
Большое спасибо за разъяснения. Очень интересно в этом разобраться. Я этим приёмом попробую воспользоваться в будущем. Сейчас у меня эмулируется 8192 байта.
Могу увеличить память максимум ещё на 6кБ. В STM, который я использую, 20кб оперативной памяти.
Icer wrote: У 8080 Есть команда DAA десятичная коррекция.
Из приложенных вами файлов не понял как она работает, но вызывает не доверие.
Поставил переход эмуляции в пошаговый режим при выполнении команды 0x27 (DAA). Такой команды не встречается до ввода ширины терминала (дальше не проверял).
А какой посоветуете взять проверенный эмулятор 8080, чтобы легко можно было бы адаптировать под микроконтроллер?

Меня этот эмулятор привлёк тем, что вызывает выполнение команд не через CASE, а через массив адресов функций. Так должно работать быстрее.

Code: Select all

...
    void do0xFF () { 
      _I8080_RST(7);}

typedef void (*t8080)();
 const t8080 c8080[]=
  {
    do0x00,
    do0x01,
...

void call()
{
    _AB = _PC;
    _RDMEM();    
    _IR = _DB;
    c8080[_IR]();
}