Subversion Repositories atmturbo

Rev

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

  1. ;************************************************
  2. ; Контроллер AT-клавиатуры на 51-ом контроллере *
  3. ;************************************************
  4. ; R1 - предыдущий code key
  5. ; R2 - code key
  6. ; R3 - flags
  7. ;       d0 - Left Shift
  8. ;       d1 - Ctrl
  9. ;       d2 - ALT
  10. ;       d3
  11. ;       d4 - Caps Lock trigger
  12. ;       d5 - Num Lock trigger
  13. ;       d6 - Scroll Lock trigger
  14. ;       d7 - RUS(1)/LAT(0)
  15. ; R4 -  d0 - Right Shift
  16. ;--------------------------------
  17. $mod52
  18. ; ПОРТЫ
  19. ; порт P1(A)
  20. ; PA0 - CD     input
  21. ; PA1 - CTS    input
  22. ; PA2 - RI     input
  23. ; PA3 - DTR    out
  24. ; PA4 - RTS    out
  25. ; PA5 - INT_T  out
  26. ; PA6 - /RES  -out
  27. ; PA7 - W_ON  -out
  28. ; порт P3
  29. ; P30 - RX     input
  30. ; P31 - TX    -output
  31. ; P32 - CLK_K  input
  32. ; P33 - /KEYRD inpit
  33. ; P34 - VE1    input
  34. ; P35 - DATA_K input
  35. ; P36 - /VWR  -output
  36. ; P37 - /VRD  -output
  37. dseg
  38.         org     00h
  39.  
  40. INTMEM_0:  ds 1
  41. INTMEM_1:  ds 1
  42. INTMEM_2:  ds 1
  43. INTMEM_3:  ds 1
  44. INTMEM_4:  ds 1
  45.         org     06h
  46. INTMEM_6:  ds 1
  47. INTMEM_7:  ds 1
  48.         org     10h
  49. INTMEM_10: ds 1
  50. INTMEM_11: ds 1
  51.         org     17h
  52. INTMEM_17: ds 1
  53.         org     1Fh
  54. INTMEM_1F: ds 1
  55. ;--------------------------------------------
  56.         org     20h
  57. b_sadr: ds      1       ;буфер скан-адреса
  58.         org     2Eh
  59. mode:      ds 1
  60. ;-----------------------
  61. flags:     ds 1
  62. f_wait    equ   flags.0
  63. f_unpres  equ   flags.1
  64. f_pref    equ   flags.2
  65. f_press   equ   flags.3
  66. f_decod   equ   flags.5
  67. ;-----------------------
  68.         org     35h
  69. t_res:  ds      3       ;буфер контр.строки
  70.         org     38h
  71. ; Bufer KBD
  72. INTMEM_38: ds 8         ;
  73. ;---------
  74.         org     40h
  75. tics:           ds 1            ;50 тиков в секунду
  76. b_time:         ds 3            ;секунды,минуты,часы
  77. b_date:         ds 4            ;день,месяц,год,столетие
  78. b_stek:         ds 8            ;стек -> вверх
  79. ;_________________________________________
  80. ; Часы реального времени
  81. f_tic   equ     50      ;Частота тиков Ч.Р.В  (Гц)
  82. f_proc  equ     7000    ;Частота тактирования (КГц)
  83. ; Коэфф.деления таймера 0 равна
  84. ;KF_T0  equ     -f_proc*1000/12/f_tic
  85. ;KF_T0  equ     0D26Eh  ; 7.0000 Мгц
  86. ;KF_T0  equ     0B800h  ;11.0592 МГц
  87. KF_T0   equ     0B1E0h  ;12.0000 МГц
  88. ;*****************************************
  89. CSEG
  90.         ORG     000h
  91. ;-----------------------------------------
  92. ; Стартовый адрес
  93. start:  ljmp    prog    ;-> запуск программы
  94. ; ========================================
  95.         ORG     003h   
  96. ; External interrupt 0 ~\_
  97. extint0:
  98.         push    PSW
  99.         push    ACC
  100.         ajmp    L_23C   ; int /CLK_K
  101. ; ========================================
  102.         ORG     00Bh
  103. ; Timer interrupt 0 (Часы реального времени)
  104. timint0:
  105.         push    PSW
  106.         push    ACC
  107.         ajmp    L_3FD
  108. ; ========================================
  109.         ORG     013h
  110. ; External interrupt 1 ~\_
  111. extint1:                ;2
  112.         push    PSW     ;2
  113.         push    ACC     ;2
  114.         push    DPH     ;2
  115.         ajmp    RD_KBD  ;2  int /RDKEY
  116. ; ========================================
  117.         ORG     01Bh
  118. ; Timer interrupt 1
  119. timint1:reti
  120. ; ========================================
  121.         ORG     023h
  122. ; Serial port interrupt (SERIAL)
  123. serint: reti
  124. ; -------------------------
  125.         ORG     02Ch
  126. ; Ver 2.200
  127. VERS:   db      2,2     ;2.2
  128.         db      1,2     ;Тактовая Частота в МГц
  129. ;*********************************************
  130. ;******* START PROGRAMM **********************
  131. ;*********************************************
  132. ; Сброс при первом включении
  133. reset:  mov     R0,#t_res       ;Буфер контр.строки
  134.         mov     @R0,#'A'
  135.         inc     R0
  136.         mov     @R0,#'T'
  137.         inc     R0
  138.         mov     @R0,#'M'
  139.         mov     P1, #0BFh       ;/RESET=0 (PA6=0)
  140.         sjmp    $               ;жду своего сброса
  141. ;=============================================
  142. ; Вход по включению питания
  143. prog:   mov     P1, #0FFh       ;/RESET=1;W_ON=1
  144. ; Пауза
  145.         clr     A
  146.         mov     PSW,A           ; = 00h
  147.         mov     R0,A
  148.         djnz    R0, $
  149.         djnz    R0, $
  150. ; При первом включении выдать /RESET
  151.         mov     R0,#t_res       ;буфер контрольной строки
  152.         cjne    @R0,#'A',reset  ;
  153.         inc     R0
  154.         cjne    @R0,#'T',reset
  155.         inc     R0
  156.         cjne    @R0,#'M',reset
  157. ;--------------------------------
  158. ; ИНИЦИАЛИЗАЦИЯ УЗЛОВ КОНТРОЛЛЕРА
  159.         mov     PCON, #80h      ; SMOD=1
  160.         mov     SCON, #0E8h     ; Serial Port Control
  161.         mov     TMOD, #21h      ;Timer1=mode2  8-бит
  162.                                 ;Timer0=mode1 16-бит
  163. ; Set Timer 0 (50 Герц)
  164.         mov     TH0,#HIGH KF_T0 ; Timer0 - High Byte
  165.         mov     TL0,#LOW  KF_T0 ; Timer0 - Low Byte
  166. ; скорость RS232 для тактовой частоты 7 МГц
  167.         mov     TH1,#-30        ;1215 бод (err=1.3%)
  168. ;       mov     TH1,#-15        ;2431 бод (err=1.3%)
  169.         mov     TCON, #55h      ;Timer0,1-On/INT0,1 -Impuls
  170. ; Init MEM; 00h -> RAM 02h..38h
  171.         mov     R0, #02h        ;от 02h
  172.         mov     R1, #36h        ; до 38h
  173.         clr     A               ;
  174. c_clr:  mov     @R0, A          ; обнулить
  175.         inc     R0
  176.         djnz    R1,c_clr
  177. ;-----------------------------------------------
  178.         mov     SP, #b_stek     ;Указатель стека
  179.         mov     IP,   #01h      ; Interrupt Priority
  180.         mov     IE,   #87h      ; Interrupt Enable INT0,1,T0
  181.         clr     P1.7            ;Разрешить /WAIT (W_ON=0)
  182. ;/=============================================
  183. c0main: acall   L_222           ; Clear buf KBD
  184. ;/-------------------------------
  185. ; Main Cikl Wait press key
  186. c_main: mov     R6, #0          ; Флаг Префикса E0h
  187.         acall   L_102           ; Wait Code KBD
  188.         cjne    R5, #0E1h, L_66 ; Pause/Break ?
  189. ; Принят первый скан-код клавиши PAUSE
  190. ; Press Pause/Break [E1,14,77,E1,F0,14,F0,77]
  191.         mov     R0, #7-2        ; Count Code (-2 кода F0)
  192. ;//---
  193. L_5C:   acall   L_102           ; Wait Code KBD
  194.         djnz    R0, L_5C        ; 7 раз
  195. ;\\---
  196. ; Переключиться в режим <ПАУЗА> для чего надо
  197. ; запретить прерывание по /RDKBD (INT1)
  198.         clr     EX1             ; Запретить INT1
  199.         setb    f_wait          ; Flag Wait = 1
  200.         sjmp    c_main          ; Ждать нажатий
  201. ;\-------------------------------
  202. ; Проверить на допустимость скан-кода
  203. L_66:   clr     C
  204.         mov     A, R5
  205.         subb    A, #84h         ; Scan-Code >= 84h
  206.         jnc     c0main          ;       err code kbd
  207. ; Scan-code normal
  208.         jnb     f_wait, L_7D    ; Нет Pause
  209. ; Если был включен режим Pause - сбросить
  210.         clr     f_press         ; Clear Flag Press
  211.         clr     f_wait          ; Clear Flag Wait
  212.         mov     DPTR, #0        ;
  213.         movx    @DPTR, A        ; /VWR=0 (сброс /WAIT)
  214.         setb    EX1             ; Разрешить INT1
  215.         sjmp    c0main          ; Ждать еще нажатия
  216. ;\==================================================
  217. ; Press new key
  218. L_7D:   mov     A, R5           ; =Scan-code AT IBM
  219.         mov     DPTR, #L_58F
  220.         movc    A, @A+DPTR      ;code set2 -> code set1
  221.         jz      c_main          ; non code
  222. ;\-------------------------------
  223. ; Yes normal scan-code set1
  224.         mov     R7, A           ; R7 = scan code set1
  225.         jnb     f_unpres,no_unpres ;
  226. ; клавиша отпущена
  227.         orl     INTMEM_7,#80h   ;установить бит отжатия
  228. no_unpres:
  229.         mov     INTMEM_17,R7    ;запомнить скан-код set1
  230.         dec     A
  231.         mov     R5, A           ; R5 = scan code - 1
  232. ;
  233.         mov     A, mode         ;Mode
  234.         jnz     L_AC            ;не 00h
  235. ; Mode = Spectrum KBD
  236.         mov     A, R5           ;(Number key-1) (0..
  237.         mov     DPTR, #L_527    ;
  238.         movc    A, @A+DPTR      ; -> Code key
  239.         mov     R1, A
  240.         acall   L_134           ;code key -> bufer KBD
  241. ;/---- проверить буфер на предмет нажатых клавиш
  242.         mov     R0, #INTMEM_38
  243.         mov     R1, #8
  244.         mov     A, #0FFh
  245. L_9D:   anl     A, @R0
  246.         inc     R0
  247.         djnz    R1, L_9D
  248. ;\----
  249.         xrl     A, #1Fh
  250.         anl     A, #1Fh
  251. ; No press key если код = 00h
  252.         clr     f_press         ;=0
  253.         jz      L_B6            ; No press KBD
  254. ; Yes press key
  255. L_AC:   setb    f_press         ;=1
  256. ;==============================================
  257. ; mode non Spectrum KBD
  258. L_B6:   mov     A, R2
  259.         mov     R1, A           ;R1=R2 - предыдущий код клавиши
  260.         setb    f_decod         ;
  261. ; Началось декодирование скан-кода клавиатуры IBM
  262.         mov     A, R5           ;
  263.         rl      A               ;
  264.         mov     R5, A           ;R5=Scan-code*2
  265.         mov     DPTR, #L_471
  266.         jb      f_unpres, L_C9  ;Клавиша отжата
  267. ;----
  268. ; new code key press
  269.         movc    A, @A+DPTR      ;Scan-code -> Sym Code
  270.         jz      L_C9
  271. ;
  272.         mov     R2, A           ;INTMEM_2=Sym-code 1
  273. ;----
  274. ; code key unpress
  275. L_C9:   mov     A, R5           ;
  276.         inc     A
  277.         movc    A, @A+DPTR
  278.         mov     R5, A           ;R5=Sym-code 2
  279.         acall   L_16A           ;Decode
  280.         clr     f_decod
  281. ;
  282.         sjmp    c_main          ;Wait next key
  283. ;\--------------
  284. ;****************************************************
  285. ; Процедура приема скан-кода нажатой клавиши ********
  286. L_100:  acall   L_222   ; Clear Buf KBD
  287. ;/-----
  288. ;       Wait Code KBD
  289. L_102:  clr     f_unpres        ; Flag unpress = 0
  290. ; wait code after prefix
  291. L_104:  mov     A, INTMEM_10    ; R0 page 10
  292.         jnz     L_11E           ; yes new code
  293. ; Bufer code KBD empty
  294. L_108:  mov     A, INTMEM_11    ; R1 page 10
  295.         jz      L_108           ; Wait begin resive
  296. ;
  297.         mov     INTMEM_1F, #3   ; R7 page 18=3
  298. ;//----
  299. L_10F:  mov     A, INTMEM_10    ; R0 page 10
  300.         jnz     L_11E           ; yes code key
  301. ;
  302.         mov     A, INTMEM_1F    ;
  303.         jnz     L_10F           ; wait code
  304. ;\\---- истек тайм-аут приема скан-кода -----
  305.         mov     INTMEM_10, A    ; 00h -> R0 page 10
  306.         mov     INTMEM_11, A    ; 00h -> R1 page 10
  307.         mov     R6, A           ; 00h -> R6
  308.         sjmp    L_102           ; wait new code
  309. ;\------
  310. ; принят скан-код клавиатуры
  311. L_11E:  mov     R5, A           ; Get code KBD
  312.         mov     INTMEM_10, #0   ; 00h -> R0 Page 10
  313.         cjne    A, #0E0h, L_129
  314. ; Resive prefix 0E0h (next code)
  315.         mov     R6, #1          ; flag prefix key
  316.         sjmp    L_104           ; Get Second code
  317. ;--------------------------------
  318. ; NO prefix = 0E0h
  319. L_129:  cjne    A, #0F0h, L_130
  320. ; Resive ptefix 0F0h (unpress)
  321.         setb    f_unpres        ; Flag unpress=1
  322.         sjmp    L_104           ;Get second code
  323. ;--------------------------------
  324. ; No prefix 0E0h & 0F0h
  325. L_130:  inc     A               ;если = 0FFh
  326.         jz      L_100           ;err code
  327.         ret
  328. ; Конец процедуры приема скан-кода клавиатуры ***
  329. ;************************************************
  330. ; R1 (code key) -> bufer Spectrum KBD
  331. ; f_unpress = 1 - clear code from bufer
  332. L_134:  mov     A, R1
  333.         jnb     ACC.3, L_13E
  334. ; ACC.3 = 1 -> Caps Shift
  335.         mov     A, #1           ;D0
  336.         mov     R0, #0          ;A8
  337.         acall   L_15D
  338. ; ACC.3 = 0
  339. L_13E:  mov     A, R1
  340.         jnb     ACC.7, L_148
  341. ; ACC.7 = 1 -> Symbol Shift
  342.         mov     A, #2           ;D1
  343.         mov     R0, #7          ;A15
  344.         acall   L_15D
  345. ; ACC.7 = 0
  346. L_148:  mov     A, R1
  347.         anl     A, #7
  348.         jnz     L_14E
  349. ; d2..d0 = 000
  350.         ret
  351. ; d2..d0 <> 000
  352. L_14E:  mov     R0, A
  353.         clr     A
  354.         setb    C
  355. L_151:  rlc     A
  356.         djnz    R0, L_151
  357. ;
  358.         push    ACC
  359.         mov     A, R1
  360.         swap    A
  361.         anl     A, #7
  362.         mov     R0, A           ;Adress
  363.         pop     ACC             ;Date
  364. ;-----
  365. L_15D:  orl     INTMEM_0, #INTMEM_38 ;R0
  366.         jnb     f_unpres, L_166
  367. ; Press key  - set code
  368.         orl     A, @R0
  369.         mov     @R0, A
  370.         ret
  371. ; Unpress key - clear code from bufer
  372. L_166:  cpl     A
  373.         anl     A, @R0
  374.         mov     @R0, A
  375.         ret
  376. ; end mode Spectrum KBD
  377. ; ========================================
  378. ; DECODE Second byte in Tab
  379. ; R5 -> ctrl code (mode CP/M)
  380. ; R6=1 prefix 0E0h
  381. ;
  382. L_16A:  mov     A, R5           ;
  383.         jnz     L_16E
  384. ; 00h -> exit
  385. L_16D:  ret
  386. ;
  387. L_16E:  anl     A, #3           ;d1,d0
  388.         jnz     L_1A6           ;ALT,Ctrl,Shift
  389. ; d1,d0=00
  390.         jb      f_unpres, L_16D ;exit
  391. ;--------------
  392. ; press new key
  393.         mov     A, R5
  394.         anl     A, #0Ch         ;d3,d2
  395.         jnz     L_1D2
  396. ;d3,d2=00
  397.         mov     A, R5
  398.         anl     A, #30h         ;d5,d4
  399.         jnz     L_1E4           ;
  400. ;d5,d4=00
  401. L_17F:  mov     A, R5
  402.         jb      ACC.6, L_19F    ;*40h
  403. ;d6=0
  404.         jnb     ACC.7, L_16D    ;d7,d6=0 Exit
  405. ;d6=0,d7=1 (80h)
  406.         mov     A, R3
  407.         orl     A, R4
  408.         anl     A, #6
  409.         cjne    A, #6, L_192    ;bits Ctrl,Alt
  410. ; Ctrl+Alt
  411.         cjne    R2, #2Eh, L_16D ;Exit
  412. ; press [.]
  413.         ajmp    reset           ;Reset COMP
  414. ;-------
  415. ; no Ctrl+Alt
  416. L_192:  cjne    R6, #1, L_1A2   ;set D7
  417. ; R6=1 (prefix 0E0h)
  418.         mov     A, R7           ;Scan code set1
  419.         clr     C
  420.         subb    A, #47h         ;-47h Код [dig.7]
  421.         mov     DPTR, #L_582    ;
  422.         movc    A, @A+DPTR
  423.         mov     R2, A           ;new code
  424.         ret
  425. ;-------
  426. ;^ D6=1
  427. L_19F:  mov     A, R6           ; R6=0?
  428.         jz      L_16D           ; exit
  429. ; R6=1 (prefix 0E0h)
  430. L_1A2:  orl     INTMEM_2, #80h  ;set D7(R2)
  431.         ret
  432. ;----------
  433. ; d1,d0 <>0
  434. L_1A6:  anl     INTMEM_7, #7Fh  ;R7
  435.         cjne    A, #3, L_1FC
  436. ; R5=03h (Left Shift & Right Shift)
  437.         mov     A, #1           ;bit0 (Flag Shift)
  438.         mov     R6, #0
  439.         cjne    R7, #36h, L_1B5 ;Code set1 Right Shift ?
  440. ; press Right Shift
  441.         mov     R6, #1          ;Flag Right Shift=1
  442. L_1B5:  jnb     f_unpres, L_1C2
  443. ; key unpress
  444.         cpl     A
  445.         cjne    R6, #1, L_1BF
  446. ; R6=1 (Right Shift)
  447.         anl     INTMEM_4, A     ;R4(d0)=0
  448.         ret
  449. ; R6=0 (Left Shift)
  450. L_1BF:  anl     INTMEM_3, A     ;R3(d0)=0
  451.         ret
  452. ; key press
  453. L_1C2:  cjne    R6, #1, L_1D4
  454. ; Right Shift
  455.         cjne    A, #1, L_1CE
  456. ; нажат Right Shift
  457.         mov     A, R3           ;Проверить Left Shift
  458.         anl     A,#1
  459.         jnz     L_1DC
  460. ; Left Shift еще не нажат
  461.         inc     A               ;A=1
  462. L_1CE:  orl     INTMEM_4, A     ;R4 bit 0=1
  463.         sjmp    L_1EC
  464. ;------
  465. ;^ d3,d2<>0
  466. L_1D2:  sjmp    L_203
  467. ;--------------------------------
  468. ;
  469. L_1D4:  cjne    A, #1, L_1EA
  470. ; нажат Left Shift
  471.         mov     A,R4            ;проверить Right Shift
  472.         anl     A,#1
  473.         jz      L_1E8           ;еще не нажат
  474. ; был нажат
  475. L_1DC:  mov     R2, #7Ah        ;'z' (в XT R2) было R0
  476.         cpl     A
  477.         anl     INTMEM_3, A     ;
  478.         anl     INTMEM_4, A     ;
  479.         ret
  480. ;-------
  481. ;^ d5,d4<>0
  482. L_1E4:  sjmp    L_21A           ;test 20,30
  483. ;-------
  484. ;v non Ctrl+Alt
  485. L_1E6:  sjmp    L_17F
  486. ;--------------------------------
  487. ; Нажат Left Shift без Right Shift
  488. L_1E8:  mov     A, #1
  489. L_1EA:  orl     INTMEM_3, A     ;R3(d0)=1
  490. ;
  491. L_1EC:  mov     A, R3
  492.         orl     A, R4
  493.         anl     A, #6
  494.         cjne    A, #6, L_1E6
  495. ; press Ctrl(d1)+Alt(d2)
  496.         cjne    R7, #53h, L_219 ;Scan-cod1 DEL =53h
  497. ; Ctrl+Alt+Del
  498.         ajmp    reset           ;Сброс Speccy
  499. ;-----
  500. L_1FC:  cjne    A, #1, L_1B5
  501. ; Code ALT = 1
  502.         mov     A, #4           ;bit2 (flag ALT)
  503.         sjmp    L_1B5
  504. ;------
  505. ;^ d3,d2<>0
  506. L_203:  jb      f_unpres, L_1E6 ;
  507. ; key press
  508.         cjne    A, #0Ch, L_20F  ;d3,d2=11
  509. ; A=0Ch (Scroll Lock)
  510.         cjne    R6, #1, L_20F
  511. ; R6=1 (prefix 0E0h)
  512.         mov     R2, #6Fh        ;'o'
  513.         ret
  514. ;-----
  515. L_20F:  rr      A               ;/2
  516.         rr      A               ;/4    
  517.         mov     R5, A
  518.         mov     A, #8           ;bit3=1
  519. L_214:  rl      A
  520.         djnz    R5, L_214
  521. ; trigger bit
  522.         xrl     INTMEM_3, A     ;R3
  523. L_219:  ret
  524. ;------
  525. ; второй код = 20h/30h
  526. L_21A:  cjne    A, #20h, L_21F
  527. ; A=20h
  528.         sjmp    L_1EC
  529. ;
  530. L_21F:  cjne    A, #30h, L_219  ;ret
  531. ; A=30h
  532. ; ========================================
  533. ; Clear buf KBD
  534. L_222:  mov     A, #0FFh
  535.         mov     R0, #INTMEM_38
  536.         mov     R1, #8
  537. L_228:  mov     @R0, A
  538.         inc     R0
  539.         djnz    R1, L_228
  540. ;\----
  541.         clr     A
  542.         clr     f_press
  543.         mov     INTMEM_11, A    ;R1 page10=0
  544.         mov     INTMEM_10, A    ;R0 page10=0
  545.         mov     R2, A
  546.         mov     R3, A
  547.         mov     R4, A
  548.         mov     R6, A
  549.         ret
  550. ; ==========================================
  551. ; Прием скан кода нажатой или отжатой клавиши
  552. ; CLK_KBD = ~\_
  553. L_23C:                  ; int0
  554.         mov     PSW, #10h
  555. ;-----
  556.         mov     C, P3.5 ; P3.5 <- DAT_KBD
  557.         mov     A, R1
  558.         jz      L_257   ;R1=0 START
  559. ;-----
  560.         dec     A
  561.         jz      L_25B   ;R1=1 Прием данных
  562. ;-----
  563.         dec     A
  564.         jz      L_266   ;R1=2 Паритет
  565. ;-----                  ;R1=3 STOP
  566.         mov     R1, #0  ;00h -> INTMEM_11
  567.         mov     A, R5   ;Результат приема
  568.         mov     R0, A   ;code -> INTMEM_10
  569. ;-----
  570.         pop     ACC
  571.         pop     PSW
  572.         reti
  573. ;-----
  574. ; Принят стартовый бит данных
  575. L_257:  mov     R6, #8  ;Resive 8 bit
  576.         sjmp    L_260
  577. ; -------------------------
  578. ; Прием битов данных
  579. L_25B:  mov     A, R5
  580.         rrc     A
  581.         mov     R5, A
  582.         djnz    R6, L_261
  583. ; Принято 8 бит данных
  584. L_260:  inc     R1
  585. L_261:  pop     ACC
  586.         pop     PSW
  587.         reti
  588. ;-----
  589. ; Прием бита паритета
  590. L_266:  mov     A, R5           ;Принятый байт
  591.         jc      L_270           ;Бит паритета = 1
  592. ;
  593.         jb      PSW.0, L_260    ; PSW.0 - ACCUMULATOR PARITY FLAG
  594. L_26C:  mov     R5, #0FFh       ; результат при ошибке паритета
  595.         sjmp    L_260
  596. ; -------------------------
  597. L_270:  jnb     PSW.0, L_260    ; PSW.0 - ACCUMULATOR PARITY FLAG
  598.         sjmp    L_26C
  599. ; =============================================
  600. ; Вход запроса кода Клавиатуры от Spectruma
  601. ; =============================================
  602. ;int1:  push    PSW             ;2
  603. ;       push    ACC             ;2
  604. ;       push    DPH             ;2
  605. ;       ajmp    RD_KBD          ;2
  606. ; Int /RDKBD
  607. RD_KBD:                         ; extint1
  608.         jnb     P3.4, L_2AF     ;2 VE1=0
  609. ; Работа контроллера запрещена
  610.         mov     A, #0FFh        ;1
  611.         mov     DPH, #01h       ;1  DPTR=#01xx
  612.         movx    @DPTR, A        ;2  /VWR=0 -> Сбросить /WAIT
  613.         setb    P1.7            ;1  W_ON=1 Запрет прерываний
  614. ; Спектрум работает без /WAIT с механической клавиатурой
  615. L_292:  jb      P3.4,$          ;2  Ждем VE1=0
  616. ; дождались разрешения работы с AT клавиатурой
  617.         clr     P1.7            ;1  W_ON=0
  618.         mov     PSW, #8         ;2
  619.         clr     A               ;1
  620.         clr     f_press         ;1
  621.         mov     INTMEM_6, A     ;1
  622.         mov     INTMEM_10, A    ;1
  623.         mov     INTMEM_11, A    ;1
  624.         mov     R7, A           ;1 флаг команды=0
  625.         mov     R1, A           ;1 Z код клавиатуры = 0
  626.         sjmp    ex_kbd          ;2
  627. ;************************************************
  628. ; Принят код сканирования не 55h (не команда)
  629. no_comm:
  630.         mov     b_sadr,A        ;Скан-адрес -> бит-регистр
  631.         inc     DPH             ;DPTR=#01xx
  632.         mov     A, mode         ;Текущий режим ?
  633.         jnz     no_m00          ;mode>00h
  634. ;================================================
  635. ; mode = 00 -> Spectrum KBD
  636.         jb      f_press,kbd_ve  ;есть нажатие
  637. ; если нет нажатия, то
  638.         movx    A,@DPTR         ;Порт принтера Speccy
  639.         movx    @DPTR,A         ; Снять /WAIT
  640. ex_kbd: pop     DPH
  641.         pop     ACC
  642.         pop     PSW
  643.         reti
  644. ; ================================================
  645. ; mode = 00 -> Spectrum KBD (есть нажатие)
  646. kbd_ve:
  647. ; РАзвернутый цикл сканирования матрицы
  648.         dec     A               ;A=#0FFh
  649.         jb      b_sadr.0,A08_1
  650.         anl     A,INTMEM_38     ;
  651. A08_1:  jb      b_sadr.1,A09_1
  652.         anl     A,INTMEM_38+1
  653. A09_1:  jb      b_sadr.2,A10_1
  654.         anl     A,INTMEM_38+2
  655. A10_1:  jb      b_sadr.3,A11_1
  656.         anl     A,INTMEM_38+3
  657. A11_1:  jb      b_sadr.4,A12_1
  658.         anl     A,INTMEM_38+4
  659. A12_1:  jb      b_sadr.5,A13_1
  660.         anl     A,INTMEM_38+5
  661. A13_1:  jb      b_sadr.6,A14_1
  662.         anl     A,INTMEM_38+6
  663. A14_1:  jb      b_sadr.7,A15_1
  664.         anl     A,INTMEM_38+7
  665. A15_1:  mov     R4,A            ;Код контроллера
  666. ;\----
  667.         movx    A,@DPTR         ;Порт Spec KBD
  668.         anl     A,R4            ;+ код контроллера
  669. ; -------------------------
  670.         movx    @DPTR,A         ; Снять /WAIT
  671.         pop     DPH
  672.         pop     ACC
  673.         pop     PSW
  674.         reti
  675. ;=========================================
  676. ; VE1=0 разрешена работа контроллера
  677. L_2AF:  mov     PSW, #8         ;2
  678.         mov     DPH, #00h       ;2  DPTR=#00xx
  679.         movx    A, @DPTR        ;2  A=Adress A15..A8
  680. ; проверить признак приема команды (R7)
  681.         cjne    R7,#0,L_31B     ;2  Анализ параметров команды
  682. ;--------------------------------
  683. ; Test COMM=055h
  684.         cjne    A,#55h,no_comm  ;2  если не 55h, то не команда
  685. ;--------------------------------
  686. ; Ответить на прием кода 55h
  687.         inc     R7              ;1  R7=1 (принят код команды)
  688.         mov     A,#0AAh         ;1  Request = 0AAh
  689.         inc     DPH             ;1  DPH=#01h Передать и
  690.         movx    @DPTR, A        ;2  Снять /WAIT
  691.         pop     DPH             ;2
  692.         pop     ACC             ;2
  693.         pop     PSW             ;2
  694.         reti                    ;2
  695. ;*****************************************
  696. ; mode = 01,02,03
  697. no_m00: cjne    A,#01h,no_m01   ;01h ?
  698. ;========================================
  699. ; Mode = 01h - RD code KBD
  700. ; читается код клавиатуры (R2) или (R1)
  701. L_2EB:  mov     A,INTMEM_1      ;R1 page 00
  702.         jb      f_decod, L_2F2  ;
  703. ; no decode
  704.         mov     A,INTMEM_2      ;R2 page 00
  705.         mov     INTMEM_2,#0     ;00h -> R2
  706. L_2F2:  movx    @DPTR, A        ; Снять /WAIT
  707.         pop     DPH
  708.         pop     ACC
  709.         pop     PSW
  710.         reti
  711. ;============================================
  712. no_m01: cjne    A,#02h,no_m02   ;02h ?
  713. ; ===========================================
  714. ; Mode =02h - CP/M
  715. ; Читаются регистры R2(или R1),(R3),(R4)
  716. ; в зависимости от состояния битов A15,A14
  717.         mov     A,b_sadr        ; Adress сканирования Axx
  718.         rl      A
  719.         rl      A
  720.         anl     A, #3           ; A15.A14 ?
  721.         jz      L_2EB           ; A15,A14=00
  722. ; -------------------------------
  723.         add     A,#INTMEM_2     ;1..3 + #INTMEM_2
  724.         mov     R1,A            ;
  725.         mov     A,@R1           ;(R3)..(R5)
  726.         movx    @DPTR, A        ; Снять /WAIT
  727.         pop     DPH
  728.         pop     ACC
  729.         pop     PSW
  730.         reti
  731. ;=========================================
  732. ; Mode = 03h - Direct RD
  733. no_m02: mov     A,INTMEM_17     ;R7 Page10
  734.         mov     INTMEM_17,#0    ;
  735.         movx    @DPTR, A        ; Снять /WAIT
  736.         pop     DPH
  737.         pop     ACC
  738.         pop     PSW
  739.         reti
  740. ;************************************************
  741. ;****** Прием параметров команды ****************
  742. ;************************************************
  743. L_31B:  mov     R6,A            ;Скан-адрес -> R6
  744.         mov     A,R3            ;Код команды
  745.         cjne    R7,#1,L_344     ;R7=2 (второй параметр)
  746. ; first Param=Code COMM
  747.         mov     A, R6
  748.         rl      A
  749.         rl      A
  750.         anl     A, #3
  751.         mov     R5, A           ;Adress COMM =A15..A14
  752. ;
  753.         mov     A, R6           ;A15..A8
  754.         anl     A, #3Fh
  755.         jz      L_33E           ; Если =0, выход с A=0FFh
  756.         mov     R3, A           ;R3=Code COMM
  757. ;*************************************************
  758. ;********** TEST CODE COMM  **********************
  759. ;*************************************************
  760. L_344:  cjne    A, #1, L_34E    ;Код команды # 01h ?
  761. ; COMM = 01h Get Vers.
  762.         push    DPL
  763.         mov     DPTR, #vers     ;Buf Ver.
  764.         mov     A, R5           ;0..3 (Adress Param)
  765.         movc    A, @A+DPTR      ;
  766.         pop     DPL
  767.         sjmp    L_340           ;
  768. ; -------------------------
  769. L_34E:  cjne    A, #7, L_35C
  770. ; COMM = 07h
  771.         mov     R0,#INTMEM_38   ;Буфер клавиатуры
  772.         mov     R1,#8
  773. L_355:  mov     @R0, #0FFh      ;все <1>
  774.         inc     R0
  775.         djnz    R1, L_355
  776. ;-----
  777.         sjmp    L_33E
  778. ; -------------------------
  779. L_35C:  cjne    A, #8, L_376
  780. ; COMM = 08h,<mode>
  781.         cjne    R7, #2, L_3C5
  782. ; Second param =<mode>
  783.         mov     A, R6           ;Второй параметр команды
  784.         anl     A,#03h          ;младшие 2 бита
  785.         mov     mode, A         ; Mode
  786.         mov     INTMEM_2,#0     ;Сброс кода
  787. ; Завершение команды - выход с кодом 0FFh
  788. L_33E:  mov     A, #0FFh        ;выход с A=0FFh
  789. L_340:  mov     R7, #0          ;
  790. L_2F3:  mov     DPH,#01h        ;DPTR=#01xx
  791.         movx    @DPTR, A        ; Снять /WAIT
  792.         pop     DPH
  793.         pop     ACC
  794.         pop     PSW
  795.         reti
  796. ; -------------------------
  797. L_376:  cjne    A, #9, L_37F
  798. ; COMM = 09h,49h,89h,C9h
  799.         mov     A, R5           ;0..3
  800.         inc     A               ;1..4
  801.         mov     R0, A
  802.         mov     A, @R0          ;A=(R1)..(R4)
  803.         sjmp    L_340
  804. ; -------------------------
  805. L_37F:  cjne    A, #0Ah, L_387
  806. ; COMM=0Ah Set RUS
  807.         orl     INTMEM_3, #80h  ; Set RUS (было INTMEM_1)
  808.         sjmp    L_33E           ;выход с A=0FFh
  809. ; -------------------------
  810. L_387:  cjne    A, #0Bh, L_38F
  811. ; COMM=0Bh Set LAT
  812.         anl     INTMEM_3, #7Fh  ; Set LAT (было INTMEM_1)
  813.         sjmp    L_33E           ;выход с A=0FFh
  814. ; -------------------------
  815. L_38F:  cjne    A, #0Ch, L_396
  816. ; COMM=0Ch
  817.         setb    f_wait          ; Set Wait ON
  818.         sjmp    L_33E           ;выход с A=0FFh
  819. ; -------------------------
  820. L_396:  cjne    A, #0Dh, L_39B
  821. ; COMM=0Dh
  822.         ajmp    reset           ; Reset Computer
  823. ; -------------------------
  824. L_39B:  cjne    A, #10h, L_3A4
  825. ; COMM=10h (запрос текущего времени)
  826.         mov     A, #b_time      ;секунды
  827.         acall   L_3E7           ; Get Time
  828.         ajmp    L_2F3
  829. ; -------------------------
  830. L_3A4:  cjne    A, #11h, L_3AD
  831. ; COMM=11h (установка текущего времени)
  832.         mov     A, #b_time
  833.         acall   L_3ED           ; Set Time
  834.         ajmp    L_2F3
  835. ; -------------------------
  836. L_3AD:  cjne    A, #12h, L_3B6
  837. ; COMM=12h (запрос текущей даты)
  838.         mov     A, #b_date      ; Буфер даты
  839.         acall   L_3E7           ; Get DATA
  840.         ajmp    L_2F3
  841. ; -------------------------
  842. L_3B6:  cjne    A, #13h, L_3BF
  843. ; COMM=13h (установка текущей даты)
  844.         mov     A, #b_date      ; Буфер даты
  845.         acall   L_3ED           ; Set DATA
  846.         ajmp    L_2F3
  847. ; -------------------------
  848. L_3BF:  cjne    A, #14h, L_3CD  ;
  849. ; COMM=14h (установка битов порта P1)
  850.         cjne    R7, #1, L_3C8
  851. ; R7=1
  852. L_3C5:  inc     R7              ; R7=2
  853.         mov     A,#0FFh
  854.         ajmp    L_2F3
  855. ; ---
  856. ; R7=2
  857. L_3C8:  mov     A, R6
  858.         orl     P1, A
  859.         ajmp    L_33E           ;Выход с A=0FFh
  860. ; -------------------------
  861. L_3CD:  cjne    A, #15h, L_3D9
  862. ; COMM=15h (сброс битов порта P1)
  863.         cjne    R7, #2, L_3C5   ;R7=1
  864. ; R7=2
  865.         mov     A, R6
  866.         cpl     A
  867.         anl     P1, A
  868. L_3D7:  ajmp    L_33E           ;выход с A=0FFh
  869. ; -------------------------
  870. L_3D9:  cjne    A, #16h, L_3E0
  871. ; COMM=16h (чтение порта P3)
  872.         mov     A, P3
  873.         ajmp    L_340           ;выход с A=P3
  874. ; -------------------------
  875. L_3E0:  cjne    A, #17h, L_3D7 ;выход с A=0FFh
  876. ; COMM=17h (чтение порта P1)
  877.         mov     A, P1
  878.         ajmp    L_340           ;выход с A=P1
  879. ; End Decode Command
  880. ; ========================================
  881. ; Get data
  882. L_3E7:  add     A, R5
  883.         mov     R0, A
  884.         mov     A, @R0
  885.         mov     R7, #0
  886.         ret
  887. ; ========================================
  888. L_3ED:  cjne    R7, #2, L_3F9
  889. ; Set data
  890.         mov     R7, #0
  891.         add     A, R5
  892.         mov     R0, A
  893.         mov     A, R6
  894.         mov     @R0, A
  895.         mov     A, #0FFh
  896.         ret
  897. ; -------------------------
  898. ; First Param = adress param -> R5
  899. L_3F9:  mov     A, #0FFh
  900.         inc     R7              ; R7=2
  901.         ret
  902. ;**********************************************
  903. ; Timer 0 (часы реального времени)
  904. ;**********************************************
  905. L_3FD:                          ; timint0
  906.         mov     PSW, #18h
  907. ; Счетчик тайм-аута клавиатуры
  908.         mov     A, R7           ; INTMEM_1F
  909.         jz      L_408           ;
  910.         dec     R7              ; -1
  911. L_408:
  912. ;--------------------------------
  913.         djnz    tics,L_45A      ;
  914. ;
  915.         mov     tics, #f_tic    ;50 тиков в секунду
  916.         mov     R0, #b_time     ;Буфер времени
  917.         inc     @R0
  918.         cjne    @R0, #60, L_45A ;<60 секунд
  919. ;
  920.         mov     @R0, #0         ;
  921.         inc     R0
  922.         inc     @R0
  923.         cjne    @R0, #60, L_45A ;<60 минут
  924. ;
  925.         mov     @R0, #0
  926.         inc     R0
  927.         inc     @R0
  928.         cjne    @R0, #24, L_45A ;<24 часов
  929. ;
  930.         mov     @R0, #0
  931. ;
  932.         inc     R0
  933.         inc     @R0             ;след.день
  934.         mov     A, @R0
  935.         mov     R2, A
  936.         inc     R0
  937.         mov     A, @R0          ;Номер месяца
  938.         push    DPL
  939.         push    DPH
  940.         mov     DPTR, #L_465-1  ;Таблица дней
  941.         movc    A, @A+DPTR
  942.         pop     DPH
  943.         pop     DPL
  944.         cjne    @R0, #2, L_445
  945. ;
  946.         inc     R0
  947.         mov     R3, A
  948.         mov     A, @R0
  949.         dec     R0
  950.         rrc     A
  951.         jc      L_444
  952.         rrc     A
  953.         jc      L_444
  954.         inc     R3
  955. L_444:  mov     A, R3
  956. ;
  957. L_445:  clr     C
  958.         subb    A, R2
  959.         jnc     L_45A
  960. ;
  961.         dec     R0
  962.         mov     @R0, #1
  963.         inc     R0
  964.         inc     @R0
  965.         cjne    @R0, #13, L_45A ;<13
  966. ;
  967.         mov     @R0, #1
  968.         inc     R0
  969.         inc     @R0
  970.         cjne    @R0, #100, L_45A ;<100
  971. ;
  972.         mov     @R0, #0
  973. ;
  974. L_45A:  mov     TH0,#HIGH KF_T0 ; Timer0 - High Byte
  975.         mov     TL0,#LOW  KF_T0 ; Timer0 - Low Byte
  976.         pop     ACC
  977.         pop     PSW
  978.         reti
  979. ; -------------------------
  980. ;
  981.         ORG     600h
  982. ;----------------------------------------
  983. ; Число дней в месяцах
  984. L_465:  db  31  ;Январь
  985.         db  28  ;Февраль
  986.         db  31  ;Март
  987.         db  30  ;Апрель
  988.         db  31  ;Май
  989.         db  30  ;Июнь
  990.         db  31  ;Июль
  991.         db  31  ;Август
  992.         db  30  ;Сентябрь
  993.         db  31  ;Октябрь
  994.         db  30  ;Ноябрь
  995.         db  31  ;Декабрь
  996. ;----------------------------------------
  997. ; Таблица CP/M - кодов клавиатуры
  998. L_471:  db  1Bh ; ESC
  999.         db    0 ;
  1000. ;
  1001.         db  31h ; 1
  1002.         db    0 ;
  1003. ;
  1004.         db  32h ; 2
  1005.         db    0 ;
  1006. ;
  1007.         db  33h ; 3
  1008.         db    0 ;
  1009. ;
  1010.         db  34h ; 4
  1011.         db    0 ;
  1012. ;
  1013.         db  35h ; 5
  1014.         db    0 ;
  1015. ;
  1016.         db  36h ; 6
  1017.         db    0 ;
  1018. ;
  1019.         db  37h ; 7
  1020.         db    0 ;
  1021. ;
  1022.         db  38h ; 8
  1023.         db    0 ;
  1024. ;
  1025.         db  39h ; 9
  1026.         db    0 ;
  1027. ;
  1028.         db  30h ; 0
  1029.         db    0 ;
  1030. ;
  1031.         db  2Dh ; -/_
  1032.         db    0 ;
  1033. ;
  1034.         db  3Dh ; =/+
  1035.         db    0 ;
  1036. ;
  1037.         db    8 ; BS
  1038.         db    0 ;
  1039. ;
  1040.         db    9 ; TAB
  1041.         db    0 ;
  1042. ;
  1043.         db  51h ; Q
  1044.         db    0 ;
  1045. ;
  1046.         db  57h ; W
  1047.         db    0 ;
  1048. ;
  1049.         db  45h ; E
  1050.         db    0 ;
  1051. ;
  1052.         db  52h ; R
  1053.         db    0 ;
  1054. ;
  1055.         db  54h ; T
  1056.         db    0 ;
  1057. ;
  1058.         db  59h ; Y
  1059.         db    0 ;
  1060. ;
  1061.         db  55h ; U
  1062.         db    0 ;
  1063. ;
  1064.         db  49h ; I
  1065.         db    0 ;
  1066. ;
  1067.         db  4Fh ; O
  1068.         db    0 ;
  1069. ;
  1070.         db  50h ; P
  1071.         db    0 ;
  1072. ;
  1073.         db  5Bh ; [
  1074.         db    0 ;
  1075. ;
  1076.         db  5Dh ; ]
  1077.         db    0 ;
  1078. ;
  1079.         db  0Dh ; Enter
  1080.         db 0C0h ;
  1081. ;
  1082.         db    0 ; Ctrl
  1083.         db    2 ; bit 1 (R3)
  1084. ;
  1085.         db  41h ; A
  1086.         db    0 ;
  1087. ;
  1088.         db  53h ; S
  1089.         db    0 ;
  1090. ;
  1091.         db  44h ; D
  1092.         db    0 ;
  1093. ;
  1094.         db  46h ; F
  1095.         db    0 ;
  1096. ;
  1097.         db  47h ; G
  1098.         db    0 ;
  1099. ;
  1100.         db  48h ; H
  1101.         db    0 ;
  1102. ;
  1103.         db  4Ah ; J
  1104.         db    0 ;
  1105. ;
  1106.         db  4Bh ; K
  1107.         db    0 ;
  1108. ;
  1109.         db  4Ch ; L
  1110.         db    0 ;
  1111. ;
  1112.         db  3Bh ; ;
  1113.         db    0 ;
  1114. ;
  1115.         db  27h ; '
  1116.         db    0 ;
  1117. ;
  1118.         db  60h ; `
  1119.         db    0 ;
  1120. ;
  1121.         db    0 ; Left Shift
  1122.         db    3 ; bit0 R3
  1123. ;
  1124.         db  5Ch ; \
  1125.         db    0 ;
  1126. ;
  1127.         db  5Ah ; Z
  1128.         db    0 ;
  1129. ;
  1130.         db  58h ; X
  1131.         db    0 ;
  1132. ;
  1133.         db  43h ; C
  1134.         db    0 ;
  1135. ;
  1136.         db  56h ; V
  1137.         db    0 ;
  1138. ;
  1139.         db  42h ; B
  1140.         db    0 ;
  1141. ;
  1142.         db  4Eh ; N
  1143.         db    0 ;
  1144. ;
  1145.         db  4Dh ; M
  1146.         db    0 ;
  1147. ;
  1148.         db  2Ch ; ,
  1149.         db    0 ;
  1150. ;
  1151.         db  2Eh ; .
  1152.         db    0 ;
  1153. ;
  1154.         db  2Fh ; /
  1155.         db  40h ;
  1156. ;
  1157.         db    0 ; Rght Shift
  1158.         db    3 ; bit0 R4
  1159. ;
  1160.         db 0AAh ; \/|
  1161.         db    0 ;
  1162. ;
  1163.         db    0 ; ALT
  1164.         db    1 ; bit2 R3
  1165. ;
  1166.         db  20h ; SPACE
  1167.         db    0 ;
  1168. ;
  1169.         db    0 ; CapS LOck
  1170.         db    4 ; bit4 R3 (trigger)
  1171. ;----
  1172.         db  61h ; F1
  1173.         db    0 ;
  1174. ;
  1175.         db  62h ; F2
  1176.         db    0 ;
  1177. ;
  1178.         db  63h ; F3
  1179.         db    0 ;
  1180. ;
  1181.         db  64h ; F4
  1182.         db    0 ;
  1183. ;
  1184.         db  65h ; F5
  1185.         db    0 ;
  1186. ;
  1187.         db  66h ; F6
  1188.         db    0 ;
  1189. ;
  1190.         db  67h ; F7
  1191.         db    0 ;
  1192. ;
  1193.         db  68h ; F8
  1194.         db    0 ;
  1195. ;
  1196.         db  69h ; F9
  1197.         db    0 ;
  1198. ;
  1199.         db  6Ah ; F10
  1200.         db    0 ;
  1201. ;
  1202.         db    0 ; Num Lock
  1203.         db    8 ; bit5 R3 (trigger)
  1204. ;
  1205.         db    0 ; Scroll Lock
  1206.         db  0Ch ; bit6 R3 (trigger)
  1207. ;----------------------------------
  1208. ; Num keyboard scan code set1 > 47h
  1209.         db  37h ;47h [7]
  1210.         db  80h ;set bit7 R2
  1211. ;
  1212.         db  38h ;48h [8]
  1213.         db  80h ;
  1214. ;
  1215.         db  39h ;49h [9]
  1216.         db  80h ;
  1217. ;
  1218.         db  2Dh ;4Ah [-]
  1219.         db  80h ;
  1220. ;
  1221.         db  34h ;4Bh [4]
  1222.         db  80h ;
  1223. ;
  1224.         db  35h ;4Ch [5]
  1225.         db  80h ;
  1226. ;
  1227.         db  36h ;4Dh [6]
  1228.         db  80h ;
  1229. ;
  1230.         db  2Bh ;4Eh [+]
  1231.         db  80h ;
  1232. ;
  1233.         db  31h ;4Fh [1]
  1234.         db  80h ;
  1235. ;
  1236.         db  32h ;50h [2]
  1237.         db  80h ;
  1238. ;
  1239.         db  33h ;51h [3]
  1240.         db  80h ;
  1241. ;
  1242.         db  30h ;52h [0]
  1243.         db  80h ;
  1244. ;
  1245.         db  2Eh ;53h [.]
  1246.         db  80h ;
  1247. ;
  1248.         db    0 ;54h
  1249.         db    0 ;
  1250. ;
  1251.         db    0 ;55h
  1252.         db    0 ;
  1253. ;
  1254.         db    0 ;56h
  1255.         db  30h ;
  1256. ;
  1257.         db  6Bh ;57h F11
  1258.         db    0 ;
  1259. ;
  1260.         db  6Ch ;58h F12
  1261.         db    0 ;
  1262. ;
  1263.         db    0 ;59h
  1264.         db    0 ;
  1265. ;
  1266.         db    0 ;5Ah
  1267.         db    0 ;
  1268. ;
  1269.         db    0 ;5Bh
  1270.         db    0 ;
  1271. ;
  1272. ;----------------------------------------
  1273. ; Scan-code IBM(1) -> code Spectrum
  1274. ; D7 - Symbol Shift
  1275. ; D6..D4 - Number bit Adress (A8=000..A15=111)
  1276. ; D3 - Caps Shift
  1277. ; D2..D0 - Number bit Data (D0=001..D4=101)
  1278. L_527:
  1279.         db  39h ;01 ESC         CapSh + 1
  1280. ;
  1281.         db  31h ;02 1/!
  1282.         db  32h ;03 2/@
  1283.         db  33h ;04 3/#
  1284.         db  34h ;05 4/$
  1285.         db  35h ;06 5/%
  1286. ;
  1287.         db  45h ;07 6/^
  1288.         db  44h ;08 7/&
  1289.         db  43h ;09 8/*
  1290.         db  42h ;0A 9/(
  1291.         db  41h ;0B 0/)
  1292. ;
  1293.         db 0E4h ;0C -/_         SymSh+Kl_J
  1294.         db 0E2h ;0D =/+         SymSh+Kl_L
  1295.         db  49h ;0E BS          CapSh+Kl_0
  1296.         db  3Bh ;0F TAB         CapSh+Kl_3
  1297. ;
  1298.         db  21h ;10 Q
  1299.         db  22h ;11 W
  1300.         db  23h ;12 E
  1301.         db  24h ;13 R
  1302.         db  25h ;14 T
  1303. ;
  1304.         db  55h ;15 Y
  1305.         db  54h ;16 U
  1306.         db  53h ;17 I
  1307.         db  52h ;18 O
  1308.         db  51h ;19 P
  1309. ;
  1310.         db 0D5h ;1A [/{         SymSh+Kl_Y
  1311.         db 0D4h ;1B ]/}         SymSh+Kl_U
  1312.         db  61h ;1C ENTER
  1313.         db  88h ;1D Ctrl        CapSh+SymSh
  1314. ;
  1315.         db  11h ;1E A
  1316.         db  12h ;1F S
  1317.         db  13h ;20 D
  1318.         db  14h ;21 F
  1319.         db  15h ;22 G
  1320. ;
  1321.         db  65h ;23 H
  1322.         db  64h ;24 J
  1323.         db  63h ;25 K
  1324.         db  62h ;26 L
  1325. ;
  1326.         db 0D2h ;27 ;/:         SymSh+Kl_O
  1327.         db 0D1h ;28 '/"         SymSh+Kl_P
  1328.         db  91h ;29 `/~         CapSh+Kl_A
  1329. ;
  1330.         db  08h ;2A Left Shift  CapSh
  1331.         db  92h ;2B \/|         CapSh+Kl_S
  1332. ;
  1333.         db  02h ;2C Z
  1334.         db  03h ;2D X
  1335.         db  04h ;2E C
  1336.         db  05h ;2F V
  1337. ;
  1338.         db  75h ;30 B
  1339.         db  74h ;31 N
  1340.         db  73h ;32 M
  1341. ;
  1342.         db 0F4h ;33 ,/<         SymSh+Kl_N
  1343.         db 0F3h ;34 ./>         SymSh+Kl_M
  1344.         db  85h ;35 //?         SymSh+Kl_V
  1345.         db  80h ;36 Rght Shift  SymSh
  1346.         db 0F5h ;37 [*]         SymSh+Kl_B
  1347.         db  3Ch ;38 Alt         CapSh+Kl_4
  1348. ;
  1349.         db  71h ;39 SPACE
  1350. ;
  1351.         db  3Ah ;3A CapsLock    CapSh+Kl_2
  1352. ;
  1353.         db 0B1h ;3B F1          SymSh+Kl_1
  1354.         db 0B2h ;3C F2          SymSh+Kl_2
  1355.         db 0B3h ;3D F3          SymSh+Kl_3
  1356.         db 0B4h ;3E F4          SymSh+Kl_4
  1357.         db 0B5h ;3F F5          SymSh+Kl_5
  1358.         db 0C5h ;40 F6          SymSh+Kl_6
  1359.         db 0C4h ;41 F7          SymSh+Kl_7
  1360.         db 0C3h ;42 F8          SymSh+Kl_8
  1361.         db 0C2h ;43 F9          SymSh+Kl_9
  1362.         db 0C1h ;44 F10         SymSh+Kl_0
  1363. ;
  1364.         db    0 ;45 NumLock
  1365.         db    0 ;46 ScrollLock
  1366. ;
  1367.         db  3Ch ;47 [7]         CapSh+Kl_4
  1368.         db  4Ch ;48 [8] [Up]    CapSh+Kl_7
  1369.         db  3Dh ;49 [9]         CapSh+Kl_5
  1370.         db 0E4h ;4A [-]         SymSh+Kl_J
  1371.         db  3Dh ;4B [4]         CapSh+Kl_5
  1372.         db  35h ;4C [5]         5
  1373.         db  4Bh ;4D [6]         CapSh+Kl_8
  1374.         db 0E3h ;4E [+]         SymSh+Kl_K
  1375.         db  4Ah ;4F [1]         CapSh+Kl_9
  1376.         db  4Dh ;50 [2]         CapSh+Kl_6
  1377.         db  4Bh ;51 [3]         CapSh+Kl_8
  1378.         db  84h ;52 [Insert]    SymSh+Kl_C
  1379.         db  49h ;53 [Delete]    CapSh+Kl_0
  1380.         db    0 ;54
  1381.         db    0 ;55
  1382.         db    0 ;56
  1383.         db 0E5h ;57 F11         SymSh+Kl_H
  1384.         db  94h ;58 F12         SymSh+Kl_F
  1385.         db    0 ;59
  1386.         db    0 ;5A
  1387.         db    0 ;5B
  1388. ;-----------------------------------------
  1389. ; Tab for Num KBD
  1390. L_582:  db  76h ;47h Home
  1391.         db  70h ;48h Cur Up
  1392.         db  74h ;49h Page Up
  1393.         db 0ADh ;4Ah [-]
  1394.         db  72h ;4Bh Cur Left
  1395.         db 0B5h ;4Ch [5]
  1396.         db  73h ;4Dh Cur Right
  1397.         db 0ABh ;4Eh [+]
  1398.         db  77h ;4Fh End
  1399.         db  71h ;50h Cur Down
  1400.         db  75h ;51h Page Down
  1401.         db  78h ;52h Insert
  1402.         db  79h ;53h Del
  1403. ;-----------------------------------------
  1404. ; Tab Scan-code Set 2 -> Scan-code Set 1
  1405. L_58F:  db    0 ;00h
  1406.         db  43h ;01h F9
  1407.         db    0 ;02h
  1408.         db  3Fh ;03h F5
  1409.         db  3Dh ;04h F3
  1410.         db  3Bh ;05h F1
  1411.         db  3Ch ;06h F2
  1412.         db  58h ;07h F12
  1413.         db    0 ;08h
  1414.         db  44h ;09h F10
  1415.         db  42h ;0Ah F8
  1416.         db  40h ;0Bh F6
  1417.         db  3Eh ;0Ch F4
  1418.         db  0Fh ;0Dh [Tab]
  1419.         db  29h ;0Eh ~/`
  1420.         db    0 ;0Fh
  1421.         db    0 ;10h
  1422.         db  38h ;11h ALT
  1423.         db  2Ah ;12h Left Shift
  1424.         db    0 ;13h
  1425.         db  1Dh ;14h [Ctrl]
  1426.         db  10h ;15h Q
  1427.         db    2 ;16h 1/!
  1428.         db    0 ;17h
  1429.         db    0 ;18h
  1430.         db    0 ;19h
  1431.         db  2Ch ;1Ah Z
  1432.         db  1Fh ;1Bh S
  1433.         db  1Eh ;1Ch A
  1434.         db  11h ;1Dh W
  1435.         db    3 ;1Eh 2/@
  1436.         db    0 ;1Fh
  1437.         db    0 ;20h
  1438.         db  2Eh ;21h C
  1439.         db  2Dh ;22h X
  1440.         db  20h ;23h D
  1441.         db  12h ;24h E
  1442.         db    5 ;25h 4/$
  1443.         db    4 ;26h 3/#
  1444.         db    0 ;27h
  1445.         db    0 ;28h
  1446.         db  39h ;29h [Space]
  1447.         db  2Fh ;2Ah V
  1448.         db  21h ;2Bh F
  1449.         db  14h ;2Ch T
  1450.         db  13h ;2Dh R
  1451.         db    6 ;2Eh 5/%
  1452.         db    0 ;2Fh
  1453.         db    0 ;30h
  1454.         db  31h ;31h N
  1455.         db  30h ;32h B
  1456.         db  23h ;33h H
  1457.         db  22h ;34h G
  1458.         db  15h ;35h Y
  1459.         db    7 ;36h 6/^
  1460.         db    0 ;37h
  1461.         db    0 ;38h
  1462.         db    0 ;39h
  1463.         db  32h ;3Ah M
  1464.         db  24h ;3Bh J
  1465.         db  16h ;3Ch U
  1466.         db    8 ;3Dh 7/&
  1467.         db    9 ;3Eh 8/*
  1468.         db    0 ;3Fh
  1469.         db    0 ;40h
  1470.         db  33h ;41h ,/<
  1471.         db  25h ;42h K
  1472.         db  17h ;43h I
  1473.         db  18h ;44h O
  1474.         db  0Bh ;45h 0/)
  1475.         db  0Ah ;46h 9/(
  1476.         db    0 ;47h
  1477.         db    0 ;48h
  1478.         db  34h ;49h ./>
  1479.         db  35h ;4Ah //?
  1480.         db  26h ;4Bh L
  1481.         db  27h ;4Ch ;/:
  1482.         db  19h ;4Dh P
  1483.         db  0Ch ;4Eh -/_
  1484.         db    0 ;4Fh
  1485.         db    0 ;50h
  1486.         db    0 ;51h
  1487.         db  28h ;52h '/"
  1488.         db    0 ;53h
  1489.         db  1Ah ;54h [/{
  1490.         db  0Dh ;55h =/+
  1491.         db    0 ;56h
  1492.         db    0 ;57h
  1493.         db  3Ah ;58h [Caps Lock]
  1494.         db  36h ;59h [Right Shift]
  1495.         db  1Ch ;5Ah [Enter]
  1496.         db  1Bh ;5Bh ]/}
  1497.         db    0 ;5Ch
  1498.         db  2Bh ;5Dh \/|
  1499.         db    0 ;5Eh
  1500.         db    0 ;5Fh
  1501.         db    0 ;60h
  1502.         db    0 ;61h
  1503.         db    0 ;62h
  1504.         db    0 ;63h
  1505.         db    0 ;64h
  1506.         db    0 ;65h
  1507.         db  0Eh ;66h [BS]
  1508.         db    0 ;67h
  1509.         db    0 ;68h
  1510.         db  4Fh ;69h [End]
  1511.         db    0 ;6Ah
  1512.         db  4Bh ;6Bh [Left]
  1513.         db  47h ;6Ch [Home]
  1514.         db    0 ;6Dh
  1515.         db    0 ;6Eh
  1516.         db    0 ;6Fh
  1517.         db  52h ;70h [Insert]
  1518.         db  53h ;71h [Delete]
  1519.         db  50h ;72h [Down]
  1520.         db  4Ch ;73h [5]
  1521.         db  4Dh ;74h [Right]
  1522.         db  48h ;75h [Up]
  1523.         db    1 ;76h [Esc]
  1524.         db  45h ;77h [Num Lock]
  1525.         db  57h ;78h F11
  1526.         db  4Eh ;79h [+]
  1527.         db  51h ;7Ah [3] и [Page Down]
  1528.         db  4Ah ;7Bh [-]
  1529.         db  37h ;7Ch [*]
  1530.         db  49h ;7Dh [9] и [Page up]
  1531.         db  46h ;7Eh [Scroll Lock]
  1532.         db    0 ;7Fh
  1533.         db    0 ;80h
  1534.         db    0 ;81h
  1535.         db    0 ;82h
  1536.         db  41h ;83h  F7
  1537.         db    0 ;84h
  1538.         db    0 ;85h
  1539.         db    0 ;86h
  1540. ;----------------------------------------------
  1541.         org     7C0h
  1542. aCopyrightC1995:
  1543.         db 0Dh,0Ah
  1544.         db 'Copyright (C) 1995 Honey Soft',0Dh,0Ah
  1545.         db '  AT Keyboard Driver V2.212',0Dh,0Ah,0
  1546. ; =================================================
  1547. ;
  1548.         end
  1549.