nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 26 Nov 2020 13:00



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

Joined: 03 May 2020 09:31
Posts: 20
Location: Мытищи
Reply with quote
Хочу, ради развлечения, попробовать сэмулировать компьютер Altair 8800 на Arduino.
Аппаратное окружение предполагается такое: терминал=(печатающая машинка+клавиатура).

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

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

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

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

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

PS повторять готовые конструкции с GitHub'а не хочу, так как кроме развлечения хочу ещё немного разобраться в программировании.


03 May 2020 10:22
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Barmaley wrote:
Вопросы у меня на сейчас вот какие:

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

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

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

На двух таких регистрах можно сделать индикацию и ввод с клавиатуры примерно так:
Attachment:
reg.gif
reg.gif [ 13.04 KiB | Viewed 2698 times ]

С регистрами работают здесь чисто программно операциями запись и чтение.

Насчет минимального аппаратного обеспечения, чтобы запустить Altair Basic, мне подсказать что-то трудно.
Надо хотя бы схемы Altair посмотреть... но это уж посмотрите по Интернету сами, они есть.

_________________
iLavr


03 May 2020 14:33
Profile
Writer

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


04 May 2020 03:06
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
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.
Смотрите, что он делает и куда обращается.

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

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

P.S. И вот вам ещё пару хороших ссылочек, пока я их не забыл:
https://altairclone.com/downloads/manuals/Altair%20Clone%20Operator's%20Manual.pdf
http://www.classiccmp.org/altair32/Altair32specs.htm

_________________
iLavr


04 May 2020 09:22
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Lavr wrote:
Оригинальный Altair 8800...
У нас это уже где-то на форуме было, но как приложение DOS, а здесь - консольное приложение Венды:
Эмулятор Altair 8800, запускающий 4К_Basic от Билли...
Attachment:
Altair.zip [213.5 KiB]
Downloaded 120 times

Ну если кому в Altair_Basic поиграться захочется... :ewink:

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

Внутри эмулятора: help - это Хэлп его :wink: , quit - выход в Венду, load - загрузка файла с диска.
У Altair_Basic - понятное дело - команды Basic.

_________________
iLavr


04 May 2020 12:15
Profile
Writer

Joined: 03 May 2020 09:31
Posts: 20
Location: Мытищи
Reply with quote
Lavr, большое спасибо за ответы на мои вопросы. Книг по 8080 нашёл довольно много, в ближайшее время пролистаю одну из них более внимательно.
по Altair документации, чтобы была расписана карта памяти, адреса портов, и логика работы периферийных устройств - такого к сожалению не нашёл.

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

далее идёт бесконечный IN по чередующейся ША=0 - ША=257
какая должна быть последовательность ответа, чтобы в Basic подсунуть данные?


05 May 2020 15:07
Profile
Writer

Joined: 03 May 2020 09:31
Posts: 20
Location: Мытищи
Reply with quote
Lavr wrote:
Вот по этому адресу: http://altairbasic.org/ есть полный исходный код Altair Basic.
Смотрите, что он делает и куда обращается.


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


05 May 2020 15:09
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Barmaley wrote:
Я это даже близко не осилю :osad:

Интересный разворот... :lol: Вам все эти команды надо не только знать, но и эмулировать командами Arduino.
Я и то посмотрел что там вам отслеживать надо: 1.6 Terminal I/O
Code:
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 работает с терминалом:
Quote:
...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


05 May 2020 17:46
Profile
Supreme God
User avatar

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

А я так вижу, что вы и не искали - по моим ссылкам эта информация есть:
Attachment:
mem.jpg
mem.jpg [ 11.66 KiB | Viewed 2557 times ]

А здесь информация про адреса портов: http://www.classiccmp.org/altair32/Altair32specs.htm

Я чисто из интересу набрал в Гугле фразу:"Altair 8800 memory map" и в первых же ссылках
есть вся документция: ALTAIR 8800 - Documentation
Attachment:
8800doc.gif
8800doc.gif [ 14.98 KiB | Viewed 2557 times ]

И я не знаю, кто там с чем пошутил, но в исходнике всё нормально:
Code:
0EF0   4D454D4F52592053495AC500   szMemorySize   DS "MEMORY SIZE\0"


P.S. Если кто не понял, что значит "всё нормально": в исходнике видно, что последний символ
в каждой строке перед стоп-битом записан со взведенным старшим битом. Кириллицы у Билла
в ASCII по определению нет. Отсюда 197 (0C5H) - это 45Н (Е) со взведенным старшим битом.

_________________
iLavr


05 May 2020 17:52
Profile
Writer

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


09 May 2020 04:40
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Barmaley wrote:
Нет описанного алгоритма:
"в порт№х выведи эти биты, дождись с порта№у этот признак, и тогда прочитай с порта№z нужные данные".
Это описывают в мануалах на соответствующие БИС последовательного интерфейса.

Но это очевидно и из программы:
Code:
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


09 May 2020 09:20
Profile
Writer

Joined: 03 May 2020 09:31
Posts: 20
Location: Мытищи
Reply with quote
Lavr wrote:
Ожидание готовности терминала:
0377 - читаем порт 00h


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

после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так?
У Вас когда программа на работает, Вы её сразу дизассемблировать начинаете?


09 May 2020 09:46
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Barmaley wrote:
У Вас когда программа на работает, Вы её сразу дизассемблировать начинаете?

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

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

Вот что Васик делает при начальных вопросах: http://altairbasic.org/init_dis_2.htm
ну и надо посмотреть - где он может вылететь на синтаксическую ошибку.

_________________
iLavr


09 May 2020 09:52
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Barmaley wrote:
после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так?

Возможно, в строке цифр есть буква или считывается с терминала НЕцифра.
Attachment:
Bas_err.gif
Bas_err.gif [ 3.12 KiB | Viewed 2364 times ]

_________________
iLavr


09 May 2020 10:24
Profile
Writer

Joined: 03 May 2020 09:31
Posts: 20
Location: Мытищи
Reply with quote
Я попробовал разные терминалы. В ардуиновском терминале поля ввода и вывода разделены. Поэтому в приведённом ниже скриншоте "4096" гарантированно цифра - это то как её эхом вывел бейсик.


Attachments:
1.jpg
1.jpg [ 70.03 KiB | Viewed 2354 times ]
09 May 2020 11:43
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 41 posts ]  Go to page 1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 1 guest


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.