PDA

Просмотр полной версии : ПК8000 - Уточнённое описание архитектуры и программ.



demetrius2003
20.03.2014, 16:20
Доброго дня, уважаемые форумчане!

Помнится в одной из тем уже поднимался вопрос о новом и старом софте. Было много обсуждений, а потом я вспомнил, что у меня в гараже лежат кассеты с записями от Суры. Я их тогда нашёл. Список программ выложил сюда, на форум. Кто-то даже хотел мне задарить кассетную деку для оцифровки. А потом тема заглохла. Моё сообщение в той теме последнее и висит. А что же было дальше? А далее случилось всё так, как и случается у таких бездарей как я. Банальность, однако. Спустя н-дцать дней я всё-таки приготовился к записи. Здорово так приготовился. Основательно. Полез в шкафчик, где кассеты лежали. И... Нету, короче, кассет. Облазил я его весь, может завалились куда. Натурально - нету!!! Что делает обычный, среднестатистический гражданин, который потерял кассеты, скорее всего оставшиеся в единственном экземпляре в стране (или даже в мире!)? Правильно - задаёт вопрос жене. Примерно такого содержания - "А не видела ли ты в шкафчике кассеты?". Надо сказать, что я тут же получил грамотно составленный ответ, наподобие такого - "Я их не брала. А зачем они тебе? Они всё-равно были старые". Что в принципе равнозначно одному грубому слову - "задница". Я уже научился не реагировать на подобные ответы. Всё же предельно ясно - была очередная уборка... Что толку кричать, кассеты то всё-равно не вернёшь. Вот, годы идут, а ничего не меняется. Проходят века и эоны. Так же, наверное, в доисторических семьях целые мамонты пропадали. Наверняка тоже кто-нибудь возмущался - "я положил его сюда, а теперь его нет! Ять, где мамонт?". Ничего не меняется...
Но это всё лирика. Как же дальше то жить? Сура была моей первой платформой. Не бросать же её просто так! Предлагаю сообществу собрать, что называется с миру по нитке. Докопаться таки до истины. Начну пожалуй с того, что опишу, что же было потеряно в тех кассетах. Что удалось найти. И что предстоит ещё сделать.
1. Программы, которые были на кассетах, в принципе, уже оцифрованы и лежат на разных сайтах в интренете. Исключение составляет система "Форт" фирмы Лейди-софт, адаптированная под Суру. Её богу где-то видел я эту софтину. В одном из эмуляторов. Там заставка ещё с туфлёй. Значит и она есть, просто поискать надо. Хотя я и не уверен, что это был Суровский вариант. Может это была версия, адаптированная под другой компьютер?
2. Документы, которые были на кассетах. Вот тут дело сложнее. Там были очень качественные тексты! Их реально жаль! Что же там было:
- описание всего софта (ассемблера, дизассемблера, текстовых редакторов, графического редактора, форта и т. д.)
- документация по программированию на ассемблере, в том числе - таблица системных переменных, описание точек входа в ПЗУ и т. д.
Но и тут оказывается не всё потеряно. Только что я обнаружил, что оказывается, кое что я распечатывал тогда на бумагу и делал кое-какие записи в тетрадках. Первая партия бумаг отсканирована и лежит во вложении. Качество очень не очень. Времени прилично прошло. Но хоть это есть! С тетрадками сложнее. Часть я обнаружил в куче, предназначающейся для растопки печи. Там реальная мешанина Спектрумовского кода и Суровского, куски лекций и прочая дребедень. Разберу - постараюсь отсканить как можно скорее. В принципе, если верить моей памяти, то удастся восстановить почти всё! Исключение составляет самый лакомый кусок - дока с точками входа в ПЗУ. Вот эту доку я реально переписывал в тетрадь, но и то не полностью, т. к. писать было много, очень много. Это я помню как сейчас, но тетрадку ту обнаружить пока не могу. Посему предложение к сообществу - может навалиться нам всем, кому не безразлично, и разобрать ПЗУ по косточкам? Описание системных переменных есть. Так что жить становится проще. Есть также одно прелюбопытное наблюдение. Если в Тоталкоммандере сравнить БИОСы Суры и Львова побайтно, то обнаружим, что наполовину они идентичны! Т. е. основа одна, и мне кажется, что ноги растут от Бейсика Альтаировского. Где-то в сети (по моему на форуме у Шаоса) есть тема о Бейсиках и о том, что откуда произошло. Тут может помочь тот факт, что Львов документирован неплохо. Только карта памяти у него перевёрнута по сравнению с Суровской.
Вот как то так. Попутно ещё вопросы к сообществу:
1. Есть ли у кого копия Суровкого ПЗУ? Или от Хобби она один к одному? Почему в универсальном эмуляторе одна строка "Сура и Хобби"?
2. Эмулятор Суры существует один? Или есть ещё то, чего я не видел?
3. Нужен ли новый софт под Суру? Будет ли он кому интересен, хотя бы в плане какого-то культурного наследия, что-ли. Или как сказать то? Не знаю даже. Просто есть куча моих набросков. Текстовый редактор, к примеру. Его я даже дарил на день рождения своему товарищу. Тогда кроме Клада и ТяпЛяпа на Суре вообще ничего не было. А у нас уже был свой текстовый редактор!
4. Нужен совет по кроссовым средствам разработки. Ассемблер, Дизассемблер. Что лучше брать и самое главное, где? Может даже Си и Паскаль кроссовые существуют?
5. Самое насущное - сообща разберём ПЗУ на части?
Вообще, то что я ищу кому-нибудь кроме меня интересно?

hantarex
20.03.2014, 16:38
моей первой машинкой была Веста ПК8000 :)
мне интересна любая инфа по этому семейству. думаю, не мне одному.

demetrius2003
21.03.2014, 21:35
Посидел с дизассемблером. Это только начало. Надо более точно отделить код от данных. Работы непочатый край.

