1 Отредактировано Voldemar0 (08-03-2022 15:03)

Тема: Аппаратный отладчик для Агата

Привет!

Тут начинаю рассказ об устройстве новой железки: аппаратный отладчик для Агата.
На ютуб есть ролик об этом устройстве:
https://youtu.be/qvIa9U1PELw

Основная задача этого устройства: разбирать проги, которые не могут полноценно идти в эмуляторе (тема ЯЗС, тема сетевых карт), либо (типа того, что было с Way In Hell) поведение которых почему-то не совпадает на реале с эмулятором.

С его помощью можно рулить компом: остановить ЦП по запросу, по breakpoint/watchpoint, посмотреть память, трассу последних действий ЦП (перед остановкой), поправить что нибудь в ОЗУ, пройти код по шагам.

С PC взаимодействует через USB, управляется через полноэкранный цветной интерфейс через любую
терминалку. Под Windows это почти хорошо получается через PuTTY, под *NIX - почти идеально через XTerm + cu (а вот популярный MiniCom не вывозит многое).
Интерфейс весь на английском (чтобы не путаться в кодировках при смене терминалки), но в дампах можно видеть все русские буквы (если терминалка умеет) и даже значки, если в терминале поддерживается UTF.

Поддержку мыши делать не стал. Хотя и это было бы возможно.

--

Аппаратный состав: ATMega128 + max240 в качестве ядра.
Матрица обеспечивает стык между совсем не синхронной атмегой и строго синхронной шиной агата.
Ну а мега делает всё остальное.
Также на плате есть pl2303 - UART-USB конвертор.
И SRAM на 32 Кб, которая используется, в основном, только для журнала монитора шины агата.
Она доступна как матрице, так и меге.

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

--

ПО: кривое и косое, писалось на cvAVR. Кривое, потому что:

1) Надо было сперва научиться пользоваться этим зверем (cvAVR), а потом уже писать. Но я пошёл другим путём. Рефакторить пока не хочу, хотя поддержка такого кода несколько сложнее, чем нормального.

2) Изнутри поддержка терминала совсем не похожа на вылизанный оптимальный поток байтиков, как это делают библиотеки ncurses или clang. У меня нет буфера кадра, так что любое обновление перерисовывает, порой, весь экран. Это медленно. Есть оптимизации для частных случаев, иначе было бы совсем плохо. Причина, в основном, в том, что у меги и так озу маловато. С другой стороны - отладчик имеет внешнюю SRAM.... Теоретически, это можно было бы использовать, но вряд ли я это сделаю. Внешняя доступна, по сути, в режиме PIO: требуется вызов отдельных процедур, чтобы прочитать/записать байт. Хотя это всё равно быстрее, чем вывод одного символа на UART.

3) Я так и не попробовал более высокие скорости UART, чем 115200. Хотя pl2303 это позволяет, да и мега, вероятно, не будет против.

На текущий момент занято где-то 32 Кб памяти прог меги.

--

Особый респект: AlexBel за подаренную мегу и разные обсуждения (компиляторов, терминалок, XModem'ов и прочего).

--

Устройство процентов на 80 готово, так что я в этом году планирую снять по нему серию роликов и подробно описать его возможности. Но эти 80% - результат уже примерно года работы (я начал эту тему в конце 2019, но почти на 3/4 следующего года руки не доходили), так что 20% остатка - это тоже могут быть месяц-два-четыре + съёмка/монтаж роликов с демонстрацией - это тоже месяц уйдёт.

Сейчас нужно закончить как раз пошаговый проход, потом, может быть, сделаю ещё shadow memory (возможность подставлять команды процессору из отладчика, минуя основное ОЗУ - например, чтобы изменить или посмотреть значения регистров), ну и немного вылизать UI).

И потестировать всё на семёрке (пока всё делаю на девятке).

ToDo-лист за последний месяц уже стал входить на экран :)), но пока сокращается медленно.

Post's attachments

dsc_1205s.jpg, 76.98 kb, 750 x 368
dsc_1205s.jpg 76.98 kb, 141 downloads since 2021-07-09 

2 Отредактировано Voldemar0 (09-07-2021 20:36)

Re: Аппаратный отладчик для Агата

Скриншоты в XTerm:

Настройки терминала (выбор кодировки, а также отключение-включение некоторых фич)

http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=955&download=0

Модуль тестов ОЗУ
http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=956&download=0

Виртуальный дисплей
http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=957&download=0

Post's attachments

Attachment icon s1.PNG 13.05 kb, 142 downloads since 2021-07-09 

Attachment icon s2.PNG 6.58 kb, 148 downloads since 2021-07-09 

