< -->
;wavdir.asm
FILESPEC equ "comsysex.dat"
SBPORT equ 220h
.model tiny
.code
.186
org 100h
start:
call dsp_reset
jc no_blaster
mov bl, 0D1h
call dsp_write
call open_file
call hook_int8
mov bx, 640
call reprogram_pit
main_loop:
cmp byte ptr finished_flag, 0
je main_loop
mov bx, 0FFFFh
call reprogram_pit
call restore_int8
no_blaster:
ret
buffer_addr dw offset buffer
old_int08h dd ?
finished_flag db 0
filename db FILESPEC, 0
int08h_handler proc far
pusha
cmp byte ptr cs:finished_flag, 1
je exit_handler
mov di, word ptr cs:buffer_addr
mov bl, 10h
call dsp_write
mov bl, byte ptr cs:[di]
call dsp_write
inc di
cmp di, offset buffer+5420
jb not_finished
mov byte ptr cs:finished_flag, 1
not_finished:
mov word ptr cs:buffer_addr, di
exit_handler:
mov al, 20h
out 20h, al
popa
iret
int08h_handler endp
dsp_reset proc near
mov dx, SBPORT+6
mov al, 1
out dx, al
mov cx, 40
dsploop:
in al, dx
loop dsploop
mov al, 0
out dx, al
add dx, 8
mov cx, 100
check_port:
in al, dx
and al, 80h
jz port_not_ready
sub dx, 4
in al, dx
add dx, 4
cmp al, 0AAh
je good_reset
port_not_ready:
loop check_port
bad_reset:
stc
ret
good_reset:
clc
ret
dsp_reset endp
dsp_write proc near
mov dx, SBPORT+0Ch
write_loop:
in al, dx
and al, 80h
jnz write_loop
mov al, bl
out dx, al
ret
dsp_write endp
reprogram_pit proc near
cli
mov al, 00110110b
out 43h, al
mov al, bl
out 40h, al
mov al, bh
out 40h, al
sti
ret
reprogram_pit endp
hook_int8 proc near
mov ax, 3508h
int 21h
mov word ptr old_int08h, bx
mov word ptr old_int08h+2, es
mov ax, 2508h
mov dx, offset int08h_handler
int 21h
ret
hook_int8 endp
restore_int8 proc near
mov ax, 2508h
lds dx, dword ptr old_int08h
int 21h
ret
restore_int8 endp
open_file proc near
mov ax, 3D00h
mov dx, offset filename
int 21h
jc error_exit
mov bx, ax
mov ah, 3Fh
mov cx, 5420
mov dx, offset buffer
int 21h
ret
error_exit:
mov ah, 9
mov dx, offset notopenmsg
int 21h
int 20h
notopenmsg db "Ошибка при открытии файла", 0Dh, 0Ah, '$'
open_file endp
buffer:
end start
Назад