hantarex
22.03.2014, 17:54
я бы с удовольствием подключился. правда программер из меня тот еще:(
а есть какой-нить план работ? чтобы несколько чел. одновременно не делали одно и тоже.
ivagor, b2m хорошо разбираются в данном вопросе, если их попросить, думаю, помогут.

demetrius2003
22.03.2014, 19:39
Сегодня я немного (точнее совсем) не в кондиции. Поэтому буду краток. Дизассемблирование ведётся в Иде. Сам файл идовской базы idb я выкладывать не буду, т. к. с трудом себе представляю, как же с ним можно работать коллективно. Кстати! Ежели у кого будут мысли по этому поводу - просьба сообщить. Таким образом - база находится у меня. Сюда я выкладываю архив, в котором находятся:
- html файл с дизассемблерным листингом. Вещь, на которую надо ориентироваться в работе, т. к. там подсветка синтаксиса и другие вкусности;
- lst файл, это тот же листинг, но в простом текстовом формате (вдруг у кого браузер хтмл переварить не в состоянии);
- FUNCTION - вот тут и содержатся точки входа в ПЗУ! Это то, что мы ищем! Всего их около 260 шт., но большая их часть не так важна. Весь цимус - я так думаю штук 50 точек, которые и можно потом будет задействовать в процессе программинга (см., к примеру, &H0056 - заполнение области константой). Собственно надо брать очередной адрес, дать ему более-менее осмысленное имя (по типу как в книге Логана и Охары "Полный дизассемблер ПЗУ ПК Спектрум") и описать его входные параметры и результаты.
- PROBLEM файл. В нём описаны проблемные участки, К примеру - ROM:0019 NONAME lda 0F902h - вот тут дизассемблер говорит нам, что эта инструкция пытается что-то из адреса &HF902 поиметь, а вот что там - неизвестно. Задача - определить по логике работы программы, что же там действительно должно быть в этой ячейке? Большая часть ответов дана в моих сканах. Остальное надо также осмысленно обозвать и описать, зачем оно собственно надо.
То, что над одной функцией или переменной будет работать несколько человек я полагаю не так страшно. Как говорится - одна голова хорошо, а две лучше. Хотя может я и ошибаюсь. Ну вот как то так. Сегодня изъял из листинга знакогенератор и добавил сегмент с переменными (адреса &HF000-&HFFFF). Плюс начал обзывать функции с переменными. А потом к вечеру ушёл в гости, поэтому очередной листинг выложу завтра.
Короче комментарии приветствуются!

esl
22.03.2014, 22:33
немного посидел в иде
вот результат

https://www.dropbox.com/s/ae2i8sguw35bbmu/sura.idb
вбил по докам имена функций
кое-что расковырял, кое что назвал

но там в основмном бейсик, а его смысл ковырять то ?

из полезных - почти все описаны в руководстве (тех что на сайте pk8000.narod.ru)

p.s. там часть кода копируется из пзу в f800
и в роме есть переходы туда
я перенес нужный код на место
заодно и дефолтные переменные кое какие

demetrius2003
23.03.2014, 10:03
...

но там в основмном бейсик, а его смысл ковырять то ?

...

Скорее всего да. Большого смысла функции поддержания жизнедеятельности интерпретатора не имеют и никому не нужны, поэтому я и написал, что ценных функций там штук 50. Но, к примеру, было бы здорово уметь вызывать LINE, SAVE, LOAD и т. д. из машинного кода. И вообще, там много чего неучтённого. Те же RST. Они нигде ведь не упоминаются. Системные переменные не полностью. Посмотрите документацию на Львов. Там без проблем описаны вызовы п.п Бейсика из машинного кода. Да и потом, это ведь просто интересно поковыряться и посмотреть как это было сделано 25 лет назад.

ivagor
23.03.2014, 10:46
Те же RST.
Здесь (http://altairbasic.org/int_dis_1.htm) есть описание. Ну и, конечно, там и про другие общеальтаиробейсиковские вещи написано. Специфичных для ПК8000 вещей там, понятное дело, нет, но их нетрудно разобрать.

---------- Post added at 12:46 ---------- Previous post was at 12:37 ----------

Не думаю, что сильно сэкономлю время, но
1. Ссылки на операторы (коды 80-9C) по адресам 3335h-336Eh
2. Ссылки на функции (коды AE-F1) по адресам 336F-33F8

Когда разбирался я до 100% не доковырял и свою иду выкладывать не буду, больно уж там непотребно.

ivagor
23.03.2014, 10:53
Для примера фрагмент непотребства

ivagor
23.03.2014, 12:24
Поправлю себя - во второй части после функций опять операторы. Плохая память + отсутствие комментариев = ошибки. Это я к тому, что - пишите комментарии.

demetrius2003
23.03.2014, 12:35
ivagor! Огромное спасибо за ссылку по Альтаировскому Васику. Это просто праздник какой-то! b8000.txt тоже полезен. Плюс ко всему выясняется, что попытки диззасмить Суру предпринимались и ранее. Короче по ходу дела у каждого была своя Ида-база...

P.S.: Теперь вот лично я знаю, что CALL &H17C6 равносильно CLS. И т. д. Что резко упрощает программинг на ассемблере. Надеюсь теперь станет понятнее, чего же я хочу.

ivagor
23.03.2014, 14:18
Короче по ходу дела у каждого была своя Ида-база...
Ну а что делать, если исчерпывающего описания, типа как для спека нет, а попрограммить для машинки хотелось. Правда есть родственник Чака Норриса, который на лету чуть ли не по машинному коду все понимает. А обычным людям остается ида.
В дополнение к тому дизасму альтаировского бейсика есть еще пара слов (http://asdasd.rpg.fi/~svo/scalar/ware/572/). Страницы 41-42 с описаниями нескольких (очень) важных околовычислительных функций.
Соответствующие адреса функций для ПК8000 (имена из векторовской инфы, в альтаировском дизасме, насколько помню, не все есть):
VARSEARCH: 0B1A
COMPUTE: 0975
SHORTINT: 0CAB
LONGINT: 12DA
CHANGE SIGN: 12EA
INTFROMFLOAT: 649
Аккумулятор для вычислений с ПТ (FLOAT POINT, вроде в доках по ПК8000 он назван иначе): F938-F93B

Хочу пожелать довести начатое до конца, а то я вот несколько дизасмов бейсиков советских компов бросил в разной степени (не)готовности.

---------- Post added at 16:18 ---------- Previous post was at 16:14 ----------

К слову, в бейсике-микрон, на основе которого сделан basic 2.5 для вектора, кое-что в вычислительных функциях подправлено. А ПКшный бейсик сделан на основе предыдущей версии РКшного. Но суть перечисленных процедур это не меняет.

demetrius2003
23.03.2014, 19:19
Читаю потихоньку доки ivagor'а. В соответствии с этим потихоньку вношу изменения в Иду. Пока всё записываю в комментарии, позднее соберу всю инфу в Ворде.

esl
23.03.2014, 19:52
P.S.: Теперь вот лично я знаю, что CALL &H17C6 равносильно CLS. И т. д. Что резко упрощает программинг на ассемблере. Надеюсь теперь станет понятнее, чего же я хочу.
к сожалению не сильно полезная информация


RAM:17C6 _CLS: ; DATA XREF: RAM:OpcodeTAB_809Co
RAM:17C6 E5 push h
RAM:17C7 3E 0C mvi a, 0Ch
RAM:17C9 DF rst 3 ; OutChar_Rst3
RAM:17CA E1 pop h
RAM:17CB C9 ret


собственно более эффективно



mvi a, 0Ch
call CONOUT (0x003b)


---------- Post added at 17:52 ---------- Previous post was at 17:49 ----------

да, альтаирбасик просто основа ...
процентов на 80+

p.s. по моей ссылке - рабочая IDB

demetrius2003
23.03.2014, 19:56
Почему? Разве так не информативнее:


call _CLS

ivagor
23.03.2014, 19:57
Пара моментов
1. После rst 1 идет код символа
2. особенность этой серии бейсиков - для повышения компактности кода во многих местах используются переходы "внутрь" команды (например в районе 87Dh). Неприятная (неудобная) при дизассемблировании вещь, к счастью ида подсвечивает красным. Тут, конечно, каждый сам решает как оформлять, я у 87Dh написал комментарий ;ori

Доки ивагора - перебор, мопед не мой :) Написали одни умные люди, нашли другие, а я запостил сюда ссылки.

esl
23.03.2014, 20:38
Почему? Разве так не информативнее:


call _CLS
не намного

да и там подводные камни могут быть, посмотри код RST

---------- Post added at 18:38 ---------- Previous post was at 18:26 ----------


Пара моментов
1. После rst 1 идет код символа
.

тоже самое для подпрограммы
RAM:02AA CheckEnoughVarSpace?:

за ней идет байт параметра

p.s. я такие штуки правлю в иде
становишся на точку входв, Ctrl+X (Xreff)
и имеем список всех мест кто вызывет этот код
проходимся по нему и правим.

ivagor
23.03.2014, 22:16
тоже самое для подпрограммы
RAM:02AA CheckEnoughVarSpace?:

за ней идет байт параметра
Хорошо, что я свою базу не выложил :) ПК8000 копал выборочно, а вот в векторовском дизасме все отмечено, только вслед за Филипповым эту процедуру обозначил CHECKCROSSWITHSTACK

---------- Post added at 22:53 ---------- Previous post was at 22:52 ----------

Не исключено, что еще есть такие процедуры

---------- Post added at 23:07 ---------- Previous post was at 22:53 ----------


p.s. я такие штуки правлю в иде
становишся на точку входв, Ctrl+X (Xreff)
и имеем список всех мест кто вызывет этот код
почему-то я привык становиться на имя и жать просто x без ctrl. На первый взгляд результат одинаковый.

---------- Post added at 23:56 ---------- Previous post was at 23:07 ----------

Надо еще отметить что в общий доступ были выложены как минимум 2 дизассемблера близкородственных бейсиков.
1. Векторовский бейсик 2.5, дизассемблировал Е. Филиппов. К сожалению в общественный доступ попал какой-то промежуточный вариант.
2. Орионовский бейсик, версию не помню, дизассемблировал В. (надеюсь имя не спутал) Пушков. Мне запомнился тем, что в нем я увидел короткий и быстрый (до этого придумал свой длинный и медленный) вариант адаптации под z80, который потом применил в нескольких других бейсиках. Что интересно, потом увидел еще и "профессионально" адаптированный под z80 альтаировский бейсик - там вместо того, чтобы поправить процедуры, исправили места их вызова.

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

---------- Post added 24.03.2014 at 00:16 ---------- Previous post was 23.03.2014 at 23:56 ----------

Векторовский здесь (http://asdasd.rpg.fi/~svo/scalar/ware/610/) (BAS25RE.ZIP)
Орионовский здесь (ftp://ftp2+emuverse%2Eru:[email protected]/pub/orion/). OrionSoftware.rar/Programming/BASIC/TBASIC400 там есть readme

esl
23.03.2014, 23:07
1. Векторовский бейсик 2.5, дизассемблировал Е. Филиппов. К сожалению в общественный доступ попал какой-то промежуточный вариант.

Векторовский здесь (http://asdasd.rpg.fi/~svo/scalar/ware/610/) (BAS25RE.ZIP)


эт не мой результат, эт перенос altairbasic names на почву суры ;)
векторовский дизасм в родимом resourcer - ностальжи ...
(кстати в иду легко перенести в теории) ;)

esl
25.03.2014, 19:45
[/COLOR]
почему-то я привык становиться на имя и жать просто x без ctrl. На первый взгляд результат одинаковый.[COLOR="Silver"]


пример

AAAA: LAAAA: JP LBBBB


если стоим на LAAAA то разницы нет.
если на LBBBB то есть ;)

крусор стоит на LBBBB

X - xrefs to LBBBB
ctrl+x - xrefs to LAAAA

ivagor
25.03.2014, 20:09
Понятно, разница есть, но вот лично я поставив курсор на LBBBB и нажав x как раз ожидаю ссылки на LBBBB. Да, если мне вдруг потом сразу захочется получить ссылки на LAAAA, то экономнее будет нажать ctrl+x. Короче спасибо разработчику, предусмотревшему сочетания на все случаи жизни. Вот она реальная забота о потребителе не на словах а на деле, а некоторые хацкеры не ценят.

DemonId7
27.03.2014, 10:57
Раз уж пошла такая пьянка, то может и мои былые потуги будут полезны? Выдирал оттуда способы установки видеорежимов, без использования биоса.
В DSAVE я смотрел как именно байсик-проги сохраняются на диск в com-формате. В принципе по каментам легко разобраться.

Чуть не забыл. В TEST дизассемблирован запуск бейсиковской COM-программы. Очень интересный кстати, с подготовкой биоса и интерпритатора бейсика.
47075
47076

hantarex
27.03.2014, 12:17
вопрос - vesta.idb - это слепок памяти с эмулятора? как вы его получили?

demetrius2003
27.03.2014, 12:25
Вот, очередная порция - уже процентов 10-15 сделано. Короче ещё очень много сделать надо. И дальше становится сложнее.

esl
27.03.2014, 14:24
вопрос - vesta.idb - это слепок памяти с эмулятора? как вы его получили?

idb - это база для IDA
http://rutor.org/torrent/125774/ida-pro-advanced-v6.1-hexrays-x86-decompiler-v1.5-2011-pc

hantarex
27.03.2014, 14:52
то, что файл для иды - это понятно:) в нем пзу+озу вместе, мне интересно - как получили такой файл?

