Обработка прерываний от таймера.

Тема в разделе "WASM.BEGINNERS", создана пользователем Igor1024, 27 фев 2011.

  1. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Приветствую. У Юрова есть пример для обработки прерываний от таймера, но на MASM. Я его разобрал, переписал на FASM, начал тестить на VirtualBox и... ничего. Что-то я не так сделал...
    Вот код.
    Код (Text):
    1. use16
    2.  
    3. macro delay time
    4. {
    5. local ext, iter
    6. push cx
    7. mov cx, time
    8. ext:
    9. push cx
    10. mov cx, 5000
    11. iter:
    12. loop iter
    13. pop cx
    14. loop ext
    15. pop cx
    16. }
    17.  
    18. datas:
    19.       tonelow    dw 2651
    20.       cnt        db    0
    21.       old_off8   dw 0
    22.       old_seg8   dw 0
    23.       time_1ch   dw 0
    24.       temp       dw 0
    25.  
    26. start:
    27.         off_1ch    equ 1ch*4
    28.         off_0ffh   equ 0ffh*4
    29.         char       db  '0'
    30.         maskf      db 07h
    31.         position   dw 2000
    32.  
    33. mov ax, datas
    34. mov ds, ax
    35. xor ax, ax
    36.  
    37. cli
    38.  
    39. mov ax, 0
    40. mov es, ax
    41. mov ax, [es:off_1ch]
    42. mov [old_off8], ax
    43. mov ax, [es:off_1ch+2]
    44. mov [old_seg8], ax
    45. mov ax, new_1ch
    46. mov [es:off_1ch], ax
    47. push cs
    48. pop ax
    49. mov [es:off_1ch+2], ax
    50.  
    51. mov ax, new_0ffh
    52. mov [es:off_0ffh], ax
    53. push cs
    54. pop ax
    55. mov [es:off_0ffh+2], ax
    56. sti
    57. delay 3500
    58. int 0ffh
    59.  
    60. exit:
    61. mov ax, 4c00h
    62. int 21h
    63. ret
    64.  
    65. new_1ch:
    66. push ax
    67. push bx
    68. push es
    69. push ds
    70. push cs
    71. pop ds
    72.  
    73. mov ax, 0b800h
    74. mov es, ax
    75. mov al, [char]
    76. mov ah, [maskf]
    77. mov bx, [position]
    78. mov [es:bx], ax
    79. add bx, 2
    80. mov [position], bx
    81. inc [char]
    82. pop ds
    83. pop es
    84. pop bx
    85. pop ax
    86. iret
    87.  
    88. new_0ffh:
    89. sirena:
    90. push ax
    91. push bx
    92.  
    93. test [time_1ch], 03h
    94. jnz leave_it
    95.  
    96. go:
    97. mov ax, 0b06h
    98. out 43h, ax
    99. in al, 61h
    100. or al, 3
    101. out 61h, al
    102. mov cx, 2083
    103.  
    104. musicup:
    105. mov ax, [tonelow]
    106. out 42h, al
    107. mov al, ah
    108. out 42h, al
    109. add [tonelow], 1
    110. delay 1
    111. mov dx, [tonelow]
    112. mov [temp], dx
    113. loop musicup
    114. mov cx, 2083
    115.  
    116. musicdown:
    117. mov ax, [temp]
    118. out 42h, al
    119. mov al, ah
    120. out 42h, al
    121. sub [temp], 1
    122. delay 1
    123. loop musicdown
    124.  
    125. nosound:
    126. in al, 61h
    127. and al, 0fch
    128. out 61h, al
    129. mov dx, 2651
    130. mov [tonelow], dx
    131. inc [cnt]
    132. cmp [cnt], 2
    133. jne go
    134.  
    135. leave_it:
    136. inc [time_1ch]
    137. pop bx
    138. pop ax
    139.  
    140. cli
    141. xor ax, ax
    142. mov es, ax
    143. mov ax, [old_off8]
    144. mov [es:off_1ch], ax
    145. mov ax, [old_seg8]
    146. mov [es:off_1ch+2], ax
    147. sti
    148. iret
     
  2. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Ой ступил!!!
     
  3. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Я ж под голое железо стартовал. Всё, добавил org 0x7C00 и забил всё до 512 байт. Всё работает. Извиняюсь. Ступил.
     
  4. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Вот, может кому пригодится:
    Код (Text):
    1. org 0x7C00
    2. use16
    3.  
    4. macro delay time
    5. {
    6. local ext, iter
    7. push cx
    8. mov cx, time
    9. ext:
    10. push cx
    11. mov cx, 5000
    12. iter:
    13. loop iter
    14. pop cx
    15. loop ext
    16. pop cx
    17. }
    18.  
    19. datas:
    20.       tonelow    dw 2651
    21.       cnt        db    0
    22.       old_off8   dw 0
    23.       old_seg8   dw 0
    24.       time_1ch   dw 0
    25.       temp       dw 0
    26.  
    27. start:
    28.         off_1ch    equ 1ch*4
    29.         off_0ffh   equ 0ffh*4
    30.         char       db  '0'
    31.         maskf      db 07h
    32.         position   dw 2000
    33.  
    34. mov ax, datas
    35. mov ds, ax
    36. xor ax, ax
    37.  
    38. cli
    39.  
    40. mov ax, 0
    41. mov es, ax
    42. mov ax, [es:off_1ch]
    43. mov [old_off8], ax
    44. mov ax, [es:off_1ch+2]
    45. mov [old_seg8], ax
    46. mov ax, new_1ch
    47. mov [es:off_1ch], ax
    48. push cs
    49. pop ax
    50. mov [es:off_1ch+2], ax
    51.  
    52. mov ax, new_0ffh
    53. mov [es:off_0ffh], ax
    54. push cs
    55. pop ax
    56. mov [es:off_0ffh+2], ax
    57. sti
    58. delay 3500
    59. int 0ffh
    60.  
    61. exit:
    62. mov ax, 4c00h
    63. int 21h
    64. ret
    65.  
    66. new_1ch:
    67. push ax
    68. push bx
    69. push es
    70. push ds
    71. push cs
    72. pop ds
    73.  
    74. mov ax, 0b800h
    75. mov es, ax
    76. mov al, [char]
    77. mov ah, [maskf]
    78. mov bx, [position]
    79. mov [es:bx], ax
    80. add bx, 2
    81. mov [position], bx
    82. inc [char]
    83. pop ds
    84. pop es
    85. pop bx
    86. pop ax
    87. iret
    88.  
    89. new_0ffh:
    90. sirena:
    91. push ax
    92. push bx
    93.  
    94. test [time_1ch], 03h
    95. jnz leave_it
    96.  
    97. go:
    98. mov ax, 0b06h
    99. out 43h, ax
    100. in al, 61h
    101. or al, 3
    102. out 61h, al
    103. mov cx, 2083
    104.  
    105. musicup:
    106. mov ax, [tonelow]
    107. out 42h, al
    108. mov al, ah
    109. out 42h, al
    110. add [tonelow], 1
    111. delay 1
    112. mov dx, [tonelow]
    113. mov [temp], dx
    114. loop musicup
    115. mov cx, 2083
    116.  
    117. musicdown:
    118. mov ax, [temp]
    119. out 42h, al
    120. mov al, ah
    121. out 42h, al
    122. sub [temp], 1
    123. delay 1
    124. loop musicdown
    125.  
    126. nosound:
    127. in al, 61h
    128. and al, 0fch
    129. out 61h, al
    130. mov dx, 2651
    131. mov [tonelow], dx
    132. inc [cnt]
    133. cmp [cnt], 2
    134. jne go
    135.  
    136. leave_it:
    137. inc [time_1ch]
    138. pop bx
    139. pop ax
    140.  
    141. cli
    142. xor ax, ax
    143. mov es, ax
    144. mov ax, [old_off8]
    145. mov [es:off_1ch], ax
    146. mov ax, [old_seg8]
    147. mov [es:off_1ch+2], ax
    148. sti
    149. iret
    150. ends: rb 499-(ends- start)
    151. db 055h, 0aah