
Я хоть и "к старости слаба глазами стала", но распознавание образов в зашумлённой среде пока работает

Moderator: Shaos
Привычка подвела...Shaos wrote:Да она вроде как и читается более-менее - ЛН1
На самом деле оказалось, что значение, выдаваемое в "COVOX", эмулятор БК-0010 просто нигдеLavr wrote:Сделал развертку по позициям индикатора, и оно заработало!![]()
Стартует всегда, как и написано в статье, с "0" в крайнем разряде.
Дальше, как я понимаю, Монитор читает порт 177714о, в который сам же и записал только что
код и знакоместо индикатора, и воспринимает это как нажатие кнопок клавиатуры.
Code: Select all
PostMessage(hwnd, WM_KEYDOWN, VK_хх, lParam);
PostMessage(hwnd, WM_KEYUP, VK_хх, lParam);
Значит пульт Монитора теперь будет эмулироваться целиком вместе с клавишами: Попробовал - обычные коды клавиатуры посылаются хорошо, но для "джойстика" надо посылатьLavr wrote:срабатываютпосланные ему из другого окна.Code: Select all
PostMessage(hwnd, WM_KEYDOWN, VK_хх, lParam); PostMessage(hwnd, WM_KEYUP, VK_хх, lParam);
Да, похоже, что сканирование клавиш проходит не с одного опроса столбца...Lavr wrote:Остался последний шаг - посылать скан-коды синхронно с опросом Монитором разрядов индикатора...
И трудность будет в том, что по идее, для подавления "дребезга контактов" Монитор может фиксировать
нажатие клавиши не с одного опроса.
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)
Code: Select all
0013476 CMP (R2)+, (R2)+ ;
0013500 ADD #400, R3; + 100h = 1.0000.0000b следующий разряд в строке;
0013504 BR 13444; на R3 -> по адресу пульта указать новую позицию;
Пришлось-таки прибегнуть к проходу отладчиком, хотя думал, что "на глаз" обойдусь...Lavr wrote:Меня очень смущает один момент:
строчка CMP (R2)+, (R2)+ ; мне кажется, это просто R2 = R2 + 2;
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; возвращаемся в Монитор, откуда пришли.