demetrius2003
27.03.2014, 15:22
А вот вопрос! Сюда заглядывает автор универсального эмулятора? Было бы неплохо добавить на панель эмулятора состояние светодиодиков Суровских. И нигде не могу раскладку клавиатурную найти (спецклавиши).

ivagor
27.03.2014, 15:23
demetrius2003, если за rst 1 идет символ с кодом <80h, то ПМСМ нагляднее показывать его именно как символ. Ну или в комментарии символ указать.

DemonId7
27.03.2014, 15:25
Взял bios с эмулятора. В иде "отобразил" его на адресное пространство в 64 кб, как и на настоящей машине. Код, который при инициализации переносится из биоса в ОЗУ, переносил макросами самой иды. Макросы в аттаче, сразу как то забыл про них.
47089

demetrius2003
27.03.2014, 15:37
demetrius2003, если за rst 1 идет символ с кодом <80h, то ПМСМ нагляднее показывать его именно как символ. Ну или в комментарии символ указать.

Принято! Буду править. Сейчас стараюсь комментариев как можно больше писать. Чтобы ничего не забылось. Кстати! Кто знает, есть ли в Иде такая фишка (вот в Java есть!) - создавать документацию из комментариев? А то получится, сейчас несколько месяцев на раскопки уйдёт, а потом ещё всё это в Ворд переносить!

esl
27.03.2014, 15:47
Взял bios с эмулятора. В иде "отобразил" его на адресное пространство в 64 кб, как и на настоящей машине. Код, который при инициализации переносится из биоса в ОЗУ, переносил макросами самой иды. Макросы в аттаче, сразу как то забыл про них.
47089

в иде стандартно есть idc\memcpy.idc
оно спрашивает From, To, Size
удобно ;)

demetrius2003
01.04.2014, 12:51
Исправил все RST1, разобрался с токенами. Начинаю ковыряться в процедурах работы с плавающей точкой.

