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 823B JMP STERR ;<2> выход за границу стека26 0003 808C JMP SC_M ;<3> Таймер A27 0004 0000 NOP ;<4> не используется28 0005 0000 NOP ;<5> не используется29 0006 8091 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 436A MOVL %B2,00011011B ; Установка конфигурации порта B54 001B 5FEA MOVL %B2,11111111B55 001C 5FEA MOVL %B2,11111111B56 001D 400A MOVL %B2,057 001E 400A MOVL %B2,058 001F 400A MOVL %B2,05960 0020 3841 BISL %A1,0010B ; выдаем 1 на линию сброса регистров в ПЛИС61 0021 2881 BICL %A1,0100B ; выдаем 0 на линию STROBE6263 0022 91F3 JSR KEYINI6465 0023 2841 BICL %A1,0010B66 0024 0000 NOP67 0025 0000 NOP68 0026 3881 BISL %A1,0100B6970 0027 91FC JSR MOUSINI7172 0028 921D JSR REZET7374 0029 9232 JSR TIMER7576 002A 2000 START: LDR #A,0 ; Сегмент A - рабочие регистры портов77 002B 2019 LDR #B,18H ; Сегмент B - регистры конфигурации портов78 002C 2042 LDR #C,64 ; Сегмент С - переменные79 002D 2053 LDR #D,80 ; Сегмент D - переменные8081 002E 91E2 JSR INIT ; инициализируем порты8283 002F 91F3 JSR KEYINI8485 0030 9232 JSR TIMER ; инициализируем прерывания от таймера8687 ;MOVL %D0,088 0031 91DA JSR RDFLSH8990 0032 285D MAIN: BICL %D5,0010B91 0033 343D BTTL %D5,0001B92 0034 B036 JNZ CLM9394 0035 8032 JMP MAIN ; и есчо разок ...9596 0036 7FFC CLM: CMPL %D4,25597 0037 A032 JZ MAIN ; если мышь не была расползнана при инициализации98 0038 4004 MOVL %A4,0 ; тормозим счетчик и запрещаем прерывания от него99 0039 91C1 JSR WAIT ; ожидаем готовность мыши100 003A 5D73 MOVL %C3,11101011B ; код команды запроса состояния101 003B 9166 JSR WR_SC ; засылаем в мышь102 003C 9127 JSR MORE ; принимаем ответ103 003D 7F53 CMPL %C3,11111010B ; все о.к. ?104 003E B036 JNZ CLM ; видимо, нет105 003F 9127 JSR MORE ; ну а если все о.к., то принимаем еще 3 байта106 0040 2049 LDR #B,72107 0041 066F MOV %B7,%C3 ; ZZ108 0042 9127 JSR MORE109 0043 9055 JSR MASHTB110 0044 2049 LDR #B,72111 0045 126D ADD %B5,%C3 ; XX112113 0046 9127 JSR MORE114115 0047 9055 JSR MASHTB116 0048 2049 LDR #B,72117 0049 126E ADD %B6,%C3 ; YY118119 004A 3BEF BISH %B7,1111B ; обрабатываем данные о нажатых кнопках мыши120 004B 290F BICL %B7,1000B121 004C 3DEF BTGL %B7,1111B122123 004D 283D BICL %D5,0001B ; CLEAR MOUSE INTERRUPTION BIT124125 004E 906C JSR VYVOD ; закачиваем данные в ПЛИС126127128129 004F 345D BTTL %D5,0010B130 0050 B052 JNZ EXI1131132 0051 9232 EXI: JSR TIMER133 0052 401D EXI1: MOVL %D5,0134 0053 4064 MOVL %A4,00000011B135 0054 8032 JMP MAIN136137 0055 0719 MASHTB: MOV %D1,D0 ; грузим в D1 коэффициент замедления мышки138 0056 6019 CMPL %D1,0139 0057 A06B JZ VJOPU140 0058 6013 CMPL %C3,0141 0059 A06B JZ VJOPU142143 005A 7013 CMPL %C3,128144 005B D064 JS MSH1 ; если меньше 128145 005C 501A MOVL %D2,10000000B;146147 005D 00B3 MSH0: SHR %C3148 005E 00DA SHRA %D2149 005F 2C39 DEC %D1150 0060 B05D JNZ MSH0151152 0061 009A SHL %D2 ; нужно установить столько старших разрядов, сколько153 ; сдвигов было проделано (иначе стрелка будет154 ; дергаться из-за того, что вместо уменьшения координат155 ; произойдет их увеличение). В D2 теперь как раз и будет156 ; установлено нужное количество старших разрядов.157158 0062 1B53 OR %C3,%D2159160 0063 000C RTS161162 0064 0719 MSH1: MOV %D1,%D0163 0065 00B3 MSH2: SHR %C3164 0066 2C39 DEC %D1165 0067 B065 JNZ MSH2166167 0068 6013 CMPL %C3,0168 0069 B06B JNZ VJOPU169 006A 4033 MOVL %C3,1170171 006B 000C VJOPU: RTS172173174 VYVOD: ; закачка данных в ПЛИС175 006C 2841 BICL %A1,0010B ; сбрасываем регистры в ПЛИС176 006D 0000 NOP177 006E 0000 NOP178 006F 3841 BISL %A1,0010B ; снимаем сигнал сброса179 0070 2049 LDR #B,72180 0071 0502 MOV %A2,%B0 ; понеслась :-)181 0072 9087 JSR STROBE182 0073 0522 MOV %A2,%B1183 0074 9087 JSR STROBE184 0075 0542 MOV %A2,%B2185 0076 9087 JSR STROBE186 0077 0562 MOV %A2,%B3187 0078 9087 JSR STROBE188 0079 0582 MOV %A2,%B4189 007A 9087 JSR STROBE190 007B 1B8D OR %B5,%D4191 007C 05A2 MOV %A2,%B5192 007D 9087 JSR STROBE193 007E 1B8E OR %B6,%D4194 007F 05C2 MOV %A2,%B6195 0080 9087 JSR STROBE196 0081 1B8F OR %B7,%D4197 0082 05E2 MOV %A2,%B7198 0083 9087 JSR STROBE199 0084 4002 MOVL %A2,0200 0085 2019 LDR #B,18H201 0086 000C RTS202203 0087 3881 STROBE: BISL %A1,0100B ; даем строб204 0088 0000 NOP205 0089 0000 NOP206 008A 2881 BICL %A1,0100B ; снимаем строб207 008B 000C RTS208209 008C 01C8 SC_M: CLIE210 008D 0493 MOV %C3,%A4211 008E 383D BISL %D5,0001B212 008F 0188 STIE213 0090 000D RTI214215216217 0091 01C8 SC_KEY: CLIE ; запрещаем прерывания218 0092 0433 MOV %C3,%A1 ; снимаеи сигнал запроса прерывания +219 ; MOV %C3,%A4220 0093 4004 MOVL %A4,00000000B ; тормозим счетчик и запрещаем прерывания от него221 ; MOVL %A4,00000110B222 ; MOVL %A5,150223 ; MOVL %A4,0224225 0094 0011 PUSH #B226 0095 2019 LDR #B,18H227 0096 4569 MOVL %B1,00101011B228 0097 40E9 MOVL %B1,00000111B ; разрешаем запись в PA0229 0098 2821 BICL %A1,0001B ; захватываем сигнал переключения на клавиатуру230 0099 385D BISL %D5,0010B ; устанавливаем флаг прерывания от клавиатуры231232 009A 90A5 JSR KEY233 009B 906C JSR VYVOD234235 009C 2019 LDR #B,18H236 009D 4569 MOVL %B1,00101011B237 009E 40C9 MOVL %B1,00000110B ; запрещаем запись в PA0238239 009F 40C4 MOVL %A4,00000110B ; подключаем регистр интервала (HI) к адресу 5240 00A0 52C5 MOVL %A5,150241 00A1 4064 MOVL %A4,00000011B ; запускаем счетчик и разрешаем прерывания от него242 00A2 0019 POP #B243244245 00A3 0188 STIE246 00A4 000D RTI247248 ; ****249250 00A5 4014 KEY: MOVL %C4,0251 00A6 4015 MOVL %C5,0252 00A7 9151 JSR RD_SC ; Ура! Начинаем принимать скан-код!253 00A8 0674 MOV %C4,%C3254 00A9 7C14 CMPL %C4,11100000B ; принимать второй байт скан-кода?255 00AA A0AE JZ KEY1256 00AB 7C34 CMPL %C4,11100001B257 00AC A0AE JZ KEY1258 00AD 80B1 JMP CONTTT259 00AE 3855 KEY1: BISL %C5,0010B ; устанавливаем флажок260 00AF 9127 JSR MORE261 00B0 0674 MOV %C4,%C3262263 00B1 60F4 CONTTT: CMPL %C4,7 ; если нажата кнопка F12, то даем RESET264 00B2 A228 JZ REZT265 00B3 6F14 CMPL %C4,078H266 00B4 B0B6 JNZ CONTTZ267 00B5 9148 JSR NMI268 00B6 6014 CONTTZ: CMPL %C4,0 ; если была ошибка, то считаем, что был269 ; принят код отжатия. Понимаю, что лажа, но270 ; почему-то в 99% случаев ошибки происходят271 ; именно при приеме кода отжатия. Уж не знаю,272 ; почему. Спишем на ламерство изобретателей273 ; PS2 интерфейса (ну не признавать же свою274 ; криворукость275 00B7 A0BD JZ PODGON276 00B8 7E14 CMPL %C4,11110000B ; это был код отжатой клавиши?277 00B9 A0BD JZ PODGON278 00BA 7E34 CMPL %C4,11110001B279 00BB A0BD JZ PODGON280 00BC 80C0 JMP CONTT0281 00BD 3835 PODGON: BISL %C5,0001B ; устанавливаем флажок282 00BE 9127 JSR MORE ; принимаем еще один скан-код - код отжатой283 00BF 0674 MOV %C4,%C3 ; клавиши284285 00C0 3455 CONTT0: BTTL %C5,0010B286 00C1 A0D8 JZ CONTTA287288 00C2 6234 CONTT1: CMPL %C4,00010001B ; правый ALT = левый ALT = SYMBOL SHIFT289 00C3 A106 JZ CONTT2290291 00C4 6E94 EX5: CMPL %C4,74H292 00C5 B0C8 JNZ EX6293 00C6 9136 JSR SHIFT294 00C7 47D4 MOVL %C4,3EH295296 00C8 6D74 EX6: CMPL %C4,6BH297 00C9 B0CC JNZ EX7298 00CA 9136 JSR SHIFT299 00CB 45D4 MOVL %C4,2EH300301 00CC 6EB4 EX7: CMPL %C4,75H ; UP302 00CD B0D0 JNZ EX8303 00CE 9136 JSR SHIFT304 00CF 47B4 MOVL %C4,3DH305306 00D0 6E54 EX8: CMPL %C4,72H ; DOWN307 00D1 B0D4 JNZ EX9308 00D2 9136 JSR SHIFT309 00D3 46D4 MOVL %C4,36H310311 00D4 6E34 EX9: CMPL %C4,71H ; BACKSPACE = DEL312 00D5 B106 JNZ CONTT2313 00D6 9133 JSR BACKSP314 00D7 8106 JMP CONTT2315316 00D8 6CD4 CONTTA: CMPL %C4,66H ; это клавиша BACKSPACE?317 00D9 B0DB JNZ CONTTD318 00DA 9133 JSR BACKSP ; если да, то ставим в соответсвие CAPS+0319320 00DB 6B34 CONTTD: CMPL %C4,59H ; правый SHIFT = левый SHIFT = CAPS SHIFT321 00DC B0DE JNZ CONTTW322 00DD 4254 MOVL %C4,12H323324 00DE 61B4 CONTTW: CMPL %C4,0DH ; TAB = EDIT = CAPS + 0325 00DF B0E2 JNZ CONTE326 00E0 9136 JSR SHIFT327 00E1 42D4 MOVL %C4,16H328329 00E2 6B14 CONTE: CMPL %C4,58H ; CAPS LOCK = CAPS + 2330 00E3 B0E6 JNZ CONTE1331 00E4 9136 JSR SHIFT332 00E5 43D4 MOVL %C4,1EH333334 00E6 6934 CONTE1: CMPL %C4,049H ; точка335 00E7 B0EA JNZ CONTE2336 00E8 913F JSR SSHIFT337 00E9 4754 MOVL %C4,03AH338339 00EA 6834 CONTE2: CMPL %C4,041H ; запятая340 00EB B0EE JNZ CONTE3341 00EC 913F JSR SSHIFT342 00ED 4634 MOVL %C4,031H343344 00EE 6AB4 CONTE3: CMPL %C4,055H ; =345 00EF B0F2 JNZ CONTE4346 00F0 913F JSR SSHIFT347 00F1 4974 MOVL %C4,004BH348349 00F2 69D4 CONTE4: CMPL %C4,04EH ; -350 00F3 B0F6 JNZ CONTE5351 00F4 913F JSR SSHIFT352 00F5 4774 MOVL %C4,03BH353354 00F6 60D4 CONTE5: CMPL %C4,6355 00F7 B0FB JNZ CONTE6356 00F8 3435 BTTL %C5,0001B357 00F9 B0FB JNZ CONTE6358 00FA 3038 INC %D0 ; F2 - увеличения коэффициента замедления мышки359360 00FB 6094 CONTE6: CMPL %C4,4361 00FC B103 JNZ CONTE7362 00FD 3435 BTTL %C5,0001B363 00FE B103 JNZ CONTE7364 00FF 2C38 DEC %D0 ; F3 - уменьшение коэффициента замедления мышки365 0100 7FF8 CMPL %D0,255366 0101 B103 JNZ CONTE7367 0102 4018 MOVL %D0,0368369 0103 60B4 CONTE7: CMPL %C4,5370 0104 B106 JNZ CONTT2371 0105 91D2 JSR WRFLSH ; - F1 - сохранение коэффициента замедления во FLASH - память372373 0106 4F51 CONTT2: MDAL %C1,SCODE374 0107 4092 MDAH %C2,SCODE ; Грузим в регистр косвенной адресации адрес375 0108 02D1 MTPR #6,%C1 ; таблицы скан-кодов в памяти команд376 0109 02F2 MTPR #7,%C2 ; (вся хрень с автоинкрементом, доступ через D7)377378 010A 4911 CCD: MOVL %C1,72379 010B 4116 CYCK0: MOVL %C6,8 ; 8 бит380 010C 5FD2 MOVL %C2,11111110B ; стартовое значение381 010D 07F3 CYCK1: MOV %C3,D7 ; берем скан-код из таблицы382 010E 0A93 CMP %C3,%C4 ; совпал с прочитанным?383 010F A11B JZ SKEY ; если совпал то идем на SKEY384 0110 0181 SST 0001B ; устанавливаем флаг C385 0111 00F2 RLC %C2 ; смотрим следующий вариант386 0112 2C36 DEC %C6387 0113 B10D JNZ CYCK1388 0114 3031 INC %C1389 0115 69B1 CMPL %C1,77 ; проверили все 5 наборов по 8 клавиш390 0116 B10B JNZ CYCK0391 0117 4014 MOVL %C4,0392 0118 000C RTS393394 0119 91F3 PPODGON:JSR KEYINI395 011A 80BD JMP PODGON396397398 011B 0291 SKEY: MTPR #4,%C1399 011C 4811 MOVL %C1,01000000B400 011D 02B1 MTPR #5,%C1401 011E 3435 BTTL %C5,0001B402 011F B123 JNZ RESKEY403 0120 165E AND %D6,%C2 ; фиксируем нажатие клавиши404 0121 4014 MOVL %C4,0405 0122 000C RTS406 0123 0072 RESKEY: NOT %C2407 0124 1A5E OR %D6,%C2 ; фиксируем отжатие клавиши408 0125 4014 MOVL %C4,0409 0126 000C RTS ; Усё410411 0127 5BD0 MORE: MOVL %C0,222 ; будем ждать (3*45+3)*222 команд412 0128 45B1 WT0: MOVL %C1,45 ; если за это время не поступит новый байт413 0129 0432 WT1: MOV %C2,%A1 ; данных, то выходим по ошибке414 012A 3632 BTTH %C2,0001B;415 012B A131 JZ WT2416 012C 2C31 DEC %C1417 012D B129 JNZ WT1418 012E 2C30 DEC %C0419 012F B128 JNZ WT0;420 0130 000C RTS421 0131 9151 WT2: JSR RD_SC422 0132 000C RTS423424 0133 9136 BACKSP: JSR SHIFT ; DEL = SHIFT+0 обрабатываем SHIFT425 0134 48B4 MOVL %C4,45H ; подсовываем скан-код нуля426 0135 000C RTS427428 0136 2049 SHIFT: LDR #B,72429 0137 3435 BTTL %C5,0001B430 0138 B13C JNZ RSHIFT431 0139 2828 BICL %B0,0001B ; фиксируем нажатие клавиши432 013A 2019 LDR #B,18H433 013B 000C RTS434 013C 3828 RSHIFT: BISL %B0,0001B ; фиксируем отжатие клавиши435 013D 2019 LDR #B,18H436 013E 000C RTS437438 013F 2049 SSHIFT: LDR #B,72439 0140 3435 BTTL %C5,0001B440 0141 B145 JNZ RSSHIFT441 0142 2B09 BICH %B1,1000B ; фиксируем нажатие клавиши442 0143 2019 LDR #B,18H443 0144 000C RTS444 0145 3B09 RSSHIFT:BISH %B1,1000B ; фиксируем отжатие клавиши445 0146 2019 LDR #B,18H446 0147 000C RTS447448 0148 2841 NMI: BICL %A1,0010B ; даем сигнал сброса449 0149 4022 MOVL %A2,1 ; даем DATA0 = 1 (теперь на выходе NMI ПЛИС450 ; появится 0)451 014A 0000 NOP452 014B 0000 NOP453 014C 0000 NOP454 014D 0000 NOP455 014E 4002 MOVL %A2,0 ; убираем 1 на DATA0456 014F 3841 BISL %A1,0010B ; снимаем сигнал сброса457 0150 000C RTS458459 ; **************************************************************460461 RD_SC: ; Процедура чтения байта скан-кода462463 0151 4013 MOVL %C3,0 ; Будем читать в C3. Начальное значение 0464 0152 0431 MOV %C1,%A1465 0153 3511 BTTL %C1,1000B ; проверяем стартовый бит466 ; JNZ ERROR467 ; скан-код468469 0154 4112 MOVL %C2,8 ; будем читать 8 бит470 0155 91C1 SCAN1: JSR WAIT471 0156 91C5 JSR WAIT1 ; идем на процедуру ожидания следующего такта472 0157 00B3 SHR %C3473 0158 0431 MOV %C1,%A1474 0159 3511 BTTL %C1,1000B475 015A A15C JZ SCAN2476 015B 3B13 BISH %C3,1000B ; если DATA=1, то ставим эту 1 в C3477 015C 2C32 SCAN2: DEC %C2478 015D B155 JNZ SCAN1479 015E 91C1 JSR WAIT ; Байт скан-кода вроде бы прочитали, теперь надо принять бит480 ; четности и затем стоповый бит.481 015F 91C5 JSR WAIT1; На бит четности сразу же кладем, ибо нафиг он не нужен482483 0160 91C1 JSR WAIT484 0161 91C5 JSR WAIT1485 0162 0431 MOV %C1,A1486 0163 3511 BTTL %C1,1000B ; Проверяем стоповый бит487488 ; JZ ERROR489 0164 91C1 JSR WAIT ; ждем прихода в исходное состояние490 0165 000C RTS491492 ; ******************************************************************493494 WR_SC: ; Процедура передачи байта скан-кода495 ; Чтобы перейти в режим передачи данных, нужно удерживать 0 на линии496 ; CLK не менее 60 мкс. На всякий случай будем держать 0 80 мкс.497 ; 80 это 320 команд (640 тактов) при F=8 МГц498499 0166 4569 MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A500 0167 43C9 MOVL %B1,00011110B501502 0168 2A21 BICH %A1,0001B ; выдаем 0 в CLK и DATA503 0169 2901 BICL %A1,1000B504505 016A 4810 MOVL %C0,64 ; Ждем 64*5=320 команд506 016B 0000 REPL: NOP507 016C 0000 NOP508 016D 0000 NOP509510 016E 0000 NOP ; было 3511 016F 0000 NOP512 0170 2C30 DEC %C0513 0171 B16B JNZ REPL;514515 0172 3A21 BISH %A1,0001B ; снимаем 0 CLK516 0173 4569 MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A517 0174 41C9 MOVL %B1,00001110B ; переводим CLK на чтение518 0175 2901 BICL %A1,1000B519520 0176 4030 MOVL %C0,1 ; это будет счетчик единичных битов для формирования521 ; бита четности522523 0177 5FF7 W1: MOVL %C7,255 ; ждем 0, т.е. начала тактирования процесса524 0178 3621 W2: BTTH %A1,0001B525 0179 A181 JZ E1526 017A 0000 NOP527 017B 0000 NOP528 017C 0000 NOP529 017D 0000 NOP530 017E 0000 NOP531 017F 2C37 DEC %C7532 0180 B178 JNZ W2533 E1:534 ; передачи данных девайсом535 0181 4112 MOVL %C2,8 ; будем передавать 8 бит536 WR_0: ; передаем бит537538 0182 00B3 WR1: SHR %C3539 0183 F186 JC WR2540 0184 2901 BICL %A1,1000B541 0185 8188 JMP WR3542543 0186 3901 WR2: BISL %A1,1000B544 0187 3030 INC %C0 ; добавляем 1 к счетчику545 0188 3621 WR3: BTTH %A1,0001B ; ждем 1 на CLK546 0189 A188 JZ WR3;547548 ; ожидаем защелкивания бита данных девайсом и его549 ; готовности к приему следующего бита (0 на CLK)550551 018A 5FF7 MOVL %C7,255552 018B 3621 WW2: BTTH %A1,0001B553 018C A194 JZ EE1554 018D 0000 NOP555 018E 0000 NOP556 018F 0000 NOP557 0190 0000 NOP558 0191 0000 NOP559 0192 2C37 DEC %C7560 0193 B18B JNZ WW2561562 0194 2C32 EE1: DEC %C2563 0195 B182 JNZ WR_0564565 ; Байт скан-кода вроде бы передали, теперь надо передать бит566 ; четности и затем принять стоповый бит. Мля, ну какие же567 ; ламеры придумали этот PS2 интерфейс :-E568569 0196 4013 MOVL %C3,0570 0197 00B0 SHR %C0 ; Значение бита четности берем из 0-го разряда %C0571 0198 E19A JNC BCNZ ; Если бит четности =0572 0199 3833 BISL %C3,1 ; если бит четности =1573574 BCNZ: ; передаем575576 019A 00B3 SHR %C3577 019B F19E JC WRR2578 019C 2901 BICL %A1,1000B579 019D 81A0 JMP WRR3580581 019E 3901 WRR2: BISL %A1,1000B582 019F 3030 INC %C0 ; добавляем 1 к счетчику583584 WRR3: ; ждем 1585 01A0 3621 BTTH %A1,0001B586 01A1 A1A0 JZ WRR3;587588 ; ожидаем защелкивания бита данных девайсом и его589 ; готовности к приему следующего бита590591 01A2 5FF7 MOVL %C7,255 ; ждем 0592 01A3 3621 WWA1: BTTH %A1,0001B593 01A4 A1AC JZ EEX594 01A5 0000 NOP595 01A6 0000 NOP596 01A7 0000 NOP597 01A8 0000 NOP598 01A9 0000 NOP599 01AA 2C37 DEC %C7600 01AB B1A3 JNZ WWA1601602 01AC 4569 EEX: MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A603 01AD 40C9 MOVL %B1,00000110B ; переводим DATA на чтение604605 IT: ; ждем 1606 01AE 3621 BTTH %A1,0001B607 01AF A1AE JZ IT;608609 01B0 91C5 JSR WAIT1 ; ожидаем приход стопового бита610611612 01B1 5FF7 MOVL %C7,255 ; ждем 0613 01B2 3621 AWA1: BTTH %A1,0001B614 01B3 A1BB JZ WEX615 01B4 0000 NOP616 01B5 0000 NOP617 01B6 0000 NOP618 01B7 0000 NOP619 01B8 0000 NOP620 01B9 2C37 DEC %C7621 01BA B1B2 JNZ AWA1622623 01BB 0431 WEX: MOV %C1,%A1624 01BC 3511 BTTL %C1,1000B ; проверяем стоповый бит625 ; только непонятно, зачем626627 HT: ; ждем 1628 01BD 3621 BTTH %A1,0001B629 01BE A1BD JZ HT;630 01BF 000C RTS631632 01C0 4013 ERROR: MOVL %C3,0633634 01C1 0431 WAIT: MOV %C1,%A1 ; ждем 1635 01C2 3631 BTTH %C1,0001B636 01C3 A1C1 JZ WAIT;637 01C4 000C RTS638 01C5 5FF7 WAIT1: MOVL %C7,255 ; ждем 0639 01C6 0431 WAI1: MOV %C1,%A1640 01C7 3631 BTTH %C1,0001B641 01C8 A1D1 JZ EXIT1642 01C9 0000 NOP643 01CA 0000 NOP644 01CB 0000 NOP645 01CC 0000 NOP646 01CD 0000 NOP647 01CE 2C37 DEC %C7648 01CF B1C6 JNZ WAI1649 01D0 81C0 JMP ERROR650 01D1 000C EXIT1: RTS651652 ; ********************653654 01D2 2039 WRFLSH: LDR #B,56 ; адрес регистра управления блока ЭСППЗУ данных655 01D3 4009 MOVL %B1,0 ; адрес ячейки = 0 (используем только один байт)656 01D4 070F MOV %B7,%D0657 01D5 4028 MOVL %B0,00000001B658 01D6 3428 WRF1: BTTL %B0,0001B659 01D7 B1D6 JNZ WRF1 ; ждем, пока происходит запись660 01D8 2019 LDR #B,18H661 01D9 000C RTS662663 ; ********************664665 01DA 2039 RDFLSH: LDR #B,56 ; адрес регистра управления блока ЭСППЗУ данных666 01DB 4009 MOVL %B1,0 ; адрес ячейки = 0 (используем только один байт)667 01DC 4048 MOVL %B0,00000010B668 01DD 3448 RDF1: BTTL %B0,0010B669 01DE B1DD JNZ RDF1 ; ждем, пока происходит чтение670 01DF 05F8 MOV %D0,%B7671 01E0 2019 LDR #B,18H672 01E1 000C RTS673674 ; ********************675 01E2 4769 INIT: MOVL %B1,00111011B ; Установка конфигурации порта A676 01E3 40C9 MOVL %B1,00000110B677 01E4 43E9 MOVL %B1,00011111B678 01E5 4009 MOVL %B1,00000000B679 01E6 4009 MOVL %B1,00000000B680 01E7 4029 MOVL %B1,00000001B ; прерывание по отрицательному перепаду уровня681 ; на линии CLK_KEY для опроса клавиатуры682683 01E8 0188 STIE684685 01E9 436A MOVL %B2,00011011B ; Установка конфигурации порта B686 01EA 5FEA MOVL %B2,11111111B687 01EB 5FEA MOVL %B2,11111111B688 01EC 400A MOVL %B2,0689 01ED 400A MOVL %B2,0690 01EE 400A MOVL %B2,0691692 01EF 3841 BISL %A1,0010B ; выдаем 1 на линию сброса регистров в ПЛИС693 01F0 2881 BICL %A1,0100B ; выдаем 0 на линию STROBE694695 01F1 401D MOVL %D5,0 ; флажок (потом пригодится)696 01F2 000C RTS697698 KEYINI: ; инициализация матрицы клавиатуры699 01F3 2049 LDR #B,72 ; весь буфер из 5-и байтов заполняем700 01F4 5FE8 MOVL %B0,11111111B ; значениями 255701 01F5 5FE9 MOVL %B1,11111111B702 01F6 5FEA MOVL %B2,11111111B703 01F7 5FEB MOVL %B3,11111111B704 01F8 5FEC MOVL %B4,11111111B705 01F9 2019 LDR #B,18H706 01FA 906C JSR VYVOD707 01FB 000C RTS708709 ; здесь надо бы отключать клавиатуру - потом поправлю710711 01FC 01C8 MOUSINI:CLIE ; DI712713 01FD 2049 LDR #B,72714 01FE 4FAD MOVL %B5,125715 01FF 4FEE MOVL %B6,127716 0200 5FEF MOVL %B7,255717 0201 2019 LDR #B,18H718719 0202 9251 JSR RMZ00720721722 0203 91C1 JSR WAIT723724 ; мышь подключили. Теперь ожидаем ее готовность725 ; Теперь нужно передать в мышь команду запроса726 ; ее состояния (здесь неудобно использовать727 ; потоковый режим, хотя, в принципе, можно)728729 0204 407C MOVL %D4,3730 MR:731 0205 5FF3 MOVL %C3,0FFH732 0206 9166 JSR WR_SC733 0207 9251 JSR RMZ00734 0208 9127 JSR MORE735 0209 9127 JSR MORE736737 020A 5E93 MRR: MOVL %C3,0F4H738 020B 9166 JSR WR_SC739 020C 9127 JSR MORE740741 020D 5E13 MOVL %C3,11110000B ; код команды перехода в REMOTE MODE742 020E 9166 JSR WR_SC743 020F 9127 JSR MORE ; принимаем код подтверждения744 0210 7F53 CMPL %C3,11111010B745 0211 A215 JZ MRR1746 0212 2C3C DEC %D4747 0213 B205 JNZ MR748749 0214 822B JMP MOUSOFF ;MOUSOFF750751 0215 401C MRR1: MOVL %D4,0752 ; MOVL %C3,11110011B753 ; JSR WR_SC754 ; JSR MORE755 ; MOVL %C3,80756 ; JSR WR_SC757 ; JSR MORE758759 0216 5D13 MOVL %C3,11101000B760 0217 9166 JSR WR_SC761 0218 9127 JSR MORE762 0219 4013 MOVL %C3,0763 021A 9166 JSR WR_SC764 021B 9127 JSR MORE765766 021C 000C RTS767768 021D 2841 REZET: BICL %A1,0010B769 021E 0000 NOP770 021F 0000 NOP771 0220 3881 BISL %A1,0100B772773 0221 4653 MOVL %C3,50774 0222 9252 JSR RMZ01775776 0223 2881 BICL %A1,0100B777 0224 0000 NOP778 0225 0000 NOP779 0226 3841 BISL %A1,0010B780 0227 000C RTS781782 0228 921D REZT: JSR REZET783 0229 0002 RST784 022A 802A JMP START785786 022B 5FFC MOUSOFF:MOVL %D4,255787 022C 2049 LDR #B,72788 022D 5FED MOVL %B5,255789 022E 5FEE MOVL %B6,255790 022F 5FEF MOVL %B7,255791 0230 2019 LDR #B,18H792793 0231 000C RTS794795 TIMER: ; мышку будем опрашивать по прерываниям от таймера796 0232 4244 MOVL %A4,00010010B ; подключаем регистр конфигурации к адресу 5797 0233 49E5 MOVL %A5,01001111B ; задаем коэффициент деления тактовой частоты 1/256798 0234 4044 MOVL %A4,00000010B ; подключаем регистр интервала (LOW) к адресу 5799 0235 48C5 MOVL %A5,70800 0236 40C4 MOVL %A4,00000110B ; подключаем регистр интервала (HI) к адресу 5801 0237 4005 MOVL %A5,0 ; итак, получили полный коэффициент802 ; деления 128*(2?4?*256+113)=80000, прерывания от803 ; таймера будут идти с частотой Fтакт/80000=100 Гц804 0238 4064 MOVL %A4,00000011B ; пускаем таймер на счет805 0239 0188 STIE ; разрешаем прерывания806 023A 000C RTS807808809 023B 0002 STERR: RST810 023C 8032 JMP MAIN811812 023D SCODE: .BYTE 12H,1CH,15H,16H,45H,4DH,5AH,29H813 .EVEN; байт 0: CS,A,Q,1,0,P,ENT,SPACE814815 0241 .BYTE 1AH,1BH,1DH,1EH,46H,44H,4BH,11H816 .EVEN; байт 1: Z,S,W,2,9,O,L,SS817818 0245 .BYTE 22H,23H,24H,26H,3EH,43H,42H,3AH819 .EVEN; байт 2: X,D,E,3,8,I,K,M820821 0249 .BYTE 21H,2BH,2DH,25H,3DH,3CH,3BH,31H822 .EVEN; байт 3: C,F,R,4,7,U,J,N823824 024D .BYTE 2AH,34H,2CH,2EH,36H,35H,33H,32H825 .EVEN; байт 4: V,G,T,5,6,Y,H,B826827 0251 5373 RMZ00: MOVL %C3,155828 0252 9256 RMZ01: JSR RMZ0829 0253 2C33 DEC %C3830 0254 B252 JNZ RMZ01831 0255 000C RTS832 0256 5FF4 RMZ0: MOVL %C4,255833 0257 45B5 RMZ1: MOVL %C5,45834 0258 2C35 RMZ2: DEC %C5835 0259 B258 JNZ RMZ2836 025A 2C34 DEC %C4837 025B B257 JNZ RMZ1838 025C 000C RTS839840 .END;