1

ウェブからいくつかの情報とコードを使用してビルドするコードを取得しましたが、少なくとも 100 回試行し、mode_infoandvbe_info構造を書き直しました。正しい値を取得できません。vbe3.pdf を見ましたが、dd ?anddb ?を使用しています。で作業しないでください。いくつかのサイトでとデータ構造NASMの異なるバイト サイズを見つけたので、私が推測したものを書きましたが、システムは "set vieo mode" というメッセージを出力することさえせず、で停止します。システムがデータを使用して関数を呼び出そうとするとバグが発生します(構造が正しくない可能性があります)が、コードに何が問題なのですか?vbe_infomode_infoget_mode_infomode_info

(コードがブートローダーに収まらないので、2 番目のセクターをロードする必要がありました)

メイクファイル:

all: compile run

compile:
    nasm -f bin bootloader.asm -o bin/bootloader.bin
    nasm -f bin system.asm -o bin/system.bin
    cat bin/bootloader.bin bin/system.bin > img/system.img

run:
    qemu-system-i386 -fda img/system.img

ブートローダー:

[BITS 16]
[ORG 0x7C00]

setup_stack:

    xor ax, ax;                     // ax = 0
    mov ds, ax;                     // ds = 0

    mov es, ax;                     // es = ds
    mov bx, 0x8000;                 // stack segment can be any usable memory

    mov ss, bx;                     // stack start 0x80000
    mov sp, ax;                     // stack final 0x8FFFF

    cld;                            // clear direction flag

read_kernel:

    pushf;                          // save values
    stc;                            // set carry flag

    mov ah, 00;                     // reset disk
    int 13h;                        // disk interrupt

    mov ax, 0x0000;                 // register ax [0000]:1000
    mov bx, 0x1000;                 // register bx  0000:[1000]

    mov ah, 0x2;                    // read sector instruction
    mov al, 0x3;                    // sectors to read
    mov ch, 0x0;                    // cylinder
    mov cl, 0x2;                    // local to write
    mov dh, 0x0;                    // head

    int 0x13;                       // call the disk interupter

    popf;                           // restore values

    jmp 0x0000:0x1000;              // Jump to kernel

    cli;                            // clear interrupt flag
    hlt;                            // halt

TIMES 510 - ($-$$) DB 0;            // complete the bootsector with zeros
DW 0xAA55;                          // end of bootsector

システム:

[org 0x1000]
[bits 16]

jmp main;

vbe_info:

    .signature db "VBE2";           // must be "VESA" to indicate valid VBE support
    .version resw 1;                // VBE version; high byte is major version, low byte is minor version
    .oem resd 1;                    // segment:offset pointer to OEM
    .capabilities resd 1;           // bitfield that describes card capabilities
    .video_modes resd 1;            // segment:offset pointer to list of supported video modes
    .video_memory resw 1;           // amount of video memory in 64KB blocks
    .software_rev resw 1;           // software revision
    .vendor resd 1;                 // segment:offset to card vendor string
    .product_name resd 1;           // segment:offset to card model name
    .product_rev resd 1;            // segment:offset pointer to product revision
    .reserved resb 222;             // reserved for future expansion
    .oem_data resb 256;             // OEM BIOSes store their strings in this area

mode_info:

    .attributes resw 1;             // deprecated, only bit 7 should be of interest to you, and it indicates the mode supports a linear frame buffer.
    .window_a resb 1;               // deprecated
    .window_b resb 1;               // deprecated
    .granularity resw 1;            // deprecated; used while calculating bank numbers
    .window_size resw 1;
    .segment_a resw 1;
    .segment_b resw 1;
    .win_func_ptr resd 1;           // deprecated; used to switch banks from protected mode without returning to real mode
    .pitch resw 1;                  // number of bytes per horizontal line
    .width resw 1;                  // width in pixels
    .height resw 1;                 // height in pixels
    .w_char resb 1;                 // unused...
    .y_char resb 1;                 // ...
    .planes resb 1;
    .bpp resb 1;                    // bits per pixel in this mode
    .banks resb 1;                  // deprecated; total number of banks in this mode
    .memory_model resb 1;
    .bank_size resb 1;              // deprecated; size of a bank, almost always 64 KB but may be 16 KB...
    .image_pages resb 1;
    .reserved0 resb 1;

    .red_mask resb 1;
    .red_position resb 1;
    .green_mask resb 1;
    .green_position resb 1;
    .blue_mask resb 1;
    .blue_position resb 1;
    .reserved_mask resb 1;
    .reserved_position resb 1;
    .direct_color_attributes resb 1;

    .framebuffer resd 1;            // physical address of the linear frame buffer; write here to draw to the screen
    .off_screen_mem_off resd 1;
    .off_screen_mem_size resw 1;    // size of memory in the framebuffer but not being displayed on the screen
    .reserved1 resb 206;

main:

vbe_get_info:

    mov ah, 4Fh;                    // super VGA support
    mov al, 00h;                    // return Super VGA information
    mov di, vbe_info;               // pointer to buffer

    int 0x10;                       // video interrupt

    cmp ax, 0x4F;                   // BIOS support VBE?
    jne error;                      // if doesn't jump to error

get_mode_info:

    ;mov ax, 4F01h is the same
    mov ah, 4Fh;                    // return mode information
    mov al, 01h
    mov cx, [vbe_info.video_modes]; // first mode
    mov di, mode_info;              // pointer to buffer

    int 0x10;                       // video interrupt

    cmp ax, 0x4F;                   // check vbe error
    jne error;                      // jump to error

set_mode:

    mov ah, 0
    mov ax, 0x4F02
    mov bx, [vbe_info.video_modes]; first mode

    int 0x10

draw:

    mov edi, [mode_info.framebuffer];   framebuffer
    add edi, 0;                         pixel_offset = y * pitch + ( x * ( bpp/8 )) + framebuffer;
    mov al,0x0F;                        the color of the pixel
    mov [edi], al;                      mov pixel derect to memory

    jmp $

error:

    mov ah, 0x00;                   // restart instruction
    int 19h;                        // restart the system

    ret
4

1 に答える 1