Attachment icon s3.PNG 11.51 kb, 145 downloads since 2021-07-09 

3 Отредактировано Voldemar0 (09-07-2021 20:23)

Re: Аппаратный отладчик для Агата

Немного о механниках, которые тут используются:

Виртуальный дисплей:
Этот модуль, при работающем ЦП, примерно 10 раз в секунду тормозит ЦП и вытаскивает всю видеопамять, затем отрисовывает её в терминале. Работает только если выбран текстовый режим.
Если будет включен графический, то продолжает рисовать последний текстовый.
Вновь получаем двухдисплейный агат ;)

Чтобы не слишком тормозить железку, доступ к ОЗУ включается только на момент захвата одного или двух байт. После этого ЦП снова может работать, а отладчик синтезирует цвет, код символа, отправляет его, ждёт завершения отправки... Так что большой нагрузки на шину это не вызывает,
хотя и будет мешать дисководам. Поэтому на время работы флопа можно отключить обновление.

Чтобы узнать - какой режим ДК выбран - постоянно мониторит шину на предмет доступа к C7xx.
Захватывает значение режима и переключает его в своих внутренностях.


Виртуальная клавиатура:
Поддерживает только латиницу и некоторые УПР-кнопки (включая стрелки и Enter).
Работает одновременно с основным контроллером.
Логика такая: если пришел код от терминалки, то этот код попадает в матрицу, а она начинает слушать обращение к C00x. Перехватывает его, блокирует штатный контроллер, отдаёт код.
Если прога сбрасывает регистр клавиатуры (C01x), то матрица перестаёт вмешиваться в процесс и, таким образом, на следующий запрос к C00x может ответить штатный контроллер клавиатуры.


Тест ОЗУ:
Позволяет тестировать девятку и семёрку по внутреннему скрипту либо задать интервал адресов и ещё несколько условий для custom-теста.

Алгоритм тестирования: от заданного ключа генерируется псевдослучайная последовательность (алгоритм arcfour) и ей заполняется регион (для девятки, например, память делиться на 4 региона, для семёрки их 3). Затем ГСП вновь инициализируется тем же ключом и читает этот же регион, сравнивая с псевдослучайной последовательностью.
Перед переходом к следующему региону синтезируется новый ключ из старого.
После прохода по всем регионам тест повторяется, до бесконечности перебирая всё новые и новые ключи. Ключ, с которого начался тест, храниться в EEPROM отладчика и, таким образом, можно полностью повторить тест с теми же значениями.

Если включить высшую графику на реальном дисплее агата - выглядит забавно.
128 кб девятки проходят полный круг где-то за 2-4 секунды, после чего экран
заливает новой картинкой. ГСП работает очень чисто, фон получается довольно точно серым.
Никаких "периодичностей" глазом не наблюдается.

Я не ставил целью сделать этот тест сопоставимым со штатными тестами. Задача была хоть как-то проверить ОЗУ в случае отказа материнки (по неизвестной заранее причине).

Так как тест работает внутри отладчика, можно даже экспериментировать с обновлением DRAM.
Например, коротнуть кварц ДК и посмотреть, при каком интервале между записью и чтением память начнёт сыпаться (у меня получалось около одной секунды, но разные микрухи довольно по разному себя ведут).

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

4 Отредактировано Voldemar0 (09-07-2021 20:30)

Re: Аппаратный отладчик для Агата

Трасса выполненных команд и управление ЦП:

При работающем ЦП отладчик мониторит системную шину агата, включая
ША, ШД и служебные сигналы (!RES, !NMI, !IRQ, R/!W, БЛК ОЗУ, БЛК ПЗУ, Apple-mode, а также - отдельным проводником - сигнал Sync ЦП).

Таким образом на каждый такт шины собирается 32 бита данных.
Они скидываются в SRAM отладчика, в кольцевой буфер, объёмом 64 записи (256 байт).

Тут два скриншота: выполенение сисмона.

На первом корректные значения доступа к ОЗУ, но коды команд прочитаны неправильно.
Это происходит из-за того, что сисмон работает из ПЗУ, но оно недоступно устройствам в слотах.

На втором скриншоте всё то же самое, но сисмон переписан в ОЗУ
(* F000<F000.FFFFM   C082:0 )
и исполняется оттуда.

Виден цикл ожидания кнопки на клавиатуре и инкремент счётчика, который отвечает за моргание курсора (сисмон девятки).

Последняя серая строчка "uncomplete" указывает на то, что в этот такт матрица остановила процессор, поэтому известен только адрес, который он выставил на шину, но обмена данными не произошло.

Post's attachments

s5.png, 14.21 kb, 690 x 662
s5.png 14.21 kb, 137 downloads since 2021-07-09 

