Subversion Repositories KoE_projects

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

          Windows VERSION
    1                   ; контроллер PS2 клавиатуры/мыши для ZX-SPECTRUM
    2                   ; BY KINGOFEVIL, год 2OO7 от р.х.
    3                   ;
    4                   ; Тактовая частота микроконтроллера 8 МГц
    5                   ; Назначение выводов микроконтроллера:
    6                   ;
    7                   ;  PS2: PA4 - CLK
    8                   ;       PA3 - DATA
    9                   ;
   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)
   19                   
   20                   
   21                   ; область векторов прерываний
   22                   
   23 0000 8010                 JMP START0 ;<0>  Начальный пуск программы
   24 0001 0000                 NOP        ;<1>  Сторожевой таймер
   25 0002 823B                 JMP STERR  ;<2>  выход за границу стека
   26 0003 808C                 JMP SC_M   ;<3>  Таймер A
   27 0004 0000                 NOP        ;<4>  не используется
   28 0005 0000                 NOP        ;<5>  не используется
   29 0006 8091                 JMP SC_KEY ;<6>  Порт A
   30 0007 0000                 NOP        ;<7>  Порт B
   31 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> Завершение записи в флэш
   39                   
   40                   
   41 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 - переменные
   45                   
   46 0014 4769                 MOVL %B1,00111011B ; Установка конфигурации порта A
   47 0015 40C9                 MOVL %B1,00000110B
   48 0016 43E9                 MOVL %B1,00011111B
   49 0017 4009                 MOVL %B1,00000000B
   50 0018 4009                 MOVL %B1,00000000B
   51 0019 4009                 MOVL %B1,00000000B ; прерывание по отрицательному перепаду уровня
   52                   
   53 001A 436A                 MOVL %B2,00011011B ; Установка конфигурации порта B
   54 001B 5FEA                 MOVL %B2,11111111B
   55 001C 5FEA                 MOVL %B2,11111111B
   56 001D 400A                 MOVL %B2,0
   57 001E 400A                 MOVL %B2,0
   58 001F 400A                 MOVL %B2,0
   59                   
   60 0020 3841                 BISL %A1,0010B     ; выдаем 1 на линию сброса регистров в ПЛИС
   61 0021 2881                 BICL %A1,0100B     ; выдаем 0 на линию STROBE
   62                   
   63 0022 91F3                 JSR KEYINI
   64                           
   65 0023 2841                 BICL %A1,0010B 
   66 0024 0000                 NOP
   67 0025 0000                 NOP
   68 0026 3881                 BISL %A1,0100B
   69                                  
   70 0027 91FC                 JSR MOUSINI
   71                           
   72 0028 921D                 JSR REZET
   73                   
   74 0029 9232                 JSR TIMER
   75                   
   76 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 - переменные
   80                   
   81 002E 91E2                 JSR INIT           ; инициализируем порты
   82                   
   83 002F 91F3                 JSR KEYINI
   84                   
   85 0030 9232                 JSR TIMER          ; инициализируем прерывания от таймера
   86                   
   87                           ;MOVL %D0,0
   88 0031 91DA                 JSR RDFLSH
   89                   
   90 0032 285D         MAIN:   BICL %D5,0010B
   91 0033 343D                 BTTL %D5,0001B
   92 0034 B036                 JNZ CLM
   93                          
   94 0035 8032                 JMP MAIN          ; и есчо разок ...
   95                   
   96 0036 7FFC         CLM:    CMPL %D4,255
   97 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,72
  107 0041 066F                 MOV %B7,%C3 ; ZZ
  108 0042 9127                 JSR MORE
  109 0043 9055                 JSR MASHTB      
  110 0044 2049                 LDR #B,72
  111 0045 126D                 ADD %B5,%C3 ; XX
  112                   
  113 0046 9127                 JSR MORE
  114                           
  115 0047 9055                 JSR MASHTB
  116 0048 2049                 LDR #B,72
  117 0049 126E                 ADD %B6,%C3 ; YY
  118                           
  119 004A 3BEF                 BISH %B7,1111B    ; обрабатываем данные о нажатых кнопках мыши
  120 004B 290F                 BICL %B7,1000B
  121 004C 3DEF                 BTGL %B7,1111B
  122                                    
  123 004D 283D                 BICL %D5,0001B    ; CLEAR MOUSE INTERRUPTION BIT
  124                           
  125 004E 906C                 JSR VYVOD         ; закачиваем данные в ПЛИС
  126                   
  127                   
  128                                  
  129 004F 345D                 BTTL %D5,0010B
  130 0050 B052                 JNZ EXI1
  131                   
  132 0051 9232         EXI:    JSR TIMER
  133 0052 401D         EXI1:   MOVL %D5,0
  134 0053 4064                 MOVL %A4,00000011B
  135 0054 8032                 JMP MAIN
  136                   
  137 0055 0719         MASHTB: MOV %D1,D0      ; грузим в D1 коэффициент замедления мышки
  138 0056 6019                 CMPL %D1,0
  139 0057 A06B                 JZ VJOPU
  140 0058 6013                 CMPL %C3,0
  141 0059 A06B                 JZ VJOPU        
  142                   
  143 005A 7013                 CMPL %C3,128
  144 005B D064                 JS MSH1 ; если меньше 128
  145 005C 501A                 MOVL %D2,10000000B;
  146                   
  147 005D 00B3         MSH0:   SHR %C3
  148 005E 00DA                 SHRA %D2
  149 005F 2C39                 DEC %D1
  150 0060 B05D                 JNZ MSH0
  151                   
  152 0061 009A                 SHL %D2         ; нужно установить столько старших разрядов, сколько
  153                                           ; сдвигов было проделано (иначе стрелка будет 
  154                                           ; дергаться из-за того, что вместо уменьшения координат
  155                                           ; произойдет их увеличение). В D2 теперь как раз и будет
  156                                           ; установлено нужное количество старших разрядов.
  157                   
  158 0062 1B53                 OR %C3,%D2
  159                           
  160 0063 000C                 RTS
  161                   
  162 0064 0719         MSH1:   MOV %D1,%D0
  163 0065 00B3         MSH2:   SHR %C3
  164 0066 2C39                 DEC %D1
  165 0067 B065                 JNZ MSH2
  166                           
  167 0068 6013                 CMPL %C3,0
  168 0069 B06B                 JNZ VJOPU
  169 006A 4033                 MOVL %C3,1
  170                   
  171 006B 000C         VJOPU:  RTS
  172                   
  173                   
  174                   VYVOD:                     ; закачка данных в ПЛИС
  175 006C 2841                 BICL %A1,0010B     ; сбрасываем регистры в ПЛИС
  176 006D 0000                 NOP
  177 006E 0000                 NOP
  178 006F 3841                 BISL %A1,0010B     ; снимаем сигнал сброса
  179 0070 2049                 LDR #B,72   
  180 0071 0502                 MOV %A2,%B0        ; понеслась :-)
  181 0072 9087                 JSR STROBE
  182 0073 0522                 MOV %A2,%B1
  183 0074 9087                 JSR STROBE
  184 0075 0542                 MOV %A2,%B2
  185 0076 9087                 JSR STROBE
  186 0077 0562                 MOV %A2,%B3
  187 0078 9087                 JSR STROBE
  188 0079 0582                 MOV %A2,%B4
  189 007A 9087                 JSR STROBE
  190 007B 1B8D                 OR %B5,%D4
  191 007C 05A2                 MOV %A2,%B5
  192 007D 9087                 JSR STROBE
  193 007E 1B8E                 OR %B6,%D4
  194 007F 05C2                 MOV %A2,%B6
  195 0080 9087                 JSR STROBE
  196 0081 1B8F                 OR %B7,%D4
  197 0082 05E2                 MOV %A2,%B7
  198 0083 9087                 JSR STROBE
  199 0084 4002                 MOVL %A2,0
  200 0085 2019                 LDR #B,18H
  201 0086 000C                 RTS
  202                   
  203 0087 3881         STROBE: BISL %A1,0100B ; даем строб
  204 0088 0000                 NOP
  205 0089 0000                 NOP
  206 008A 2881                 BICL %A1,0100B ; снимаем строб
  207 008B 000C                 RTS
  208                   
  209 008C 01C8         SC_M:   CLIE
  210 008D 0493                 MOV %C3,%A4
  211 008E 383D                 BISL %D5,0001B
  212 008F 0188                 STIE
  213 0090 000D                 RTI
  214                   
  215                   
  216                   
  217 0091 01C8         SC_KEY: CLIE               ; запрещаем прерывания
  218 0092 0433                 MOV %C3,%A1        ; снимаеи сигнал запроса прерывания                                                      +
  219                   ;       MOV %C3,%A4
  220 0093 4004                 MOVL %A4,00000000B ; тормозим счетчик и запрещаем прерывания от него
  221                   ;       MOVL %A4,00000110B
  222                   ;       MOVL %A5,150
  223                   ;       MOVL %A4,0
  224                   
  225 0094 0011                 PUSH #B
  226 0095 2019                 LDR #B,18H
  227 0096 4569                 MOVL %B1,00101011B
  228 0097 40E9                 MOVL %B1,00000111B ; разрешаем запись в PA0
  229 0098 2821                 BICL %A1,0001B     ; захватываем сигнал переключения на клавиатуру
  230 0099 385D                 BISL %D5,0010B     ; устанавливаем флаг прерывания от клавиатуры
  231                          
  232 009A 90A5                 JSR KEY
  233 009B 906C                 JSR VYVOD
  234                   
  235 009C 2019                 LDR #B,18H
  236 009D 4569                 MOVL %B1,00101011B
  237 009E 40C9                 MOVL %B1,00000110B ; запрещаем запись в PA0
  238                   
  239 009F 40C4                 MOVL %A4,00000110B ; подключаем регистр интервала (HI) к адресу 5
  240 00A0 52C5                 MOVL %A5,150        
  241 00A1 4064                 MOVL %A4,00000011B ; запускаем счетчик и разрешаем прерывания от него
  242 00A2 0019                 POP #B
  243                   
  244                   
  245 00A3 0188                 STIE
  246 00A4 000D                 RTI
  247                   
  248                   ; ****
  249                   
  250 00A5 4014         KEY:    MOVL %C4,0
  251 00A6 4015                 MOVL %C5,0
  252 00A7 9151                 JSR RD_SC               ; Ура! Начинаем принимать скан-код! 
  253 00A8 0674                 MOV %C4,%C3
  254 00A9 7C14                 CMPL %C4,11100000B      ; принимать второй байт скан-кода?
  255 00AA A0AE                 JZ KEY1
  256 00AB 7C34                 CMPL %C4,11100001B
  257 00AC A0AE                 JZ KEY1
  258 00AD 80B1                 JMP CONTTT
  259 00AE 3855         KEY1:   BISL %C5,0010B          ; устанавливаем флажок          
  260 00AF 9127                 JSR MORE
  261 00B0 0674                 MOV %C4,%C3    
  262                   
  263 00B1 60F4         CONTTT: CMPL %C4,7              ; если нажата кнопка F12, то даем RESET
  264 00B2 A228                 JZ REZT
  265 00B3 6F14                 CMPL %C4,078H
  266 00B4 B0B6                 JNZ CONTTZ
  267 00B5 9148                 JSR NMI
  268 00B6 6014         CONTTZ: CMPL %C4,0              ; если была ошибка, то считаем, что был
  269                                                   ; принят код отжатия. Понимаю, что лажа, но
  270                                                   ; почему-то в 99% случаев ошибки происходят
  271                                                   ; именно при приеме кода отжатия. Уж не знаю,
  272                                                   ; почему. Спишем на ламерство изобретателей
  273                                                   ; PS2 интерфейса (ну не признавать же свою
  274                                                   ; криворукость 
  275 00B7 A0BD                 JZ PODGON
  276 00B8 7E14                 CMPL %C4,11110000B      ; это был код отжатой клавиши?
  277 00B9 A0BD                 JZ PODGON
  278 00BA 7E34                 CMPL %C4,11110001B
  279 00BB A0BD                 JZ PODGON
  280 00BC 80C0                 JMP CONTT0
  281 00BD 3835         PODGON: BISL %C5,0001B          ; устанавливаем флажок
  282 00BE 9127                 JSR MORE                ; принимаем еще один скан-код - код отжатой 
  283 00BF 0674                 MOV %C4,%C3             ; клавиши 
  284                   
  285 00C0 3455         CONTT0: BTTL %C5,0010B
  286 00C1 A0D8                 JZ CONTTA
  287                   
  288 00C2 6234         CONTT1: CMPL %C4,00010001B ; правый ALT = левый ALT = SYMBOL SHIFT
  289 00C3 A106                 JZ CONTT2
  290                   
  291 00C4 6E94         EX5:    CMPL %C4,74H
  292 00C5 B0C8                 JNZ EX6
  293 00C6 9136                 JSR SHIFT
  294 00C7 47D4                 MOVL %C4,3EH
  295                   
  296 00C8 6D74         EX6:    CMPL %C4,6BH
  297 00C9 B0CC                 JNZ EX7
  298 00CA 9136                 JSR SHIFT
  299 00CB 45D4                 MOVL %C4,2EH
  300                   
  301 00CC 6EB4         EX7:    CMPL %C4,75H       ; UP
  302 00CD B0D0                 JNZ EX8
  303 00CE 9136                 JSR SHIFT
  304 00CF 47B4                 MOVL %C4,3DH
  305                           
  306 00D0 6E54         EX8:    CMPL %C4,72H       ; DOWN
  307 00D1 B0D4                 JNZ EX9
  308 00D2 9136                 JSR SHIFT
  309 00D3 46D4                 MOVL %C4,36H
  310                   
  311 00D4 6E34         EX9:    CMPL %C4,71H       ; BACKSPACE = DEL
  312 00D5 B106                 JNZ CONTT2
  313 00D6 9133                 JSR BACKSP 
  314 00D7 8106                 JMP CONTT2
  315                   
  316 00D8 6CD4         CONTTA: CMPL %C4,66H            ; это клавиша BACKSPACE?
  317 00D9 B0DB                 JNZ CONTTD
  318 00DA 9133                 JSR BACKSP              ; если да, то ставим в соответсвие CAPS+0
  319                   
  320 00DB 6B34         CONTTD: CMPL %C4,59H            ; правый SHIFT = левый SHIFT = CAPS SHIFT
  321 00DC B0DE                 JNZ CONTTW
  322 00DD 4254                 MOVL %C4,12H
  323                   
  324 00DE 61B4         CONTTW: CMPL %C4,0DH            ; TAB = EDIT = CAPS + 0
  325 00DF B0E2                 JNZ CONTE
  326 00E0 9136                 JSR SHIFT
  327 00E1 42D4                 MOVL %C4,16H
  328                   
  329 00E2 6B14         CONTE:  CMPL %C4,58H            ; CAPS LOCK = CAPS + 2
  330 00E3 B0E6                 JNZ CONTE1
  331 00E4 9136                 JSR SHIFT
  332 00E5 43D4                 MOVL %C4,1EH
  333                   
  334 00E6 6934         CONTE1: CMPL %C4,049H ; точка
  335 00E7 B0EA                 JNZ CONTE2
  336 00E8 913F                 JSR SSHIFT
  337 00E9 4754                 MOVL %C4,03AH
  338                   
  339 00EA 6834         CONTE2: CMPL %C4,041H ; запятая
  340 00EB B0EE                 JNZ CONTE3
  341 00EC 913F                 JSR SSHIFT
  342 00ED 4634                 MOVL %C4,031H
  343                   
  344 00EE 6AB4         CONTE3: CMPL %C4,055H  ; =
  345 00EF B0F2                 JNZ CONTE4
  346 00F0 913F                 JSR SSHIFT
  347 00F1 4974                 MOVL %C4,004BH
  348                   
  349 00F2 69D4         CONTE4: CMPL %C4,04EH  ; -
  350 00F3 B0F6                 JNZ CONTE5
  351 00F4 913F                 JSR SSHIFT
  352 00F5 4774                 MOVL %C4,03BH
  353                   
  354 00F6 60D4         CONTE5: CMPL %C4,6
  355 00F7 B0FB                 JNZ CONTE6
  356 00F8 3435                 BTTL %C5,0001B
  357 00F9 B0FB                 JNZ CONTE6
  358 00FA 3038                 INC %D0   ; F2 - увеличения коэффициента замедления мышки
  359                           
  360 00FB 6094         CONTE6: CMPL %C4,4
  361 00FC B103                 JNZ CONTE7
  362 00FD 3435                 BTTL %C5,0001B
  363 00FE B103                 JNZ CONTE7
  364 00FF 2C38                 DEC %D0 ; F3 - уменьшение коэффициента замедления мышки
  365 0100 7FF8                 CMPL %D0,255
  366 0101 B103                 JNZ CONTE7
  367 0102 4018                 MOVL %D0,0
  368                   
  369 0103 60B4         CONTE7: CMPL %C4,5
  370 0104 B106                 JNZ CONTT2
  371 0105 91D2                 JSR WRFLSH ; - F1 - сохранение коэффициента замедления во FLASH - память
  372                   
  373 0106 4F51         CONTT2: MDAL %C1,SCODE
  374 0107 4092                 MDAH %C2,SCODE      ; Грузим в регистр косвенной адресации адрес
  375 0108 02D1                 MTPR #6,%C1         ; таблицы скан-кодов в памяти команд
  376 0109 02F2                 MTPR #7,%C2         ; (вся хрень с автоинкрементом, доступ через D7) 
  377                                   
  378 010A 4911         CCD:    MOVL %C1,72
  379 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            ; если совпал то идем на SKEY
  384 0110 0181                 SST 0001B          ; устанавливаем флаг C
  385 0111 00F2                 RLC %C2            ; смотрим следующий вариант
  386 0112 2C36                 DEC %C6
  387 0113 B10D                 JNZ CYCK1
  388 0114 3031                 INC %C1
  389 0115 69B1                 CMPL %C1,77        ; проверили все 5 наборов по 8 клавиш
  390 0116 B10B                 JNZ CYCK0
  391 0117 4014                 MOVL %C4,0
  392 0118 000C                 RTS
  393                   
  394 0119 91F3         PPODGON:JSR KEYINI
  395 011A 80BD                 JMP PODGON
  396                   
  397                            
  398 011B 0291         SKEY:   MTPR #4,%C1
  399 011C 4811                 MOVL %C1,01000000B
  400 011D 02B1                 MTPR #5,%C1
  401 011E 3435                 BTTL %C5,0001B
  402 011F B123                 JNZ RESKEY 
  403 0120 165E                 AND %D6,%C2        ; фиксируем нажатие клавиши
  404 0121 4014                 MOVL %C4,0
  405 0122 000C                 RTS
  406 0123 0072         RESKEY: NOT %C2
  407 0124 1A5E                 OR %D6,%C2         ; фиксируем отжатие клавиши
  408 0125 4014                 MOVL %C4,0
  409 0126 000C                 RTS ; Усё       
  410                   
  411 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 WT2
  416 012C 2C31                 DEC %C1
  417 012D B129                 JNZ WT1
  418 012E 2C30                 DEC %C0
  419 012F B128                 JNZ WT0;
  420 0130 000C                 RTS     
  421 0131 9151         WT2:    JSR RD_SC
  422 0132 000C                 RTS
  423                   
  424 0133 9136         BACKSP: JSR SHIFT       ; DEL = SHIFT+0 обрабатываем SHIFT
  425 0134 48B4                 MOVL %C4,45H    ; подсовываем скан-код нуля
  426 0135 000C                 RTS
  427                   
  428 0136 2049         SHIFT:  LDR #B,72
  429 0137 3435                 BTTL %C5,0001B
  430 0138 B13C                 JNZ RSHIFT 
  431 0139 2828                 BICL %B0,0001B       ; фиксируем нажатие клавиши
  432 013A 2019                 LDR #B,18H
  433 013B 000C                 RTS
  434 013C 3828         RSHIFT: BISL %B0,0001B       ; фиксируем отжатие клавиши
  435 013D 2019                 LDR #B,18H
  436 013E 000C                 RTS      
  437                   
  438 013F 2049         SSHIFT: LDR #B,72
  439 0140 3435                 BTTL %C5,0001B
  440 0141 B145                 JNZ RSSHIFT 
  441 0142 2B09                 BICH %B1,1000B       ; фиксируем нажатие клавиши
  442 0143 2019                 LDR #B,18H
  443 0144 000C                 RTS
  444 0145 3B09         RSSHIFT:BISH %B1,1000B       ; фиксируем отжатие клавиши
  445 0146 2019                 LDR #B,18H
  446 0147 000C                 RTS      
  447                   
  448 0148 2841         NMI:    BICL %A1,0010B     ; даем сигнал сброса
  449 0149 4022                 MOVL %A2,1         ; даем DATA0 = 1 (теперь на выходе NMI ПЛИС
  450                                              ; появится 0)
  451 014A 0000                 NOP
  452 014B 0000                 NOP
  453 014C 0000                 NOP
  454 014D 0000                 NOP
  455 014E 4002                 MOVL %A2,0         ; убираем 1 на DATA0
  456 014F 3841                 BISL %A1,0010B     ; снимаем сигнал сброса
  457 0150 000C                 RTS             
  458                   
  459                   ; **************************************************************
  460                   
  461                   RD_SC:  ; Процедура чтения байта скан-кода
  462                   
  463 0151 4013                 MOVL %C3,0 ; Будем читать в C3. Начальное значение 0
  464 0152 0431                 MOV %C1,%A1
  465 0153 3511                 BTTL %C1,1000B ; проверяем стартовый бит
  466                   ;       JNZ ERROR 
  467                                     ; скан-код
  468                   
  469 0154 4112                 MOVL %C2,8 ; будем читать 8 бит
  470 0155 91C1         SCAN1:  JSR WAIT
  471 0156 91C5                 JSR WAIT1 ; идем на процедуру ожидания следующего такта 
  472 0157 00B3                 SHR %C3
  473 0158 0431                 MOV %C1,%A1
  474 0159 3511                 BTTL %C1,1000B
  475 015A A15C                 JZ SCAN2
  476 015B 3B13                 BISH %C3,1000B ; если DATA=1, то ставим эту 1 в C3
  477 015C 2C32         SCAN2:  DEC %C2
  478 015D B155                 JNZ SCAN1
  479 015E 91C1                 JSR WAIT ; Байт скан-кода вроде бы прочитали, теперь надо принять бит
  480                                    ; четности и затем стоповый бит.
  481 015F 91C5                 JSR WAIT1; На бит четности сразу же кладем, ибо нафиг он не нужен
  482                           
  483 0160 91C1                 JSR WAIT
  484 0161 91C5                 JSR WAIT1
  485 0162 0431                 MOV %C1,A1
  486 0163 3511                 BTTL %C1,1000B ; Проверяем стоповый бит
  487                   
  488                   ;       JZ ERROR 
  489 0164 91C1                 JSR WAIT ; ждем прихода в исходное состояние
  490 0165 000C                 RTS        
  491                   
  492                   ; ******************************************************************
  493                   
  494                   WR_SC:  ; Процедура передачи байта скан-кода
  495                           ; Чтобы перейти в режим передачи данных, нужно удерживать 0 на линии
  496                           ; CLK не менее 60 мкс. На всякий случай будем держать 0 80 мкс.
  497                           ; 80 это 320 команд (640 тактов) при F=8 МГц
  498                   
  499 0166 4569                 MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A
  500 0167 43C9                 MOVL %B1,00011110B
  501                   
  502 0168 2A21                 BICH %A1,0001B     ; выдаем 0 в CLK и DATA
  503 0169 2901                 BICL %A1,1000B
  504                   
  505 016A 4810                 MOVL %C0,64 ; Ждем 64*5=320 команд 
  506 016B 0000         REPL:   NOP
  507 016C 0000                 NOP
  508 016D 0000                 NOP
  509                           
  510 016E 0000                 NOP ; было 3
  511 016F 0000                 NOP
  512 0170 2C30                 DEC %C0
  513 0171 B16B                 JNZ REPL;
  514                           
  515 0172 3A21                 BISH %A1,0001B ; снимаем 0 CLK
  516 0173 4569                 MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A
  517 0174 41C9                 MOVL %B1,00001110B ; переводим CLK на чтение
  518 0175 2901                 BICL %A1,1000B
  519                   
  520 0176 4030                 MOVL %C0,1 ; это будет счетчик единичных битов для формирования
  521                                      ; бита четности
  522                   
  523 0177 5FF7         W1:     MOVL %C7,255   ; ждем 0, т.е. начала тактирования процесса
  524 0178 3621         W2:     BTTH %A1,0001B
  525 0179 A181                 JZ E1
  526 017A 0000                 NOP
  527 017B 0000                 NOP
  528 017C 0000                 NOP
  529 017D 0000                 NOP
  530 017E 0000                 NOP
  531 017F 2C37                 DEC %C7
  532 0180 B178                 JNZ W2
  533                   E1:
  534                                      ; передачи данных девайсом
  535 0181 4112                 MOVL %C2,8 ; будем передавать 8 бит
  536                   WR_0:              ; передаем бит
  537                   
  538 0182 00B3         WR1:    SHR %C3
  539 0183 F186                 JC WR2
  540 0184 2901                 BICL %A1,1000B
  541 0185 8188                 JMP WR3
  542                   
  543 0186 3901         WR2:    BISL %A1,1000B
  544 0187 3030                 INC %C0         ; добавляем 1 к счетчику
  545 0188 3621         WR3:    BTTH %A1,0001B  ; ждем 1 на CLK
  546 0189 A188                 JZ WR3;
  547                   
  548                            ; ожидаем защелкивания бита данных девайсом и его
  549                            ; готовности к приему следующего бита (0 на CLK)
  550                   
  551 018A 5FF7                 MOVL %C7,255
  552 018B 3621         WW2:    BTTH %A1,0001B
  553 018C A194                 JZ EE1
  554 018D 0000                 NOP
  555 018E 0000                 NOP
  556 018F 0000                 NOP
  557 0190 0000                 NOP
  558 0191 0000                 NOP
  559 0192 2C37                 DEC %C7
  560 0193 B18B                 JNZ WW2
  561                   
  562 0194 2C32         EE1:    DEC %C2
  563 0195 B182                 JNZ WR_0 
  564                           
  565                                    ; Байт скан-кода вроде бы передали, теперь надо передать бит
  566                                    ; четности и затем принять стоповый бит. Мля, ну какие же
  567                                    ; ламеры придумали этот PS2 интерфейс :-E
  568                   
  569 0196 4013                 MOVL %C3,0
  570 0197 00B0                 SHR %C0  ; Значение бита четности берем из 0-го разряда %C0
  571 0198 E19A                 JNC BCNZ ; Если бит четности =0
  572 0199 3833                 BISL %C3,1 ; если бит четности =1
  573                   
  574                   BCNZ:   ; передаем 
  575                   
  576 019A 00B3                 SHR %C3
  577 019B F19E                 JC WRR2
  578 019C 2901                 BICL %A1,1000B
  579 019D 81A0                 JMP WRR3
  580                   
  581 019E 3901         WRR2:   BISL %A1,1000B
  582 019F 3030                 INC %C0   ; добавляем 1 к счетчику
  583                   
  584                   WRR3:   ; ждем 1
  585 01A0 3621                 BTTH %A1,0001B
  586 01A1 A1A0                 JZ WRR3;
  587                   
  588                           ; ожидаем защелкивания бита данных девайсом и его
  589                           ; готовности к приему следующего бита
  590                   
  591 01A2 5FF7                 MOVL %C7,255   ; ждем 0
  592 01A3 3621         WWA1:   BTTH %A1,0001B
  593 01A4 A1AC                 JZ EEX
  594 01A5 0000                 NOP
  595 01A6 0000                 NOP
  596 01A7 0000                 NOP
  597 01A8 0000                 NOP
  598 01A9 0000                 NOP
  599 01AA 2C37                 DEC %C7
  600 01AB B1A3                 JNZ WWA1
  601                   
  602 01AC 4569         EEX:    MOVL %B1,00101011B ; будем писать в подрегистр типа вывода порта A
  603 01AD 40C9                 MOVL %B1,00000110B ; переводим DATA на чтение
  604                           
  605                   IT:     ; ждем 1
  606 01AE 3621                 BTTH %A1,0001B
  607 01AF A1AE                 JZ IT;
  608                           
  609 01B0 91C5                 JSR WAIT1 ; ожидаем приход стопового бита
  610                   
  611                   
  612 01B1 5FF7                 MOVL %C7,255   ; ждем 0
  613 01B2 3621         AWA1:   BTTH %A1,0001B
  614 01B3 A1BB                 JZ WEX
  615 01B4 0000                 NOP
  616 01B5 0000                 NOP
  617 01B6 0000                 NOP
  618 01B7 0000                 NOP
  619 01B8 0000                 NOP
  620 01B9 2C37                 DEC %C7
  621 01BA B1B2                 JNZ AWA1
  622                   
  623 01BB 0431         WEX:    MOV %C1,%A1
  624 01BC 3511                 BTTL %C1,1000B ; проверяем стоповый бит
  625                                          ; только непонятно, зачем 
  626                   
  627                   HT:     ; ждем 1
  628 01BD 3621                 BTTH %A1,0001B
  629 01BE A1BD                 JZ HT;
  630 01BF 000C                 RTS        
  631                   
  632 01C0 4013         ERROR:  MOVL %C3,0
  633                   
  634 01C1 0431         WAIT:   MOV %C1,%A1    ; ждем 1
  635 01C2 3631                 BTTH %C1,0001B
  636 01C3 A1C1                 JZ WAIT;
  637 01C4 000C                 RTS
  638 01C5 5FF7         WAIT1:  MOVL %C7,255   ; ждем 0
  639 01C6 0431         WAI1:   MOV %C1,%A1
  640 01C7 3631                 BTTH %C1,0001B
  641 01C8 A1D1                 JZ EXIT1
  642 01C9 0000                 NOP
  643 01CA 0000                 NOP
  644 01CB 0000                 NOP
  645 01CC 0000                 NOP
  646 01CD 0000                 NOP
  647 01CE 2C37                 DEC %C7
  648 01CF B1C6                 JNZ WAI1
  649 01D0 81C0                 JMP ERROR
  650 01D1 000C         EXIT1:  RTS
  651                   
  652                   ; ********************
  653                   
  654 01D2 2039         WRFLSH: LDR #B,56  ; адрес регистра управления блока ЭСППЗУ данных
  655 01D3 4009                 MOVL %B1,0 ; адрес ячейки = 0 (используем только один байт)
  656 01D4 070F                 MOV %B7,%D0
  657 01D5 4028                 MOVL %B0,00000001B
  658 01D6 3428         WRF1:   BTTL %B0,0001B
  659 01D7 B1D6                 JNZ WRF1 ; ждем, пока происходит запись
  660 01D8 2019                 LDR #B,18H
  661 01D9 000C                 RTS
  662                   
  663                   ; ********************
  664                   
  665 01DA 2039         RDFLSH: LDR #B,56  ; адрес регистра управления блока ЭСППЗУ данных
  666 01DB 4009                 MOVL %B1,0 ; адрес ячейки = 0 (используем только один байт)
  667 01DC 4048                 MOVL %B0,00000010B
  668 01DD 3448         RDF1:   BTTL %B0,0010B
  669 01DE B1DD                 JNZ RDF1 ; ждем, пока происходит чтение
  670 01DF 05F8                 MOV %D0,%B7
  671 01E0 2019                 LDR #B,18H
  672 01E1 000C                 RTS
  673                   
  674                   ; ********************
  675 01E2 4769         INIT:   MOVL %B1,00111011B ; Установка конфигурации порта A
  676 01E3 40C9                 MOVL %B1,00000110B
  677 01E4 43E9                 MOVL %B1,00011111B
  678 01E5 4009                 MOVL %B1,00000000B
  679 01E6 4009                 MOVL %B1,00000000B
  680 01E7 4029                 MOVL %B1,00000001B ; прерывание по отрицательному перепаду уровня
  681                                              ; на линии CLK_KEY  для опроса клавиатуры
  682                   
  683 01E8 0188                 STIE
  684                   
  685 01E9 436A                 MOVL %B2,00011011B ; Установка конфигурации порта B
  686 01EA 5FEA                 MOVL %B2,11111111B
  687 01EB 5FEA                 MOVL %B2,11111111B
  688 01EC 400A                 MOVL %B2,0
  689 01ED 400A                 MOVL %B2,0
  690 01EE 400A                 MOVL %B2,0
  691                   
  692 01EF 3841                 BISL %A1,0010B     ; выдаем 1 на линию сброса регистров в ПЛИС
  693 01F0 2881                 BICL %A1,0100B     ; выдаем 0 на линию STROBE
  694                   
  695 01F1 401D                 MOVL %D5,0         ; флажок (потом пригодится)
  696 01F2 000C                 RTS
  697                   
  698                   KEYINI:                   ; инициализация матрицы клавиатуры
  699 01F3 2049                 LDR #B,72         ; весь буфер из 5-и байтов заполняем
  700 01F4 5FE8                 MOVL %B0,11111111B ; значениями 255
  701 01F5 5FE9                 MOVL %B1,11111111B
  702 01F6 5FEA                 MOVL %B2,11111111B
  703 01F7 5FEB                 MOVL %B3,11111111B
  704 01F8 5FEC                 MOVL %B4,11111111B
  705 01F9 2019                 LDR #B,18H
  706 01FA 906C                 JSR VYVOD
  707 01FB 000C                 RTS
  708                   
  709                   ; здесь надо бы отключать клавиатуру - потом поправлю
  710                   
  711 01FC 01C8         MOUSINI:CLIE ; DI
  712                           
  713 01FD 2049                 LDR #B,72
  714 01FE 4FAD                 MOVL %B5,125
  715 01FF 4FEE                 MOVL %B6,127
  716 0200 5FEF                 MOVL %B7,255
  717 0201 2019                 LDR #B,18H
  718                   
  719 0202 9251                 JSR RMZ00
  720                   
  721                   
  722 0203 91C1                 JSR WAIT          
  723                   
  724                                              ; мышь подключили. Теперь ожидаем ее готовность
  725                                              ; Теперь нужно передать в мышь команду запроса
  726                                              ; ее состояния (здесь неудобно использовать
  727                                              ; потоковый режим, хотя, в принципе, можно)
  728                   
  729 0204 407C                 MOVL %D4,3
  730                   MR:     
  731 0205 5FF3                 MOVL %C3,0FFH
  732 0206 9166                 JSR WR_SC
  733 0207 9251                 JSR RMZ00
  734 0208 9127                 JSR MORE
  735 0209 9127                 JSR MORE
  736                   
  737 020A 5E93         MRR:    MOVL %C3,0F4H
  738 020B 9166                 JSR WR_SC
  739 020C 9127                 JSR MORE
  740                                   
  741 020D 5E13                 MOVL %C3,11110000B ; код команды перехода в REMOTE MODE
  742 020E 9166                 JSR WR_SC
  743 020F 9127                 JSR MORE           ; принимаем код подтверждения 
  744 0210 7F53                 CMPL %C3,11111010B 
  745 0211 A215                 JZ MRR1
  746 0212 2C3C                 DEC %D4
  747 0213 B205                 JNZ  MR
  748                   
  749 0214 822B                 JMP MOUSOFF     ;MOUSOFF       
  750                   
  751 0215 401C         MRR1:   MOVL %D4,0
  752                   ;       MOVL %C3,11110011B
  753                   ;       JSR WR_SC
  754                   ;       JSR MORE
  755                   ;       MOVL %C3,80
  756                   ;       JSR WR_SC
  757                   ;       JSR MORE        
  758                   
  759 0216 5D13                 MOVL %C3,11101000B
  760 0217 9166                 JSR WR_SC
  761 0218 9127                 JSR MORE
  762 0219 4013                 MOVL %C3,0
  763 021A 9166                 JSR WR_SC
  764 021B 9127                 JSR MORE
  765                   
  766 021C 000C                 RTS
  767                   
  768 021D 2841         REZET:  BICL %A1,0010B 
  769 021E 0000                 NOP
  770 021F 0000                 NOP
  771 0220 3881                 BISL %A1,0100B
  772                           
  773 0221 4653                 MOVL %C3,50
  774 0222 9252                 JSR RMZ01
  775                   
  776 0223 2881                 BICL %A1,0100B   
  777 0224 0000                 NOP
  778 0225 0000                 NOP
  779 0226 3841                 BISL %A1,0010B 
  780 0227 000C                 RTS
  781                   
  782 0228 921D         REZT:   JSR REZET
  783 0229 0002                 RST
  784 022A 802A                 JMP START
  785                   
  786 022B 5FFC         MOUSOFF:MOVL %D4,255
  787 022C 2049                 LDR #B,72
  788 022D 5FED                 MOVL %B5,255
  789 022E 5FEE                 MOVL %B6,255
  790 022F 5FEF                 MOVL %B7,255
  791 0230 2019                 LDR #B,18H
  792                   
  793 0231 000C                 RTS
  794                   
  795                   TIMER:                     ; мышку будем опрашивать по прерываниям от таймера
  796 0232 4244                 MOVL %A4,00010010B ; подключаем регистр конфигурации к адресу 5 
  797 0233 49E5                 MOVL %A5,01001111B ; задаем коэффициент деления тактовой частоты 1/256
  798 0234 4044                 MOVL %A4,00000010B ; подключаем регистр интервала (LOW) к адресу 5
  799 0235 48C5                 MOVL %A5,70
  800 0236 40C4                 MOVL %A4,00000110B ; подключаем регистр интервала (HI) к адресу 5
  801 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                 RTS
  807                   
  808                   
  809 023B 0002         STERR:  RST
  810 023C 8032                 JMP MAIN
  811                              
  812 023D              SCODE:  .BYTE 12H,1CH,15H,16H,45H,4DH,5AH,29H
  813                           .EVEN; байт 0: CS,A,Q,1,0,P,ENT,SPACE
  814                   
  815 0241                      .BYTE 1AH,1BH,1DH,1EH,46H,44H,4BH,11H
  816                           .EVEN; байт 1: Z,S,W,2,9,O,L,SS
  817                   
  818 0245                      .BYTE 22H,23H,24H,26H,3EH,43H,42H,3AH
  819                           .EVEN; байт 2: X,D,E,3,8,I,K,M
  820                   
  821 0249                      .BYTE 21H,2BH,2DH,25H,3DH,3CH,3BH,31H
  822                           .EVEN; байт 3: C,F,R,4,7,U,J,N
  823                   
  824 024D                      .BYTE 2AH,34H,2CH,2EH,36H,35H,33H,32H
  825                           .EVEN; байт 4: V,G,T,5,6,Y,H,B
  826                   
  827 0251 5373         RMZ00:  MOVL %C3,155
  828 0252 9256         RMZ01:  JSR RMZ0
  829 0253 2C33                 DEC %C3
  830 0254 B252                 JNZ RMZ01
  831 0255 000C                 RTS
  832 0256 5FF4         RMZ0:   MOVL %C4,255
  833 0257 45B5         RMZ1:   MOVL %C5,45
  834 0258 2C35         RMZ2:   DEC %C5
  835 0259 B258                 JNZ RMZ2
  836 025A 2C34                 DEC %C4
  837 025B B257                 JNZ RMZ1
  838 025C 000C                 RTS
  839                   
  840                   .END;