Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контроллер DMA (i8237A) 
:(
    Опции темы
makwen
Дата 24.11.2005, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 163
Регистрация: 9.11.2005
Где: Киев

Репутация: нет
Всего: 1



Поставлена такая задача:
С помощью DMA контроллера произвести запись (чтение) всех секторов НГМД.
Кто то писал что-то подобное? Если да, то хотелось посмотреть на рабочею программу.
Заранее спасибо!

PM MAIL   Вверх
Akina
Дата 24.11.2005, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Код

; LOAD_SECTOR : NEAR  Load 1 sector from floppy (A or B) into inner buffer.
;                      INPUT: CH - track; CL - sector; DH - head; DL - drive.
;                     OUTPUT: DS:DX - data read from disk (512 bytes);
;                             ES:BX - status bytes (7 bytes).
;                     If input error detected, CF=1, OUTPUT unpredictable.

PUBLIC  LOAD_SECTOR

INSTALL_INT     MACRO           tsr_num,tsr_name,addr
                MOV             AX,3500H+tsr_num
                INT             21H
                MOV             WORD PTR addr,BX
                MOV             WORD PTR addr[2],ES
                LEA             DX,tsr_name
                MOV             AH,25H
                INT             21H
                ENDM

RESTORE_INT     MACRO           tsr_num,addr
                PUSH            DS
                LDS             DX,DWORD PTR addr
                MOV             AX,2500h+tsr_num
                INT             21H
                POP             DS
                ENDM

FUNCTION_OUT    EQU     0EEH
FUNCTION_IN     EQU     0ECH

INT_08H         PROC    FAR
                INC     BYTE PTR CS:TIME_COUNTER
                DB      0EAH
OLD_08H         DD      ?
TIME_COUNTER    DB      0
INT_08H         ENDP

WAIT_FDC_INT    PROC    NEAR
                XOR     AX,AX
                MOV     ES,AX
WAIT_INT_6:
                TEST    BYTE PTR ES:[43EH],80H   ; Test FDC interrupt flag
                JZ      WAIT_INT_6
                AND     BYTE PTR ES:[43EH],7FH   ; Clear FDC interrupt flag
                RETN
WAIT_FDC_INT    ENDP

IN_OUT          PROC    NEAR
                MOV     DX,3F4H
WAIT_FDC_READY:
                IN      AL,DX
                TEST    AL,80H
                JZ      WAIT_FDC_READY
                INC     DX
                MOV     AL,AH
FUNCTION        DB      ?
                RETN
IN_OUT          ENDP

CREATE_PARAMETERS       PROC    NEAR    ; Input: CH - track
                                        ;        CL - sector
                                        ;        DH - head (0 or 1)
                                        ;        DL - drive (0 or 1)
                        TEST    DX,0E0EH; Test head and drive
                        JZ      HEAD_DRIVE_OK
                        STC
                        RET
HEAD_DRIVE_OK:
                        MOV     AL,00001100B
                        ADD     AL,DL
                        MOV     PAR1,AL ; For motor off
                        MOV     AH,CL
                        MOV     PAR2,AL ; Sector #
                        MOV     AH,DH
                        MOV     PAR3,AL ; Head #
                        MOV     AH,CH
                        MOV     PAR4,AL ; Track #
                        XOR     AX,AX
                        MOV     AH,DH
                        SHL     AH,1
                        SHL     AH,1
                        OR      AH,DL
                        MOV     PAR5,AL ; Drive & Head
                        MOV     AH,CH
                        MOV     PAR6,AL ; Track #
                        MOV     AH,DL
                        MOV     PAR7,AL ; Drive #
                        MOV     AL,00011100B    ; For drive A
                        OR      DL,DL
                        JZ      CREATE_PARAMETERS_LOC
                        MOV     AL,00101101B    ; For drive B
CREATE_PARAMETERS_LOC:
                        MOV     PAR8,AL ; For motor on
                        RET
CREATE_PARAMETERS       ENDP

PAR1            DB      ?
PAR2            DB      ?
PAR3            DB      ?
PAR4            DB      ?
PAR5            DB      ?
PAR6            DB      ?
PAR7            DB      ?
PAR8            DB      ?

LOAD_SECTOR     PROC    NEAR
                CALL    CREATE_PARAMETERS
                JNC     PARAMETERS_OK
                RET
PARAMETERS_OK:
                INSTALL_INT     08H,INT_08H,OLD_08H
                STI
                MOV     DX,3F2H ; Digital output register
                MOV     AL,PAR8
;                MOV     AL,00011100B
                                ;       ** - Drive (00-A, 01-B, 10-C, 11-D)
                                ;      * - Reset FDC (0 - yes)
                                ;     * - Let FDC int and DMA access (1 - yes)
                                ; **** - Motor (1 - on, 0 - off)
                                ; Drive A, don't reset FDC, let FDC interrupt
                                ;   and DMA access, motor A on, B-D off
                OUT     DX,AL
                MOV     TIME_COUNTER,0
WAIT_MOTOR_ON:
                CMP     TIME_COUNTER,0AH
                JB      WAIT_MOTOR_ON   ; Wait normal motor rotate rate
                MOV     AH,15           ; Find track code
                MOV     CS:FUNCTION,FUNCTION_OUT   ; Sub IN_OUT set to OUT
                CALL    IN_OUT
                MOV     AH,PAR7
;                MOV     AH,0            ; Drive number
                CALL    IN_OUT
                MOV     AH,PAR6
;                MOV     AH,12           ; Track number
                CALL    IN_OUT
                CALL    WAIT_FDC_INT    ; Wait FDC interrupt
                MOV     TIME_COUNTER,0
WAIT_HEAD_SEEK:
                CMP     TIME_COUNTER,2
                JB      WAIT_HEAD_SEEK  ; Wait heads ready
                MOV     AL,46H          ; Read FDC code
                OUT     12,AL           ;    save to DMA
                OUT     11,AL           ;    save to DMA
                LEA     AX,BUFFER       ; Дї
                MOV     BX,DS           ;  і
                MOV     CL,4            ;  і Buffer
                ROL     BX,CL           ;  і address
                MOV     DL,BL           ;  і prepared
                AND     DL,0FH          ;  і to normal
                AND     BL,0F0H         ;  і DMA address
                ADD     AX,BX           ;  і
                ADC     DL,0            ; ДЩ
                OUT     4,AL            ; Дї
                MOV     AL,AH           ;  і Save
                PUSH    DX              ;  і address
                OUT     4,AL            ;  і to
                POP     AX              ;  і DMA
                OUT     81H,AL          ; ДЩ
                MOV     AX,511          ; Дї
                OUT     5,AL            ;  і
                MOV     AL,AH           ;  і Save the number
                PUSH    AX              ;  і of bytes - 1
                POP     BX              ;  і to transferr
                OUT     5,AL            ;  і to DMA
                MOV     AL,2            ;  і
                OUT     10,AL           ; ДЩ
                MOV     AX,351EH        ; Get FD parameter table address
                INT     21H
                MOV     AH,66H          ; Read one sector code
                CALL    IN_OUT
                MOV     AH,PAR5
;                MOV     AH,0            ; 00000000
                                        ;       ** - Drive A
                                        ;      * - Head 0
                                        ; ***** - unusable
                CALL    IN_OUT
                MOV     AH,PAR4
;                MOV     AH,12           ; Track number
                CALL    IN_OUT
                MOV     AH,PAR3
;                MOV     AH,0            ; Head number
                CALL    IN_OUT
                MOV     AH,PAR2
;                MOV     AH,1            ; Sector number
                CALL    IN_OUT
                MOV     AH,ES:BX[3]     ; Sector size code
                CALL    IN_OUT
                MOV     AH,ES:BX[4]     ; "End of track" sector number
                CALL    IN_OUT
                MOV     AH,ES:BX[5]     ; Interdata length
                CALL    IN_OUT
                MOV     AH,ES:BX[6]     ; Data length
                CALL    IN_OUT
                CALL    WAIT_FDC_INT    ; Wait FDC interrupt
                MOV     CX,7
                CLD
                PUSH    CS
                POP     ES
                LEA     DI,STA_BUFFER
                MOV     CS:FUNCTION,FUNCTION_IN ; Sub IN_OUT set to IN
NEXT:
                CALL    IN_OUT
                STOSB
                LOOP    NEXT
                MOV     DX,3F2H ; Digital output register
                MOV     AL,PAR1
;                MOV     AL,12   ; Motor A off (see above)
                OUT     DX,AL
                RESTORE_INT     08H,OLD_08H
                MOV     AX,CS
                MOV     DS,AX
                MOV     ES,AX
                LEA     DX,BUFFER
                LEA     BX,STA_BUFFER
                CLC
                RET
LOAD_SECTOR     ENDP

BUFFER          DB      1024 DUP (?)
STA_BUFFER      DB      7 DUP (?)

Добавлено @ 10:16
Примечание - процедура отлаживалась на прямом чтении (без задания параметров) сектора 12 дороги 0 стороны 0 на устройстве А:. Тест-строки закомментированы, но оставлены для понимания.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.