J-3100GTSX041 OS自作入門の演習 三日目〜四日目途中

J-3100GTSX041 OS自作入門の演習 三日目〜四日目途中

さて、途中になっていたOS自作入門の三日目ですが、原因が判明。前回はDay3のharib00hまででしたが、一気に03_dayの一番最後harib00jまでやっつけてしまいましょう。load errorになっていた原因ですが、私のケアレスミスでした。PC/ATとの互換性なんて関係なしでした・・・・

iplプログラムのipl10.nas中で、フロッピーのセクタを定義するところがあるのですが、
(中略)
MOV ES,AX ; ADD ES,0x020 という命令がないのでこうしている
ADD CL,1 ; CLに1を足す
CMP CL,18 ; CLと18を比較
JBE readloop ; CL <= 18 だったらreadloopへ
MOV CL,1
ADD DH,1
CMP DH,2
ここで、フロッピーのお話、1.44MByteフォーマットの場合、セクタ数は18なんだけど、1.2MByteフォーマットの場合、セクタ数は15、つまり存在しないセクタを読み込もうとして、エラー処理に飛んでいたと
error:
MOV AX,0
MOV ES,AX
MOV SI,msg

そいでもって、CMP CL,18をCMP CL,15に書き換えたところ、はいフロッピー読み込み後、黒画面!

さて張り切って、四日目行ってみよう!
04_dayのharib01hがうまく構築できると、

といった画面が表示されるはず。しかし、これはPC/ATのサンプル。ここからいよいよ互換性の問題。サンプルはディスプレイがVGAを想定していますが、J-3100GTSXはDCGAなのでここで違いが。とりあえずCGAでも使えるようなので、
○ipl10.nasを1.2MByteフロッピー対応に書き換える
○asmhead.nasを以下のように書き換えてみた、一応CGA対応のつもり
; 画面モードを設定

MOV AL,0x05 ; CGAグラフィックス、320x200x2bitカラー
MOV AH,0x00
INT 0x10
MOV BYTE [VMODE],2 ; 画面モードをメモする(C言語が参照する)
MOV WORD [SCRNX],320
MOV WORD [SCRNY],200
MOV DWORD [VRAM],0x000b8000

○bootpack.cをCGA対応に書き換えたつもり
vram = (char *) 0xb8000;
xsize = 320;
ysize = 200;

boxfill8(vram, xsize, 0x55, 0, 0, xsize – 1, ysize – 29);
boxfill8(vram, xsize, 0xAA, 0, ysize – 28, xsize – 1, ysize – 28);
boxfill8(vram, xsize, 0xFF, 0, ysize – 27, xsize – 1, ysize – 27);
boxfill8(vram, xsize, 0xAA, 0, ysize – 26, xsize – 1, ysize – 1);

boxfill8(vram, xsize, 0xFF, 3, ysize – 24, 59, ysize – 24);
boxfill8(vram, xsize, 0xFF, 2, ysize – 24, 2, ysize – 4);
boxfill8(vram, xsize, 0x55, 3, ysize – 4, 59, ysize – 4);
boxfill8(vram, xsize, 0x55, 59, ysize – 23, 59, ysize – 5);
boxfill8(vram, xsize, 0x00, 2, ysize – 3, 59, ysize – 3);
boxfill8(vram, xsize, 0x00, 60, ysize – 24, 60, ysize – 3);

boxfill8(vram, xsize, 0x55, xsize – 47, ysize – 24, xsize – 4, ysize – 24);
boxfill8(vram, xsize, 0x55, xsize – 47, ysize – 23, xsize – 47, ysize – 4);
boxfill8(vram, xsize, 0xFF, xsize – 47, ysize – 3, xsize – 4, ysize – 3);
boxfill8(vram, xsize, 0xFF, xsize – 3, ysize – 24, xsize – 3, ysize – 3);

そいでもってmakeを実施、さてどうなりますでしょうか?

ん〜座標がずれてる、残念。ちょいと解析が必要そうです。

追記:画面キタァ
bootpack.cの一部を書き換え、無理やり4ドット飛ばしになるけど画面が出ました
void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
{
int x, y;

for (y = y0; y <= y1; y++) {
for (x = x0; x <= x1; x++)
vram[y/2 * (xsize/4) + x/4] = c;
}