J-3100GTSX041 OS自作入門の演習 十一日目〜十六日目

J-3100GTSX041 OS自作入門の演習 十一日目〜十六日目

はい、J-3100GTSXでOS自作入門するの十一日目〜十六日目です。マウス問題はありますが、ウィンドウ表示が見たいので、かなりすっ飛ばして十六日目までやってみました。
十一日目 マウス制御の続き、ウィンドウ表示
十二日目 タイマを使う、割り込み処理
十三日目 文字表示を簡単に、FIFO見直し
十四日目 キー入力、高解像度化
十五日目 簡単なマルチタスク
十六日目 タスク管理自動化、ウィンドウを増やす

十一日目のマウス制御の確認はしない。十四日目の高解像度化についてはJ-3100のグラフィック制御が微妙なので、320×200のまま

では、やっていきましょ
基本は、十日目までの変更に、bootpack.cのウィンドウ作成部分、ウィンドウ描画用のsheet.cの修正で済む感じ

bootpack.cのmake_window8関数内のバッファ計算と色情報を修正
char c, tc, tbc;
if (act != 0) {
tc = 0xFF;
tbc = 0x00;
} else {
tc = 0xAA;
tbc = 0x55;
}
boxfill8(buf, xsize, 0xAA, 0, 0, xsize – 1, 0 );
boxfill8(buf, xsize, 0xFF, 1, 1, xsize – 2, 1 );
boxfill8(buf, xsize, 0xAA, 0, 0, 0, ysize – 1);
boxfill8(buf, xsize, 0xFF, 1, 1, 1, ysize – 2);
boxfill8(buf, xsize, 0x55, xsize – 2, 1, xsize – 2, ysize – 2);
boxfill8(buf, xsize, 0x00, xsize – 1, 0, xsize – 1, ysize – 1);
boxfill8(buf, xsize, 0xAA, 2, 2, xsize – 3, ysize – 3);
boxfill8(buf, xsize, tbc, 3, 3, xsize – 4, 20 );
boxfill8(buf, xsize, 0x55, 1, ysize – 2, xsize – 2, ysize – 2);
boxfill8(buf, xsize, 0x00, 0, ysize – 1, xsize – 1, ysize – 1);
putfonts8_asc(buf, xsize, 24, 4, tc, title);
for (y = 0; y < 14; y++) {
for (x = 0; x < 16; x++) { c = closebtn[y][x]; if (c == ‘@’) { c = 0x00; } else if (c == ‘$’) { c = 0x40; } else if (c == ‘Q’) { c = 0x80; } else { c = 0xC0; } /* buf[(5 + y)/2 * xsize/4 + (xsize – 21 + x)/4] = c; */ buf[(5 + y)/2 * xsize/4 + (xsize – 21 + x)/4] |= c >> (((xsize – 21 + x)%4)*2);

bootpack.cのmake_textbox8関数内の色情報を修正
boxfill8(sht->buf, sht->bxsize, 0x55, x0 – 2, y0 – 3, x1 + 1, y0 – 3);
boxfill8(sht->buf, sht->bxsize, 0x55, x0 – 3, y0 – 3, x0 – 3, y1 + 1);
boxfill8(sht->buf, sht->bxsize, 0xFF, x0 – 3, y1 + 2, x1 + 1, y1 + 2);
boxfill8(sht->buf, sht->bxsize, 0xFF, x1 + 2, y0 – 3, x1 + 2, y1 + 2);
boxfill8(sht->buf, sht->bxsize, 0x00, x0 – 1, y0 – 2, x1 + 0, y0 – 2);
boxfill8(sht->buf, sht->bxsize, 0x00, x0 – 2, y0 – 2, x0 – 2, y1 + 0);
boxfill8(sht->buf, sht->bxsize, 0xAA, x0 – 2, y1 + 1, x1 + 0, y1 + 1);
boxfill8(sht->buf, sht->bxsize, 0xAA, x1 + 1, y0 – 2, x1 + 1, y1 + 1);
boxfill8(sht->buf, sht->bxsize, c, x0 – 1, y0 – 1, x1 + 0, y1 + 0);

sheet.cのsheet_refreshmap関数内バッファ計算を修正
/* if (buf[by * sht->bxsize + bx] != sht->col_inv) { */
if (buf[by/2 * (sht->bxsize)/4 + bx/4] != sht->col_inv) {

sheet.cのsheet_refreshsub関数内バッファ計算を修正
/* vram[vy * ctl->xsize + vx] = buf[by * sht->bxsize + bx]; */
vram[vy/2 * (ctl->xsize)/4 + vx/4] = buf[by/2 * (sht->bxsize)/4 + bx/4];

asmhead.nasの解像度判別の部分をがっつり削って
; 画面モードを設定

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

ちなみに、十六日目を改造せずにmakeしたものを、某xxwareで動かしてみると

そりゃ画面でかいですね。これをDosBoxで動かすと

んで、J-3100用に改造したのを動かすと

そいでもって実機動作確認、今回流石に画面が出るまで30秒ぐらいかかる

さぁて、シリアルマウスが届きました、八日目まで戻ってなんとかマウスが動くようにしたい