s6.png, 15.27 kb, 690 x 662
s6.png 15.27 kb, 138 downloads since 2021-07-09 

5 Отредактировано Voldemar0 (09-07-2021 20:37)

Re: Аппаратный отладчик для Агата

С правой стороны от трассы команд могут выводиться сигналы шины, если там есть что-то интересное.
Например, поставим адрес breakpoint на вторую команду обработчика Reset и увидим:

http://forum.agatcomp.ru//misc.php?action=pun_attachment&amp;item=958&amp;download=0

RES - тут активен сигнал RESET, проц мечется куда попало.
После отпускания RES проц ещё три такта продолжает барагозить, затем зачем-то идёт на стек,
а потом уже вытаскивает вектора сброса, выполняет первую команду CLD и на следующей отладчик тормозит его (FA37).

Post's attachments

Attachment icon s7.PNG 7.54 kb, 139 downloads since 2021-07-09 

6 Отредактировано Voldemar0 (09-07-2021 19:27)

Re: Аппаратный отладчик для Агата

Просмотр-редактирование дампов памяти выглядит вполне традиционно, но есть особенности:
1) Положение курсора и режим отображения сохраняются в EEPROM отладчика, так что можно даже щёлкать питанием компа в процессе работы. Есть три копии дампера, каждую можно настроить на отображение своего региона и потом быстро переключаться между ними.
2) Дампер позволяет видеть также память самого отладчика - это делалось для отладки отладчика.
3) Дампер имеет две особенности, связанными с тем, что тут железо настоящее и реагирует соответствующе:
  a) Есть safe mode: в этом режиме дампер не отображает и не позволяет редактировать регион Cxxx.
Просто чтобы случайно что нибудь там не расколбасить при листании.
  b) Есть режим ограничения вывода: задаётся размер области (например, 10 байт) и выводиться будут только они. В этом режиме листания нет, курсор крутиться только внутри дампа.
Это нужно для того, чтобы ограничать обращения к шине только определёнными адресами (чтобы не закосячить что-то по соседству).

Post's attachments

s8.png, 17.91 kb, 579 x 662
s8.png 17.91 kb, 135 downloads since 2021-07-09 

s9.png, 25.33 kb, 573 x 662
s9.png 25.33 kb, 145 downloads since 2021-07-09 

7 Отредактировано Voldemar0 (22-07-2021 21:23)

Re: Аппаратный отладчик для Агата

Доделал автомат шага, который запускает проц, разрешает сделать один шаг и останавливает на следующем. Тонкость в том, что не на любом шаге можно останавливать: если проц пишет в память, он игнорирует RDY, соответственно, останавливать его тут смысла нет: проц не остановиться, а отключив ему шину получим запись не ясно в куда. Или в никуда.

Автомат работает, а вокруг него можно уже тестировать остальные режимы: проход через команду, через процедуру и всякое такое. И тут опять подвох: сделал пропуск тактов по размеру команды, но когда идёт обмен, тактов команда занимает больше, чем байт. Значит надо на все опкоды расписать число шагов проца - не сообразил вовремя. Мало того, дизассемблер брал всегда для декодирования опкод и два следующих байта, но проц работает интереснее: jsr, например, сперва выгребает младший байт адреса, затем скидывает на стек возврат, а потом берёт второй байт адреса:

                            4036-  20 80 FE    JSR  $FE80
                            4037-  uncomplete
                            4037-  80 
                            0170-  uncomplete
                            0170-  FE 
                            0170:40 
                            016F:38 
                            4038-  uncomplete
                            4038-  4C 
                            4C80-  uncomplete
                            4C80-  A2 ?? ..    LDX  # ??

Так что дизассемблер трассы тут косячит: это была команда JSR 4C80.

Но это -то я поправлю. Хуже что прога в агате подглючивает под отладкой.
Надо будет изучать в чём там дело.
Скорее всего, когда виртуальный терминал захватывает байты, он что-то ещё портит.
Пока что я все тесты гонял с сисмоном, ему -то это почти не страшно.
А сейчас перешёл на традиционную для хардкорной отладки игрушку MARS :)

Ещё сделал загрузку FIL-файлов в память, с разбором заголовка FIL. Поддерживает A, B и K -типы.
Для A только нужно указать точку загрузки.

Причесал дампер и монитор ЦПУ.

Пытался сделать в матрице слово состояния для меги, нужен был всего один бит: причина остановки: запрос или срабатывание BP. Че-то оно нифига не работало, начал отлаживать (матрица мусор давала в этом бите статуса), а потом подумал: можно же сравнивать последний адрес на шине с адресом BP - тогда и будет понятно. Переделал так - вроде пока хорошо работает.

