nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 18 Apr 2024 03:08



Reply to topic  [ 41 posts ]  Go to page Previous  1, 2, 3  Next
Разработка эмулятора Altair 8800 на Arduino 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Barmaley wrote:
Поэтому в приведённом ниже скриншоте "4096" гарантированно цифра - это то как её эхом вывел бейсик.

А других вариантов нет. Что-то у вас считывается неправильно. И цифры на ваших и моих скриншотах бейсик обрабатывает только после [Enter].
На моём скриншоте 4B00 - тоже нормально выведено, а синтаксическая ошибка вылезает позже,
уже после нажатия [Enter].

_________________
iLavr


09 May 2020 14:27
Profile
Writer

Joined: 03 May 2020 08:31
Posts: 20
Location: Мытищи
Reply with quote
В общем почему то basic цифры распознать не может, а буквы может.

Code:
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.



10 May 2020 03:07
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 164
Location: Кемеровская обл.
Reply with quote
Может не та "кодировка" цифр? То что терминал воспринимает как цифры, для форта левые символы.

пысы: прочитал тему с начала и увидел :oops:
Lavr wrote:
Barmaley wrote:
после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так?

Возможно, в строке цифр есть буква или считывается с терминала НЕцифра.
Attachment:
Bas_err.gif


10 May 2020 06:55
Profile
Writer

Joined: 03 May 2020 08:31
Posts: 20
Location: Мытищи
Reply with quote
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.


10 May 2020 07:30
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 164
Location: Кемеровская обл.
Reply with quote
Терминалу все равно. А эхо есть эхо.
Ошибка в "PRINT 100" намекает что "100" не воспринимается как число
Попробуйте в терминале скопировать цифирки которые выводит сам бейсик и подставить в print


10 May 2020 07:39
Profile
Writer

Joined: 03 May 2020 08:31
Posts: 20
Location: Мытищи
Reply with quote
Icer wrote:
А эхо есть эхо


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

Скопировать символы и вставить попробую, но я смотрел коды символов 4096 которые эхом отправлял basic в OUT, они правильные.


10 May 2020 07:53
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 164
Location: Кемеровская обл.
Reply with quote
Если не жалко приложите файлы вашего эмулятора, а то получается "лечим по фотографии".


10 May 2020 08:15
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Barmaley wrote:
Я уже думаю в сторону правильности работы эмулятора 8080. Подскажите, пожалуйста, есть какие-либо тесты процессора, которые можно загрузить с нулевого адреса и передать ему управление? Нужен тест, чтоб без CP/M работал, и для ввода/вывода использовал бы терминал. Всё что я нашёл работает из-под CP/M.

Такой тест есть и не раз здесь на форуме упоминался:
MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC

Только мне всё же кажется дело в терминале, судя по вашим примерам.

_________________
iLavr


10 May 2020 08:52
Profile
Writer

Joined: 03 May 2020 08:31
Posts: 20
Location: Мытищи
Reply with quote
Исходники в прикреплённом файле к этому сообщению. (авторство на 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.



10 May 2020 09:12
Profile
Writer

Joined: 03 May 2020 08:31
Posts: 20
Location: Мытищи
Reply with quote
файл


Attachments:
test_stm32.zip [11.29 KiB]
Downloaded 271 times
10 May 2020 09:16
Profile
Writer

Joined: 03 May 2020 08:31
Posts: 20
Location: Мытищи
Reply with quote
Lav wrote:
Такой тест есть и не раз здесь на форуме упоминался:
MICROCOSM ASSOCIATES 8080/8085 CPU DIAGNOSTIC


Нашёл только asm. Может у кого бинарник есть?


10 May 2020 10:16
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Barmaley wrote:
Исходники в прикреплённом файле к этому сообщению.
(авторство на 99.78% Copyright (C) 2017 - Alexey V. Voronin @ FoxyLab ).

Я почему-то так и подумал, читали мы его здесь:
Arduino Nano - эмулятор компьютера под управлением ОС CP/M

_________________
iLavr


10 May 2020 11:04
Profile
Doomed
User avatar

Joined: 19 Feb 2017 03:46
Posts: 584
Location: Санкт-Петербург, Россия, третья планета от Солнца, галактика Млечный Путь
Reply with quote
Post 
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, то надо перетранслировать, хотя я не знаю с каким минимальным ОЗУ этот тест процессора ещё сработает.


Attachments:
Тесты CPU для SP и RK.rar [5.09 KiB]
Downloaded 276 times
10 May 2020 22:46
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 164
Location: Кемеровская обл.
Reply with quote
У бейсика проблемы с числами, а они в десятичном формате. У 8080 Есть команда DAA десятичная коррекция.
Из приложенных вами файлов не понял как она работает, но вызывает не доверие.
Code:
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 и генерации видео
(не стал править свое несправедливое замечание)


12 May 2020 06:43
Profile
Writer

Joined: 03 May 2020 08:31
Posts: 20
Location: Мытищи
Reply with quote
Приделал переключатель и тактовую кнопку. Переключателем можно перевести выполнение программы в пошаговый режим, тактовой кнопкой соответственно шагать.
При пошаговом режиме выводятся все регистры, и можно выводить значения переменных.

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

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

Нашёл одно место исходника, которое выполняется недопустимо долго. Чую, что ошибка точно там! Сейчас нет записей под рукой, потом напишу какие участки кода долго выполняются.

barsik wrote:
...Несколько слов о том как легко вручную адаптировать этот CP/M-тест CPU для любой машины...


Большое спасибо за разъяснения. Очень интересно в этом разобраться. Я этим приёмом попробую воспользоваться в будущем. Сейчас у меня эмулируется 8192 байта.
Могу увеличить память максимум ещё на 6кБ. В STM, который я использую, 20кб оперативной памяти.

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


Поставил переход эмуляции в пошаговый режим при выполнении команды 0x27 (DAA). Такой команды не встречается до ввода ширины терминала (дальше не проверял).
А какой посоветуете взять проверенный эмулятор 8080, чтобы легко можно было бы адаптировать под микроконтроллер?

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

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

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

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


12 May 2020 13:20
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 41 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 7 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.