Code (Text): org 07C00h ; смещение по которому программа загрузится в память 00000:07C00h jmp Begin ; прыжок на начало кода nop ;================== BPB sector ================ db 'bootsect' SectSize dw 00200h ClustSize db 001h ResSecs dw 00001h FatCnt db 002h RootSz dw 000E0h TotSecs dw 00B40h Media db 0F0h FatSz dw 00009h TrkSecs dw 00012h HeadCnt dw 00002h HidnSec dw 00000h ;====================================================================== Begin: cli xor cx, cx mov ax,cx mov ds,ax mov es,ax mov ss,ax mov sp,07C00h sti call GetCursorPos mov bp, msg ; Loading mov cx, 12 call print mov dx,0x0100 call SetCursorPos mov bp, dev_test ; Testing devices mov cx,16 call print mov dx,0x0303 call SetCursorPos mov bp, HDD mov cx,4 call print mov dx,0x0310 call SetCursorPos int 0x11 ; HDD presents ? xor bx,bx mov bl,1 and al,bl cmp ax,1 ; ax - result jne No mov bp,true jmp Ex No: mov bp,false Ex: mov cx,4 call print xor bx,bx mov dx,0x0403 call SetCursorPos mov bp, CD_ROM mov cx,6 call print mov dx,0x0410 call SetCursorPos xor dx,dx ;<===== number of CD-ROM drives ============================== int 11h and ax,0C0h ; get result mov dx,1 cmp ax,00h jz L_END mov dx,2 cmp ax,40h jz L_END mov dx,3 cmp ax,80h jz L_END mov dx,4 cmp ax,0C0h ;---- print symbol ( 0Ah - int 0x10 ) L_END: add dx,30h xor bx,bx mov al,dl mov cx,1 mov ah,0Ah int 10h ; print symbol ( dx ) ;=============================================================> call Char_in call Turn_Off jmp $ ;===================== Подпрограммы =================================== print: mov bl,7 mov ax,0x1301 int 10h ret ;---------------------------------- GetCursorPos: mov ah,3h xor bh,bh int 10h ret ;---------------------------------- SetCursorPos: mov ah,2h xor bh,bh int 10h ret ;---------------------------------- Char_in: mov ah,10h int 16h ret ;---------------------------------- Turn_Off: mov ax,5301h sub bx,bx int 15h jb stop mov ax,530eh sub bx,bx int 15h jb stop mov ax,5307h mov bx,0001h mov cx,0003h int 15h stop: ret ;----------------------------------- ;========================= Data ========================= msg db 'Loading... ',0x00 dev_test db 'Device testing: ',0x00 HDD db 'HDD ',0x00 CD_ROM db 'CD-ROM',0x00 true db '_OK_',0x00 false db 'NULL',0x00 DEVICE dw 0 times(512-2-($-07C00h)) db 0 ; заполняем остальную часть нулями db 55h,0AAh ; 511 512 bytes ;---------------------------------------------- конец первичного загрузчика ------ 512 (200h) байт которые считает БИОС ------------- Не работает вот это место: ;<===== number of CD-ROM drives Настройки VirtualBox IDE контроллер Первичный мастер IDE: Disc.vdi Первичный слэйв IDE (CD/DVD): SomeDisc.iso Вторичный мастер IDE (CD/DVD): Привод хоста 'F:' Картинка - результат работы
mov al,32h out 70h jmp $+2 in al,71h Результат нулевой. В чем здесь проблема. Это винда запрещает инструкции in out? (тестировал под виндой в emu8086) ================================================================= Есть где-нибудь описание прерывания int 15?
Базовый порт 1F6h. Это есть везде: ; Порт 1F6h. ; Чтение/запись номера устройства и головки для последующей ; операции. ; ; bit 7 = 1 ; bit 6 = 0 ; bit 5 = 1 ; bit 4 = 0 выбор диска 0 ; = 1 выбор диска 1 ; bit 3-0 бит выбора головки что значат биты 5 6 7 ? =================================================== Как из загруженной в память программы, перейти к загрузке с жесткого диска? Есть что-то конкретное? Как передать управление? int 13?
И не должно. Int 11h не возвращает информацию о сидиромах. 20h должно быть. А как вы запускает откуда?
5 и 7 Ничего не значат. 6 бит зависит от команды. Чаще всего выбирает режим адресации CHS или LBA. Если 1 то используется LBA. Если 0 то CHS.
Конечно есть. - PhoenixBIOS 4.0 Programmer’s Guide - IBM personal system/2 BIOS Interface Technical Reference - Interupt - Help - и тд.
из под Виндовс. emu8086 или программа в masm. Спасибо. Это я слишком обрадовался возможностям БИОС. Как читать сколько у меня дисководов (биты 6-7 на картинке)?
Разобрался! Из под Виндовс обращение к портам не работает, зато когда загружался из под VirtualBox, все обращения к портам замечательно работает, однако появился вопрос. В каком формате хранятся данные в часах? Ещё вопрос, как мне загрузиться с жесткого диска. На VirtualBox есть всего один диск с ms-dos. Это мне нужно прочитать первые 512 байт в память и передать туда управление? Если есть пример, напишите ссылку не статью.
Ральф Браун говорит, что в 6м и 7м бите живет информация об количестве гибких, а не лазерных дисков, если нулевой бит установлен. То есть нужно делать And Al, 0C1h А потом сравнивать Al с 041h/081h/0C1h Но оптимальней сделать так: Code (Text): Int 11h ; 6+7 биты кол-во FDD Test Al, 001h ; Проверяем наличие FDD jNZ @@Skip ; Есть флопы Xor Al, Al ; Al=0 на всякий случай; Если флопов нет @@Skip: Shr Al, 6 ; Сдвигаем на 6 бит в право. 0+1й биты содержат кол-во флопов. 2-7й биты содержат 0. Or Al, 030h ; А теперь тут символ В каких часах? Какие данные? Если вы про RTC и про первые десять регистров, то в BCD. Если именно они вам нужны, то лучше почитать про Int 0x1A. http://www.wasm.ru/forum/viewforum.php?id=33 Минимум четыре темы...