Советчик
   
Профиль
Группа: Модератор
Сообщений: 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 на устройстве А:. Тест-строки закомментированы, но оставлены для понимания.
--------------------
О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.
|