demetrius2003
02.04.2014, 12:05
Новая порция. Теперь только HTML и LST файлы. Откомментированы следующие операторы Бейсика: PSET, PRESET, POKE, PEEK, CLS, COLOR, SCREEN, LINE. Посмотрите, как красив COLOR! Вообще дизассемблирование этого ПЗУ приносит некоторое удовольствие. Уместить такое в 16 кБ кода! Это вам не дистрибутив винды в 4ГБ! Ну, и первые же комментарии дали свои плоды. Вот, к примеру, как нарисовать линию из машинного кода:



org 5000h
5000 3E 02 mvi a,2 ;режим 2
5002 CD 6D 28 call 286dh ;call SETMODE2
5005 CD C6 17 call 17c6h ;call CLS
5008 21 8F FD lxi h, 0fd8fh ;адрес PSETC
500B 3E 07 mvi a,7 ;заносим в А 7 цвет
500D 77 mov m, a ;в переменную PSETC записываем 7 цвет
500E 23 inx h ;теперь HL=X1
500F 3E 0A mvi a,10 ;первая точка будет с координатами (10,10)
5011 77 mov m, a ;X1=10
5012 23 inx h ;теперь HL=Y1
5013 77 mov m, a ;Y1=10
5014 3E 14 mvi a,20 ;вторая точка будет с координатами (20,20)
5016 23 inx h ;теперь HL=X2
5017 77 mov m, a ;X2=20
5018 23 inx h ;теперь HL=Y2
5019 77 mov m, a ;Y2=20
501A CD 08 19 call 1908h ;call LINE_ASM
501D C3 1D 50 l: jmp l

Labels:
l 501D

Memory dump:
5000: 3E 02 CD 6D 28 CD C6 17-21 8F FD 3E 07 77 23 3E >..m(...!..>.w#>
5010: 0A 77 23 77 3E 14 23 77-23 77 CD 08 19 C3 1D 50 .w#w>.#w#w.....P

Так что не стесняемся, набираем дамп с адреса &h5000, даём команду x=usr(&h5000) и лицезреем линию.

demetrius2003
09.04.2014, 11:30
Пока с данной работой затишье. И ещё на недельку это затишье продлится. Связано это с тем, что сел я на SAP R3 и пока не въеду в него, остальное не имеет смысла. А пока вот бонус - Однопроходовый кроссассемблер.
Им я компилю примерчики. Если кто посмотрит, отбетатестирует, буду благодарен.
Итак:
Все числа - шестнадцатеричные.
Если параметр не может быть переведён в шестнадцатеричное число, то он считается меткой.
Директивы:
DB <байт>
DW <слово>
DS <строка> (между DS и собственно строкой - 1 символ, и лучше чтобы это был пробел)
END бросаем всё и уходим отсюда
Пользоваться просто:
onepassa <имя.asm> <имя.bin> <ORG>
Все параметры обязательны! ORG - шестнадцатеричный!
Спецсимволы:
Пробел и табуляция - игнорируются
Точка с запятой - справа от неё идёт комментарий
Двоеточие - слева от неё идёт имя метки
Что-то наверняка забыл. Что-то как всегда глючит. Писалось в три захода в течении обеденных перерывов.
Работает. В архиве - сырок.

artyr_n
09.04.2014, 17:01
artyr@Suxoy:~/asm/tmp1$ gcc onepassa.c
onepassa.c: В функции «main»:
onepassa.c:124:7: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char **» [-Wformat]
onepassa.c:132:4: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char **» [-Wformat]
onepassa.c:270:5: предупреждение: format «%s» expects argument of type «char *», but argument 2 has type «char **» [-Wformat]
onepassa.c:298:5: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char **» [-Wformat]
onepassa.c:304:5: предупреждение: format «%s» expects argument of type «char *», but argument 3 has type «char **» [-Wformat]
artyr@Suxoy:~/asm/tmp1$ ls
a.out onepassa.c
artyr@Suxoy:~/asm/tmp1$ ./a.out
OnePassA v.01
Ошибка сегментирования


видимо из за отсутствующих параметров

содержимое test.asm


jmp start

start:
mov a,h

end




artyr@Suxoy:~/asm/tmp1$ ./a.out ?
OnePassA v.01
Usage: onepassa <INFILENAME> <OUTFILENAME> <HEXORG>
artyr@Suxoy:~/asm/tmp1$ ./a.out test.asm test.bin 100
OnePassA v.01
ORG=256 (&h100)
Ошибка сегментирования
artyr@Suxoy:~/asm/tmp1$

demetrius2003
09.04.2014, 18:31
Нет. Это не из-за отсутствующих параметров. Это из-за того, что Вы собираете под gcc. У меня прожка скомпилена Turbo C 2.0. Там всё ОК. Версия, которая собирается под MinGW (а, следовательно, соберётся и под gcc) есть, но на работе. Завтра выложу.

demetrius2003
10.04.2014, 07:05
Вот версия, которая компилится и под Turbo C и под MinGW (gcc версии 4.2.1-sjlj (mingw32-2)). Собственно отличие в том, что gcc не переваривает конструкции типа:


strcpy((char *)tLab[i].Lab, 0x00);

В Turbo C всё хорошо, а вот gcc этот код компилит, но при выполнении всё крашится.
Также исправил некоторые моменты и мелкие ошибки типа getc вместо fgetc и т. д.
В архиве сырок и дла exe 16 и 32 бит.

demetrius2003
16.04.2014, 16:04
Доброго дня!
Ещё немного работы. На сей раз разобрал и дополнил следующие операторы и функции: AUTO, RUN, GOTO, RETURN, DATA, REM, CONT, STOP, RESTORE, STRIG, STICK, END, CSRLIN, LLIST, LPRINT, POS. Комментирование некоторых из них пока поверхностное, т.к. многие уходят далеко в главные циклы интерпретарора. Там много неясностей и неизвестностей. К примеру, процедуры из ряда MAINLOOP и AUTOTR очень разнообразны, поэтому дополнять их буду по мере продвижения вперёд. Так же продолжаю ковырять плавающую точку и её форматы. Разобрал принцип работы операторов. Он вкратце таков:
- во входной точке в процедуру имеем следующее состояние регистров:
На примере команды AUTO:
A - первый байт первого параметра и ноль, если параметров нет
BC=PC - адрес обрабатываемой команды (расположение её в ПЗУ - AUTO)
DE - адрес обрабатываемой команды в таблице команд + 1 (_AUTO + 1)
HL - адрес буфера ввода-вывода + 2 (IOBUF+2)
SP - стек :)
Иногда возврат в главный цикл происходит просто по команде из разряда jmp MAINLOOP3, иногда адрес возврата явно ложится на стек, иногда возврат осуществляется штатно командой ret. Очень много "двойного" кода, когда трёхбайтовая команда одновременно является двух или однобайтовой, если сделать jmp на её начало+1 байт (или начало+2 байта соответственно), о чём уже упоминалось.
Самый лакомый кусок - научится работать с плавающей точкой из машинного кода. Как только разберу форматы чисел, так сразу приступлю к функциям типа SIN, COS. На этом пока всё. Общий объём работы оцениваю как примерно 40-45 процентов.

ivagor
16.04.2014, 16:45
С большим интересом жду разбора плавающеточечных процедур.

