Blame | Last modification | View Log | Download | RSS feed
Windows VERSION1 ; контроллер PS2 клавиатуры/мыши для ZX-SPECTRUM2 ; BY KINGOFEVIL, год 2OO7 от р.х.3 ;4 ; Тактовая частота микроконтроллера 8 МГц5 ; Назначение выводов микроконтроллера:6 ;7 ; PS2: PA4 - CLK8 ; PA3 - DATA9 ;10 ; PB7..PB0 - данные11 ;12 ; PA0 - если 0, то подключить клавиатуру к PS2 интерфейсу13 ; если 1, то подключена мышь14 ; PA1 - сброс регистров в ПЛИС15 ; PA2 - строб для приема информации с PB7..PB0 (прием по переднему фронту16 ; в сдедующей последовательности: клавиатура, мышь X, мышь Y, мышь кн.17 ; Через PB7..PB0 будет передано 8 байтов, которые нужно принимать в ПЛИС18 ; последовательно с каждым фронтом импульса на PA2)192021 ; область векторов прерываний2223 0000 8010 JMP START0 ;<0> Начальный пуск программы24 0001 0000 NOP ;<1> Сторожевой таймер25 0002 821A JMP STERR ;<2> выход за границу стека26 0003 807B JMP SC_M ;<3> Таймер A27 0004 0000 NOP ;<4> не используется28 0005 0000 NOP ;<5> не используется29 0006 8080 JMP SC_KEY ;<6> Порт A30 0007 0000 NOP ;<7> Порт B31 0008 0000 NOP ;<8> не используется32 0009 0000 NOP ;<9> не используется33 000A 0000 NOP ;<10> не используется34 000B 0000 NOP ;<11> не используется35 000C 0000 NOP ;<12> не используется36 000D 0000 NOP ;<13> не используется37 000E 0000 NOP ;<14> не используется38 000F 0002 RST ;<15> Завершение записи в флэш394041 0010 2000 START0: LDR #A,0 ; Сегмент A - рабочие регистры портов42 0011 2019 LDR #B,18H ; Сегмент B - регистры конфигурации портов43 0012 2042 LDR #C,64 ; Сегмент С - переменные44 0013 2053 LDR #D,80 ; Сегмент D - переменные4546 0014 4769 MOVL %B1,00111011B ; Установка конфигурации порта A47 0015 40C9 MOVL %B1,00000110B48 0016 43E9 MOVL %B1,00011111B49 0017 4009 MOVL %B1,00000000B50 0018 4009 MOVL %B1,00000000B51 0019 4009 MOVL %B1,00000000B ; прерывание по отрицательному перепаду уровня5253 001A 8207 JMP REST5455 001B 2000 START: LDR #A,0 ; Сегмент A - рабочие регистры портов56 001C 2019 LDR #B,18H ; Сегмент B - регистры конфигурации портов57 001D 2042 LDR #C,64 ; Сегмент С - переменные58 001E 2053 LDR #D,80 ; Сегмент D - переменные5960 001F 91CF JSR INIT ; инициализируем порты61 0020 91E0 JSR KEYINI ; инициализируем матрицу ZX-клавиш62 0021 91E9 JSR MOUSINI ; инициализируем мышку63 0022 91FE JSR TIMER ; инициализируем прерывания от таймера6465 ;MOVL %D0,066 0023 91C7 JSR RDFLSH6768 0024 343D MAIN: BTTL %D5,0001B69 0025 B027 JNZ CLM7071 0026 8024 JMP MAIN ; и есчо разок ...7273 0027 7FFC CLM: CMPL %D4,25574 0028 A024 JZ MAIN ; если мышь не была расползнана при инициализации75 0029 4004 MOVL %A4,0 ; тормозим счетчик и запрещаем прерывания от него76 002A 91AE JSR WAIT ; ожидаем готовность мыши77 002B 5D73 MOVL %C3,11101011B ; код команды запроса состояния78 002C 9155 JSR WR_SC ; засылаем в мышь79 002D 9116 JSR MORE ; принимаем ответ80 002E 7F53 CMPL %C3,11111010B ; все о.к. ?81 002F B042 JNZ EXI ; видимо, нет82 0030 9116 JSR MORE ; ну а если все о.к., то принимаем еще 3 байта83 0031 2049 LDR #B,7284 0032 066F MOV %B7,%C3 ; ZZ85 0033 9116 JSR MORE86 0034 9044 JSR MASHTB87 0035 2049 LDR #B,7288 0036 126D ADD %B5,%C3 ; XX8990 0037 9116 JSR MORE9192 0038 9044 JSR MASHTB93 0039 2049 LDR #B,7294 003A 126E ADD %B6,%C3 ; YY9596 003B 3BEF BISH %B7,1111B ; обрабатываем данные о нажатых кнопках мыши97 003C 290F BICL %B7,1000B98 003D 3DEF BTGL %B7,1111B99100 003E 283D BICL %D5,0001B ; CLEAR MOUSE INTERRUPTION BIT101102 003F 905B JSR VYVOD ; закачиваем данные в ПЛИС103104105 0040 40C4 MOVL %A4,00000110B ; подключаем регистр интервала (HI) к адресу 5106 0041 4045 MOVL %A5,2 ;107108109 0042 4064 EXI: MOVL %A4,00000011B; запускаем счетчик и разрешаем прерывания от него110 0043 8024 JMP MAIN111112 0044 0719 MASHTB: MOV %D1,D0 ; грузим в D1 коэффициент замедления мышки113 0045 6019 CMPL %D1,0114 0046 A05A JZ VJOPU115 0047 6013 CMPL %C3,0116 0048 A05A JZ VJOPU117118 0049 7013 CMPL %C3,128119 004A D053 JS MSH1 ; если меньше 128120 004B 501A MOVL %D2,10000000B;121122 004C 00B3 MSH0: SHR %C3123 004D 00DA SHRA %D2124 004E 2C39 DEC %D1125 004F B04C JNZ MSH0126127 0050 009A SHL %D2 ; нужно установить столько старших разрядов, сколько128 ; сдвигов было проделано (иначе стрелка будет129 ; дергаться из-за того, что вместо уменьшения координат130 ; произойдет их увеличение). В D2 теперь как раз и будет131 ; установлено нужное количество старших разрядов.132133 0051 1B53 OR %C3,%D2134135 0052 000C RTS136137 0053 0719 MSH1: MOV %D1,%D0138 0054 00B3 MSH2: SHR %C3139 0055 2C39 DEC %D1140 0056 B054 JNZ MSH2141142 0057 6013 CMPL %C3,0143 0058 B05A JNZ VJOPU144 0059 4033 MOVL %C3,1145146 005A 000C VJOPU: RTS147148149 VYVOD: ; закачка данных в ПЛИС150 005B 2841 BICL %A1,0010B ; сбрасываем регистры в ПЛИС151 005C 0000 NOP152 005D 0000 NOP153 005E 3841 BISL %A1,0010B ; снимаем сигнал сброса154 005F 2049 LDR #B,72155 0060 0502 MOV %A2,%B0 ; понеслась :-)156 0061 9076 JSR STROBE157 0062 0522 MOV %A2,%B1158 0063 9076 JSR STROBE159 0064 0542 MOV %A2,%B2160 0065 9076 JSR STROBE161 0066 0562 MOV %A2,%B3162 0067 9076 JSR STROBE163 0068 0582 MOV %A2,%B4164 0069 9076 JSR STROBE165 006A 1B8D OR %B5,%D4166 006B 05A2 MOV %A2,%B5167 006C 9076 JSR STROBE168 006D 1B8E OR %B6,%D4169 006E 05C2 MOV %A2,%B6170 006F 9076 JSR STROBE171 0070 1B8F OR %B7,%D4172 0071 05E2 MOV %A2,%B7173 0072 9076 JSR STROBE174 0073 4002 MOVL %A2,0175 0074 2019 LDR #B,18H176 0075 000C RTS177178 0076 3881 STROBE: BISL %A1,0100B ; даем строб179 0077 0000 NOP180 0078 0000 NOP181 0079 2881 BICL %A1,0100B ; снимаем строб182 007A 000C RTS183184 007B 01C8 SC_M: CLIE185 007C 0493 MOV %C3,%A4186 007D 383D BISL %D5,0001B187 007E 0188 STIE188 007F 000D RTI189190191192 0080 01C8 SC_KEY: CLIE ; запрещаем прерывания193 0081 0433 MOV %C3,%A1 ; снимаеи сигнал запроса прерывания +194 0082 4004 MOVL %A4,00000000B ; тормозим счетчик и запрещаем прерывания от него195 0083 0011 PUSH #B196 0084 2019 LDR #B,18H197 0085 4569 MOVL %B1,00101011B198 0086 40E9 MOVL %B1,00000111B ; разрешаем запись в PA0199 0087 2821 BICL %A1,0001B ; захватываем сигнал переключения на клавиатуру200 0088 385D BISL %D5,0010B ; устанавливаем флаг прерывания от клавиатуры201202 0089 9094 JSR KEY203 008A 905B JSR VYVOD204205 008B 2019 LDR #B,18H206 008C 4569 MOVL %B1,00101011B207 008D 40C9 MOVL %B1,00000110B ; запрещаем запись в PA0208209 008E 40C4 MOVL %A4,00000110B ; подключаем регистр интервала (HI) к адресу 5210 008F 52C5 MOVL %A5,150 ; итак, получили полный коэффициент211 0090 4064 MOVL %A4,00000011B ; запускаем счетчик и разрешаем прерывания от него212 0091 0019 POP #B213214 0092 0188 STIE215 0093 000D RTI216217 ; ****218219 0094 4014 KEY: MOVL %C4,0220 0095 4015 MOVL %C5,0221 0096 9140 JSR RD_SC ; Ура! Начинаем принимать скан-код!222 0097 0674 MOV %C4,%C3223 0098 7C14 CMPL %C4,11100000B ; принимать второй байт скан-кода?224 0099 A09D JZ KEY1225 009A 7C34 CMPL %C4,11100001B226 009B A09D JZ KEY1227 009C 80A0 JMP CONTTT228 009D 3855 KEY1: BISL %C5,0010B ; устанавливаем флажок229 009E 9116 JSR MORE230 009F 0674 MOV %C4,%C3231232 00A0 60F4 CONTTT: CMPL %C4,7 ; если нажата кнопка F12, то даем RESET233 00A1 A207 JZ REST234 00A2 6F14 CMPL %C4,078H235 00A3 B0A5 JNZ CONTTZ236 00A4 9137 JSR NMI237 00A5 6014 CONTTZ: CMPL %C4,0 ; если была ошибка, то считаем, что был238 ; принят код отжатия. Понимаю, что лажа, но239 ; почему-то в 99% случаев ошибки происходят240 ; именно при приеме кода отжатия. Уж не знаю,241 ; почему. Спишем на ламерство изобретателей242 ; PS2 интерфейса (ну не признавать же свою243 ; криворукость244 00A6 A0AC JZ PODGON245 00A7 7E14 CMPL %C4,11110000B ; это был код отжатой клавиши?246 00A8 A0AC JZ PODGON247 00A9 7E34 CMPL %C4,11110001B248 00AA A0AC JZ PODGON249 00AB 80AF JMP CONTT0250 00AC 3835 PODGON: BISL %C5,0001B ; устанавливаем флажок251 00AD 9116 JSR MORE ; принимаем еще один скан-код - код отжатой252 00AE 0674 MOV %C4,%C3 ; клавиши253254 00AF 3455 CONTT0: BTTL %C5,0010B255 00B0 A0C7 JZ CONTTA256257 00B1 6234 CONTT1: CMPL %C4,00010001B ; правый ALT = левый ALT = SYMBOL SHIFT258 00B2 A0F5 JZ CONTT2259260 00B3 6E94 EX5: CMPL %C4,74H261 00B4 B0B7 JNZ EX6262 00B5 9125 JSR SHIFT263 00B6 47D4 MOVL %C4,3EH264265 00B7 6D74 EX6: CMPL %C4,6BH266 00B8 B0BB JNZ EX7267 00B9 9125 JSR SHIFT268 00BA 45D4 MOVL %C4,2EH269270 00BB 6EB4 EX7: CMPL %C4,75H ; UP271 00BC B0BF JNZ EX8272 00BD 9125 JSR SHIFT273 00BE 47B4 MOVL %C4,3DH274275 00BF 6E54 EX8: CMPL %C4,72H ; DOWN276 00C0 B0C3 JNZ EX9277 00C1 9125 JSR SHIFT278 00C2 46D4 MOVL %C4,36H279280 00C3 6E34 EX9: CMPL %C4,71H ; BACKSPACE = DEL281 00C4 B0F5 JNZ CONTT2282 00C5 9122 JSR BACKSP283 00C6 80F5 JMP CONTT2284285 00C7 6CD4 CONTTA: CMPL %C4,66H ; это клавиша BACKSPACE?286 00C8 B0CA JNZ CONTTD287 00C9 9122 JSR BACKSP ; если да, то ставим в соответсвие CAPS+0288289 00CA 6B34 CONTTD: CMPL %C4,59H ; правый SHIFT = левый SHIFT = CAPS SHIFT290 00CB B0CD JNZ CONTTW291 00CC 4254 MOVL %C4,12H292293 00CD 61B4 CONTTW: CMPL %C4,0DH ; TAB = EDIT = CAPS + 0294 00CE B0D1 JNZ CONTE295 00CF 9125 JSR SHIFT296 00D0 42D4 MOVL %C4,16H297298 00D1 6B14 CONTE: CMPL %C4,58H ; CAPS LOCK = CAPS + 2299 00D2 B0D5 JNZ CONTE1300 00D3 9125 JSR SHIFT301 00D4 43D4 MOVL %C4,1EH302303 00D5 6934 CONTE1: CMPL %C4,049H ; точка304 00D6 B0D9 JNZ CONTE2305 00D7 912E JSR SSHIFT306 00D8 4754 MOVL %C4,03AH307308 00D9 6834 CONTE2: CMPL %C4,041H ; запятая309 00DA B0DD JNZ CONTE3310 00DB 912E JSR SSHIFT311 00DC 4634 MOVL %C4,031H312313 00DD 6AB4 CONTE3: CMPL %C4,055H ; =314 00DE B0E1 JNZ CONTE4315 00DF 912E JSR SSHIFT316 00E0 4974 MOVL %C4,004BH317318 00E1 69D4 CONTE4: CMPL %C4,04EH ; -319 00E2 B0E5 JNZ CONTE5320 00E3 912E JSR SSHIFT321 00E4 4774 MOVL %C4,03BH322323 00E5 60D4 CONTE5: CMPL %C4,6324 00E6 B0EA JNZ CONTE6325 00E7 3435 BTTL %C5,0001B326 00E8 B0EA JNZ CONTE6327 00E9 3038 INC %D0 ; F2 - увеличения коэффициента замедления мышки328329 00EA 6094 CONTE6: CMPL %C4,4330 00EB B0F2 JNZ CONTE7331 00EC 3435 BTTL %C5,0001B332 00ED B0F2 JNZ CONTE7333 00EE 2C38 DEC %D0 ; F3 - уменьшение коэффициента замедления мышки334 00EF 7FF8 CMPL %D0,255335 00F0 B0F2 JNZ CONTE7336 00F1 4018 MOVL %D0,0337338 00F2 60B4 CONTE7: CMPL %C4,5339 00F3 B0F5 JNZ CONTT2340 00F4 91BF JSR WRFLSH ; - F1 - сохранение коэффициента замедления во FLASH - память341342 00F5 4711 CONTT2: MDAL %C1,SCODE343 00F6 4092 MDAH %C2,SCODE ; Грузим в регистр косвенной адресации адрес344 00F7 02D1 MTPR #6,%C1 ; таблицы скан-кодов в памяти команд345 00F8 02F2 MTPR #7,%C2 ; (вся хрень с автоинкрементом, доступ через D7)346347 00F9 4911 CCD: MOVL %C1,72348 00FA 4116 CYCK0: MOVL %C6,8 ; 8 бит349 00FB 5FD2 MOVL %C2,11111110B ; стартовое значение350 00FC 07F3 CYCK1: MOV %C3,D7 ; берем скан-код из таблицы351 00FD 0A93 CMP %C3,%C4 ; совпал с прочитанным?352 00FE A10A JZ SKEY ; если совпал то идем на SKEY353 00FF 0181 SST 0001B ; устанавливаем флаг C354 0100 00F2 RLC %C2 ; смотрим следующий вариант355 0101 2C36 DEC %C6356 0102 B0FC JNZ CYCK1357 0103 3031 INC %C1358 0104 69B1 CMPL %C1,77 ; проверили все 5 наборов по 8 клавиш359 0105 B0FA JNZ CYCK0360 0106 4014 MOVL %C4,0361 0107 000C RTS362363 0108 91E0 PPODGON:JSR KEYINI364 0109 80AC JMP PODGON365366367 010A 0291 SKEY: MTPR #4,%C1368 010B 4811 MOVL %C1,01000000B369 010C 02B1 MTPR #5,%C1370 010D 3435 BTTL %C5,0001B371 010E B112 JNZ RESKEY372 010F 165E AND %D6,%C2 ; фиксируем нажатие клавиши373 0110 4014 MOVL %C4,0374 0111 000C RTS375 0112 0072 RESKEY: NOT %C2376 0113 1A5E OR %D6,%C2 ; фиксируем отжатие клавиши377 0114 4014 MOVL %C4,0378 0115 000C RTS ; Усё379380 0116 5BD0 MORE: MOVL %C0,222 ; будем ждать (3*45+3)*222 команд381 0117 45B1 WT0: MOVL %C1,45 ; если за это время не поступит новый байт382 0118 0432 WT1: MOV %C2,%A1 ; данных, то выходим по ошибке383 0119 3632 BTTH %C2,0001B;384 011A A120 JZ WT2385 011B 2C31 DEC %C1386 011C B118 JNZ WT1387 011D 2C30 DEC %C0388 011E B117 JNZ WT0;389 011F 000C RTS390 0120 9140 WT2: JSR RD_SC391 0121 000C RTS392393 0122 9125 BACKSP: JSR SHIFT ; DEL = SHIFT+0 обрабатываем SHIFT394 0123 48B4 MOVL %C4,45H ; подсовываем скан-код нуля395 0124 000C RTS396397 0125 2049 SHIFT: LDR #B,72398 0126 3435 BTTL %C5,0001B399 0127 B12B JNZ RSHIFT400 0128 2828 BICL %B0,0001B ; фиксируем нажатие клавиши401 0129 2019 LDR #B,18H402 012A 000C RTS403 012B 3828 RSHIFT: BISL %B0,0001B ; фиксируем отжатие клавиши404 012C 2019 LDR #B,18H405 012D 000C RTS406407 012E 2049 SSHIFT: LDR #B,72408 012F 3435 BTTL %C5,0001B409 0130 B134 JNZ RSSHIFT410 0131 2B09 BICH %B1,1000B ; фиксируем нажатие клавиши411 0132 2019 LDR #B,18H412 0133 000C RTS413 0134 3B09 RSSHIFT:BISH %B1,1000B ; фиксируем отжатие клавиши414 0135 2019 LDR #B,18H415 0136 000C RTS416417 0137 2841 NMI: BICL %A1,0010B ; даем сигнал сброса418 0138 4022 MOVL %A2,1 ; даем DATA0 = 1 (теперь на выходе NMI ПЛИС419 ; появится 0)420 0139 0000 NOP421 013A 0000 NOP422 013B 0000 NOP423 013C 0000 NOP424 013D 4002 MOVL %A2,0 ; убираем 1 на DATA0425 013E 3841 BISL %A1,0010B ; снимаем сигнал сброса426 013F 000C RTS427428 ; **************************************************************429430 RD_SC: ; Процедура чтения байта скан-кода431432 0140 4013 MOVL %C3,0 ; Будем читать в C3. Начальное значение 0433 0141 0431 MOV %C1,%A1434 0142 3511 BTTL %C1,1000B ; проверяем стартовый бит435 ; JNZ ERROR436 ; скан-код437438 0143 4112 MOVL %C2,8 ; будем читать 8 бит439 0144 91AE SCAN1: JSR WAIT440 0145 91B2 JSR WAIT1 ; идем на процедуру ожидания следующего такта441 0146 00B3 SHR %C3442 0147 0431 MOV %C1,%A1443 0148 3511 BTTL %C1,1000B444 0149 A14B JZ SCAN2445 014A 3B13 BISH %C3,1000B ; если DATA=1, то ставим эту 1 в C3446 014B 2C32 SCAN2: DEC %C2447 014C B144 JNZ SCAN1448 014D 91AE JSR WAIT ; Байт скан-кода вроде бы прочитали, теперь надо принять бит449 ; четности и затем стоповый бит.450 014E 91B2 JSR WAIT1; На бит четности сразу же кладем, ибо нафиг он не нужен451452 014F 91AE JSR WAIT453 0150 91B2 JSR WAIT1454 0151 0431 MOV %C1,A1455 0152 3511 BTTL %C1,1000B ; Проверяем стоповый бит456457 ; JZ ERROR458 0153 91AE JSR WAIT ; ждем прихода в исходное состояние459 0154 000C RTS460461 ; ******************************************************************462463 WR_SC: ; Процедура передачи байта скан-кода464 ; Чтобы перейти в режим передачи данных, нужно удерживать 0 на линии465 ; CLK не менее 60 мкс. На всякий случай будем держать 0 80 мкс.466 ; 80 это 320 команд (640 тактов) при F=8 МГц467468 0155 4569 MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A469 0156 43C9 MOVL %B1,00011110B470 0157 2901 BICL %A1,1000B471 0158 2A21 BICH %A1,0001B ; выдаем 0 в CLK и DATA472473 0159 4810 MOVL %C0,64 ; Ждем 64*5=320 команд474 015A 0000 REPL: NOP475 015B 0000 NOP476 015C 0000 NOP477 015D 2C30 DEC %C0478 015E B15A JNZ REPL;479480 015F 3A21 BISH %A1,0001B ; снимаем 0 CLK481 0160 4569 MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A482 0161 41C9 MOVL %B1,00001110B ; переводим CLK на чтение483 0162 2901 BICL %A1,1000B484 0163 4010 MOVL %C0,0 ; это будет счетчик единичных битов для формирования485 ; бита четности486487 0164 5FF7 W1: MOVL %C7,255 ; ждем 0, т.е. начала тактирования процесса488 0165 3621 W2: BTTH %A1,0001B489 0166 A16E JZ E1490 0167 0000 NOP491 0168 0000 NOP492 0169 0000 NOP493 016A 0000 NOP494 016B 0000 NOP495 016C 2C37 DEC %C7496 016D B165 JNZ W2497 E1:498 ; передачи данных девайсом499 016E 4112 MOVL %C2,8 ; будем передавать 8 бит500 WR_0: ; передаем бит501502 016F 00B3 WR1: SHR %C3503 0170 F173 JC WR2504 0171 2901 BICL %A1,1000B505 0172 8175 JMP WR3506507 0173 3901 WR2: BISL %A1,1000B508 0174 3030 INC %C0 ; добавляем 1 к счетчику509 0175 3621 WR3: BTTH %A1,0001B ; ждем 1 на CLK510 0176 A175 JZ WR3;511512 ; ожидаем защелкивания бита данных девайсом и его513 ; готовности к приему следующего бита (0 на CLK)514515 0177 5FF7 MOVL %C7,255516 0178 3621 WW2: BTTH %A1,0001B517 0179 A181 JZ EE1518 017A 0000 NOP519 017B 0000 NOP520 017C 0000 NOP521 017D 0000 NOP522 017E 0000 NOP523 017F 2C37 DEC %C7524 0180 B178 JNZ WW2525526 0181 2C32 EE1: DEC %C2527 0182 B16F JNZ WR_0528529 ; Байт скан-кода вроде бы передали, теперь надо передать бит530 ; четности и затем принять стоповый бит. Мля, ну какие же531 ; ламеры придумали этот PS2 интерфейс :-E532533 0183 4013 MOVL %C3,0534 0184 00B0 SHR %C0 ; Значение бита четности берем из 0-го разряда %C0535 0185 E187 JNC BCNZ ; Если бит четности =0536 0186 3833 BISL %C3,1 ; если бит четности =1537538 BCNZ: ; передаем539540 0187 00B3 SHR %C3541 0188 F18B JC WRR2542 0189 2901 BICL %A1,1000B543 018A 818D JMP WRR3544545 018B 3901 WRR2: BISL %A1,1000B546 018C 3030 INC %C0 ; добавляем 1 к счетчику547548 WRR3: ; ждем 1549 018D 3621 BTTH %A1,0001B550 018E A18D JZ WRR3;551552 ; ожидаем защелкивания бита данных девайсом и его553 ; готовности к приему следующего бита554555 018F 5FF7 MOVL %C7,255 ; ждем 0556 0190 3621 WWA1: BTTH %A1,0001B557 0191 A199 JZ EEX558 0192 0000 NOP559 0193 0000 NOP560 0194 0000 NOP561 0195 0000 NOP562 0196 0000 NOP563 0197 2C37 DEC %C7564 0198 B190 JNZ WWA1565566 0199 4569 EEX: MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A567 019A 40C9 MOVL %B1,00000110B ; переводим DATA на чтение568569 IT: ; ждем 1570 019B 3621 BTTH %A1,0001B571 019C A19B JZ IT;572573 019D 91B2 JSR WAIT1 ; ожидаем приход стопового бита574575576 019E 5FF7 MOVL %C7,255 ; ждем 0577 019F 3621 AWA1: BTTH %A1,0001B578 01A0 A1A8 JZ WEX579 01A1 0000 NOP580 01A2 0000 NOP581 01A3 0000 NOP582 01A4 0000 NOP583 01A5 0000 NOP584 01A6 2C37 DEC %C7585 01A7 B19F JNZ AWA1586587 01A8 0431 WEX: MOV %C1,%A1588 01A9 3511 BTTL %C1,1000B ; проверяем стоповый бит589 ; только непонятно, зачем590591 HT: ; ждем 1592 01AA 3621 BTTH %A1,0001B593 01AB A1AA JZ HT;594 01AC 000C RTS595596 01AD 4013 ERROR: MOVL %C3,0597598 01AE 0431 WAIT: MOV %C1,%A1 ; ждем 1599 01AF 3631 BTTH %C1,0001B600 01B0 A1AE JZ WAIT;601 01B1 000C RTS602 01B2 5FF7 WAIT1: MOVL %C7,255 ; ждем 0603 01B3 0431 WAI1: MOV %C1,%A1604 01B4 3631 BTTH %C1,0001B605 01B5 A1BE JZ EXIT1606 01B6 0000 NOP607 01B7 0000 NOP608 01B8 0000 NOP609 01B9 0000 NOP610 01BA 0000 NOP611 01BB 2C37 DEC %C7612 01BC B1B3 JNZ WAI1613 01BD 81AD JMP ERROR614 01BE 000C EXIT1: RTS615616 ; ********************617618 01BF 2039 WRFLSH: LDR #B,56 ; адрес регистра управления блока ЭСППЗУ данных619 01C0 4009 MOVL %B1,0 ; адрес ячейки = 0 (используем только один байт)620 01C1 070F MOV %B7,%D0621 01C2 4028 MOVL %B0,00000001B622 01C3 3428 WRF1: BTTL %B0,0001B623 01C4 B1C3 JNZ WRF1 ; ждем, пока происходит запись624 01C5 2019 LDR #B,18H625 01C6 000C RTS626627 ; ********************628629 01C7 2039 RDFLSH: LDR #B,56 ; адрес регистра управления блока ЭСППЗУ данных630 01C8 4009 MOVL %B1,0 ; адрес ячейки = 0 (используем только один байт)631 01C9 4048 MOVL %B0,00000010B632 01CA 3448 RDF1: BTTL %B0,0010B633 01CB B1CA JNZ RDF1 ; ждем, пока происходит чтение634 01CC 05F8 MOV %D0,%B7635 01CD 2019 LDR #B,18H636 01CE 000C RTS637638 ; ********************639 01CF 4769 INIT: MOVL %B1,00111011B ; Установка конфигурации порта A640 01D0 40C9 MOVL %B1,00000110B641 01D1 43E9 MOVL %B1,00011111B642 01D2 4009 MOVL %B1,00000000B643 01D3 4009 MOVL %B1,00000000B644 01D4 4029 MOVL %B1,00000001B ; прерывание по отрицательному перепаду уровня645 ; на линии CLK_KEY для опроса клавиатуры646647 01D5 0188 STIE648649 01D6 436A MOVL %B2,00011011B ; Установка конфигурации порта B650 01D7 5FEA MOVL %B2,11111111B651 01D8 5FEA MOVL %B2,11111111B652 01D9 400A MOVL %B2,0653 01DA 400A MOVL %B2,0654 01DB 400A MOVL %B2,0655656 01DC 3841 BISL %A1,0010B ; выдаем 1 на линию сброса регистров в ПЛИС657 01DD 2881 BICL %A1,0100B ; выдаем 0 на линию STROBE658659 01DE 401D MOVL %D5,0 ; флажок (потом пригодится)660 01DF 000C RTS661662 KEYINI: ; инициализация матрицы клавиатуры663 01E0 2049 LDR #B,72 ; весь буфер из 5-и байтов заполняем664 01E1 5FE8 MOVL %B0,11111111B ; значениями 255665 01E2 5FE9 MOVL %B1,11111111B666 01E3 5FEA MOVL %B2,11111111B667 01E4 5FEB MOVL %B3,11111111B668 01E5 5FEC MOVL %B4,11111111B669 01E6 2019 LDR #B,18H670 01E7 905B JSR VYVOD671 01E8 000C RTS672673 ; здесь надо бы отключать клавиатуру - потом поправлю674675 01E9 401C MOUSINI:MOVL %D4,0676 01EA 2049 LDR #B,72677 01EB 4FAD MOVL %B5,125678 01EC 4FAE MOVL %B6,125679 01ED 5FEF MOVL %B7,255680 01EE 2019 LDR #B,18H681 01EF 91AE JSR WAIT ; мышь подключили. Теперь ожидаем ее готовность682 ; Теперь нужно передать в мышь команду запроса683 ; ее состояния (здесь неудобно использовать684 ; потоковый режим, хотя, в принципе, можно)685 01F0 5E13 MOVL %C3,11110000B ; код команды перехода в REMOTE MODE686 01F1 9155 JSR WR_SC687 01F2 9116 JSR MORE ; принимаем код подтверждения688 01F3 7F53 CMPL %C3,11111010B689 01F4 B1FC JNZ MOUSOFF ; ERROR690 01F5 5E73 MOVL %C3,11110011B691 01F6 9155 JSR WR_SC692 01F7 9116 JSR MORE693 01F8 4513 MOVL %C3,40694 01F9 9155 JSR WR_SC695 01FA 9116 JSR MORE696 01FB 000C RTS697698 01FC 5FFC MOUSOFF:MOVL %D4,255699 01FD 000C RTS700701 TIMER: ; мышку будем опрашивать по прерываниям от таймера702 01FE 4244 MOVL %A4,00010010B ; подключаем регистр конфигурации к адресу 5703 01FF 49C5 MOVL %A5,01001110B ; задаем коэффициент деления тактовой частоты 1/128704 0200 4044 MOVL %A4,00000010B ; подключаем регистр интервала (LOW) к адресу 5705 0201 4E25 MOVL %A5,113706 0202 40C4 MOVL %A4,00000110B ; подключаем регистр интервала (HI) к адресу 5707 0203 4045 MOVL %A5,2 ; итак, получили полный коэффициент708 ; деления 128*(2?4?*256+113)=80000, прерывания от709 ; таймера будут идти с частотой Fтакт/80000=100 Гц710 0204 4064 MOVL %A4,00000011B ; пускаем таймер на счет711 0205 0188 STIE ; разрешаем прерывания712 0206 000C RTS713714715 0207 2841 REST: BICL %A1,0010B716 0208 0000 NOP717 0209 0000 NOP718 020A 3881 BISL %A1,0100B719 020B 5FF3 MOVL %C3,255720 020C 5FF4 TRMZ0: MOVL %C4,255721 020D 43D5 TRMZ1: MOVL %C5,30722 020E 2C35 TRMZ2: DEC %C5723 020F B20E JNZ TRMZ2724 0210 2C34 DEC %C4725 0211 B20D JNZ TRMZ1726 0212 2C33 DEC %C3727 0213 B20C JNZ TRMZ0728 0214 2881 BICL %A1,0100B729 0215 0000 NOP730 0216 0000 NOP731 0217 3841 BISL %A1,0010B732 0218 0002 RST733 0219 801B JMP START734735 021A 0002 STERR: RST736 021B 801B JMP START737738 021C SCODE: .BYTE 12H,1CH,15H,16H,45H,4DH,5AH,29H739 .EVEN; байт 0: CS,A,Q,1,0,P,ENT,SPACE740741 0220 .BYTE 1AH,1BH,1DH,1EH,46H,44H,4BH,11H742 .EVEN; байт 1: Z,S,W,2,9,O,L,SS743744 0224 .BYTE 22H,23H,24H,26H,3EH,43H,42H,3AH745 .EVEN; байт 2: X,D,E,3,8,I,K,M746747 0228 .BYTE 21H,2BH,2DH,25H,3DH,3CH,3BH,31H748 .EVEN; байт 3: C,F,R,4,7,U,J,N749750 022C .BYTE 2AH,34H,2CH,2EH,36H,35H,33H,32H751 .EVEN; байт 4: V,G,T,5,6,Y,H,B752753 .END;