Отладочный модуль на К1801ВМ1

Digital Equipment Corporation PDP-8 & PDP-11 (а также совместимые с последним советские ЭВМ на 1801ВМ1/2/3)

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Отладочный модуль на К1801ВМ1

Post by Shaos »

Да она вроде как и читается более-менее - ЛН1 :)

Я хоть и "к старости слаба глазами стала", но распознавание образов в зашумлённой среде пока работает ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Shaos wrote:Да она вроде как и читается более-менее - ЛН1 :)
Привычка подвела... :-? По привычке ЛН1 должны быть просто 6 инверторов... :wink:
Вот и искал что-то типа ЛП1 ... ЛЛ1... :roll:
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Привел в удобочитаемый вид цепи подключения клавиатуры и индикатора:
MPSS_86_2_35.gif
А то непонятно мне её сканирование было... :-?

Но есть там один момент не совсем очевидный...
Сейчас еще матрицу клавиш понятно разрисую.


P.S. А со схемой у авторов, похоже, ошибочка вышла... В тексте статьи:
"Биты 0,1,2,3,4,5,6,7 - соответствуют сегментам А,В,С,D,E,F,G,Н", и эмуляция
7-сегментного индикатора это подтверждает. А на схеме - совсем не так!


P.P.S. Заменил схему на исправленный вариант. Успешная эмуляция программы
Монитор показывает, что вроде как никаких других неточностей нет.
:-?
You do not have the required permissions to view the files attached to this post.
Last edited by Lavr on 05 Feb 2018 03:21, edited 3 times in total.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Матрица клавиатуры Отладочного модуля разведена следующим образом:
MPSS_86_2_KBM.gif
Сканирование матрицы осуществляется "бегущим нулём" с выходов дешифраторов D18, D19
типа К155ИД7. Эти же выходы И1 ... И13 осуществляют поразрядное подключение позиций
индикатора. На входы дешифраторов подаются разряды D8...D11 шины данных.
"При этом код строки К1 ... К4 считывается через входной порт пульта. Нажатой клавише
соответствует сигнал низкого уровня
(проверка их в строке происходит сверху вниз)".
Разряды D0...D7 шины данных через преобразователи уровня подаются на сегментные входы
ABCDEFGH индикатора.

Внешне сама клавиатура, согласно рисунку в статье, выглядит следующим образом:
MPSS_86_2_KB.gif
Назначение клавиш совпадает с описанием в статье, но не совпадает с пультом "Электроника С5-2107",
от которого, якобы, согласно статье, клавиатура используется.
c5-2107-5.gif
Человек я добрый, но русские надписи на клавиатуре типа "БСЧ-БАП" меня почему-то раздражают... :lol:
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Lavr wrote:Сделал развертку по позициям индикатора, и оно заработало! :o
Image
Стартует всегда, как и написано в статье, с "0" в крайнем разряде.
Дальше, как я понимаю, Монитор читает порт 177714о, в который сам же и записал только что
код и знакоместо индикатора, и воспринимает это как нажатие кнопок клавиатуры.
На самом деле оказалось, что значение, выдаваемое в "COVOX", эмулятор БК-0010 просто нигде
не хранит.
В ячейку 177714о он записывает только состояние "джойстика", если поддержка джойстика
с клавиатуры разрешена.
Так что если изначально в ячейку 177714о записать значение 0х0000FFFF, то Монитор при
старте четко устанавливается в стартовой позиции с "0" в крайнем разряде.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Приятный результат, что эмулятор БК-0010 "слушает" клавиатуру обычным образом, через сообщения
Выньдоуз в его очередь.
Поэтому срабатывают

Code: Select all

PostMessage(hwnd, WM_KEYDOWN, VK_хх, lParam);
PostMessage(hwnd, WM_KEYUP, VK_хх, lParam);
посланные ему из другого окна.

Неприятный результат, что в теле самого эмулятора БК-0010 места на обработку 24 клавиш
пульта практически нет.
Придется, видимо, использовать функцию, вызываемую из dll, дважды.
Чтобы различать вызовы для индикатора и вызовы для клавиатуры, предполагаю в качестве флага
использовать старшее слово передаваемого в функцию аргумента.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Lavr wrote:срабатывают

Code: Select all

PostMessage(hwnd, WM_KEYDOWN, VK_хх, lParam);
PostMessage(hwnd, WM_KEYUP, VK_хх, lParam);
посланные ему из другого окна.
Значит пульт Монитора теперь будет эмулироваться целиком вместе с клавишами:
digidisp91.gif
Попробовал - обычные коды клавиатуры посылаются хорошо, но для "джойстика" надо посылать
коды боковой клавиатуры с учетом признака KF_EXTENDED.
Проверяется в обслуживании "джойстика": if (!(nFlags & KF_EXTENDED))
Ну и надо будет засинхронизировать посылку "нажатий" с кодом опроса индикатора...

