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;