Разработка эмулятора Altair 8800 на Arduino
Moderator: Shaos
-
- Writer
- Posts: 20
- Joined: 03 May 2020 08:31
- Location: Мытищи
Разработка эмулятора Altair 8800 на Arduino
Хочу, ради развлечения, попробовать сэмулировать компьютер Altair 8800 на Arduino.
Аппаратное окружение предполагается такое: терминал=(печатающая машинка+клавиатура).
Навыков и знаний у меня не много, поэтому заранее прошу прощение за глупые вопросы.
Вопросы у меня на сейчас вот какие:
1. что такое порт ввода-вывода? что он представляет из себя в машинах на 8080? какая логика обмена данными?
2. какое минимальное аппаратное обеспечение надо сэмулировать чтобы запустить Altair Basic 4k?
3. правильно я понимаю, что действовать надо в таком направлении: эмулируется 64кБ оперативной памяти, регистры 8080, и все инструкции 8080.
далее в адресное пространство (где взять карту адресов Altair?) записываются коды Basic, и запускается эмулятор инструкций?
Как отловить момент, когда Basic решит что-то вывести в терминал, или например, когда он будет ожидать из терминала данные, куда их нужно подсунуть?
PS повторять готовые конструкции с GitHub'а не хочу, так как кроме развлечения хочу ещё немного разобраться в программировании.
Аппаратное окружение предполагается такое: терминал=(печатающая машинка+клавиатура).
Навыков и знаний у меня не много, поэтому заранее прошу прощение за глупые вопросы.
Вопросы у меня на сейчас вот какие:
1. что такое порт ввода-вывода? что он представляет из себя в машинах на 8080? какая логика обмена данными?
2. какое минимальное аппаратное обеспечение надо сэмулировать чтобы запустить Altair Basic 4k?
3. правильно я понимаю, что действовать надо в таком направлении: эмулируется 64кБ оперативной памяти, регистры 8080, и все инструкции 8080.
далее в адресное пространство (где взять карту адресов Altair?) записываются коды Basic, и запускается эмулятор инструкций?
Как отловить момент, когда Basic решит что-то вывести в терминал, или например, когда он будет ожидать из терминала данные, куда их нужно подсунуть?
PS повторять готовые конструкции с GitHub'а не хочу, так как кроме развлечения хочу ещё немного разобраться в программировании.
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Разработка эмулятора Altair 8800 на Arduino
Минимальный порт вывода - регистр, к которому обращаются на запись по заданному адресу.Barmaley wrote:Вопросы у меня на сейчас вот какие:
1. что такое порт ввода-вывода? что он представляет из себя в машинах на 8080? какая логика обмена данными?
2. какое минимальное аппаратное обеспечение надо сэмулировать чтобы запустить Altair Basic 4k?
Минимальный порт ввода - регистр с Z-состоянием или шинный буфер к которому обращаются на чтение по заданному адресу.
На двух таких регистрах можно сделать индикацию и ввод с клавиатуры примерно так: С регистрами работают здесь чисто программно операциями запись и чтение.
Насчет минимального аппаратного обеспечения, чтобы запустить Altair Basic, мне подсказать что-то трудно.
Надо хотя бы схемы Altair посмотреть... но это уж посмотрите по Интернету сами, они есть.
You do not have the required permissions to view the files attached to this post.
iLavr
-
- Writer
- Posts: 20
- Joined: 03 May 2020 08:31
- Location: Мытищи
Re: Разработка эмулятора Altair 8800 на Arduino

Из ответа про порт ввода-вывода, и бегло пролистав книгу "Палагута: Микропроцессоры 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
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Разработка эмулятора Altair 8800 на Arduino
Внешнее устройство, обычно контроллер ПДП, подает процессору сигнал HOLD - запрос захвата шин.Barmaley wrote:На шине управления есть сигнал HOLD (запрос прямого доступа к памяти) - как это работает?
Процессор 580ВМ80 заканчивает текущую операцию, переводит ВСЕ свои шины в высокоимпедансное
состояние и отвечает контроллеру ПДП сигналом HLDА - разрешение на захвата шин.
После этого процессор остановлен, а контроллер ПДП - полный хозяин на шинах, пока не снимет
сигнал HOLD.
Без внешнего контроллера 580ВК28(38) процессор 580ВМ80 перевести сигналы DBIN и WR в высокоимпедансное
состояние не может.
Рассказывать вам полностью алгоритмы работы процессора 580ВМ80 очень уныло и скучно.

