2012.6.29
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第161回]


●ROMとRAMの切り換え

前回は同じアドレス(0000〜7FFF)に配置したROMとRAMとを切り換えてアクセスする仕組みについて説明をしました。
I/Oアドレス9CHに00(ビット3を0にする値ならなんでもよい)を出力するとROMが選択され、FF(ビット3を1にする値ならなんでもよい)を出力するとRAMが選択されます。

今回はその機能が実際のプログラムでどのように使われているかを説明いたします。
下はCP/M互換DOSのBIOSプログラムのコンソール入力部分のアセンブルリストです。

              ;
              ;CONSOLE INPUT
              ;
D31B 3A07BB   CONINJ:LD A,(CONSTDT)
D31E B7       	OR A
D31F CA29D3   	JP Z,CONINJ2
D322 F5       	PUSH AF
D323 AF       	XOR A
D324 3207BB   	LD (CONSTDT),A
D327 F1       	POP AF
D328 C9       	RET
D329 AF       CONINJ2:XOR A
D32A D39C     	OUT (9C),A
D32C 3E05     	LD A,05;1chr IN,nodp
D32E CDAB10   	CALL SOUT
D331 CDAE10   	CALL SIN
D334 F5       	PUSH AF
D335 3EFF     	LD A,FF
D337 D39C     	OUT (9C),A
D339 F1       	POP AF
D33A C9       	RET

DOSプログラムのファンクションコールの機能からの要求を満たすため、ちょっと複雑なプログラムになっていますが、コアな部分はCONINJ2:以下の部分です。

XOR A
OUT (9C),A
でROMが選択されます。

XOR Aは、
LD A,00とZフラグセット、Cフラグリセットを1バイトで実現するためによく使われます。
この場合はフラグは関係なく、A=00にすることだけが目的で使っています。

CALL SOUT、CALL SINはともにROM内のサブルーチンをCALLしています。
ROMに切り換えているために、正しく実行できます。
LD A,05
CALL SOUT
CALL SIN
の実行で、Windowsパソコンのキーボードから入力した1文字がUSB経由で送られて、PICを介してAレジスタに入れられます。

PUSH AF
でAレジスタをスタックに退避させておいて、
LD A,FF
OUT (9C),A
を実行します。
この実行によってRAMが選択されます。

下は同じくCP/M互換DOSのBIOSのコンソール出力部分のアセンブルリストです。

              ;
              ;CONSOLE OUT 12/5/20
              ;
D33B AF       CONOUTJ:XOR A
D33C D39C     	OUT (9C),A
D33E 79       	LD A,C
D33F FE08     	CP 08;BS
D341 CA53D3   	JP Z,CONOUTJ2
D344 FE0D     	CP 0D
D346 CA53D3   	JP Z,CONOUTJ2
D349 FE0A     	CP 0A
D34B CA53D3   	JP Z,CONOUTJ2
D34E FE20     	CP 20
D350 DA56D3   	JP C,CONOUTJ3
D353 CD1510   CONOUTJ2:CALL ADISP
D356 3EFF     CONOUTJ3:LD A,FF
D358 D39C     	OUT (9C),A
D35A C9       	RET
              ;

ここもDOSプログラムからの要求を満たすために複雑なところがありますが、コアな部分はCONOUTJ2:のCALL ADISPです。
ADISPはROM内のルーチンで、Aレジスタの文字コードをPICとUSBを介して、Windowsパソコンのコマンドプロンプト画面に表示します。

最初のCONOUTJ:の
XOR A
OUT (9C),A
でROMが選択されます。
ここでROMに切り換えているために、CALL ADISPが正しく実行できます。

実行後は、
LD A,FF
OUT (9C),A
を実行します。
この実行によってRAMが選択されます。

たったこれだけのことで、「裏」に隠れてしまったROM内のプログラムを呼び出して実行することができてしまいます。
この手法は「メモリバンク切り換え」という方法で、ずっと昔からよく使われている方法です。
PICでも「レジスタのバンク切り換え」としてごく普通に使われています。

ワンボードマイコンでCP/Mを![第161回]
2012.6.29upload

前へ
次へ
ホームページトップへ戻る