8 Отредактировано Voldemar0 (24-07-2021 15:58)

Re: Аппаратный отладчик для Агата

В мымрине, в таблице опкодов, у операций типа lda/ora. .. с  индексно-косвенной адресацией ( ($01,X) ) указано, что число тактов "6(5)". Выглядит немного загадочно, потому что у остальных опкодов число тактов указывается либо единственной цифрой либо цифрой и следующей за ней "(1)" - это означает, что может быть на 1 больше при определённых обстоятельствах.

Но как понять "6(5)" ?

Тут про "lda (xx,x)" пишут, что они строго 6 тактов:
http://www.6502.org/tutorials/6502opcodes.html

Может была какая-то версия проца с 5 тактами на эти команды?

9 Отредактировано Voldemar0 (24-07-2021 20:57)

Re: Аппаратный отладчик для Агата

На эти выходные, наверное, наигрался. Хоть на работу иди, там пока задачи попроще.
Хотя завтра видно будет...

В общем, не только доделал, но и проверил работу автомата шага и всего что вокруг него навёрнуто:

- Проход одного такта на шине.

- Проход нескольких тактов до следующей команды (т.е. ход по опкодам).
Отладчик выполняет один за другим такты, пока на очередном такте ЦП не запросит опкод команды.

- Чуть изменил и проверил проход до следующей команды по break point.
Тут отладчик ставит BP на следующую команду и запускает ЦП.
Это значит, что если текущая команда jsr, к примеру, то отладчик пропустит всё содержимое процедуры. Если ветвление (скажем в конце цикл do while) - то стопанётся именно после выхода из цикла (т.е. когда ветвление не будет срабатывать).

- Переделал в дизассемблере декодирование JSR.

- Добавил такой ништяк в комментариях к командам:

                            FD29-  B1 28 ..    LDA  ($28), Y    ; 3102-  20
                            FD2B-  85 2A ..    STA  $2A
                            FD2D-  B1 28 ..    LDA  ($28), Y    ; 3102-  20
                            FD2F-  49 DF ..    EOR  #$DF        ; '_
                            FD31-  45 2A ..    EOR  $2A
                            FD33-  91 28 ..    STA  ($28), Y    ; 3102:DF
                            FD35-  E6 4E ..    INC  $4E

Т.е. дизассемблер трассы показывает, что и куда было фактически записано или прочитано (после ";"). Только для индексных методов адресации.

В задачах по интерфейсу осталась одна хотелка: загрузка и выгрузка файла меток.
Это чтобы дизассемблеры в отладчике могли заменять адреса символическими именами и комментариями к ним.
Формат от юних-эмулятора, заодного есть утилитка, которая инфу о метках может выцеплять из компилятора ca65 в том же формате.
У меня уже набралось немало таких файлов за время копания во всяком разном софте.

В задачах по матрице осталось две задачи:
- Теневая память.
- Порт динамика.

Последняя задачка совсем примитивная, возникла недавно: таскать нормальный динамик на стол лень ( я без корпусов агатами пользуюсь ) - можно на тестовые точки на плате отладчика напаять мелкий динамик-наушник и внутри матрицы повторить звуковой порт агата.

--

Печальное:
1) Пытался разобраться с мусором во время работы MARS, чётко убедился что гадит именно виртуальный монитор (если в него не заходить - всё работает, минут 20 игрался), но загадка в том, почему и в каких случаях он это делает. Явно видно, что это как-то сочетается именно с работой агат-программы. Например, MET играет и ничего не ломается.
Заметил, что иногда выскакивает мусор и в сисмоне, но надо сказать "крибле-крабле-бумс", чтобы это случилось: вывести на экран листинг и гонять курсор влево - вправо по заполненной символами строке. При движении влево иногда выскакивает символ "@". Куда копать - пока не знаю. Как копать - догадываюсь, но будет муторно.

2) Тест озу внезапно стал давать много сбоев. Сразу по всем битам, но иногда только по некоторым.
Если посмотреть адреса и значения, то дампер потом подтверждает, что сбой именно при записи.
Или портятся данные уже после записи, т.е. дампер показывает неправильные значения - те же, которые показал и тест как ошибочные. Ошибки: например несколько нулей подряд в соседних байтах или несколько FF. Но не всегда.

Иногда же глюки исчезают и тест может десятками минут нормально идти. Один раз вылечилось после подёргивания разъёма питания. Второй раз - после выдёргивания логического анализатора из шины - радикально помогло.

