Приветствую. У Юрова есть пример для обработки прерываний от таймера, но на MASM. Я его разобрал, переписал на FASM, начал тестить на VirtualBox и... ничего. Что-то я не так сделал... Вот код. Код (Text): use16 macro delay time { local ext, iter push cx mov cx, time ext: push cx mov cx, 5000 iter: loop iter pop cx loop ext pop cx } datas: tonelow dw 2651 cnt db 0 old_off8 dw 0 old_seg8 dw 0 time_1ch dw 0 temp dw 0 start: off_1ch equ 1ch*4 off_0ffh equ 0ffh*4 char db '0' maskf db 07h position dw 2000 mov ax, datas mov ds, ax xor ax, ax cli mov ax, 0 mov es, ax mov ax, [es:off_1ch] mov [old_off8], ax mov ax, [es:off_1ch+2] mov [old_seg8], ax mov ax, new_1ch mov [es:off_1ch], ax push cs pop ax mov [es:off_1ch+2], ax mov ax, new_0ffh mov [es:off_0ffh], ax push cs pop ax mov [es:off_0ffh+2], ax sti delay 3500 int 0ffh exit: mov ax, 4c00h int 21h ret new_1ch: push ax push bx push es push ds push cs pop ds mov ax, 0b800h mov es, ax mov al, [char] mov ah, [maskf] mov bx, [position] mov [es:bx], ax add bx, 2 mov [position], bx inc [char] pop ds pop es pop bx pop ax iret new_0ffh: sirena: push ax push bx test [time_1ch], 03h jnz leave_it go: mov ax, 0b06h out 43h, ax in al, 61h or al, 3 out 61h, al mov cx, 2083 musicup: mov ax, [tonelow] out 42h, al mov al, ah out 42h, al add [tonelow], 1 delay 1 mov dx, [tonelow] mov [temp], dx loop musicup mov cx, 2083 musicdown: mov ax, [temp] out 42h, al mov al, ah out 42h, al sub [temp], 1 delay 1 loop musicdown nosound: in al, 61h and al, 0fch out 61h, al mov dx, 2651 mov [tonelow], dx inc [cnt] cmp [cnt], 2 jne go leave_it: inc [time_1ch] pop bx pop ax cli xor ax, ax mov es, ax mov ax, [old_off8] mov [es:off_1ch], ax mov ax, [old_seg8] mov [es:off_1ch+2], ax sti iret
Я ж под голое железо стартовал. Всё, добавил org 0x7C00 и забил всё до 512 байт. Всё работает. Извиняюсь. Ступил.
Вот, может кому пригодится: Код (Text): org 0x7C00 use16 macro delay time { local ext, iter push cx mov cx, time ext: push cx mov cx, 5000 iter: loop iter pop cx loop ext pop cx } datas: tonelow dw 2651 cnt db 0 old_off8 dw 0 old_seg8 dw 0 time_1ch dw 0 temp dw 0 start: off_1ch equ 1ch*4 off_0ffh equ 0ffh*4 char db '0' maskf db 07h position dw 2000 mov ax, datas mov ds, ax xor ax, ax cli mov ax, 0 mov es, ax mov ax, [es:off_1ch] mov [old_off8], ax mov ax, [es:off_1ch+2] mov [old_seg8], ax mov ax, new_1ch mov [es:off_1ch], ax push cs pop ax mov [es:off_1ch+2], ax mov ax, new_0ffh mov [es:off_0ffh], ax push cs pop ax mov [es:off_0ffh+2], ax sti delay 3500 int 0ffh exit: mov ax, 4c00h int 21h ret new_1ch: push ax push bx push es push ds push cs pop ds mov ax, 0b800h mov es, ax mov al, [char] mov ah, [maskf] mov bx, [position] mov [es:bx], ax add bx, 2 mov [position], bx inc [char] pop ds pop es pop bx pop ax iret new_0ffh: sirena: push ax push bx test [time_1ch], 03h jnz leave_it go: mov ax, 0b06h out 43h, ax in al, 61h or al, 3 out 61h, al mov cx, 2083 musicup: mov ax, [tonelow] out 42h, al mov al, ah out 42h, al add [tonelow], 1 delay 1 mov dx, [tonelow] mov [temp], dx loop musicup mov cx, 2083 musicdown: mov ax, [temp] out 42h, al mov al, ah out 42h, al sub [temp], 1 delay 1 loop musicdown nosound: in al, 61h and al, 0fch out 61h, al mov dx, 2651 mov [tonelow], dx inc [cnt] cmp [cnt], 2 jne go leave_it: inc [time_1ch] pop bx pop ax cli xor ax, ax mov es, ax mov ax, [old_off8] mov [es:off_1ch], ax mov ax, [old_seg8] mov [es:off_1ch+2], ax sti iret ends: rb 499-(ends- start) db 055h, 0aah