| Код |
format PE native 4.0 at 10000h entry DriverEntry
include "D:\assembler\FASM\INCLUDE\win32a.inc" include "D:\assembler\FASM\INCLUDE\macro\if.inc"
STATUS_DEVICE_CONFIGURATION_ERROR equ 00C0000182h
TIMER_FREQUENCY equ 1193167 ; 1,193,167 Гц OCTAVE equ 2 ; множитель октавы
PITCH_C equ 523 ; До - 523,25 Гц PITCH_Cs equ 554 ; До диез - 554,37 Гц PITCH_D equ 587 ; Ре - 587,33 Гц PITCH_Ds equ 622 ; Ре диез - 622,25 Гц PITCH_E equ 659 ; Ми - 659,25 Гц PITCH_F equ 698 ; Фа - 698,46 Гц PITCH_Fs equ 740 ; Фа диез - 739,99 Гц PITCH_G equ 784 ; Соль - 783,99 Гц PITCH_Gs equ 831 ; Соль диез - 830,61 Гц PITCH_A equ 880 ; Ля - 880,00 Гц PITCH_As equ 988 ; Ля диез - 987,77 Гц PITCH_H equ 1047 ; Си - 1046,50 Гц
; Нам нужны три звука для до-мажорного арпеджио (до, ми, соль)
TONE_1 equ TIMER_FREQUENCY/(PITCH_C*OCTAVE) TONE_2 equ TIMER_FREQUENCY/(PITCH_E*OCTAVE) TONE_3 equ (PITCH_G*OCTAVE) ; для HalMakeBeep
DELAY equ 3000000h ; для моей ~800mHz машины
section '.text' code readable executable notpageable
proc MakeBeep1,dwPitch enter ; Прямой доступ к оборудованию через порты ввода-вывода
cli
mov al, 10110110b out 43h, al
mov eax, [dwPitch] out 42h, al
mov al, ah out 42h, al
; включить динамик
in al, 61h or al, 11b out 61h, al
sti mov eax, DELAY .while eax dec eax .endw cli
; выключить динамик
in al, 61h and al, 11111100b out 61h, al
sti return endp
proc MakeBeep2,dwPitch enter ; Прямой доступ к оборудованию используя функции ; WRITE_PORT_UCHAR и READ_PORT_UCHAR из модуля hal.dll
cli
invoke WRITE_PORT_UCHAR, 43h, 10110110b
mov eax, [dwPitch] push 0 movzx ax,al push ax push 42h call [WRITE_PORT_UCHAR] mov eax, [dwPitch] mov al,ah push 0 movzx ax,al push ax push 42h call [WRITE_PORT_UCHAR]
; включить динамик
invoke READ_PORT_UCHAR, 61h or al,11b push 0 movzx ax,al push ax push 61h call [WRITE_PORT_UCHAR]
sti mov eax, DELAY .while eax dec eax .endw cli
; выключить динамик
invoke READ_PORT_UCHAR, 61h and al, 11111100b push 0 movzx ax,al push ax push 61h call [WRITE_PORT_UCHAR]
sti return endp
proc DriverEntry,pDriverObject,pusRegistryPath enter stdcall MakeBeep1,TONE_1 stdcall MakeBeep2,TONE_2
; Прямой доступ к оборудованию используя функцию HalMakeBeep из модуля hal.dll
invoke HalMakeBeep,TONE_3 mov eax, DELAY .while eax dec eax .endw invoke HalMakeBeep, 0
mov eax, STATUS_DEVICE_CONFIGURATION_ERROR return endp
section '.rdata' import readable notpageable library hal,"hal.dll" import hal,HalMakeBeep,"HalMakeBeep",\ READ_PORT_UCHAR,'READ_PORT_UCHAR',\ WRITE_PORT_UCHAR,'WRITE_PORT_UCHAR'
section '.reloc' data fixups readable discardable
|
Воть, исходничек нарыл, а как работает не знаю, мне бы описание hal.dll, и что нибуть типа MSDN по этому делу |