******** CP/Mエミュレータ PC−1600K ********  PC−1600K用のCP/Mです。  S1:に16KB以上のモジュールを、S2:に32KB以上のモジュールをセットします。 これらのモジュールは、プログラムモジュールかファイルモジュールとして 初期化しておかなくてはなりません。  CALL &D000で実行します。 1.メモリマップ (1) 1600K IOCS/割り込み実行時 (2) CP/Mプログラム実行時 0000 +--------+ 0000 +--------------+ | | | SCRATCH AREA | | ROM | 0100 +--------------+ | | -----> (D) BANK#1 | | | | | CP/M | 3FFF +--------+ 3FFF | FREE AREA | 4000 +--------+ 4000 | | | | | | | ROM | -----> (C) BANK#1 | | | | | | | | | | 7FFF +--------+ 7FFF | | 8000 +--------+--------+ +--------+--------+ 8000 | | | S1: | | | S2: | | | | | RAM | なし | | RAM | | | | | 16KB | | | 32KB | | (A) | | | (A) | (B) | | (C) | (D) |---> | | | | | | | | | | BFFF +--------+--------+ +--------+--------+ BFFF | | C000 +--------+ CC00 +--------------+ | | | BDOS/BIOS/CCP| | RAM | -----> BANK #0 | AREA | | | +--------------+ | | | SYSTEM WORK | FFFF +--------+ FFFF +--------------+ 2.TPAについて  0100Hから7F00Hまでの約32KBが使用可能である。  8000HからBFFFHまでの16KBはラムファイルS1:に使われる。  C000HからはBDOSとBIOSとCCPのエミュレータに使用する。 3.CCPについて(em−shについて)  普通はTPAとBDOSの間に配置されて、DDTなどでこのエリアは破壊されて 使用されたりするのだが、今回はBIOSの後方に配置して絶対に破壊されないもの とする。機能を縮小/拡張しようかと考えている。(例えばCOPYコマンドとかを 拡張したいと思っている)  現在のVerでは、BASIC,SWITCH,TERM,EXEC,HEXLOADの5つしかコマンドがありま せん。  BASIC ... BASICに戻る  SWITCH ... 外部キーボード化  TERM ... 簡易ターミナルソフト  EXEC ... 0100h番地から実行  HEXLOAD ... RS-232CからHEXファイルを入力する 4.BDOSコールについて  基本的にIOCSのファイル関係のIOCSで処理して、ディスクの読み書きには BIOSを呼ばないでエミュレートするだけである。ゆえにディスクのフォーマット は従来のディスクのFATやディレクトリ構造のままで、そのまま使用できる。  あと、BDOS 10Hの文字入力を拡張して、ヒストリが使えるようになっている。 5.BIOSコールについて  以下のものをサポートする(IOBYTE処理はCON:についてのみ) +00h:COLD_BOOT +03h:WARM_BOOT +06h:CONSOLE_STATUS +09h:CONSOLE_INPUT +0Ch:CONSOLE_OUTPUT +0Fh:LIST(PRINTER)_OUTPUT +12h:PUNCH(RS-232C)_OUTPUT +15h:READER(RS-232C)_INPUT 6.ディスク装置について  デフォルトでは、   ディスク装置A:はラムファイルS1:に割り当てられる。   ディスク装置B:は2.5”ディスクX:に割り当てられる。  というふうにするつもり。  (S1を使わなければ、フリーエリアとしても使える。) 7.論理デバイスと物理デバイスについて  論理デバイスは、   CON:,RDR:,PUN:,LST:の4つ。  それに対して物理デバイスは、   LCDディスプレイ/キーボード装置,RS−232C,プリンタ   に割り当てられる。   (PC−1600Kには通信ポートが2つあるがRS−232Cのみ使用する) 8.コンソール装置について  コンソール出力はエスケープシーケンスをサポートしないので、エスケープコード がきても無視する。ただし、IOBYTEでRS−232Cに割り当てた場合は相手 先によってはスクリーンエディタさえもまともに動作させることができる。 9. サンプルプログラム1  以下のようなプログラムを試してみました。 ; ; CP/Mのプログラムのテスト ; org 100h ; start: ld de,msg ld c,9 call 5 ret ; msg: db 'This is test.',13,010,'$' ; end :100100001109010E09CD0500C9546869732069738E :0901100020746573742E0D0A249D :00000001FF  HEXLOADでRS-232C経由で0100hからロードし、EXECで実行します。 すると、"This is test."と画面に表示されます。