Всеми любимый загрузчик

Тема в разделе "WASM.OS.DEVEL", создана пользователем TXID, 6 мар 2011.

  1. TXID

    TXID New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    6
    Код (Text):
    1. org 07C00h      ; смещение по которому программа загрузится в память 00000:07C00h
    2. jmp Begin   ; прыжок на начало кода
    3. nop
    4.  
    5. ;================== BPB sector ================
    6. db 'bootsect'
    7. SectSize dw 00200h
    8. ClustSize db 001h
    9. ResSecs dw 00001h
    10. FatCnt db 002h
    11. RootSz dw 000E0h
    12. TotSecs dw 00B40h
    13. Media db 0F0h
    14. FatSz dw 00009h
    15. TrkSecs dw 00012h
    16. HeadCnt dw 00002h
    17. HidnSec dw 00000h
    18. ;======================================================================
    19.  
    20. Begin:
    21.        
    22.         cli
    23.         xor cx, cx
    24.         mov ax,cx
    25.         mov ds,ax
    26.         mov es,ax
    27.         mov ss,ax
    28.         mov sp,07C00h
    29.         sti
    30.        
    31.         call GetCursorPos
    32.                                
    33.         mov bp, msg             ; Loading
    34.         mov cx, 12
    35.         call print
    36.        
    37.         mov dx,0x0100
    38.         call SetCursorPos
    39.        
    40.         mov bp, dev_test        ; Testing devices
    41.         mov cx,16
    42.         call print
    43.        
    44.         mov dx,0x0303
    45.         call SetCursorPos
    46.                
    47.         mov bp, HDD
    48.         mov cx,4
    49.         call print
    50.        
    51.         mov dx,0x0310
    52.         call SetCursorPos
    53.        
    54.         int 0x11                ; HDD presents ?
    55.         xor bx,bx
    56.         mov bl,1
    57.         and al,bl
    58.         cmp ax,1                ; ax - result
    59.         jne No
    60.         mov bp,true
    61.         jmp Ex
    62.     No:
    63.         mov bp,false
    64.     Ex:
    65.         mov cx,4
    66.         call print
    67.        
    68.         xor bx,bx
    69.        
    70.         mov dx,0x0403
    71.         call SetCursorPos
    72.        
    73.         mov bp, CD_ROM
    74.         mov cx,6
    75.         call print
    76.        
    77.        
    78.         mov dx,0x0410
    79.         call SetCursorPos
    80.        
    81.         xor dx,dx
    82.         ;<===== number of CD-ROM drives ==============================
    83.         int 11h
    84.         and ax,0C0h
    85.                     ;   get result
    86.         mov dx,1
    87.         cmp ax,00h
    88.         jz L_END
    89.         mov dx,2
    90.         cmp ax,40h
    91.         jz L_END
    92.         mov dx,3
    93.         cmp ax,80h     
    94.         jz L_END
    95.         mov dx,4
    96.         cmp ax,0C0h
    97.         ;---- print symbol ( 0Ah - int 0x10 )
    98.     L_END: 
    99.         add dx,30h
    100.         xor bx,bx
    101.         mov al,dl
    102.         mov cx,1
    103.         mov ah,0Ah
    104.         int 10h            ; print symbol     ( dx )
    105.        
    106.        
    107.         ;=============================================================>
    108.        
    109.         call Char_in
    110.         call Turn_Off  
    111.  
    112.        
    113.         jmp $
    114. ;===================== Подпрограммы ===================================
    115.     print:
    116.         mov bl,7
    117.         mov ax,0x1301
    118.         int 10h
    119.         ret
    120.     ;----------------------------------
    121.     GetCursorPos:
    122.         mov ah,3h
    123.         xor bh,bh
    124.         int 10h
    125.         ret
    126.     ;----------------------------------
    127.     SetCursorPos:
    128.         mov ah,2h
    129.         xor bh,bh
    130.         int 10h
    131.         ret
    132.     ;----------------------------------
    133.     Char_in:   
    134.         mov ah,10h
    135.         int 16h
    136.         ret
    137.     ;----------------------------------
    138.     Turn_Off:
    139.         mov ax,5301h
    140.         sub bx,bx
    141.         int 15h
    142.         jb stop
    143.         mov ax,530eh
    144.         sub bx,bx
    145.         int 15h
    146.         jb stop
    147.         mov ax,5307h
    148.         mov bx,0001h
    149.         mov cx,0003h
    150.         int 15h
    151.        stop:
    152.         ret
    153.     ;-----------------------------------
    154.  
    155. ;========================= Data =========================
    156.  
    157.         msg db 'Loading... ',0x00
    158.         dev_test db 'Device testing: ',0x00
    159.         HDD db 'HDD ',0x00
    160.         CD_ROM db 'CD-ROM',0x00
    161.         true db '_OK_',0x00
    162.         false db 'NULL',0x00
    163.        
    164.         DEVICE dw 0
    165.        
    166.         times(512-2-($-07C00h)) db 0                    ; заполняем остальную часть нулями
    167.         db 55h,0AAh                                                             ; 511 512 bytes
    168. ;---------------------------------------------- конец первичного загрузчика ------ 512 (200h) байт которые считает БИОС -------------
    Не работает вот это место: ;<===== number of CD-ROM drives
    Настройки VirtualBox
    IDE контроллер
    Первичный мастер IDE: Disc.vdi
    Первичный слэйв IDE (CD/DVD): SomeDisc.iso
    Вторичный мастер IDE (CD/DVD): Привод хоста 'F:'

    Картинка - результат работы
     
  2. TXID

    TXID New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    6
    mov al,32h
    out 70h
    jmp $+2
    in al,71h

    Результат нулевой. В чем здесь проблема. Это винда запрещает инструкции in out? (тестировал под виндой в emu8086)

    =================================================================

    Есть где-нибудь описание прерывания int 15?
     
  3. TXID

    TXID New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    6
    Базовый порт 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?
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    И не должно. Int 11h не возвращает информацию о сидиромах.

    20h должно быть. А как вы запускает откуда?
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    5 и 7 Ничего не значат.
    6 бит зависит от команды. Чаще всего выбирает режим адресации CHS или LBA. Если 1 то используется LBA. Если 0 то CHS.
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Конечно есть.
    - PhoenixBIOS 4.0 Programmer’s Guide
    - IBM personal system/2 BIOS Interface Technical Reference
    - Interupt
    - Help
    - и тд.
     
  7. TXID

    TXID New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    6
    из под Виндовс. emu8086 или программа в masm.

    Спасибо.

    Это я слишком обрадовался возможностям БИОС.
    Как читать сколько у меня дисководов (биты 6-7 на картинке)?
     
  8. TXID

    TXID New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2011
    Сообщения:
    6
    Разобрался! Из под Виндовс обращение к портам не работает, зато когда загружался из под VirtualBox, все обращения к портам замечательно работает, однако появился вопрос. В каком формате хранятся данные в часах?

    Ещё вопрос, как мне загрузиться с жесткого диска. На VirtualBox есть всего один диск с ms-dos. Это мне нужно прочитать первые 512 байт в память и передать туда управление? Если есть пример, напишите ссылку не статью.
     
  9. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    Ральф Браун говорит, что в 6м и 7м бите живет информация об количестве гибких, а не лазерных дисков, если нулевой бит установлен.
    То есть нужно делать
    And Al, 0C1h
    А потом сравнивать Al с 041h/081h/0C1h

    Но оптимальней сделать так:
    Код (Text):
    1. Int 11h ; 6+7 биты кол-во FDD
    2. Test Al, 001h ; Проверяем наличие FDD
    3. jNZ @@Skip ; Есть флопы
    4. Xor Al, Al ; Al=0 на всякий случай; Если флопов нет
    5. @@Skip:
    6. Shr Al, 6 ; Сдвигаем на 6 бит в право.  0+1й биты содержат кол-во флопов. 2-7й биты содержат 0.
    7. Or Al, 030h ; А теперь тут символ
    В каких часах? Какие данные?
    Если вы про RTC и про первые десять регистров, то в BCD. Если именно они вам нужны, то лучше почитать про Int 0x1A.

    http://www.wasm.ru/forum/viewforum.php?id=33
    Минимум четыре темы...