Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Драйвер, обьясните как работает.


Автор: fAL 12.3.2005, 21:54
Код


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 по этому делу smile

Автор: Chingachguk 12.3.2005, 22:55
Попробуй почитать статьи Four-F на wasm.ru, например: http://www.wasm.ru/print.php?article=drvw2k01

Автор: fAL 14.3.2005, 14:09
Цитата(Chingachguk @ 12.3.2005, 22:55)
Попробуй почитать статьи Four-F на wasm.ru, например: http://www.wasm.ru/print.php?article=drvw2k01

Именно их я и пытаюсь изучать, но проблема в том, что там написано на MASM32, а у меня FASM

Автор: oleg1973 14.3.2005, 23:38
fAL
а какая разница?

Автор: TDil 15.3.2005, 16:11
А может спросить в http://flatassembler.net

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)