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
疑問
0x3D4、0x3D5の設定が悪い?
VRAMの開始位置が別のアドレスになっている?
bochsの中のbiosとの互換性が悪い?
御存じの方がおられましたらご教授下されば幸いです。
0 likes