Advertisement
SquirrelInBox

Untitled

May 16th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. model tiny
  2. .code
  3. org 100h
  4. locals
  5. .186
  6.  
  7. _1:
  8. jmp start
  9.  
  10. buff db 10 dup (0)
  11. tail dw offset buff
  12. head dw offset buff
  13.  
  14. save_buff proc
  15. ; Пишем в хвост, читаем из головы
  16. mov di, tail
  17. mov bx, di
  18. inc bx
  19. cmp bx, offset tail ; случай переполнения, именно так, потому что tail
  20. ; сразу за буфером
  21. jnz @@1
  22. mov bx, offset buff
  23. @@1:
  24. cmp bx, head
  25. jz @@2
  26. stosb
  27. mov tail, bx
  28. @@2:
  29. ret
  30. save_buff endp
  31.  
  32. int9 proc far
  33. push ax
  34. push bx
  35. push di
  36. push ds
  37. push es
  38.  
  39. ; чтобы находились в одном сегменте, т.к. значения cs, ds нам не
  40. ; гарантированы
  41. push cs
  42. pop ds
  43. push cs
  44. pop es
  45.  
  46. in al, 60h ; здесь символ только читаем, но не извлекаем
  47. call save_buff
  48. ; Говорим клавиатурному обработчику, что символ получили и обработали
  49. in al, 61h ; 61 - порт состояния
  50. mov ah, al
  51. or al, 80h ; установили флаг обработанности (старший бит в 61 порту)
  52. out 61h, al ; выдали снова в 61 порт
  53. ;mov al, ah
  54. ;out 61h, al
  55. mov al, 20h ; говорим контроллеру прер, что мы закончили обрабатывать
  56. out 20h, al ; прерываний
  57. ; здесь работает и так, тк контроллер клавиатуры
  58. ; делает за нас эту работу после группы команд выше
  59. ; закончили обработку символа
  60.  
  61. pop es
  62. pop ds
  63. pop di
  64. pop bx
  65. pop ax
  66. iret
  67. int9 endp
  68.  
  69. int9_off dw 0
  70. int9_seg dw 0
  71.  
  72. start:
  73. xor ax, ax
  74. push ax
  75. pop ds
  76. mov si, 9*4
  77. mov di, offset int9_off
  78. movsw
  79. movsw
  80.  
  81. ; адрес своего обработчика записываем по адресу
  82. push ds
  83. pop es
  84. push cs
  85. pop ds
  86.  
  87. mov di, 9*4
  88. mov ax, offset int9
  89. cli
  90. stosw
  91. mov ax, cs
  92. stosw
  93. sti
  94. push cs
  95. pop es
  96. @@1:
  97. mov si, head
  98. cmp si, tail
  99. jz @@1
  100. lodsb ; в al теперь наш символ
  101. inc head
  102. cmp head, offset tail ; если достигли конца, закольцовываем буфер
  103. jnz @@2
  104. mov head, offset buff
  105. @@2:
  106. push ax
  107. shr al,4
  108. call tohex
  109. mov di, offset bbb
  110. stosb
  111. pop ax
  112. push ax
  113. call tohex
  114. stosb
  115. mov ah, 9
  116. mov dx, offset bbb
  117. int 21h
  118. pop ax
  119. cmp al, 81h
  120. jz @@3
  121. cmp al, 0b9h
  122. jnz @@1 ; не каждое нажатие клавиши = 2 скан кода
  123. mov ah, 9
  124. mov dx, offset space
  125. int 21h
  126. jmp @@1
  127.  
  128. @@3:
  129. mov si, offset int9_off
  130. mov di, 9*4
  131. xor ax, ax
  132. push ax
  133. pop es
  134. cli
  135. movsw
  136. movsw
  137. sti
  138. push cs
  139. pop es
  140. ret
  141.  
  142. tohex:
  143. cmp al, 09h
  144. jg @@letter
  145. add al, 30h
  146. jmp @@end
  147. @@letter:
  148. add al, 37h
  149. @@end:
  150. ret
  151.  
  152. bbb db 0,0,0dh,0ah,"$"
  153. space db 0dh, 0ah, "$"
  154. end _1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement