Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Программа работы контроллера DMA


Автор: kader 25.12.2011, 17:58
IDEAL
P386
LOCALS
MODEL MEDIUM

DATASEG
Text0 DB "Tip",0
Text1 DB "Kanalov",0
AnyK  DB "Speed",0

ENDS

SEGMENT PRD_Table para public 'DATA'
        DB 16 DUP(?)
ENDS

SEGMENT DMA_Sector512 para public 'DATA'
        DB 512 DUP(?)
ENDS

SEGMENT sseg para stack 'STACK'
DB 400h DUP(?)
ENDS

CODESEG

PROC IDE_DMA_Test
        mov     AX,DGROUP
        mov     DS,AX
        mov     AX,3
        int     10h
        mov     [ScreenString],25
        mov     [ScreenColumn],0
        call    SetCursorPosition
        MShowColorText 1,Text0
        call    FindHDD
        cmp     [ChannelNumber],1
        je      @@TestLBASupport
        mov     SI,offset NoHDD
        call    FatalError
@@TestLBASupport:
        cmp     [dword ptr Sector512+60*2],0
        jne     @@LBASupported
        mov     SI,offset NoLBA
        call    FatalError
@@LBASupported:
        call    SearchBusMasterIDEContr
        mov     AX,PRD_Table
        mov     ES,AX
        xor     EAX,EAX
        mov     AX,DMA_Sector512
        shl     EAX,4
        mov     [ES:0],EAX
        mov     [word ptr ES:4],512
        mov     [word ptr ES:6],8000h
        xor     EAX,EAX
        mov     AX,PRD_Table
        shl     EAX,4
        mov     DX,[IDEContrRegsBaseAddr]
        add     DX,04h
        out     DX,EAX
        call    ReadBootSector
        MShowColorText 1,Text1
        push    DS
        mov     AX,DMA_Sector512
        mov     DS,AX
        xor     SI,SI
        call    ShowSector512
        pop     DS
        MShowColorText 1,AnyK
        call    GetChar
        mov     AX,3
        int     10h
        mov     AH,4Ch
        int     21h
ENDP IDE_DMA_Test

PROC ReadBootSector near
        pushad
;        mov     DX,[IDEContrRegsBaseAddr]
;        add     DX,02h
;        mov     AL,110b
;        out     DX,AL
        mov     DX,[IDEContrRegsBaseAddr]
        mov     AL,0
        out     DX,AL
        mov     AL,1000b
        out     DX,AL
        mov     [ATAAddressMode],1
        mov     [dword ptr SectorAddress],0    ;ᥪв®а 0
        mov     [dword ptr ATASectorNumber],0
        mov     [ATAFeatures],0
        mov     [ATASectorCount],1 
        mov     EAX,[SectorAddress]
        mov     [ATACommand],0C8h  
        call    SendCommandToHDD
        cmp     [DevErrorCode],0  
        jne     @@Err

        mov     DX,[IDEContrRegsBaseAddr]
        add     DX,02h
        mov     AL,110b
        out     DX,AL
        mov     DX,[IDEContrRegsBaseAddr]
        mov     AL,1001b
        out     DX,AL
        mov     AX,0
        mov     ES,AX
        mov     DX,[ATABasePortAddr]
        add     DX,7
@@WaitCompleet:
        mov     EAX,[ES:046Ch]
        sub     EAX,[OpTime]
        cmp     EAX,MaxHDDWaitTime
        ja      @@Err
        in      AL,DX
        test    AL,88h   ;б®бв®п­ЁҐ бЁЈ­ «®ў BSY Ё DRQ
        jnz     @@WaitCompleet
        mov     DX,[IDEContrRegsBaseAddr]
        add     DX,02h
@@WaitDMAOperationEnd:
        in      AL,DX
        test    AL,100b
        jz      @@WaitDMAOperationEnd

        mov     DX,[IDEContrRegsBaseAddr]
        mov     AL,0
        out     DX,AL
        popad
        ret

@@Err:  mov     SI,offset NoSec
        call    FatalError
ENDP ReadBootSector
ENDS

END

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