Наверно надо будет заменить на клавишах некоторые русские надписи на более првычные английские.
Всё-таки П - повторный пуск - это RES, Шаг - это Step, и т.д.
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Заменил надписи на кнопках на английские - стало гораздо понятнее... 8)
kbdscan.gif
С большим трудом вписал патчем в код БК-0010 опрос порта о177714 в процедуру чтения клавиш
джойстика - трудоёмко было сдвинуть код, поэтому вписывался как есть...

Джойстик эмулятора БК-0010 понимает нажатия клавиш, как установку битов порта о177714 в 1.
Монитор же наоборот понимает нажатия клавиш, как сброс битов порта о177714 в 0.

В итоге получился некий компромисс: джойстик наоборот... :wink:
Хотя Монитору надо всего 4 бита, можно манипулировать всеми 8-ю, что и видно на картинке.

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

Очень много времени потерял на глупую затею: хотел сделать кнопку RES красной - чисто для красоты. :-?
Оказалось, что цвет стандартной кнопки типа BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD | WS_TABSTOP
простыми способами поменять практически нельзя. :osad:
Надо делать её типа BS_OWNERDRAW и отрисовывать программно самому - решил не усложнять программу...
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Lavr wrote:Остался последний шаг - посылать скан-коды синхронно с опросом Монитором разрядов индикатора...
И трудность будет в том, что по идее, для подавления "дребезга контактов" Монитор может фиксировать
нажатие клавиши не с одного опроса.
Да, похоже, что сканирование клавиш проходит не с одного опроса столбца... :-?
Клавиши срабатывают, но со сбоями. Придется посмотреть код Монитора - как конкретно
организован опрос, и имитировать кнопками эту процедуру...
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Я, конечно, пока еще не очень освоился с ассемблером 1801ВМ1, но насколько я вижу,
"противодребезговых" мероприятий в коде опроса клавиатуры вроде как и нет. :-?
В лобовую пишут в порт позицию разряда, сразу же читают порт и сдвигом вправо начинают
анализировать биты, не более 4-х сдвигов.
Видимо, в эмуляции я не успеваю "отпустить" кнопку, поэтому она считывается не один раз.

Code: Select all

;------ ADDR KBD SCAN ------------------------------------------------------------------;
0013372          MOV        R3, -(SP)
0013374          MOV        R1, -(SP)
0013376          MOV        R2, -(SP)
0013400          TST        100(R0)
0013404          BEQ        13422
0013406          TSTB       127(R0)
0013412          BNE        13422
0013414          MOVB      #175, 127(R0)
;--------------------------
0013422          JSR        PC, 13676; PULT ;
0013426          BIC       #20, R4; 0001.0000 Bit Clear

0013432          MOV       #400, R3; 100h = 1.0000.0000b - позиция 1 в старшем бите
;                          #410, R3; 108h = 1.0000.1000b - позиция 1 в старшем бите-'_'
;                                R3 - счетчик позиций в старшем байте, код - в младшем;
0013436          CLR        R5;    = 0;  - счетчик строк;
0013440          MOV       #4, R2; = 4 max счетчика строк;
;-------------------- 13444 --------------------
0013444          MOV        R3, @13770; R3 -> по адресу пульта указана позиция;
0013450          MOV       @13770, R1 ; читаем код с адреса пульта -> R1
;-------------------- 13454
0013454          ROR        R1; Rotate Right -> C ;
0013456          BLO        13462; Branch if Lower (бит C PSW равен 1) сам бит =0 на шине;
0013460          BR         13534;
;-------------------- 13462
0013462          CMP         R5, #33; 1Bh = 0001.1011b; счетчик строк проверка на 27 ?
0013466          BEQ         13506  ; если равен 27;

0013470          INC         R5; R5 = R5 + 1 счетчик строк увеличим;
0013472          CMP         R5, R2;  R5 < 4=R2 ?;
0013474          BLT         13454; Branch if Less Then НА Rotate Right -> C ;

0013476          CMP        (R2)+, (R2)+ ; R2 = R2 + 2;
0013500          ADD        #400, R3; + 100h = 1.0000.0000b следующий разряд в строке;
0013504          BR          13444; на R3 -> по адресу пульта указать новую позицию;
;-------------------- 13506
0013506          BIT        #20, R4; Bit Test 10h = 0001.0000b;
0013512          BNE         13520