Это самый документированный процессор, и прочитать про него можно и здесь на форуме, и много
где еще и в интернете и в книжках - надо просто вам поискать.
Оригинальный Altair 8800 имел всего 256 байт ОЗУ и всё.Barmaley wrote:1. бинарный код Altair Basic "загрузить" в память. С какого адреса начинать?
2. PC=начало бинарного кода Basic.
3. SP=???
4. регистр флагов=???
5. остальные регистры=???
6. чтобы отследить что Basic решил что-то ввести/вывести в терминал, жду команду IN? (или OUT, что первое будет).
Чтобы загрузить 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
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Разработка эмулятора Altair 8800 на Arduino
У нас это уже где-то на форуме было, но как приложение DOS, а здесь - консольное приложение Венды:Lavr wrote:Оригинальный Altair 8800...
Эмулятор Altair 8800, запускающий 4К_Basic от Билли... Ну если кому в Altair_Basic поиграться захочется...

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

У Altair_Basic - понятное дело - команды Basic.
You do not have the required permissions to view the files attached to this post.
iLavr
-
- Writer
- Posts: 20
- Joined: 03 May 2020 08:31
- Location: Мытищи
Re: Разработка эмулятора Altair 8800 на Arduino
Lavr, большое спасибо за ответы на мои вопросы. Книг по 8080 нашёл довольно много, в ближайшее время пролистаю одну из них более внимательно.
по Altair документации, чтобы была расписана карта памяти, адреса портов, и логика работы периферийных устройств - такого к сожалению не нашёл.
Запустил сегодня arduino-эмулятор
_PC=0;
_SP=MaxMem;
при выполнении команд IN, OUT выполнялась печать состояния регистров в терминал.
Получил следующее: OUT по ША=257 последовательности символов /13/10"MEMORY SIZ" /197 "? "
после символа "Z" выводится, почему-то, символ с кодом 197 (Е в русской раскладке). Кто-то пошутил с бинарником бейсика?
далее идёт бесконечный IN по чередующейся ША=0 - ША=257
какая должна быть последовательность ответа, чтобы в Basic подсунуть данные?
по Altair документации, чтобы была расписана карта памяти, адреса портов, и логика работы периферийных устройств - такого к сожалению не нашёл.
Запустил сегодня arduino-эмулятор
_PC=0;
_SP=MaxMem;
при выполнении команд IN, OUT выполнялась печать состояния регистров в терминал.
Получил следующее: OUT по ША=257 последовательности символов /13/10"MEMORY SIZ" /197 "? "
после символа "Z" выводится, почему-то, символ с кодом 197 (Е в русской раскладке). Кто-то пошутил с бинарником бейсика?
далее идёт бесконечный IN по чередующейся ША=0 - ША=257
какая должна быть последовательность ответа, чтобы в Basic подсунуть данные?
-
- Writer
- Posts: 20
- Joined: 03 May 2020 08:31
- Location: Мытищи
Re: Разработка эмулятора Altair 8800 на Arduino
Lavr wrote: Вот по этому адресу: http://altairbasic.org/ есть полный исходный код Altair Basic.
Смотрите, что он делает и куда обращается.

Я это даже близко не осилю

-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Разработка эмулятора Altair 8800 на Arduino
Интересный разворот...Barmaley wrote:Я это даже близко не осилю

