@earthen94

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

BIOS(int 0x10)を使わず描写する方法

BIOSの機能int 0x10を使わずにVGAのVRAMに直接書き込み、
任意の図形を表示する実験をしています。

動作環境はWindowsの 「Bochs x86 Emulator 3.0」です

testvga.s
org 0x7C00

start:
    cli
    ;-----------------------------------------------------
    ; 1. UGABios保護の解除
    ;-----------------------------------------------------
    mov dx, 0x3D4
    mov al, 0x11
    out dx, al
    jmp $+2
    inc dx              ; 0x3D5
    in al, dx
    and al, 0x7F        ; 
    out dx, al
    jmp $+2

    ;-----------------------------------------------------
    ; 2. VRAM0xB800より画素に白を書き込む
    ;-----------------------------------------------------
    ;mov ax, 0xB800      ;VRAM書き込み開始
    mov ax, 0xA000     
    mov es, ax
    xor di, di          
    mov cx, 65535       ; 64KB
    mov al, 0x0F        ; 白い画素
    rep stosb           ; 書き込み

    ;-----------------------------------------------------
    ; CPUを止める
    ;-----------------------------------------------------
    cli
.halt:
    hlt
    jmp .halt

times 510-($-$$) db 0
dw 0xAA55

設定は以下になります。

bochsrc.txt
megs: 32
romimage: file=$BXSHARE/BIOS-bochs-latest
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest.bin
#vgaromimage: file="$BXSHARE/VGABIOS-lgpl-latest-cirrus.bin"
#vgaromimage: file="$BXSHARE/VGABIOS-elpin-2.40"
floppya: 1_44=testvga.bin, status=inserted
boot: floppy
log: bochsout.txt
mouse: enabled=0
vga: extension=none    # 強制的にVGAにする
cpu: ips=16M           # CPU減速

# デバッグ用
display_library: win32, options="gui_debug"
magic_break: enabled=1 

コンパイル及び実行

C:\Users\nanasi\hello>nasm -f bin -o testvga.bin testvga.s
C:\Users\nanasi\hello>bochs -f bochsrc.txt

試したこと

BIOS使い以下が動くことを確認.s
org 0x7C00

start:
    mov ax, 0x0013  ; 设置模式13h
    int 0x10
    mov ax, 0xA000  ; 传统VGA显存段
    mov es, ax
    mov di, 0       ; 显存起始地址
    mov cx, 32000   ; 填充32KB显存
    mov al, 0x0F    ; 白色像素
    rep stosb
    cli
.halt:
    hlt
    jmp .halt

times 510-($-$$) db 0
dw 0xAA55

結果.jpg

以下のように図形が書けることも確認
sss.jpg

疑問
0x3D4、0x3D5の設定が悪い?
VRAMの開始位置が別のアドレスになっている?
bochsの中のbiosとの互換性が悪い?

御存じの方がおられましたらご教授下されば幸いです。

0 likes

1Answer

説明している本人はわかっていることかも知れませんが
質問を聞く側はまったくわからないのでしっかり説明しないと回答は得られません

質問を解釈してみました

AT互換機のエミュレータを使って仮想PC-ATでのプログラムを書いています
画面に四角を描くサンプルは動いたのですが
これをBIOSコールではなく直接描画させようとプログラムを書いたのですが四角は描かれません
BIOSコールでは無く直接描画する方法を教えてください

こうだとしてざっとBIOSコールを調べたのですが

AT互換機の場合まずBIOSを呼んでグラフィックモードを指定して
その後にVRAMに直接書き込んで描画します

まずこれでなぜ完成としないのかが謎です。BISOが使えない、使わない理由があるのですか?

そしてBIOSを呼ばずに画面に描画する方法なのですが
AT互換機が初期値でのVRAMマッピングがどうなっているのか不明です

そもそもAT互換機の成り立ちから
初期状態ではテキストしか表示出来ない
と推測するのですがどうでしょうか?

0Like

Your answer might help someone💌