0013514          CLR         104(R0)
;-------------------- 13520
0013520          BIC        #40000, R4; Bit Clear 4000h = 0100.0000.0000.0000b;
0013524          MOV        #177777, 110(R0); 0FFFFh;
0013532          BR          13422; на  JSR PC, 13676; PULT ;
;-------------------- 13534
0013534          TST         104(R0)
0013540          BMI         13560
0013542          BIT        #40000, R4; Bit Test  0100.0000.0000.0000b;
0013546          BEQ         13616
0013550          ADD        #700, 104(R0)
0013556          BR          13422; на  JSR PC, 13676; PULT ;
;-------------------- 13560
0013560          BIS        #20, R4; Bit Set  0000.0000.0000.0010b;
0013564          CMP         R5, 110(R0)
0013570          BLE         13462; на  CMP  R5, #33;
0013572          MOV        #3, 106(R0)
;-------------------- 13600
0013600          JSR         PC, 13676; PULT
0013604          DEC         106(R0)
0013610          BPL         13600;----/\
0013612          MOV         R5, 110(R0)
;-------------------- 13616
0013616          BIS        #40000, R4; Bit Set  0100.0000.0000.0000b;
0013622          MOV        (SP)+, R2
0013624          MOV        (SP)+, R1
0013626          MOV        (SP)+, R3
0013630          MOVB        127(R0), 106(R0)
0013636          CLRB        127(R0)
0013642          ASL         R5
0013644          ADD         PC, R5
0013646          ADD        #177434, R5; 0FF1Ch
0013652          MOV        (R5), R5
0013654          CMP        #10, R5
0013660          BLT         13666;
0013662          JMP         10134
;-------------------- 13666
0013666          ADD         PC, R5;  R5 = R5 + PC;
0013670          SUB        #4670, R5; 9B8h, 2488
0013674          JMP        (R5)
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Что-то я никак не подстроюсь под процедуру опроса кнопок в Мониторе.... :-?
То есть, кнопки то работают правильно, то сбоить начинают.

Добавил выше более разобранный код опроса клавиатуры.
Меня очень смущает один момент:

Code: Select all

0013476          CMP        (R2)+, (R2)+ ;
0013500          ADD        #400, R3; + 100h = 1.0000.0000b следующий разряд в строке;
0013504          BR          13444; на R3 -> по адресу пульта указать новую позицию;
строчка CMP (R2)+, (R2)+ ; мне кажется, это просто R2 = R2 + 2;
т.к. CMP (R2)+, (R2)+ ; сработает всегда одинаково, и по итогу сравнения никаких
действий не предпринимается...
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

Lavr wrote:Меня очень смущает один момент:
строчка CMP (R2)+, (R2)+ ; мне кажется, это просто R2 = R2 + 2;
Пришлось-таки прибегнуть к проходу отладчиком, хотя думал, что "на глаз" обойдусь...
Строчка CMP (R2)+, (R2)+ ; на самом деле выполняет R2 = R2 + 4; ! :o
Не зная ассемблера 1801ВМ1, "на глаз" ни за что не догадаешься! 8)
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Отладочный модуль на К1801ВМ1

Post by Shaos »

Да, кстати, я так было и подумал - оно же по адресам скачет по 2 байта, значит двойной инкремент будет +4
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

В общем, раз уж дошло до отладчика, погонял я внимательно алгоритм сканирования клавиатуры,
и подпатчил код Монитора вот в этом месте:

Code: Select all

;-------------------- 13444 --------------------
0013444          MOV        R3, @13770; R3 -> по адресу пульта указана позиция;
0013450          MOV       @13770, R1 ; читаем код с адреса пульта -> R1
;-------------------- 13454
0013454          ROR        R1; Rotate Right -> C ;
Вот так:

Code: Select all

;-------------------- 13444 --------------------
0013444          JMP        14000; выйдем на свободное место за Монитор
0013450          MOV       @13770, R1 ; читаем код с адреса пульта -> R1
;-------------------- 13454
0013454          ROR        R1; Rotate Right -> C ;

...

0014000          MOV        R3, @13770; R3 -> по адресу пульта указана позиция;
0014004          MOV       @13770, R1 ; читаем код с адреса пульта -> R1
0014010          BIS       #1, R3; установим бит 0 = 1 признак для dll-библиотеки
0014014          MOV        R3, @33770; сообщаем dll-библиотеке, что скан-код считан
0014020          BIC       #1, R3; Bit Clear 4000h = 0001b - сбрасываем бит 0 = 0, как и было
0014024          JMP        0013454; возвращаемся в Монитор, откуда пришли.
То есть, теперь Монитор сам сообщает, что скан-код считан и кнопку можно "отпустить". :wink:
Ну и виртуальная клавиатура сразу заработала четко, как "A Clockwork Orange"... 8)
digidispB.gif
Хотелось бы сказать:"Ура!"... но "Не Ура..."- задолбал меня этот патч в целом... :-?

Единственное, есть теперь уверенность, что код Монитора, выложенный здесь на форуме,
работоспособен процентов так на 99...

Ну и планирую я его ассемблерный текст привести к виду, который бы компилировался в побитную копию.
А это не так просто, Монитор перемещаемый - почти всё на относительных смещениях... :-?
You do not have the required permissions to view the files attached to this post.
iLavr
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Отладочный модуль на К1801ВМ1

Post by Lavr »

А у нас на форуме или еще где-либо есть удобочитаемая схема БК-шки?
Хотел глянуть кое-что, но везде только скан из её мануала на двух листах.
Кому-нибуть попадалось более приемлемое изображение схемы БК ?
iLavr