Я и то посмотрел что там вам отслеживать надо: 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
Вот обращение к 6850 ACIA это и есть работа 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.
ACIA и вывод в её порт. Это вывод символа на экран терминала.
iLavr
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Разработка эмулятора Altair 8800 на Arduino
А я так вижу, что вы и не искали - по моим ссылкам эта информация есть: А здесь информация про адреса портов: http://www.classiccmp.org/altair32/Altair32specs.htmBarmaley wrote:по Altair документации, чтобы была расписана карта памяти, адреса портов, и логика работы периферийных устройств - такого к сожалению не нашёл.
Я чисто из интересу набрал в Гугле фразу:"Altair 8800 memory map" и в первых же ссылках
есть вся документция: ALTAIR 8800 - Documentation И я не знаю, кто там с чем пошутил, но в исходнике всё нормально:
Code: Select all
0EF0 4D454D4F52592053495AC500 szMemorySize DS "MEMORY SIZE\0"
в каждой строке перед стоп-битом записан со взведенным старшим битом. Кириллицы у Билла
в ASCII по определению нет. Отсюда 197 (0C5H) - это 45Н (Е) со взведенным старшим битом.
You do not have the required permissions to view the files attached to this post.
iLavr
-
- Writer
- Posts: 20
- Joined: 03 May 2020 08:31
- Location: Мытищи
Re: Разработка эмулятора Altair 8800 на Arduino
Я взял готовый сишный эмулятор 8080. Он из себя представляет определение всех регистров процессора, и функции которые меняют состояние этих регистров в зависимости от алгоритма работы 8080. Функции обращения к памяти и портам ввода-вывода пытаюсь написать сам.Lavr wrote: Вам все эти команды надо не только знать, но и эмулировать командами Arduino.
Документацию я прочитал. Она достаточно непривычно преподносит информацию. Очень тяжело найти что-то нужное в данный момент.
Как работает терминал вообще из документации не понятно. Есть описание временнЫх диаграмм, есть схемы. Нет описанного алгоритма:
"в порт№х выведи эти биты, дождись с порта№у этот признак, и тогда прочитай с порта№z нужные данные".
как это используется?Lavr wrote: в исходнике видно, что последний символ
в каждой строке перед стоп-битом записан со взведенным старшим битом
на текущий момент сделал вывод в терминал, убирая "взведённый" старший бит, и при выводе символы с кодом <27 дополнительно дублирую выводом #(десятичный код символа)
получается такой диалог:
#13#10MEMORY SIZE? 4096#13#10
#13#10
?SN ERROR#13#10
MEMORY SIZE?
?SN - синтаксическая ошибка. Что не нравится Basic'у?
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Разработка эмулятора Altair 8800 на Arduino
Это описывают в мануалах на соответствующие БИС последовательного интерфейса.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 - передаём его
Я не знаю - чего еще надо?!

Я дал вам ссылку на исходники Basic'а, там подробные комментарии.Barmaley wrote:?SN - синтаксическая ошибка. Что не нравится Basic'у?
Я что ли их за вас читать должен?
Я вобще-то их читал в своё время, но меня интересовало, как пишут Basic-и..
iLavr
-
- Writer
- Posts: 20
- Joined: 03 May 2020 08:31
- Location: Мытищи
Re: Разработка эмулятора Altair 8800 на Arduino
и это, и многое другое я уже сделал, иначе как получился бы такой диалог:Lavr wrote: Ожидание готовности терминала:
0377 - читаем порт 00h
#13#10MEMORY SIZE? 4096#13#10
#13#10
?SN ERROR#13#10
MEMORY SIZE?
после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так?
У Вас когда программа на работает, Вы её сразу дизассемблировать начинаете?
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Разработка эмулятора Altair 8800 на Arduino
Я её смотрю отладчиком, который сам по себе построчный дизассемблер.Barmaley wrote:У Вас когда программа на работает, Вы её сразу дизассемблировать начинаете?
Но вам-то ничего дизассемблировать не надо - всё давно дизассемблировали.
Я просто взял нужный кусок кода с сайта про Альтаир Васик.
А вот шаманством и танцем с бубнами я точно не занимаюсь, когда программа на работает...

Вот что Васик делает при начальных вопросах: http://altairbasic.org/init_dis_2.htm
ну и надо посмотреть - где он может вылететь на синтаксическую ошибку.
iLavr
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Разработка эмулятора Altair 8800 на Arduino
Возможно, в строке цифр есть буква или считывается с терминала НЕцифра.Barmaley wrote:после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так?
You do not have the required permissions to view the files attached to this post.
iLavr
-
- Writer
- Posts: 20
- Joined: 03 May 2020 08:31
- Location: Мытищи
Re: Разработка эмулятора Altair 8800 на Arduino
Я попробовал разные терминалы. В ардуиновском терминале поля ввода и вывода разделены. Поэтому в приведённом ниже скриншоте "4096" гарантированно цифра - это то как её эхом вывел бейсик.
You do not have the required permissions to view the files attached to this post.