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

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

Moderator: Shaos

Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

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

Post by Barmaley »

Хочу, ради развлечения, попробовать сэмулировать компьютер Altair 8800 на Arduino.
Аппаратное окружение предполагается такое: терминал=(печатающая машинка+клавиатура).

Навыков и знаний у меня не много, поэтому заранее прошу прощение за глупые вопросы.

Вопросы у меня на сейчас вот какие:

1. что такое порт ввода-вывода? что он представляет из себя в машинах на 8080? какая логика обмена данными?

2. какое минимальное аппаратное обеспечение надо сэмулировать чтобы запустить Altair Basic 4k?

3. правильно я понимаю, что действовать надо в таком направлении: эмулируется 64кБ оперативной памяти, регистры 8080, и все инструкции 8080.
далее в адресное пространство (где взять карту адресов Altair?) записываются коды Basic, и запускается эмулятор инструкций?
Как отловить момент, когда Basic решит что-то вывести в терминал, или например, когда он будет ожидать из терминала данные, куда их нужно подсунуть?

PS повторять готовые конструкции с GitHub'а не хочу, так как кроме развлечения хочу ещё немного разобраться в программировании.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Barmaley wrote:Вопросы у меня на сейчас вот какие:

1. что такое порт ввода-вывода? что он представляет из себя в машинах на 8080? какая логика обмена данными?

2. какое минимальное аппаратное обеспечение надо сэмулировать чтобы запустить Altair Basic 4k?
Минимальный порт вывода - регистр, к которому обращаются на запись по заданному адресу.
Минимальный порт ввода - регистр с Z-состоянием или шинный буфер к которому обращаются на чтение по заданному адресу.

На двух таких регистрах можно сделать индикацию и ввод с клавиатуры примерно так:
reg.gif
С регистрами работают здесь чисто программно операциями запись и чтение.

Насчет минимального аппаратного обеспечения, чтобы запустить Altair Basic, мне подсказать что-то трудно.
Надо хотя бы схемы Altair посмотреть... но это уж посмотрите по Интернету сами, они есть.
You do not have the required permissions to view the files attached to this post.
iLavr
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

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

Post by Barmaley »

:o

Из ответа про порт ввода-вывода, и бегло пролистав книгу "Палагута: Микропроцессоры Intel 8080..." , я для себя понял следующее:

Процессор с памятью и другой периферией общаются используя шину данных, шину адреса и шину управления (ША, ШД, ШУ).
В общих чертах вроде всё понятно, за исключением некоторых моментов: На шине управления есть сигнал HOLD (запрос прямого доступа к памяти) - как это работает?

на ША и ШД сидят память и устройства. Адресное пространство памяти и устройств разделено. Адресовать памяти можно 2^16, устройств 256
как такое может быть при 16 битной ША? наверно как то задействована ШУ?

Верно ли я понимаю такой алгоритм взаимодействия с устройством, на примере передачи данных в устройство? :
1. ША = адрес устройства
2. ШД = передаваемый байт
3. ШУ = команда out
4. Абсолютно все устройства получают команду ШУ=out, сравнивают ША со своим адресом, то устройство, адрес которого совпал принимает байт из ШД

А если надо последовательно передать несколько байт? повторять шаг 1-4 несколько раз?

На текущий момент вот что у меня есть:
1. Плата с контроллером STM32f103c8t6
2. Программный эмулятор 8080. (взят проверенный)
3. Эмулятор памяти.

Правильно ли я понимаю что сделать дальше? :
1. бинарный код Altair Basic "загрузить" в память. С какого адреса начинать?
2. PC=начало бинарного кода Basic.
3. SP=???
4. регистр флагов=???
5. остальные регистры=???
6. чтобы отследить что Basic решил что-то ввести/вывести в терминал, жду команду IN? (или OUT, что первое будет).
?

под терминалом я понимаю такую штуковину https://www.youtube.com/watch?v=qv5b1Xowxdk
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Barmaley wrote:На шине управления есть сигнал HOLD (запрос прямого доступа к памяти) - как это работает?
Внешнее устройство, обычно контроллер ПДП, подает процессору сигнал HOLD - запрос захвата шин.
Процессор 580ВМ80 заканчивает текущую операцию, переводит ВСЕ свои шины в высокоимпедансное
состояние и отвечает контроллеру ПДП сигналом HLDА - разрешение на захвата шин.
После этого процессор остановлен, а контроллер ПДП - полный хозяин на шинах, пока не снимет
сигнал HOLD.
Без внешнего контроллера 580ВК28(38) процессор 580ВМ80 перевести сигналы DBIN и WR в высокоимпедансное
состояние не может.

Рассказывать вам полностью алгоритмы работы процессора 580ВМ80 очень уныло и скучно. :-?
Это самый документированный процессор, и прочитать про него можно и здесь на форуме, и много
где еще и в интернете и в книжках - надо просто вам поискать.

