Windows上でJWASM(フリーのMASM6互換アセンブラ)と98エミュを使ってのプログラム作成に関するエトセトラ。また、PC-98プログラミング関係の書籍紹介とか自作ソフトの進捗とかも。

エミュを使ってIPLプログラミングもどき 

今回はセクタ2以降を読み取ってそこのアドレスに飛ぶテストです。
自由にセクタを読み取って指定のメモリに書き込んだりそこに飛んだりできれば、DOSとかを気にせず自由にメモリを使ってプログラムを動かすことが可能となるはずです、理論上。

ということで今回のコードは下の通り。

.model tiny
.386

CODE SEGMENT
assume DS:CODE,CS:CODE,ES:CODE,SS:CODE

mov ax,cs ; レジスタ初期化
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ax,60
mov ss,ax
mov eax,0FFh
mov sp,ax

;セクタ4を読み込み(SEG:70,ofs:0から)
push bp
mov ax,70h
mov es,ax
mov bp,0
mov ah,01110110b
mov al,90h
mov ch,03h
mov cl,0
mov dh,0
mov dl,04h
mov bx,400h

int 1bh
pop bp

mov si,offset AD
jmp dword ptr [si] ;SEG:70hからプログラムを読み込ませる
AD word 0
SE word 70h

ORG 1024*3
MAIN:
mov ax,0A000h
mov es,ax
mov edx,23
mov edi,2000h
add edi,80
mov eax,0F1h

@@: mov ecx,30
push edi
rep STOSW
pop edi
add edi,160
dec edx
jnz @b

mov edx,23
mov edi,80
mov eax,087h

@@: mov ecx,30
push edi
rep STOSW
pop edi
add edi,160
dec edx
jnz @b

@@:
jmp @b

CODE ENDS
END



メモリの6FFh以前をスタック領域に、700h以降をプログラムとかの実体の領域として使う設定(というか妄想?)です。
IPL自体はDISK BIOSで700hにセクタ4を読み込んでjmpするだけのシンプルなコードです。
DISK BIOSはMS-DOSじゃないので起動時にメモリ上に組み込まれ、結果こういう手抜きが可能です。
なお、実機BIOSなしでも互換のものが同等の働きをするので動きます。
セグメントの初期化はテキトーですので、適切なものに書き換えてください。
jmpの後は前回のものを386以降用っぽくしてそのまま流用しているのでセグメントの再設定はしてませんが、本来は必要だと思います。

こんなのをもっと本格的にすれば、きっとそれっぽいIPLになる、んじゃないかなと。
リアルモードにしてから読み込んでjmp、とかで…きっと、おそらく、多分。

Menu

管理人/副管理人のみ編集できます