:(( Я пока с голой девяткой экспериментирую, что же будет если с заполненной устройствами семёркой работать?

10 Отредактировано Voldemar0 (26-07-2021 07:41)

Re: Аппаратный отладчик для Агата

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

Мусор при беготне курсора - это не лучшая работа с UART-портов в отладчике, к делу отношения не имеет.

А вот минимальную прогу с дефектом написать удалось. Почему-то важно, что этот дефект лезет при работе со старшими видеостраницами. Девятка включает сперва примерно text=3 (примерно, потому что у сисмона девятки коммутация сегментов ОЗУ несколько странная),  но если переключить на text=15, то глюки лезут даже в сисмоне.

Написал простую прогу:
TXA/STA 7A00,X/INX/JMP start
И вот эта прога очень быстро рушится если я открывая для просмотра в виртуальный монитор страницу T15.

Снял графики шины, заодно зацепив !RAS и !CAS памяти. У меня ещё с весны
лежит парсер логики, который умеет распознавать сбои в агатовcких CAS и RAS.
Вот тут и всплыли два косяка:

1) ARAM_getbyte(): чтение байта из агатовской памяти. Там операция матрицей проводиться синхронно по запросу меги, но есть какой-то баг в отпускании ША. Вероятно, матрица его отпускает, а ША тянется к предыдущему положению медленно, в результате какие-то её биты меняются уже за пределами допустимых таймингов. Как было выяснено и обсуждено на этом форуме - это ломает !RAS.
А значит могут быть сбои ОЗУ.

2) Что-то происходит с матрицей после завершения захвата экрана.
Она дёргает среди такта F0 несколько раз !RDY, хотя мне такое поведение категорически не надо. Это всё тоже рушит !RAS, но может приводить и чему-то ещё плохому.

Возможно, тут что-то неправильно в проге со стороны меги.

Теперь есть чёткие направления поисков :))

11 Отредактировано Voldemar0 (29-08-2021 20:24)

Re: Аппаратный отладчик для Агата

Первую проблему с отпусканием ША решил, всё хорошо. Тестовая программка работает долго, минут 20.
Это хорошо.

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

Зацепил осцилограф на шину - чисто.

Тестовые проги работают десятки минут.
Но игрушка Марс валиться точно также, как и раньше - почти сразу.
Причем она не валилась, например, если отладчик стоит во 2 слоте и валиться, если в 3.
А поскольку отладчик не использует никаких частных линий (связанных только с конкретным слотом), то это выглядит несколько странно.

Полшага сделал, в общем. Вроде и хорошо, но хотелось бы больше.
А выходные уже закончились.

12 Отредактировано Voldemar0 (05-09-2021 19:39)

Re: Аппаратный отладчик для Агата

Продолжил разбираться с багом, который выявляет Марс:
баг возникает, похоже, когда почему-то всю систему начинает потряхивать.
Т.е. начиная от тактовых сигналов материнки.
Почему это происходит - совсем не ясно.

Основная проблема: всё это происходит в пределах одного такта F0,
соседние такты чистые. Другие, аналогичные по операциям, чистые.
Возможно, на холодной материнке тоже всё чисто.

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

За вечер удалось чётко зафисировать всего два сбоя, просто запуская Марс и анализатор раз за разом.
Потом просматривая запись анализатора вручную. Но выглядит жутко: трясёт с периодом около 20 нс все шины, включая ША. А дальше недалеко и до сбоев !CAS . !RAS.

Чётко видно только одно: сбой происходит именно при активном !DMA, т.е. когда отладчик лезет в видеопамять. И именно не на каждый запрос, а при каком-то сочетании, видимо, адреса запроса и текущего ША.
Вроде бы по первому отловленному сбою возникло предположение, что наиболее вероятен сбой если ША до запроса была в нулях. Но простая прога 4:4c 4 0 (ЦП крутиться в нулевой странице) не вызывает этого бага.

Единственное, что удалось этой прогой выявить: когда отладчик отпускает !RDY, этот raise даёт мощную наводку, как минимум, на старшие 4 разряда ША (а может и на остальные). Шина успокаивается где-то за 100 нс. Это допустимо, но уже не хорошо.

/ На осцилографе виден резкий подъём !RDY (отладчик выдаёт на неё high) и за ним также взлетают обнулённые биты ША.
Через 25 нс отладчик отпускает !RDY (Z-state), но, похоже, что ёмкости ещё не зарядились и линия проваливается где-то до 1.3 вольт вниз. Вверх её теперь тянет только pullup, и она, где-то за 100 нс, всё таки возвращается в корректный high. ША же продолжает осцилировать ещё несколько периодов, успокаиваясь примерно за 100 нс /

Есть у меня предположение, что !RDY и !DMA были разведены, но никто их в реале не тестировал. А если и тестировали, то только в предположении, что устройство один раз их активирует, выполнит обмен и вернёт обратно.  У меня же на каждый символ (два байта) отладчик запускает обмен и затем снова отпускает шину...