Barmaley wrote:1. бинарный код Altair Basic "загрузить" в память. С какого адреса начинать?
2. PC=начало бинарного кода Basic.
3. SP=???
4. регистр флагов=???
5. остальные регистры=???
6. чтобы отследить что Basic решил что-то ввести/вывести в терминал, жду команду IN? (или OUT, что первое будет).
Оригинальный Altair 8800 имел всего 256 байт ОЗУ и всё.
Чтобы загрузить Altair Basic надо было купить у MITS дополнительную плату памяти с ОЗУ 8КБайт.
Ну и сам Altair Basic на перфоленте...

Altair Basic занимает первые 4КБайт этой памяти. Вторые 4КБайт этой памяти - Basic программы и служебные ячейки.
При начальном старте процессора 580ВМ80 PC=0000Н - начало ОЗУ с Altair Basic.
Остальные регистры не определены - в них случайная информация.

Вот по этому адресу: http://altairbasic.org/ есть полный исходный код Altair Basic.
Смотрите, что он делает и куда обращается.

Эмулятор какого-либо процессора или компьютера - это всегда интерпретатор его команд кодами
вашей машины. Т.е. - увидели вы, что программа полезла в порт - надо самому своим кодом это выполнить.

Самому с нуля писать это целиком трудно. Я бы вам посоветовал всё же почитать чьи - либо исходники.
Чтобы знать, как это делается. Ну хотя бы эти: viewtopic.php?f=104&t=18964

P.S. И вот вам ещё пару хороших ссылочек, пока я их не забыл:
https://altairclone.com/downloads/manua ... Manual.pdf
http://www.classiccmp.org/altair32/Altair32specs.htm
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Lavr wrote:Оригинальный Altair 8800...
У нас это уже где-то на форуме было, но как приложение DOS, а здесь - консольное приложение Венды:
Эмулятор Altair 8800, запускающий 4К_Basic от Билли...
Altair.zip
Ну если кому в Altair_Basic поиграться захочется... :ewink:

Altair.BАТ - файл прямо Altair_Basic и запускает.
А файл ярлыка надо подрихтовать - там мои пути остались.

Внутри эмулятора: help - это Хэлп его :wink: , quit - выход в Венду, load - загрузка файла с диска.
У Altair_Basic - понятное дело - команды Basic.
You do not have the required permissions to view the files attached to this post.
iLavr
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

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

Post by Barmaley »

Lavr, большое спасибо за ответы на мои вопросы. Книг по 8080 нашёл довольно много, в ближайшее время пролистаю одну из них более внимательно.
по Altair документации, чтобы была расписана карта памяти, адреса портов, и логика работы периферийных устройств - такого к сожалению не нашёл.

Запустил сегодня arduino-эмулятор
_PC=0;
_SP=MaxMem;
при выполнении команд IN, OUT выполнялась печать состояния регистров в терминал.
Получил следующее: OUT по ША=257 последовательности символов /13/10"MEMORY SIZ" /197 "? "
после символа "Z" выводится, почему-то, символ с кодом 197 (Е в русской раскладке). Кто-то пошутил с бинарником бейсика?

далее идёт бесконечный IN по чередующейся ША=0 - ША=257
какая должна быть последовательность ответа, чтобы в Basic подсунуть данные?
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

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

Post by Barmaley »

Lavr wrote: Вот по этому адресу: http://altairbasic.org/ есть полный исходный код Altair Basic.
Смотрите, что он делает и куда обращается.
:o
Я это даже близко не осилю :osad:
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Barmaley wrote:Я это даже близко не осилю :osad:
Интересный разворот... :lol: Вам все эти команды надо не только знать, но и эмулировать командами Arduino.
Я и то посмотрел что там вам отслеживать надо: 1.6 Terminal I/O

Code: Select all

If terminal width reached then print new line. Note that NewLine returns with A=0, so TERMINAL_X gets reset properly.
036E	FE4E	OutChar_tail	CPI 48	
0370	CC8A05		CZ NewLine	
0373	3C		INR A	
0374	322700		STA TERMINAL_X	
Wait for terminal device to become ready for output.
0377	DB00	WaitTermReady	IN 00	
0379	E680		ANI 80	
037B	C27703		JNZ WaitTermReady	
Get char off stack and write it out.
037E	F1		POP PSW	
037F	D301		OUT 01	
0381	C9		RET
И я вам дал ссылку, чем Altair 8800 работает с терминалом:
...programmed I/O device (based on the 6850 ACIA) provides two serial ports which could be hardware jumpered to support either RS-232 or 20mA current loop interfaces.
Вот обращение к 6850 ACIA это и есть работа Altair 8800 на вывод: ожидание готовности
ACIA и вывод в её порт. Это вывод символа на экран терминала.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Barmaley wrote:по Altair документации, чтобы была расписана карта памяти, адреса портов, и логика работы периферийных устройств - такого к сожалению не нашёл.
А я так вижу, что вы и не искали - по моим ссылкам эта информация есть:
mem.jpg
А здесь информация про адреса портов: http://www.classiccmp.org/altair32/Altair32specs.htm

