IPL は Initial Program Loader のことで、PCが起動した際に最初に読み込まれるプログラムのことを指します。ここでは、内蔵5インチ2Dのトラック0・セクタ1に限定した話をします。
FDDブートが有効なPC-8801を起動すると、N-BASIC/N88-BASICともドライブ1・トラック0・セクタ1の256バイトを読み込み、メインメモリのC000H〜C0FFHに配置します(これは、PC-8001のRAMがC000H-FFFFHの16kBにしかなかったことに由来するようです)。セクタ2以降のプログラムは、IPLに書かれたプログラムで読み込むこととなります(ブートストラップ)。
通常、N-BASICモード用とN88-BASIC用のIPLは、異なるBASICモードでは正常に動作しません。しかし、中にはBASICモードを判別し、モード自体を切り替えてリセットしてしまうIPLがあったので、何をやっているか調べてみました。
ORG 0C000H START: 3A 03 00 LD A,(0003H) ; ROMの0003Hの値を調べる FE FF CP 0FFH CA xx xx JP Z,NMODE ; FFHだった場合(=N-BASICモード)はジャンプ ; N88→Nモード切替 N88MODE: F3 DI ; 割り込み禁止 AF XOR A D3 E6 OUT (0E6H),A ; RS-232C/VRTC/タイマ割り込み禁止 3E 04 LD A,04H D3 31 OUT (31H),A ; N-BASICモード選択 C3 00 00 JP 0000H ; N-BASIC ROMの0000H番地へ(リセット) ; 本来の処理 NMODE: :
ORG 0C000H START: 3E FF LD A,0FFH D3 71 OUT (71H),A ; メインROM選択 3A 03 00 LD A,(0002H) ; ROMの0002Hの値を調べる 3C INC A C2 xx xx JP NZ,N88MODE ; FFH以外の場合(=N88-BASICモード)はジャンプ ; N→N88モード切替 NMODE: D3 31 OUT (31H),A ; N88-BASICモード選択(A=0) DB 32 IN A,(32H) E6 FC AND 0FCH D3 32 OUT (32H),A ; 内蔵拡張ROMバンク0選択(4th ROM) 3E 04 LD A,0CH ; DIP-SW値 DELコード無視/Sパラメータ無効/テキスト80x25/N88-BASIC C3 FE 77 JP 77FEH ; N88-BASIC ROMの77FEH番地へ(初期化処理) ; 本来の処理 N88MODE: :
以下のように、N-BASICではSPを0FFFFHで初期化しているのに対し、N88-BASICでは0E1A0Hで初期化しているのを利用しています。
ORG 0000H NSTART: 0000: F3 DI 0001: 31 FF FF LD SP,0FFFFH 0004: C3 3B 00 JP 003BH : ORG 0000H N88START: 0000: F3 DI 0001: 31 E1 A0 LD SP,0E1A0H 0004: C3 E5 3B JP 3BE5H :
今だから使うPC-88へ戻る