demetrius2003
18.04.2014, 16:10
Под конец рабочей недели как всегда кусочек нового. Разобрал и дополнил функции: (тут должен быть списочек, но бумаженция зашкерилась где-то на работе, посему будет попозже).
Кода откомментировано и разобрано/исправлено очень много. В основном это дебри интерпретатора. Но это надо пройти! Это вносит ясность. Не смотря на то, что свой минимум я отработал (плавающая точка сдалась, графика и ввод-вывод есть), я пойду до конца и откомменчу всё ПЗУ.

На десерт - сладкое. Пример работы с плавающей точкой из ассемблера.



org 5000h
5000 21 22 50 lxi h, num1; грузим в HL адрес строки с первым числом
5003 CD C6 13 call 0x13c6; FIN - переводим строку в FACCUM
5006 21 16 50 lxi h, cnt1; запоминаем на стеке адрес, куда надо вернуться после сложения чисел
5009 E5 push h
500A CD F2 12 call 0x12f2; FPUSH - толкаем первое число на стек
500D 21 2A 50 lxi h, num2; грузим в HL адрес строки со вторым числом
5010 CD C6 13 call 0x13c6; FIN - переводим его в FACCUM
5013 C3 4C 14 jmp 0x144c; FADD - складываем FACCUM и BCDEONSTK, результат остаётся в FACCUM
5016 CD 70 14 cnt1: call 0x1470; FOUT - выводим FACCUM в строку (буфер строки расположен в FBUFFER)
5019 21 3D F9 lxi h, 0xf93d; FBUFFER
501C 3E 02 mvi a, 2; выводим строку с текущего положения
501E CD 50 00 call 0x0050; TRETLINE - печатаем содержимое FBUFFER
5021 C9 ret
5022 31 2E 32 33 num1 db "1.234E2"
. . .
5026 34 45 32
5029 00 db 0x0
502A 33 2E 36 35 num2 db "3.654E1"
. . .
502E 34 45 31
5031 00 db 0x0

Labels:

cnt1 5016num1 5022num2 502A

Memory dump:
5000: 21 22 50 CD C6 13 21 16-50 E5 CD F2 12 21 2A 50 !"P...!.P....!*P
5010: CD C6 13 C3 4C 14 CD 70-14 21 3D F9 3E 02 CD 50 ....L..p.!=.>..P
5020: 00 C9 31 2E 32 33 34 45-32 00 33 2E 36 35 34 45 ..1.234E2.3.654E
5030: 31 00 - 1...............


Пояснения по коду. Обратите внимание, как неудобно написан код. Перед тем как вызвать процедуру FPUSH мы сохраняем на стек адрес, куда надо будет вернуться после того, как отработает FADD, а саму процедуру FADD вызываем не через CALL, а через JMP. Связано это вот с чем. Если просто сделать CALL FPUSH, а затем тут же CALL FADD, то второй CALL положит на стек в дополнение к числу с плавающей точкой адрес возврата (в нашем случае cnt1), а потом внутри FADD произойдёт снятие верхушки стека, которое интерпретатор посчитает числом с плавающей точкой, что конечно же неверно. Мало того что числа не сложатся, мы ещё и вернёмся вникуда по адресу, который суть оставшаяся часть числа с плавающей точкой. В этом интерпретаторе всё сделано именно таким образом. Это удобно для интерпретации, но неприемлемо для программиста на ассемблере. Поэтому с сегодняшнего для я буду вести Вордовский документ, в котором буду описывать примеры программирования на ассемблере и вообще писать заметки по архитектуре Суры. Для этого в дизассемблерный листинг я буду дополнительно вводить фиктивные метки с суффиксом _ASM. Для самого интерпретатора они не нужны, а вот нам - очень даже пригодятся. В большинстве случаев они будут расположены глубоко внутри процедур и функций, но вызывая их мы будем иметь более компактный и более понятный код. Ведь всё-таки процедуры ПЗУ заточены под Бейсик-интерпретатор. Но, не смотря на это, в ПЗУ очень много кусочков кода, используя которые мы сможем сильно упростить себе программирование! В результате должна получить брошюра, в которой будет всё, что нужно для полноценной писанины на ассемблере под ПК8000.

demetrius2003
19.04.2014, 11:23
Друзья!
Как можно автоматизировать процесс переноса скомпиленного кода в эмулятор? Вот сейчас я ассемблером собираю прожку, делаю дамп этой проги, открываю в эмуляторе дебагер, иду в дампе дебагера на адрес &h5000 и забиваю вручную байты со своего дампа. И так каждый раз! Если что-то меняется в начале программы, то дамп приходится перенабирать заново, что очень неудобно! Программки то становятся всё длиннее и длиннее!

DemonId7
19.04.2014, 12:01
Компилируй в CAS формат и затем в эмуляторе:
BLOAD "Имя", R

demetrius2003
19.04.2014, 13:43
Получается! Только bload "tstprg" без R, а далее x=urs(&h5000)



ORG 0x5000-0x26
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DB 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0
DB 'tstprg'
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DW START, ENDE, START
START: lxi h, num1; грузим в HL адрес строки с первым числом
call 0x13c6; FIN - переводим строку в FACCUM
call 0x130d; FCOPYTOBCDE - переводим FACCUM в BCDE формат
push b; сохраним BCDE временно
push d
lxi h, num2; грузим в HL адрес строки со вторым числом
call 0x13c6; FIN - переводим его в FACCUM
pop d; восстановим BCDE
pop b
call 0x1082; FADD2 - складываем FACCUM и BCDE, результат остаётся в FACCUM
call 0x1470; FOUT - выводим FACCUM в строку (буфер строки расположен в FBUFFER)
lxi h, 0xf93d; FBUFFER
mvi a, 2; выводим строку с текущего положения
call 0x0050; TRETLINE - печатаем содержимое FBUFFER
ret
num1 db "1.234E2"
db 0x0
num2 db "3.654E1"
db 0x0
ENDE:
END


Это наш пример сложения чисел, только под CAS и без извратов со стеком и JMP!

demetrius2003
19.04.2014, 17:05
А вот тут уже загвоздка. Две программы, которые должны делать одно и то же. Но ассемблерный вариант рисует две лишние точки (не там) и смещает часть графика.

Первая:


10 SCREEN2
30 LINE(0,96)-(255,96),12
40 LINE(128,0)-(128,192),12
100 FOR X=0 TO 255
110 Y=10*SIN(X/10)+96
120 PSET(X,Y),3
200 NEXT
1000 IF INKEY$="" GOTO1000


Вторая:


ORG 0x5000-0x26
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DB 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0
DB 'tstprg'
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DW START, ENDE, START
START: mvi a, 2
call 0x286d; SETMODE2
lxi h, 0xfd8f; адрес PSETC
mvi m, 12; в переменную PSETC записываем 12 цвет
inx h
mvi m, 0; X1=0
inx h
mvi m, 96; Y1=96
inx h
mvi m, 255; X2=255
inx h
mvi m, 96; Y2=96
call 0x1908; LINE_ASM - рисуем ось абсцисс
lxi h, 0xfd90; адрес X1
mvi m, 128; X1=128
inx h
mvi m, 0; Y1=0
inx h
mvi m, 128; X2=128
inx h
mvi m, 192; Y2=192
call 0x1908; LINE_ASM - рисуем ось ординат
lxi h, 0xfd8f; адрес PSETC
mvi m, 3; в переменную PSETC записываем 3 цвет
mvi c, 0; параметр цикла
loop: push b
mov a, c
call 0x12d5; FCHARTOFLOAT - перевод параметра цикла в плавающую точку
call 0x120c; FDIVBYTEN
call 0x1666; SIN
call 0x12b3; FMULBYTEN
call 0x130d; FCOPYTOBCDE - переводим FACCUM в BCDE формат
push b; сохраним BCDE временно
push d
lxi h, ord
call 0x13c6; FIN - переводим строку в FACCUM
pop d; восстановим BCDE
pop b
call 0x1082; FADD2 - складываем FACCUM и BCDE, результат остаётся в FACCUM
call 0x1367; FASINTEGER переводим FACCUM в целое
lxi h, 0xfd90; адрес X1
pop b
push b
mov m, c
inx h
mov m, e
call 0x182c; PSET_ASM
pop b
inr c
mov a, c
cpi 0x0
jnz loop
xra a
lock: call 0x007c; BUFBT2A - IF INKEY$=""
cpi 0x0
jz lock
ret
ord: db "96"
db 0x0
ENDE:
END


Довольно интересный артефакт вылазит. Буду разбираться. Картинки и CASы - во вложении.

demetrius2003
19.04.2014, 18:48
А! Забыл добавить!
Первая программка:
load"sinus"
RUN
Вторая программка:
bload"tstprg"
x=usr(&h5000)

---------- Post added at 21:48 ---------- Previous post was at 20:43 ----------

Всё! Разобрался!
Исправленный вариант, дающий картинку 1:1 с Бейсиковской!



ORG 0x5000-0x26
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DB 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0
DB 'tstprg'
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DW START, ENDE, START
START: mvi a, 2
call 0x286d; SETMODE2
lxi h, 0xfd8f; адрес PSETC
mvi m, 12; в переменную PSETC записываем 12 цвет
inx h
mvi m, 0; X1=0
inx h
mvi m, 96; Y1=96
inx h
mvi m, 255; X2=255
inx h
mvi m, 96; Y2=96
call 0x1908; LINE_ASM - рисуем ось абсцисс
lxi h, 0xfd90; адрес X1
mvi m, 128; X1=128
inx h
mvi m, 0; Y1=0
inx h
mvi m, 128; X2=128
inx h
mvi m, 192; Y2=192
call 0x1908; LINE_ASM - рисуем ось ординат
lxi h, 0xfd8f; адрес PSETC
mvi m, 3; в переменную PSETC записываем 3 цвет
mvi c, 0; параметр цикла
loop: push b
xra a
mov d, c
mvi e, 0x0
mvi b, 0x90
call 0x12da; LONGINT - перевод параметра цикла в плавающую точку
call 0x120c; FDIVBYTEN
call 0x1666; SIN
call 0x12b3; FMULBYTEN
call 0x130d; FCOPYTOBCDE - переводим FACCUM в BCDE формат
push b; сохраним BCDE временно
push d
lxi h, ord
call 0x13c6; FIN - переводим строку в FACCUM
pop d; восстановим BCDE
pop b
call 0x1082; FADD2 - складываем FACCUM и BCDE, результат остаётся в FACCUM
call 0x136d; FASINTEGER_ASM переводим FACCUM в целое
lxi h, 0xfd90; адрес X1
pop b
push b
mov m, c
inx h
mov m, e
call 0x182c; PSET_ASM
pop b
inr c
mov a, c
cpi 0x0
jnz loop
xra a
lock: call 0x007c; BUFBT2A - IF INKEY$=""
cpi 0x0
jz lock
ret
ord: db "96"
db 0x0
ENDE:
END


Внёс два исправления. Первое - FCHARTOFLOAT видит аккумулятор как знаковое число, поэтому в картинке был излом - после 128 шло -127. Второе - использование FASINTEGER_ASM убрало артефакт в виде точки.

demetrius2003
06.05.2014, 09:10
Дополнил прилично комментариев. Теперь в архиве будет ещё и map файл и обещаный Вордовский документ. Документ буду расширять по мере продвижения вперёд.

demetrius2003
18.08.2014, 16:47
Э-э Кхм! С чего-бы начать? С самого главного, что-ли. Я снова в строю! Жизнь устроила мне серию бросков через бедро. Сейчас попытаюсь продолжить, то что начал.

DemonId7
21.08.2014, 20:05
Хорошо, что все хорошо кончается :) Ждем с нетерпением!

XobbiMan
25.08.2014, 01:32
Жизнь, она такая, бывает и забрасывает ещё выше и без парашюта, и отстаётся только очень часто махать руками и зубами хвататься за облака...


demetrius2003, ждем новые примеры - очень занятное чтиво.

demetrius2003
04.02.2015, 08:20
Прошу обратить внимание - http://zx-pk.ru/showthread.php?p=779507
Если кто поможет - буду всенепременно благодарен! Вручную набирать тысячи текста утомляет. Даже копипаста сотен комментов в разные места с разных мест - ужас ещё тот.

hantarex
05.02.2015, 11:39
а в чем конкретно заключается помощь?

demetrius2003
06.02.2015, 15:44
Да думал, что кто-нибудь знает, как (скриптом, или как-нить ещё) можно выдернуть из idb-базы метки с комментариями. Да видимо простых путей нет - начал всё вручную перелопачивать.

DemonId7
06.02.2015, 22:28
Я вроде предлагал програмку для выдирания каментов из lst-файлов? Так нужна или нет?

demetrius2003
07.02.2015, 07:16
Можно, в принципе. Если не затруднит.

demetrius2003
17.02.2015, 09:11
Пока проистекает нудное причёсывание листинга дизассемблера, переосмысливание некоторых моментов и написания руководства я решил подбрасывать дровишек в эту "топку", чтоб не завяла тема и чтоб люди не скучали. Поэтому потихоньку буду выкладывать заметочки, которые пишу для себя при исследовании ПЗУ. Итак! Заметка намберван. "Переменные, переменные!"


