Author |
Message |
Barmaley
Writer
Joined: 03 May 2020 08:31 Posts: 20 Location: Мытищи
|
Хочу, ради развлечения, попробовать сэмулировать компьютер Altair 8800 на Arduino. Аппаратное окружение предполагается такое: терминал=(печатающая машинка+клавиатура).
Навыков и знаний у меня не много, поэтому заранее прошу прощение за глупые вопросы.
Вопросы у меня на сейчас вот какие:
1. что такое порт ввода-вывода? что он представляет из себя в машинах на 8080? какая логика обмена данными?
2. какое минимальное аппаратное обеспечение надо сэмулировать чтобы запустить Altair Basic 4k?
3. правильно я понимаю, что действовать надо в таком направлении: эмулируется 64кБ оперативной памяти, регистры 8080, и все инструкции 8080. далее в адресное пространство (где взять карту адресов Altair?) записываются коды Basic, и запускается эмулятор инструкций? Как отловить момент, когда Basic решит что-то вывести в терминал, или например, когда он будет ожидать из терминала данные, куда их нужно подсунуть? PS повторять готовые конструкции с GitHub'а не хочу, так как кроме развлечения хочу ещё немного разобраться в программировании.
|
03 May 2020 09:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Минимальный порт вывода - регистр, к которому обращаются на запись по заданному адресу. Минимальный порт ввода - регистр с Z-состоянием или шинный буфер к которому обращаются на чтение по заданному адресу. На двух таких регистрах можно сделать индикацию и ввод с клавиатуры примерно так: С регистрами работают здесь чисто программно операциями запись и чтение. Насчет минимального аппаратного обеспечения, чтобы запустить Altair Basic, мне подсказать что-то трудно. Надо хотя бы схемы Altair посмотреть... но это уж посмотрите по Интернету сами, они есть.
_________________ iLavr
|
03 May 2020 13:33 |
|
|
Barmaley
Writer
Joined: 03 May 2020 08:31 Posts: 20 Location: Мытищи
|
Из ответа про порт ввода-вывода, и бегло пролистав книгу "Палагута: Микропроцессоры 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 02:06 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Внешнее устройство, обычно контроллер ПДП, подает процессору сигнал HOLD - запрос захвата шин. Процессор 580ВМ80 заканчивает текущую операцию, переводит ВСЕ свои шины в высокоимпедансное состояние и отвечает контроллеру ПДП сигналом HLDА - разрешение на захвата шин. После этого процессор остановлен, а контроллер ПДП - полный хозяин на шинах, пока не снимет сигнал HOLD. Без внешнего контроллера 580ВК28(38) процессор 580ВМ80 перевести сигналы DBIN и WR в высокоимпедансное состояние не может. Рассказывать вам полностью алгоритмы работы процессора 580ВМ80 очень уныло и скучно. Это самый документированный процессор, и прочитать про него можно и здесь на форуме, и много где еще и в интернете и в книжках - надо просто вам поискать. Оригинальный 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=18964P.S. И вот вам ещё пару хороших ссылочек, пока я их не забыл: https://altairclone.com/downloads/manuals/Altair%20Clone%20Operator's%20Manual.pdfhttp://www.classiccmp.org/altair32/Altair32specs.htm
_________________ iLavr
|
04 May 2020 08:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
У нас это уже где-то на форуме было, но как приложение DOS, а здесь - консольное приложение Венды: Эмулятор Altair 8800, запускающий 4К_Basic от Билли... Ну если кому в Altair_Basic поиграться захочется... Altair.BАТ - файл прямо Altair_Basic и запускает. А файл ярлыка надо подрихтовать - там мои пути остались. Внутри эмулятора: help - это Хэлп его , quit - выход в Венду, load - загрузка файла с диска. У Altair_Basic - понятное дело - команды Basic.
_________________ iLavr
|
04 May 2020 11:15 |
|
|
Barmaley
Writer
Joined: 03 May 2020 08:31 Posts: 20 Location: Мытищи
|
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 14:07 |
|
|
Barmaley
Writer
Joined: 03 May 2020 08:31 Posts: 20 Location: Мытищи
|
Я это даже близко не осилю
|
05 May 2020 14:09 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Интересный разворот... Вам все эти команды надо не только знать, но и эмулировать командами Arduino. Я и то посмотрел что там вам отслеживать надо: 1.6 Terminal I/OИ я вам дал ссылку, чем Altair 8800 работает с терминалом: Вот обращение к 6850 ACIA это и есть работа Altair 8800 на вывод: ожидание готовности ACIA и вывод в её порт. Это вывод символа на экран терминала.
_________________ iLavr
|
05 May 2020 16:46 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А я так вижу, что вы и не искали - по моим ссылкам эта информация есть: А здесь информация про адреса портов: http://www.classiccmp.org/altair32/Altair32specs.htmЯ чисто из интересу набрал в Гугле фразу:" Altair 8800 memory map" и в первых же ссылках есть вся документция: ALTAIR 8800 - DocumentationИ я не знаю, кто там с чем пошутил, но в исходнике всё нормально: P.S. Если кто не понял, что значит "всё нормально": в исходнике видно, что последний символ в каждой строке перед стоп-битом записан со взведенным старшим битом. Кириллицы у Билла в ASCII по определению нет. Отсюда 197 (0C5H) - это 45Н (Е) со взведенным старшим битом.
_________________ iLavr
|
05 May 2020 16:52 |
|
|
Barmaley
Writer
Joined: 03 May 2020 08:31 Posts: 20 Location: Мытищи
|
Я взял готовый сишный эмулятор 8080. Он из себя представляет определение всех регистров процессора, и функции которые меняют состояние этих регистров в зависимости от алгоритма работы 8080. Функции обращения к памяти и портам ввода-вывода пытаюсь написать сам. Документацию я прочитал. Она достаточно непривычно преподносит информацию. Очень тяжело найти что-то нужное в данный момент. Как работает терминал вообще из документации не понятно. Есть описание временнЫх диаграмм, есть схемы. Нет описанного алгоритма: "в порт№х выведи эти биты, дождись с порта№у этот признак, и тогда прочитай с порта№z нужные данные". как это используется? на текущий момент сделал вывод в терминал, убирая "взведённый" старший бит, и при выводе символы с кодом <27 дополнительно дублирую выводом #(десятичный код символа) получается такой диалог: #13#10MEMORY SIZE? 4096#13#10 #13#10 ?SN ERROR#13#10 MEMORY SIZE? ?SN - синтаксическая ошибка. Что не нравится Basic'у?
|
09 May 2020 03:40 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Это описывают в мануалах на соответствующие БИС последовательного интерфейса. Но это очевидно и из программы: Ожидание готовности терминала: 0377 - читаем порт 00h 0379 - выделяем бит 7 037B - если он не 0 снова 0377 - читаем порт 00h - ждём готовности 037E - восстановим из стека передаваемый байт 037F - передаём егоЯ не знаю - чего еще надо?! Я дал вам ссылку на исходники Basic'а, там подробные комментарии. Я что ли их за вас читать должен? Я вобще-то их читал в своё время, но меня интересовало, как пишут Basic-и..
_________________ iLavr
|
09 May 2020 08:20 |
|
|
Barmaley
Writer
Joined: 03 May 2020 08:31 Posts: 20 Location: Мытищи
|
и это, и многое другое я уже сделал, иначе как получился бы такой диалог: #13#10MEMORY SIZE? 4096#13#10 #13#10 ?SN ERROR#13#10 MEMORY SIZE? после ввода размера памяти (в соответствии с инструкцией) бэйсик выдаёт синтаксическую ошибку. в этом и вопрос, что не так? У Вас когда программа на работает, Вы её сразу дизассемблировать начинаете?
|
09 May 2020 08:46 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я её смотрю отладчиком, который сам по себе построчный дизассемблер. Но вам-то ничего дизассемблировать не надо - всё давно дизассемблировали. Я просто взял нужный кусок кода с сайта про Альтаир Васик. А вот шаманством и танцем с бубнами я точно не занимаюсь, когда программа на работает... Вот что Васик делает при начальных вопросах: http://altairbasic.org/init_dis_2.htmну и надо посмотреть - где он может вылететь на синтаксическую ошибку.
_________________ iLavr
|
09 May 2020 08:52 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Возможно, в строке цифр есть буква или считывается с терминала НЕцифра.
_________________ iLavr
|
09 May 2020 09:24 |
|
|
Barmaley
Writer
Joined: 03 May 2020 08:31 Posts: 20 Location: Мытищи
|
Я попробовал разные терминалы. В ардуиновском терминале поля ввода и вывода разделены. Поэтому в приведённом ниже скриншоте "4096" гарантированно цифра - это то как её эхом вывел бейсик.
|
09 May 2020 10:43 |
|
|