5 VBEMODE EQU 0x118 ; 1024 x 768 x 24bitカラー
7 MEMORYMODEL EQU 6 ; 4ならインデックスカラー 6ならダイレクトカラー
9 ; 0x100 : 640 x 400 x 8bitカラー
10 ; 0x101 : 640 x 480 x 8bitカラー
11 ; 0x103 : 800 x 600 x 8bitカラー
12 ; 0x105 : 1024 x 768 x 8bitカラー
13 ; 0x107 : 1280 x 1024 x 8bitカラー
14 ; 0x118 : 1024 x 768 x 24bitカラー
17 BOOTPACK_CODE EQU 0x00280000 ; bootpackのロード先
19 ;DSKCAC EQU 0x00100000 ; ディスクキャッシュの場所
20 ;DSKCAC0 EQU 0x00008000 ; ディスクキャッシュの場所(リアルモード)
22 SYSPAGEDIR EQU 0x00100000
25 BOOTDRIVE EQU 0x0ff0 ; ブートセクタが設定する
27 VMODE EQU 0x0ff2 ; 色数に関する情報。何ビットカラーか?
28 SCRNX EQU 0x0ff4 ; 解像度のX
29 SCRNY EQU 0x0ff6 ; 解像度のY
30 VRAM EQU 0x0ff8 ; グラフィックバッファの開始番地
32 ORG 0xc200 ; このプログラムがどこに読み込まれるのか
50 JB scrn320 ; if (AX < 0x0200) goto scrn320
62 CMP BYTE [ES:DI+0x19],BITPERPIXEL
64 CMP BYTE [ES:DI+0x1b],MEMORYMODEL
68 JZ scrn320 ; モード属性のbit7が0だったのであきらめる
72 MOV BX,VBEMODE | 0x4000
75 MOV BYTE [VMODE],BITPERPIXEL ; 画面モードをメモする(C言語が参照する)
85 MOV AL,0x13 ; VGAグラフィックス、320x200x8bitカラー
88 MOV BYTE [VMODE],8 ; 画面モードをメモする(C言語が参照する)
91 MOV DWORD [VRAM],0x000a0000
93 ; キーボードのLED状態をBIOSに教えてもらう
97 INT 0x16 ; keyboard BIOS
100 ; PICが一切の割り込みを受け付けないようにする
101 ; AT互換機の仕様では、PICの初期化をするなら、
102 ; こいつをCLI前にやっておかないと、たまにハングアップする
107 NOP ; OUT命令を連続させるとうまくいかない機種があるらしいので
110 CLI ; さらにCPUレベルでも割り込み禁止
112 ; CPUから1MB以上のメモリにアクセスできるように、A20GATEを設定
118 MOV AL,0xdf ; enable A20
122 ;[INSTRSET "i486p"] ; 486の命令まで使いたいという記述
125 ; page size = 4mb or 4kb (混在) pys addr size = 32 bit
127 LGDT [GDTR0] ; 暫定GDTを設定
129 ;or eax, 1 << 0x1f ; paging flag
130 ;AND EAX,0x7fffffff ; bit31を0にする(ページング禁止のため)
131 OR EAX,0x00000001 ; bit0を1にする(プロテクトモード移行のため)
144 or eax, ((1 << 8)|(1 << 7)|(1 << 1)|1)
145 mov [SYSPAGEDIR + 4 * ecx], eax
158 and eax, ~(1 << 5) ; physical addr ext(pae) を無効に
159 or eax, 1 << 4; enable paging size ext(pse)
167 or eax, 1 << 0x1f ; paging flag
172 MOV AX,1*8 ; 読み書き可能セグメント32bit
180 ; ついでにディスクデータも本来の位置へ転送
184 ;MOV ESI,0x7c00 ; 転送元
185 ;MOV EDI,DSKCAC ; 転送先
189 ; asmheadでしなければいけないことは全部し終わったので、
195 MOV ECX, [EBX+0x3C] ; lfanew
196 add ebx, ecx ; nt header 32
197 mov ax, [ebx + 6] ; number of section
198 mov ebp, [ebx + 0x28] ; entry point
199 add ebp, BOOTPACK_CODE
200 add ebx, 0xf8 ; section header
202 mov edi, [ebx + 0x0C] ; virtual addr
203 mov ecx, [ebx + 0x10] ; size of raw data
204 mov esi, [ebx + 0x14] ; pointer to raw data
205 add edi, BOOTPACK_CODE ; このセクションのコピー先
206 add esi, bootpack ; コピー元
213 ;rep dword movsb ; f3 a4
216 add ebx, 0x28 ; section header size
221 MOV ESP, 0x00380000 ; スタック初期値
234 ; mov [eax+0x15], ebp
235 ; mov dword [eax+0x19], 2*8
243 IN AL,0x60 ; から読み(受信バッファが悪さをしないように)
244 JNZ waitkbdout ; ANDの結果が0でなければwaitkbdoutへ
255 JNZ memcpy_loop ; 引き算した結果が0でなければmemcpyへ
258 ; memcpyはアドレスサイズプリフィクスを入れ忘れなければ、ストリング命令でも書ける
264 db 0xff,0xff,0x00,0x00,0x00,0x92,0xcf,0x00 ; 読み書き可能セグメント32bit
265 ;db 0xff,0xff,0x00,0x00,0x28,0x9a,0x4f,0x00 ; 実行可能セグメント32bit(bootpack用)
266 db 0xff,0xff,0x00,0x00,0x00,0x9a,0xcf,0x00 ; 実行可能セグメント32bit(bootpack用)