Что будет, если сразу после загрузки компьютера напечатать:
PRINT ABC
Компьютер ответит:
0
Оk
Вот так вот просто, незатейливо. Это, конечно, может породить кучу проблем. Но с другой стороны, это довольно-таки удобно. Теперь наберём:
LET ABC=123
PRINT ABC
123
Ok
Очевидные вещи! Но, что здесь происходит? Что такое это ABC, и где она хранится? Разберёмся по порядку.
Переменные с точки зрения Бейсика могут быть двух видов - числовые и строковые. По адресу ENBASPRG находится системная переменная, которая указывает на конец Бейсик программы. Вот тут то и начинается область переменных. После включения компьютера эта область начинается с адреса &h4003. По адресу BGARRAY располагается системная переменная, которая хранит адрес начала области массивов (с массивами разберёмся позднее). А вот по адресу VAR_TOP находится системная переменная, которая хранит адрес конца области переменных. Таким образом, все наши переменные располагаются в области начинающейся с ENBASPRG и заканчивающейся на VAR_TOP. Под каждую переменную отводится 6 байт. Рассмотрим форматы переменных:
<Имя (2 байта)> <Данные (4 байта)>
1. Числовые переменные.
Два байта - определяют имя переменной. Формируются следующим образом. Из имени переменной берётся два первых символа и меняются местами. Таким образом для нашей переменной ABC эти два байта будут выглядеть как BA. Отсюда следует неутешительный вывод - имя переменной может состоят из скольки угодно букв, но значимыми будут только первые две! Т. е. переменные ABC и ABD для Бейсика - абсолютно одно и то-же. Исключение составляют строковые переменные (AB и AB$ - разные вещи).
Четыре байта - собственно число в формате BCDEINMEM.
2. Строковые переменные.
Два байта - также определяют имя переменной и формируются по тем же правилам, что и для числовых переменных. Единственное - после преобразований в первом байте определяющем имя переменной старший бит устанавливается в 1. Это и говорит о том, что переменная строковая!
Два байта - Длина строки. Сначала идёт младший байт, потом старший.
Два байта - адрес, по которому собственно и располагается строка. Адрес этот должен лежать в области с BGSTRAR по ENSTRAR. Строки в памяти располагаются от старших адресов к младшим. Видимо с целью какой-то там оптимизации. Соответственно, как и у длинны - младший байт адреса первый, за ним старший байт адреса.
Имея эту информацию уже довольно-таки несложно написать парсер переменных. Хранение же переменных получается довольно компактным.
Рассмотрим теперь ситуацию, когда надобно создать переменную из машинного кода и затем использовать её где-нибудь, например в печати оператором Бейсика PRINT.
Вот код, создающий новую (или работающий со старой, если есть) переменную:



ORG 0x5000-0x26
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DB 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0, 0xD0
DB 'tstprg'
DB 0x1F, 0xA6, 0xDE, 0xBA, 0xCC, 0x13, 0x7D, 0x74
DW START, ENDE, START
START:
lxi h, name; грузим в HL адрес имени переменной
call 0x0b1a; GETVAR
push de; тут в DE - адрес содержимого вновь созданной переменной
lxi h, numb; грузим в HL адрес нашего числа
call 0x13c6; FIN - переводим строку с числом в FACCUM
pop hl; теперь адрес содержимого нашей переменной в HL
call 0x1319; FCOPYTOMEM - копируем FACCUM в память по адресу в HL
ret
numb db "1.234E2"
db 0x0
name db "AB"
db 0x0
ENDE:
END


Ну вот! Программа наподобие:


10 X=USR$(&H5000)
20 PRINT AB


Выдаст следующее:
123.4

demetrius2003
27.03.2015, 06:47
Доброго всем дня!
Выложил очередную поправленную версию. Теперь в архиве:
- Вордовский документ (написание в самом разгаре)
- Непосредственно IDB
- Тексты MAP, LST и HTML

В данный момент идёт написание примеров. Всё будет добавляться в вордовский документ по мере написания. Также планирую внести ряд изменений в IDB, т. к. есть несколько пока нерешённых моментов. Самый болезненный из них - работа с лентой. Если всяческие примеры можно отработать на эмуляторе, то с мафоном такие фокусы не пройдут. Тут нужен вдумчивый подход и куча времени. Пока на этом всё.

esl
27.03.2015, 15:44
это микрософт бейсик все-таки а не альтаир

я тут где-то на форуме проводил исследование родословной ...
http://zx-pk.ru/showthread.php?t=23483&highlight=%E1%E5%E9%F1%E8%EA

это наследник Microsoft 8K BASIC Ver 3-2 (по крайней мере тот что SURA)

Microsoft 8K BASIC Ver 3-2 -> Micro80 -> RK86 -> SURA