Возможно, в следующий раз поэкспериментирую с другими материнками.......
Или, на удачу, попробую затянуть !RDY ещё на 20 нс в высоком уровне...

--

Основной объём ПО Megи закончен, остались только поддержка файла символических меток и, может быть, shadow memory. Без неё тоже польза есть, но shadow позволит произвольно, из отладчика, подглядывать в регистры ЦП, менять их. Особенно важно это для того, чтобы можно было из отладчика сделать jmp на полезный адрес (например, на только что загруженный из FIL-контейнера код).
Вероятно, это займет ещё 3-5 кб. Но свободного флеша ещё больше половины.

В связи с этим пришла мысль: зарядить в память меги образы систем-в-файле. Типа теста Лисина, бейсика и прочего. Надо только придумать какую-то менюшку, которая будет как-то помнить или определять архитектуру железа и позволять пользователю выбрать объект для загрузки в ОЗУ агата.
Загрузка, несмотря на особо эффективный обмен Mega<->ОЗУ Агата, всё равно будет несравнимо быстрее чем с флопика, к тому же всё под рукой. Можно даже сделать сразу размазывание по памяти тех прог, которые имеют разные части в разных банках ОЗУ, хотя это уже некоторая дополнительная морока.
XModem тоже хорош, но я уже раз 50 за сегодня скидывал MARS через него и немного надоело нажимать для этого кучу кнопок, выбирать файл...

<всё, что делается внутри меги, на два порядка проще отлаживать, чем исследовать звон агатовских шин>

Post's attachments

Attachment icon falt1.png 27.03 kb, 67 downloads since 2021-09-05 

Attachment icon falt2.png 26.86 kb, 71 downloads since 2021-09-05 

13 Отредактировано Voldemar0 (20-09-2021 17:07)

Re: Аппаратный отладчик для Агата

Вытряхнул из заначек ещё пару плат девятки - обе дохлые. В одной частично слетела ПЗУ сисмона, а в другой DRAM'ка стала путать адресные лапы (или у неё отпала внутри одна) - пишешь бит в один адрес, читается этот бит потом из нескольких адресов. А ещё на этой плате без пинка не запускается системный генератор. Пинцетом коснёшся вывода кварца - запускается и работает. Нормально работает. А иначе не хочет.

А ведь обе платы были живые....

А семёрочная плата валяется ещё - с полпинка запустилась... То ли микрух там меньше, то ли собирали её раньше и качественнее..........

Да, это первый запуск отладчика на семёрке. Первый блин - комом. Я даже догадываюсь - почему: у семёрки и девятки разные уровни активности сигнала БлокировкаОЗУ. Он вроде в отладчике и не используется, но на шину выведен и управляется отладчиком. И значит либо его надо отрезать и не трогать или задавать в зависимости от архитектуры компа.....

А ещё на дохлой плате отладчик висит. А почему? А потому, что он при включении тестирует свою SRAM, а для этого меге нужно остановить ЦП. Потому что если ЦП работает, то SRAM занята матрицей. Мега даёт команду матрице на остановку ЦП. Матрица ждёт очередного такта F0. Но не дожидается, потому что системный генератор без пинцета не стартует........ И всё висит.

Но на плате, где поплыла микруха сисмона, отладчик показал свои возможности: простой трассировкой, даже без декодирования команд, сразу стало видно, что уже команде на 20й от reset ЦП уходит куда-то за горизонт. Сменил ПЗУшку (с другой платы временно снял) - всё заработало.

14 Отредактировано Voldemar0 (11-12-2021 11:39)

Re: Аппаратный отладчик для Агата

Всё про ремонт этих плат перенёс в отдельные ветки:
http://forum.agatcomp.ru/viewtopic.php?id=435
http://forum.agatcomp.ru//viewtopic.php?pid=6372

Ещё на паре плат всё заработало почти сразу (как ни странно: осыпалось несколько D6), на одной плате заменил резисторы системного кварца, хотя - если бы делал на сторону - менять бы надо было сам кварц... На что-то такое же старое ? Или на что-то более новое, если бы нашел. Но скорее всего нашел бы: 14.3 МГц нередко встречаются на PC. Но для себя предпочёл сменить резисторы: дюже любопытно, куда оно скатится дальше ?..

Общий итог работы отладчика с ЯБ: под ЯБ его нужно вылизывать ещё неизвестно сколько (пока не буду в это нырять).
Всё дело в таймингах: чем ближе отладчик будет эмулировать все подробности работы 6502 - тем больше вероятность, что на ЯБ тоже заработает.