Я чисто из интересу набрал в Гугле фразу:"Altair 8800 memory map" и в первых же ссылках
есть вся документция: ALTAIR 8800 - Documentation
8800doc.gif
И я не знаю, кто там с чем пошутил, но в исходнике всё нормально:

Code: Select all

0EF0	4D454D4F52592053495AC500	szMemorySize	DS "MEMORY SIZE\0"
P.S. Если кто не понял, что значит "всё нормально": в исходнике видно, что последний символ
в каждой строке перед стоп-битом записан со взведенным старшим битом. Кириллицы у Билла
в ASCII по определению нет. Отсюда 197 (0C5H) - это 45Н (Е) со взведенным старшим битом.
You do not have the required permissions to view the files attached to this post.
iLavr
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

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

Post by Barmaley »

Lavr wrote: Вам все эти команды надо не только знать, но и эмулировать командами Arduino.
Я взял готовый сишный эмулятор 8080. Он из себя представляет определение всех регистров процессора, и функции которые меняют состояние этих регистров в зависимости от алгоритма работы 8080. Функции обращения к памяти и портам ввода-вывода пытаюсь написать сам.

Документацию я прочитал. Она достаточно непривычно преподносит информацию. Очень тяжело найти что-то нужное в данный момент.

Как работает терминал вообще из документации не понятно. Есть описание временнЫх диаграмм, есть схемы. Нет описанного алгоритма:
"в порт№х выведи эти биты, дождись с порта№у этот признак, и тогда прочитай с порта№z нужные данные".
Lavr wrote: в исходнике видно, что последний символ
в каждой строке перед стоп-битом записан со взведенным старшим битом
как это используется?

на текущий момент сделал вывод в терминал, убирая "взведённый" старший бит, и при выводе символы с кодом <27 дополнительно дублирую выводом #(десятичный код символа)

получается такой диалог:

#13#10MEMORY SIZE? 4096#13#10
#13#10
?SN ERROR#13#10
MEMORY SIZE?

?SN - синтаксическая ошибка. Что не нравится Basic'у?
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Barmaley wrote:Нет описанного алгоритма:
"в порт№х выведи эти биты, дождись с порта№у этот признак, и тогда прочитай с порта№z нужные данные".
Это описывают в мануалах на соответствующие БИС последовательного интерфейса.

Но это очевидно и из программы:

Code: Select all

Wait for terminal device to become ready for output.
0377   DB00   WaitTermReady   IN 00   
0379   E680      ANI 80   
037B   C27703      JNZ WaitTermReady   
Get char off stack and write it out.
037E   F1      POP PSW   
037F   D301      OUT 01   
0381   C9      RET
Ожидание готовности терминала:
0377 - читаем порт 00h
0379 - выделяем бит 7
037B - если он не 0 снова 0377 - читаем порт 00h - ждём готовности
037E - восстановим из стека передаваемый байт
037F - передаём его

Я не знаю - чего еще надо?! :o
Barmaley wrote:?SN - синтаксическая ошибка. Что не нравится Basic'у?
Я дал вам ссылку на исходники Basic'а, там подробные комментарии.
Я что ли их за вас читать должен?
Я вобще-то их читал в своё время, но меня интересовало, как пишут Basic-и..
iLavr
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

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

Post by Barmaley »

Lavr wrote: Ожидание готовности терминала:
0377 - читаем порт 00h
и это, и многое другое я уже сделал, иначе как получился бы такой диалог:
#13#10MEMORY SIZE? 4096#13#10
#13#10
?SN ERROR#13#10
MEMORY SIZE?

после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так?
У Вас когда программа на работает, Вы её сразу дизассемблировать начинаете?
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Barmaley wrote:У Вас когда программа на работает, Вы её сразу дизассемблировать начинаете?
Я её смотрю отладчиком, который сам по себе построчный дизассемблер.
Но вам-то ничего дизассемблировать не надо - всё давно дизассемблировали.
Я просто взял нужный кусок кода с сайта про Альтаир Васик.

А вот шаманством и танцем с бубнами я точно не занимаюсь, когда программа на работает... :wink:

Вот что Васик делает при начальных вопросах: http://altairbasic.org/init_dis_2.htm
ну и надо посмотреть - где он может вылететь на синтаксическую ошибку.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

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

Post by Lavr »

Barmaley wrote:после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так?
Возможно, в строке цифр есть буква или считывается с терминала НЕцифра.
Bas_err.gif
You do not have the required permissions to view the files attached to this post.
iLavr
Barmaley
Writer
Posts: 20
Joined: 03 May 2020 08:31
Location: Мытищи

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

Post by Barmaley »

Я попробовал разные терминалы. В ардуиновском терминале поля ввода и вывода разделены. Поэтому в приведённом ниже скриншоте "4096" гарантированно цифра - это то как её эхом вывел бейсик.
You do not have the required permissions to view the files attached to this post.