C言語からメモリ書き込み
アセンブリに write_mem8という関数を書いて Cから呼び出す形式
16bit モードではメモリインデックスは [CX], [SP]はできなかったが、32bit モードでは [ECX], [ESP] なども使えるとのこと。
EAX, ECX, EDXは自由に使える。
8086, 80186, 286 は 16bit CPU, 386, Pentium .. は 32bit CPU
A - 0xa0000 から 0xaffffに 15番目の色(白)を書くので真っ白が画面ができました。
B - 色を i & 0xff することによってシマシマの模様が出力できました。
C は char *p; と宣言して直接書くやつ
D も p = (char*) 0xa0000; と宣言して *(p + i) = i & 0x0f; と書き換えてるだけ
E は p[i] = i & 0x0f; インデックスの使い方; p[i] は配列ではない、だたの表現の違い; a[2] も 2[a]も一緒
F は 16色のpalette の定義
CLI: Clear Interrupt Flag; STI: Set Interrupt Flag
EFLAGS: (15) _ NT IOPL(2) OF DF IF TF SF ZF _ AF _ PF _ CF (0)
C言語では Flags 周りのさわれない
IN/OUTはDeviceと電気信号を受けたり、送ったりするもの
io_in8 は IN AL, DX, in16 は IN AX, DX, in32は IN EAX, DX
io_out8 は OUT DX, AL, out16 は OUT DX, AX, out32 は OUT DX, EAX
PUSHFD: PUSH EFLAGS, POPFD: POP EFLAGS; EAX に FLAGS が入る
(Push Flags DWord, Flags を Stack に押し込む
PUSHFD: MOV EAX, EFLAGS 的な
POPFD: MOV EFLAGS, EAX 的な
G はボックスを作る
320の幅指定して、XとYなめて書き出してるだけ。
H はWindowsっぽく四角いものいっぱい作ってるイメージだった
達成感はめちゃある!