Осталась одна дохлая плата РВИЖ. Мне она досталась именно дохлой и копанной к тому же.

Растр есть. Если воткнуть отладчик, система почти сразу ныряет в Apple -моде - есть вероятность ошибок в дешифратора адреса. ОЗУ при попытке записи  сохраняет мусор. Да и читаются оттуда слишком много единиц. Если попытаться стартануть ЦП, он выбирает вектор сброса, но после этого как будто в упор не видит проверенную микруху сисмона - лезет куда-то не туда (надо ещё раз проверить...).

Значит отладчиком там пока ловить нечего.
Надо проверять тактовые сигналы, потом буфера ША и ШД, а потом дешифраторы адресов.

Это можно и без отладчика делать.

Если будет много интересного - буду писать.

15 Отредактировано Voldemar0 (02-01-2022 21:03)

Re: Аппаратный отладчик для Агата

Вернулся на РВИЖ. Тут всё опять хорошо.

Вспомнил: на ЯБ явный косяк, который нужно чинить: там помехи по линии F0 и это сбивает тактирование отладчика по всей шине. Помехи - около единиц нс. Можно сделать цифровую фильтрацию, но это будет задержкой. Либо сделать собственный F0, который будет только синхронизоваться с агатовским F0, что-то вроде ФАПЧ. Но это сложнее. Либо сделать обычную фильтрацию, но собственный внутренний фазогенератор сдвинуть на время фильтрации. Посмотрим... Когда нибудь.
{Отладчик имеет собственный фазогенератор, так как за время агатовского такта он должен успеть скинуть 4 байта состояния шины в свою SRAM, причем захватывая его с шины агата в определённые моменты времени}.

Посмотрел ещё раз ToDo:
1) Shadow memory и загрузка файла меток из PC-эмулятора. Не принципиально, но приятно.
2) Баг с бьющимся экраном под игрушкой Mars, если эмулятор "смотрит" на экран. Если не смотрит - бага нет. Баг очень нестабильный. Похоже это тоже помехи, может даже по F0.
3) Адаптация для семёрки. Ну хотя бы тесты. На самом деле там управление базовой памятью отличается инверсией сигнала блокировки. Отладчик мог бы не управлять этим сигналом совсем, но он как раз таки будет нужен для shadow memory, значит нужно это учесть.

Отладчик сильно помог в последних ремонтах, так что даже в таком состоянии он весьма полезен, если не сказать больше: неожиданно полезен.

--

Поэтому я решил довести только ещё одну простую внезапную хотелку: закинуть в свободную память программ Меги несколько готовых к запуску прог. Отладчик их прямо из себя может скинуть в ОЗУ Агата и дальше можно из сисмона запустить прогу. Код этой фичи написал за вечер, вроде работает неплохо.
Тест ОЗУ Лисина, игрушки MARS и MET, JukeBox (улетает примерно за секунду) уже закинул в дерево кода.

Попробую также скинуть ещё по этому списку:

7:
Официальный тест ОЗУ
Бейсик-60 + виртуальный диск + dosXX ?
Комплексный тест
ДОК (used)
Копировщик из РАПИРЫ
BTK
RANGO
Space Inviders
Калах
Horizon
Nelly 2
ИКП-копировщик
AGAT-COPY

9:
Комплексный тест
Ассемблер
ИКП-Бейсик
BTK
RANGO
Space Inviders
Калах
Horizon
ИКП-копировщик
AGAT-COPY

Тонкость в том, что эти проги под разные операционки или являются операционками, поэтому придётся немного поковыряться с порядком их загрузки. В коде лоадера предусмотрел типичную процедуру загрузки, работающую по таблице (это и в Школьнице семёрочной было и в ИКП части так грузятся):
для каждой проги есть таблица, в которой описаны отдельные сегменты проги: адрес источника (трек/сектор в оригинале, у меня же это адрес во flash-памяти), адрес приёмника (Агат-RAM), размер сегмента и состояние контроллера памяти.

Даже проги вроде Бейсик-60, который имеет собственный "раскидыватель" по памяти, можно привести к этой модели, что ускорит загрузку. Тем более отладчик проверяет корректность записи в ОЗУ агата (запись-чтение-сравнение).

Бейсик-проги читаются просто как дамп в адреса 0x1901 или 0x801, т.е. предварительно нужно загрузить бейсик. Не совсем хороший ход, по идее надо бейсику сообщать о программе (вектора конца файла настроить и вызвать определённые процедуры), но пока это оставим. Пусть хотя бы B- файлы грузятся, уже будет шикарно.

Работа по интеграции прог под отладчик довольно простая и будет вестись между делом совместо с началом работы над новым мостом.

