私は、単純なOS、ブートセクターのみ、および割り込み付きの16ビットリアルモードを設計しようとしています。私はついに仮想ボックスでテストしたOS/ブートローダーを作成することができ、それは機能しました。
次に、イメージをCDに書き込み、Pentium 4、BIOSリビジョンA05、および1GBのRAMを搭載した古いデスクトップで起動しました。これは完全に機能しました。シンプルなOSで、上部に「ヘッダー」が印刷されます。画面、それはあなたがカーソルをナビゲートするために登録されたいくつかのキーで、あなたが画面にタイプすることを可能にします。
次に、ディスクをi5プロセッサと2.6 GBのRAM、およびA05 BIOSリビジョンを備えた1年前のラップトップに接続すると、カーソルがランダムに移動し、ランダムな文字を高速で印刷し、最終的にanscii文字で停止するようです。 235(拡張文字テーブルの一部)。この時点でキーボードは正常に機能し、カーソルを移動するように指定されたキーは正常に機能します。ヘッダーだけです。これは、私がテストし、コンパイルし、書き込み、CDに書き込んだコンピューターです。(Linux Mint 12 OSを使用しました)
必要だと思ったすべての「フープ」を飛び越えました。ElToritoの「エミュレーションなし」のブート標準、ブート署名、512バイトに準拠し、正しいセクターに書き込まれるISOイメージを作成しました。
それは私のコードに問題がありますか、私は何かをしませんでしたか、それともこれは正常ですか?
これが私のコードです(NASM x86構文):
;**************************
; Note OS, Experimental OS
;**************************
[org 0x7C00]
[bits 16]
start:
jmp loader ;jump to the actual start of bootloader
times 8 - ($ - $$) db 0 ;pad eight bytes
;*********************
;El Torito Boot Info Table
;*********************
;in nasm, I couldn't figure out how to reserve bytes, in the middle of .text
;so I zeroed it out.
times 56 db 0
loader:
call cls ;clear the screen
mov si, head1 ;setup page headers
call printf
mov si, head2
call printf
jmp note ;start note program
cls:
mov ah, 0x0F ;get current video mode
mov al, 0x00 ;reset register
int 0x10 ;get video mode
mov ah, 0x00 ;set video mode
int 0x10 ;reset screen
mov ah, 0x02 ;set cursor pos
mov bh, 0x00 ;page 00
mov dh, 0x00 ;row 00
mov dl, 0x00 ;col. 00
int 0x10 ;set pos
ret
printf:
.loop ;our function that loops
mov al, [si] ;load byte
cmp al, 0 ;if null, end
je .end
mov ah, 0x0E ;function 0E
mov bh, 0x00 ;page 0x00
mov bl, 0x0F ;white text on black background
int 0x10 ;print
inc si ;increment source index
jmp .loop ;repeat
.end
ret ;return
;*******************
; Note 'Program'
;*******************
note:
mov ah, 0x00 ;function 00
int 0x16 ;get character
cmp al, '`' ;go up line?
je setcur
cmp al, 0x0D ;enter?
je setent
cmp al, '+' ;plus?
je setplu
cmp al, '-' ;minus?
je setminu
cmp al, '\' ;reset?
je loader
cmp al, 0x08 ;backspace?
je setback
mov ah, 0x0E ;function 0E
mov bh, 0x00 ;page 00
mov bl, 0x0F ;white on black
int 0x10 ;print
jmp note ;repeat
setcur:
mov ah, 0x03 ;get cur pos
mov bh, 0x00 ;page 00
int 0x10 ;get pos
cmp dh, 0x00 ;are we at top of page?
je .begin ;just reset cursor if so
sub dh, 0x01 ;go up one line
.begin
mov dl, 0x00 ;set to beginning of line
mov ah, 0x02 ;set cursor function
mov bh, 0x00 ;page 00
int 0x10 ;set position
jmp note ;read next character
setent:
mov ah, 0x0E ;write character
mov al, 0x0A ;begin line
mov bh, 0x00 ;page 00
mov bl, 0x0F ;white on black
int 0x10 ;print
setplu:
mov ah, 0x03 ;get cursor pos
mov bh, 0x00 ;page 0x00
int 0x10 ;get pos
mov ah, 0x02 ;set cursor pos
add dl, 0x01 ;add one to column
int 0x10 ;set new pos
jmp note ;get next char
setminu:
mov ah, 0x03 ;get cursor pos
mov bh, 0x00 ;page 00
int 0x10 ;get pos
mov ah, 0x02 ;set cursor pos
sub dl, 0x01 ;sub one to column
int 0x10 ;set new pos
jmp note ;get next char
setback:
mov ah, 0x03 ;get cursor pos
mov bh, 0x00 ;page 00
int 0x10 ;get pos
mov ah, 0x02 ;set cursor pos
sub dl, 0x01 ;sub one column
int 0x10 ;set pos
mov ah, 0x0E ;write char
mov al, ' ' ;write space
mov bh, 0x00 ;page 00
mov bl, 0x0F ;white on black
int 0x10
mov ah, 0x02 ;reset cur pos
int 0x10 ;reset
jmp note
;******************
; Our Page Headers
;******************
head1: db '- Note OS Version 1.2-', 0x0A, 0x0D, 0
head2: db '=======================', 0x0A, 0x0D, 0x0A, 0x0D, 0
times 510 - ($ - $$) db 0
dw 0xAA55
参考のために(私が参照したもの):
Ansciiテーブル:http ://www.asciitable.com/
El-Torito情報:http ://wiki.osdev.org/El-Torito
編集:これが私がプログラムしたキーとそれらが何をするかです:
enter-正常に動作するようになりましたbackspace-正常に動作するようになりましたplus-カーソルを右に移動しますマイナス-カーソルを左に移動します`-カーソルを前の行の先頭に移動します\-「ソフトリブート」はローダーの先頭にほぼジャンプします