demetrius2003
29.07.2016, 18:58
Ку!
А времени то прошло! Маммая! Чуть поправил дизассемблерный листинг и вордовский документ. Но надо текста много писать. Не успеваю:(

scaraby
20.10.2016, 18:32
Столкнулся с различием между эмулятором и реальным компом. Речь про порт 86h (бит d4), "ГАШ" гашение изображения. В эмуляторе EMU нулевое значение данного бита приводит к чёрному фону и чёрному растру, а в реальном компе в режиме 0 и 2 фон остаётся без изменений, а растр "зануляется", а в режиме 1 происходит срыв растра, глюк и восстановление изображения в первоначальное состояние. Полез посмотреть в принципиальную схему, так там такой лес нагородили ради этого, вместо того, чтобы "ГАШ" подать на D13.2. Там и 5 нога даже свободна. Ну, стало бы нулём зажигаться изображение, а единицей гаситься - не такая уж беда на этапе разработки.

С моей точки зрения, в эмуляторе всё намного логичнее, чем в реале: 0-нет изображения, 1-есть. Погасил экран, нарисовал картинку, зажёг экран. В реале, в режиме 0 - более-менее, погасил растр, заполнил буфер символами, зажёг растр, но в режиме 2 смешно - погасил растр и получил кучу разноцветных 8-битных полей. Применимость на практике этого - нулевая.

scaraby
31.10.2016, 19:14
Интересное наблюдение. При инициализации D33 (КР580ВВ55А) записывается управляющее слово 81h (10000001b), что, если я ничего не напутал, говорит о том, что выбирается режим 0 (d6,d5=0) для всей микросхемы, для канала A - вывод, B - вывод, С (d4-d7) - вывод и С (d0-03) - ввод. В руководстве пишется, что порт 80h (A) - чтение/запись, 81h (B) - чтение, 82h - запись. Хочу понять, о чём идёт речь? Разработчики ограничивают использование портов в виде рекомендации? Вижу противоречие в настройке режима микросхемы и того, что пишется про порты.

В связи с этим вопрос - а что случится, если 81h порт не читать, а записать туда единицы и начать нажимать кнопки? Смотрю схему и рассуждаю, что если канал B будет выдавать высокий уровень напряжения, то при нажатой кнопке через один из диодов V1-V10, начнёт течь ток в аккурат в дешифратор D1 (диоды и D1 - это на плате клавиатуры). Не начнётся ли соревнование между D33 и D1 клавиатуры на предмет, кто первый расплавится? Или я не совсем верно понимаю, как работает ВВ55 и режимы чтение/запись каждого из каналов как-то ещё определяются, кроме записи управляющего слова?

cy6
26.02.2023, 00:27
Может быть кто-то знает, что означает аббревиатура "СНД" в схеме Суры?
СНД0..СНД7 (CD0..CD7) "шина" байтов цвета, наверное. А сигнал СНД28 (SND28), это строб для нее (см. DD28 и DD29 sys001).
Но как именно расшифровываются буквы "СНД"?

Также, человек на видео (https://youtu.be/3AGTIIskvSU?t=2287) утверждает, что РУ2 адресуются портами A0..BF на запись.
Так ли это? В приведенном в теме дизассемблере не удалось найти это, может просто искала плохо.

ivagor
26.02.2023, 07:05
На форуме этот вопрос много раз упоминался (задолго до видео), в emu озу цвета РУ2 реализовано с самого начала поддержки ПК8000 (2009, если не ошибаюсь)
port[A0-BF]=vid.tcolor
иначе режим SCREEN 1 бы не работал.
Пишет в РУ2 фрагмент кода с адреса F859h. Он туда переписывается при старте фрагментом с 295E по 2969. В озу переписывается для того, чтобы модифицировать номер порта в out от A0 до BF.

cy6
26.02.2023, 09:29
Пишет в РУ2 фрагмент кода с адреса F859h. Он туда переписывается при старте фрагментом с 295E по 2969. В озу переписывается для того, чтобы модифицировать номер порта в out от A0 до BF.
Ага, спасибо.
Вот почему он не нашелся, он не дизассемблирован :)


ROM:00B3 INITVRAM2RAM_: .db 0F3h, 0CDh, 24h, 0F8h, 78h, 0B1h, 7Eh, 0CAh, 11h, 0F8h
ROM:00B3 ; DATA XREF: START+2964o
ROM:00B3 .db 12h, 13h, 23h, 0Bh, 0C3h, 4, 0F8h, 0CDh, 16h, 0F8h ; Инициализация процедур VRAM2RAM.
ROM:00B3 .db 0FBh, 0C9h, 0F5h, 0CDh, 8Bh, 0F8h, 0D3h, 80h, 0F1h ; Этот блок переносится в ОЗУ по адресу &hF800
ROM:00B3 .db 0C9h, 0F5h, 3Eh, 0FCh, 0C3h, 27h, 0F8h, 0F5h, 3Eh
ROM:00B3 .db 0FFh, 0F5h, 0DBh, 80h, 32h, 7Dh, 0FDh, 0F1h, 0C3h
ROM:00B3 .db 1Ah, 0F8h, 0F3h, 0CDh, 24h, 0F8h, 7Eh, 0C3h, 11h, 0F8h
ROM:00B3 .db 7Dh, 0D6h, 0, 6Fh, 7Ch, 0DEh, 0, 67h, 78h, 0DEh, 0
ROM:00B3 .db 47h, 3Eh, 0, 0DEh, 0, 0C9h, 0D3h, 0, 0C9h, 32h, 51h
ROM:00B3 .db 0F8h, 0DBh, 0, 0C9h, 0D3h, 0, 0C9h, 0C3h, 0F9h, 4
ROM:00B3 .db 0CDh, 24h, 0F8h, 47h, 32h, 62h, 0F8h, 7Eh, 0D3h, 0
ROM:00B3 .db 23h, 78h, 3Ch, 0FEh, 0C0h, 0C2h, 5Ch, 0F8h, 0C3h, 16h
ROM:00B3 .db 0F8h, 0C9h, 0C9h, 0C9h, 0D5h, 11h, 0, 0, 19h, 0D1h
ROM:00B3 .db 0CEh, 0, 0C9h, 52h, 0C7h, 4Fh, 80h, 0CDh, 0AAh, 2
ROM:00B3 .db 0E9h, 0C9h, 52h, 4Eh, 0C4h, 4Ch, 4Fh, 0C7h, 45h, 58h
ROM:00B3 .db 3Eh, 1, 32h, 0EBh, 0FDh, 3Ah, 7Dh, 0FDh, 0C9h

cy6
26.02.2023, 17:34
Mick, это похоже вопрос к Вам, в большей степени.
Потому что в оригинале нету сигналов СНД0..СНД7, точнее они там упоминаются только как CD0..CD7, вроде бы.
И, кстати, очень интересно что внезапно английский язык.78532

Появилось два варианта расшифровки.
Для заводского СНД28 - строб нулевых данных для микросхемы DD28.
Для СНД0..СНД7 - совмещенный набор данных (совмещенные видео данные, точки+цвета).


Может быть кто-то знает, что означает аббревиатура "СНД" в схеме Суры?
СНД0..СНД7 (CD0..CD7) "шина" байтов цвета, наверное. А сигнал СНД28 (SND28), это строб для нее (см. DD28 и DD29 sys001).
Но как именно расшифровываются буквы "СНД"?

Mick
26.02.2023, 17:45
Потому что в оригинале нету сигналов СНД0..СНД7, точнее они там упоминаются только как CD0..CD7, вроде бы.

Что то я не понял вопроса. Посмотрел свою схему - там только СD0...CD7 и SND28

cy6
26.02.2023, 17:50
Что то я не понял вопроса. Посмотрел свою схему - там только СD0...CD7 и SND28

Это же ваша схема (http://micklab.ru/file/pk8000/pk8000_sys006_pcb00.rar)?

78534

Посмотрите на разъемы между платами. :)

Mick
26.02.2023, 18:33
Посмотрите на разъемы между платами.

А разъемы я то и не смотрел :)

Сейчас не вспомню почему я так их назвал. Либо была какая то мысль, но она давно потеряна. В большинстве случаев, когда нет официальных названий, я называю как получится (в голову взбредет), но стараюсь смысл оставлять.

cy6
26.02.2023, 23:49
Mick, обнаружила очередную оказию. Скорее всего унаследованную еще от оригинальной схемы.

Сигналы SYMB32/ и SYMB40/, они не инверсные. :)
То есть они SYMB32 и SYMB40.

demetrius2003
25.10.2023, 14:24
Всем добра!
Тут эта. Дело такое. Я то ещё жив оказывается)) И поскольку снег выпал - на душе ностальгия. Опять. Попала мне в руки старая виртуалка, а на ней sura.idb и все работы с этим связанные. Вобщем буду я перебирать дизассемблер свой. Много там мест пропущенных. Сновья дизассемблировать не буду. А вот доделать то, чего не сделано было ранее надо обязательно. Посему ежели у кого есть пожелания и/или предложения - пишите!

cy6
27.10.2023, 23:15
Всем добра!
Какое счастье, Вы вернулись. :)

Кое где процедуры не прокомментированы, например работа с внешними разъемами.

- - - Добавлено - - -


ROM:2989 mvi a, 0F4h ; 'Ї'
ROM:298B out 80h
ROM:298D call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко!
ROM:2990 mvi a, 0F8h ; '°'
ROM:2992 out 80h
ROM:2994 call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко!
ROM:2997 mvi a, 0FCh ; '№'
ROM:2999 out 80h
ROM:299B call PCHL4002 ; Тут вообще муть несусветная! Но интересно жутко!

На адреса 4000-7FFF подключаются три разные страницы: две разъема и одна ОЗУ.

- - - Добавлено - - -


ROM:24C6 ; =============== S U B R O U T I N E =======================================
ROM:24C6
ROM:24C6 ; Тут вообще муть несусветная! Но интересно жутко!
ROM:24C6
ROM:24C6 PCHL4002: ; CODE XREF: START+298Dp
ROM:24C6 ; START+2994p ...
ROM:24C6 lxi d, 4000h
ROM:24C9 ldax d
ROM:24CA cpi 41h ; 'A'
ROM:24CC rnz
ROM:24CD inx d
ROM:24CE ldax d
ROM:24CF cpi 42h ; 'B'
ROM:24D1 rnz
ROM:24D2 inx d
ROM:24D3 ldax d
ROM:24D4 mov l, a
ROM:24D5 inx d
ROM:24D6 ldax d
ROM:24D7 mov h, a
ROM:24D8 pchl
ROM:24D8 ; End of function PCHL4002

Эта процедура проверяет, в подключенном окне, наличие сигнатуры из двух символов 'A' и 'B'.
Если сигнатура найдена, то следующие два байта содержат адрес запуска (LE).

Управление передается командой PCHL, то есть стек не изменяется.
При возврате RET мы попадем в процедуру переключения страниц.
Программа для внешнего модуля должна быть скомпилирована с ORG 4000h.