Остальные перечисленные хотелки по отладчику заморожу пока, скорее всего до исследований сетевых плат агата. Или до другой сложной задачи.
А вот ролик на ютуб уже можно обдумывать.
Сюжет легко написать, но вот какую натуру для съёмки выбрать - пока не придумал. Зимой или летом снимать? В комнате всё подряд снимать не хочется. Скучно смотрится.

16 Отредактировано Voldemar0 (07-01-2022 08:17)

Re: Аппаратный отладчик для Агата

Че-то размечтался про список прог, но памяти-то 64 кб всего свободно. Space Inviders + Horizon = около 64 кб. Надо урезаться или паковать.

==

Нашел ошибку в cvAVR:

if ( (mass_storage[i].arch == agat_arch) || (mass_storage[i].arch >= 0x80) ) 

компилируется неправильно. Причем не важно: if () или do {} while () - оба одинакого неправильно.

Если так сделать:

unsigned char eq1 = (mass_storage[i].arch == agat_arch);
unsigned char eq2 = (mass_storage[i].arch >= 0x80);
unsigned char eq3 = eq2 || eq1;
if (eq3)

так всё правильно.

Поковырял lst, там видно, что оба варианта используют общие подпрограммы, но в глючном случае в одно место, между вызовами подпрограмм, вклинивается странный MOV.

Согнал всё в отдельную процедуру и вызываю её :

if ( mass_menu_item_match(i) )
while ( ! mass_menu_item_match(i) )

Так работает.

/*
mass_storage[] - это массив дескрипторов файлов внутри прошивки отладчика. agat_arch - заданная архитектура компа, в который воткнут отладчик. Т.е. условие проверяет, соответствует ли файл этой архитектуре компа и особый случай: код архитектуры $81, $82 - бейсик-прога для basic-60 и для ИКП-Бейсик. Они доступны для любой архитектуры, хотя формально basic-60 для девятки не существует.

Несколько дескрипторов могут описывать один файл, например, если он имеет две точки входа для агат-7 или агат-9. Либо если его просто можно запускать под любой из архитектур.

Загрузка бейсик-прог - это пока только черновик. Для Basic-60 это более-менее изучено, но для ИКП-Бейсика ещё предстоит ковырять. Основная цель такой загрузки: запуск комплексного теста (хотя бы его Basic-тестов) на бездисковом компе. Ну или каких нибудь простеньких бейсик-игр. Это всё нужно для тестов компа после ремонта.
*/

17

Re: Аппаратный отладчик для Агата

Ждем рабочего варианта для ЯБ...

@realname Dmitry Mityanin (2:5076/6)

18 Отредактировано Voldemar0 (09-01-2022 09:38)

Re: Аппаратный отладчик для Агата

Не жди лучше :)

Возможно, что дело только в фильтрафии F0 и всё будет отлично. Но как-то я на такой счастливый исход не расчитываю. С другой стороны: свои ЯБ и РВИЖ я вытянул, так что когда у тебя будет время - вытянем и твои.

Загрузку B-прог я закончил, ИКП-Бейсик грузится, игрушки тоже. Даже jukebox на спикере отладчика поёт. На этом работы по железу свернул. Без shadow memory приходится некоторые лишние движения делать, но, благодаря сисмону, можно и так жить (Самое главное: при загрузке прог их приходится вручную запускать: "4000G". Была бы shadow - отладчик бы сам мог дёргать ЦП на нужный адрес). До семёры тоже дело дойдёт когда нибудь, вряд ли будут большие сложности.

Иногда буду возвращаться к набору загружаемых проги и с загрузкой A- прог, но это всё будут некоторые неглубокие ковыряния в эмуляторе. С наскока не получилось A- проги грузить: прога даже вроде бы работает, но list зависает, да и, скорее всего, goto/gosub могут глючить. Нужно после загрузки настроить вектор, указывающий на конец загруженной проги, а потом вызвать настройщик: он указатели на строки расставляет и может что-то ещё делает. Для Basic-60 у меня эта процедура изучена, для ИКП нужно тоже найти соответствующие входные точки.

Надо ещё ролик по нему снять. Если бы был снегоход, я бы куда нибудь на пленэр выехал, поснимал, но снегохода нету :( А для велосипеда эта зима была неудачной: даже -20 было всего несколько дней и то не подряд. Чтобы нормально ехать надо чтобы было -10 или ниже. По теплу снег мягкий, проваливается... Да и погода должна быть безветренной, у моего фота нет входа для петличного микрофона.

Так что закончу сейчас контроллер подсветки моника и буду экспериментировать на тему моста#3.

19

Re: Аппаратный отладчик для Агата

https://youtu.be/qvIa9U1PELw