Проверьте, доступен ли дискета на языке ассемблера или нет. Загрузчик

У меня есть вопрос о том, как проверить, доступен ли дисковод гибких дисков или нет, используя язык ассемблера? Я проверил, достаточно ли оперативной памяти. Но я понятия не имею, как проверить, доступен ли дисковод. Я пробовал это: CMP AH, 0 JNE disk_error, но когда я ставлю это после проверки на RAM, ничего не происходит. Когда я помещаю в continueToLoad: CMP AX,0 JNE fatal_disk_error, он работает нормально, но после загрузки отображается сообщение об ошибке. Loader Мне нужно, чтобы сообщение об ошибке появлялось перед строкой загрузки. ошибка

главный:

MOV DS,AX 
PUSH CS
POP DS
MOV AH,0x00 
MOV AL,0x03
INT 0x10    
CALL ClearScreen

MOV BL,1010b        
MOV BP,StrLoadKernel    
MOV CX,length   
MOV DH,13       
MOV DL,30           
CALL PrintString

MOV BL,1010b        
MOV BP,StrReboot    
MOV CX,length2      
MOV DH,14       
MOV DL,30           
CALL PrintString

readKeys:

CALL PressKey
CMP AL,00011011b ; ESC binary code
JE Reboot
CMP AL,00001101b ; ENTER binary code

CALL ClearScreen

MOV BL,1010b        
MOV BP,StrLoading   
MOV CX,length4      
MOV DH,14       
MOV DL,35           
CALL PrintString    

JE LoadKernel
loop readKeys

jmp $

LoadKernel:

;CHECK IF RAM MEMORY > 64MB
MOV AH,0x88
INT 0x15            
CLC  
CMP AX,0xFA00  
MOV BL,0011b                         
JNC printLoader
 CALL ClearScreen 
    MOV BL,1100b        
    MOV BP,StrErrorRAM  
    MOV CX,length3      
    MOV DH,13       
    MOV DL,25               
    CALL PrintString  

    MOV BL,1100b        
    MOV BP,press_key    
    MOV CX,length6      
    MOV DH,14       
    MOV DL,25                  
    CALL PrintString

    CALL PressKey
    CALL Reboot     
  JMP readKeys 
JMP printLoader 

changeToBlue:

MOV BL, 1001b

JMP printLoader

changeToGreen:

MOV BL, 1010b

JMP printLoader

changeToRed:

MOV BL, 0100b

JMP printLoader

continueToLoad:

    MOV AX,0
    MOV DL,0
    INT 0x13         

;load kernel
    MOV AX,kernel 
    MOV ES,AX
    MOV BX,0        

    MOV AH,02h 
    MOV AL,01h 
    MOV CH,0h  
    MOV CL,02  
    MOV DH,0   
    MOV DL,0   
    INT 0x13   

    CMP AH, 0                     
    jne fatal_disk_error

ядро jmp: 0

RET

CALL printLoader

printLoader:

    MOV BP,symbol       ; stringul care dorim sa il afisam
    MOV CX,symbolLength ; marimea stringului
    MOV DH,16       ; randul (x)
    MOV DL,[count]      ; coloana (y)

    CALL PrintString

    INC DL
    INC DL
    INC DL
    MOV [count],DL

    CALL wait2sec

    MOV AL,[pas]
    INC AL
    MOV [pas],AL

    CMP AL,3
    JE changeToBlue

    CMP AL,6
    JE changeToGreen

    CMP AL,9
    JE changeToRed 

    CMP AL,10
    JE continueToLoad

loop printLoader

Чистый экран:

MOV AX,0600h 
MOV CX,0000h
MOV BH,0Ah
MOV DX,1850h
int 0x10    

RET

PressKey:

;read a key
MOV AH,0
INT 0x16

RET

PrintString:

MOV AH, 0x13
MOV AL,0
MOV BH,0    
INT 0x10
; hide cursor
mov AH,0x01
MOV CX,2607h
INT 0x10

RET

Перезагружать:

db 0x0ea
dw 0x0000
dw 0xffff

RET

wait2sec:

MOV AH,0x86
MOV CX,0008h
MOV DX,6480h
int 0x15

RET

fatal_disk_error:

CALL ClearScreen 
MOV AX,0  
MOV ES,AX 

MOV BL,1100b        
MOV BP,disk_error   
MOV CX,length5      
MOV DH,16       
MOV DL,30
call PrintString
CALL wait2sec
CALL PressKey
CMP AL,00011011b ; ESC binary code
jmp Reboot

RET

StrLoadKernel: db "Нажмите ENTER, чтобы загрузить KERNEL "

длина равно $ -StrLoadKernel

StrReboot: db "Нажмите ESC для перезагрузки"

length2 equ $ -StrReboot

StrErrorRAM: db "Загрузка отменена! ОШИБКА: RAM < 64 МБ."

length3 equ $ -StrErrorRAM

StrLoading: дБ "Загрузка..."

length4 equ $ -StrLoading

disk_error: db "Ошибка дискеты! Нажмите любую клавишу..."

length5 equ $ -disk_error

press_key: db "Нажмите любую клавишу, чтобы перезагрузить!"

length6 equ $ -press_key

ядро равно 1000 ч

символ: дБ 219

SymbolLength equ $-символ

количество дБ 25

па дБ 0

510 - ($ - $$) дБ 0

DW 0xAA55

3 ответа

Чтобы узнать, есть ли у вас дисковод, используйте функцию BIOS GetEquipmentStatus.

int 11h

Возвращает значение в регистре AX. Биты 6 и 7 сообщают вам, сколько дисководов гибких дисков подключено к системе.

00 = 1 drive
01 = 2 drives
10 = 3 drives
11 = 4 drives

Используйте биты 6 и 7, только если бит 0 включен

Другим способом было бы проверить, сможете ли вы успешно получить статус дисковода гибких дисков через функцию BIOS 01h int 13h,

mov dl, 0
mov ah, 01h
int 13h
cmp ah, 0
jne disk_error

Обратитесь к полному списку DiskControllerStatusBits, потому что просто cmp ah, 0 может оказаться немного упрощенным.

Вам не нужно знать, если дисковод гибких дисков присутствует.

Вам нужно только знать, ведет ли себя устройство 0 (или, может быть, устройство, которое BIOS сказал вам, что вы загрузились), как дисковод гибких дисков; и если устройство (например) USB-флэш или CD/DVD, эмулирующее дисковод гибких дисков, то это нормально. Для этого используйте int 0x13, ah = 0x08, Get Drive Parameters и проверьте результаты.

Если вам действительно нужно знать, присутствует ли дисковод гибких дисков; тогда это целый мир боли. BIOS может быть неправильно настроен (и его CMOS неверен), может быть дисковод USB, о котором BIOS не знает и / или даже не поддерживает, и т. Д.

В дополнение к функции BIOS GetEquipmentStatus, упомянутой @user3144770, есть еще одна функция BIOS GetDiskType, которую вы можете использовать.

mov dl, 0
mov ah, 15h
int 13h

Если установлен флаг переноса, произошла ошибка. (Состояние в AH) Если флаг переноса снят, вы получите значение в AH, которое информирует вас о диске, указанном в аргументе DL.

AH=0 no drive
AH=1 floppy without change-line support
AH=2 floppy with change-line support
AH=3 hard disk
Другие вопросы по тегам