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

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

[第164回]


●CMコマンド

前回は、DMコマンドのプログラムを一部変更して、同じアドレス0000〜7FFFに置いたROMとRAMの中味をそれぞれ表示できるようにしました。

DMでそういうことができるようになると、同じことをCMコマンドでもできるようにしたくなります。
そこでCMコマンドもプログラムを変更して、そのようにしてしまいました。

CMコマンドは、アドレスを指定して、1バイトずつそのアドレスのメモリ内容を表示し、必要ならメモリ内容を書き換えることができます。
ROMに対してもメモリ内容を表示することはできますが、書き換えることはできません。

下はCMコマンドを実行中の画面です。
最初は今までと同じCMコマンドです。
CM 0200[Enter]
と入力して、メモリ内容を書き換えるために、12、34、56、78と入力しました。
データを入力する代わりに[←]キーを入力すると、一つ前のアドレスに戻って表示が行なわれます。
書き換えたつもりのアドレスを表示させてみましたが、0200〜0203はROMですから、内容は書き換わってはいません。



同じことをその下のところで、
CM@0200[Enter]
と入力して行ないました。
12、34、56、78と入力したあと、[←]キーを入力して、前のアドレスの内容を確認してみますと。
今度はちゃんと書き換わっています。
DMコマンドと同じように、@をつけて実行することで、RAMが選択されるようになりました。

下はそのように変更したCMコマンドのプログラムリスト(アセンブルリスト)です。
ND80ZVのROMに書かれているプログラムですが、今回は前回のDMコマンドと同様に、0000〜7FFFのRAMの内容も表示できるように一部を書き換えました。

              ;;;
              ;;; CHANGE MEMORY
1A65 CD6C10   CM:CALL ATMKCK
1A68 CD4510   CALL ASHX4
1A6B DA3010   JP C,WHTDP   
1A6E E5       CM1:PUSH HL
1A6F CD4E10   CALL HXDP4   
1A72 E1       POP HL
1A73 CD3910   CALL SPCDP
1A76 E5       PUSH HL
1A77 CDC41C   	CALL MEMRD
1A7A 67       	LD H,A
1A7B CD4B10   CALL HXDP2   
1A7E E1       POP HL
1A7F 3E2D     LD A,2D
1A81 CD1510   CALL ADISP   
1A84 3E03     LD A,03
1A86 CDAB10   CALL SOUT_M
1A89 CDAE10   CALL SIN
1A8C DAB11A   JP C,CMEND
1A8F FE3E     CP 3E;>
1A91 282E     JR Z,*CM42
1A93 FE3C     CP 3C;<
1A95 2003     JR NZ,*CM3
1A97 2B       DEC HL
1A98 1828     JR *CM43
1A9A FE2F     CM3:CP 2F;/
1A9C CAB11A   JP Z,CMEND
1A9F E5       PUSH HL
1AA0 67       LD H,A
1AA1 CD3F10   CALL ASHX1
1AA4 3822     JR C,*CM5
1AA6 3E03     LD A,03
1AA8 CDAB10   CALL SOUT_M
1AAB CDAE10   CALL SIN
1AAE 3007     JR NC,*CM31
1AB0 E1       POP HL
1AB1 CD1B10   CMEND:CALL CRLF
1AB4 C3A418   JP ENTRY
1AB7 6F       CM31:LD L,A
1AB8 CD4210   CALL ASHX2
1ABB 380B     JR C,*CM5
1ABD E1       POP HL
1ABE CDD51C   CALL MEMWR
1AC1 23       CM42:INC HL
1AC2 CD1B10   CM43:CALL CRLF
1AC5 C36E1A   JP CM1
1AC8 E1       CM5:POP HL
1AC9 3E3F     LD A,3F;?
1ACB CD1510   CALL ADISP
1ACE CD1B10   CALL CRLF
1AD1 C36E1A   JP CM1

書き換える前のリストはこちらです。

              ;;;
              ;;; CHANGE MEMORY
1A5B 13       CM:INC DE
1A5C CD4510   CALL ASHX4
1A5F DA3010   JP C,WHTDP   
1A62 E5       CM1:PUSH HL
1A63 CD4E10   CALL HXDP4   
1A66 E1       POP HL
1A67 CD3910   CALL SPCDP
1A6A E5       PUSH HL
1A6B 66       LD H,(HL)
1A6C CD4B10   CALL HXDP2   
1A6F E1       POP HL
1A70 3E2D     LD A,2D
1A72 CD1510   CALL ADISP   
1A75 3E03     LD A,03
1A77 CDAB10   CALL SOUT_M
1A7A CDAE10   CALL SIN
1A7D DAA21A   JP C,CMEND
1A80 FE3E     CP 3E;>
1A82 282C     JR Z,*CM42
1A84 FE3C     CP 3C;<
1A86 2003     JR NZ,*CM3
1A88 2B       DEC HL
1A89 1826     JR *CM43
1A8B FE2F     CM3:CP 2F;/
1A8D CAA21A   JP Z,CMEND
1A90 E5       PUSH HL
1A91 67       LD H,A
1A92 CD3F10   CALL ASHX1
1A95 3820     JR C,*CM5
1A97 3E03     LD A,03
1A99 CDAB10   CALL SOUT_M
1A9C CDAE10   CALL SIN
1A9F 3007     JR NC,*CM31
1AA1 E1       POP HL
1AA2 CD1B10   CMEND:CALL CRLF
1AA5 C3A118   JP ENTRY
1AA8 6F       CM31:LD L,A
1AA9 CD4210   CALL ASHX2
1AAC 3809     JR C,*CM5
1AAE E1       POP HL
1AAF 77       LD (HL),A
1AB0 23       CM42:INC HL
1AB1 CD1B10   CM43:CALL CRLF
1AB4 C3621A   JP CM1
1AB7 E1       CM5:POP HL
1AB8 3E3F     LD A,3F;?
1ABA CD1510   CALL ADISP
1ABD CD1B10   CALL CRLF
1AC0 C3621A   JP CM1
              ;;;

今回のCMコマンドも、書き換えたところはDMと同じようにたった3箇所だけです。
まず先頭の
CM:INC DE
を、
CM:CALL ATMKCK
に書き換えました。

2箇所目は、変更前のアドレス1A6Bの
LD H,(HL)
を、
CALL MEMRD
LD H,A
に書き換えました。

そして3箇所目は、変更前のアドレス1AAFの
LD (HL),A

CALL MEMWR
に書き換えました。

ATMKCKとMEMRDの各サブルーチンについては前回説明をいたしました。
下は、MEMWRサブルーチンです。

1CD5 F5       MEMWR:PUSH AF
1CD6 3AD1F2   	LD A,(RAMCK)
1CD9 FE40     	CP 40;@
1CDB CA3FD2   	JP Z,RAMWR
1CDE F1       	POP AF
1CDF 77       	LD (HL),A
1CE0 C9       	RET

LD (HL),Aを変更して、その代わりにこのMEMWRを実行します。
’DM@’のときは、RAMWRにジャンプします。
それ以外のときはLD (HL),Aを実行します。

RAMWRのアドレスはD23Fです。
このアドレスはRAMRDと同じくCP/M互換DOSのBIOSプログラムのアドレスです。

下はCP/M互換DOSのBIOSの先頭にあるジャンプ命令部分です。
下のほうに
JP RAMWR
が見えます。 

              ;
D200 C395D2   	JP SETEN2
D203 C3F2D2   BOOT:JP WBOOTJ
D206 C3F9D2   	JP CONSTJ
D209 C31BD3   	JP CONINJ
D20C C33BD3   	JP CONOUTJ
D20F C35BD3   	JP LISTJ
D212 C35CD3   	JP PUNCHJ
D215 C36ED3   	JP READERJ
D218 C38DD3   	JP HOMEJ
D21B C398D3   	JP SELDSKJ
D21E C3B4D3   	JP SETTRKJ
D221 C3BCD3   	JP SETSECJ
D224 C3C2D3   	JP SETDMAJ
D227 C3C8D3   	JP READJ
D22A C331D4   	JP WRITEJ
D22D C351D4   	JP PRSTATJ
D230 C352D4   	JP SECTRNJ
D233 C377D2   	JP SETENTRY
D236 C355D4   	JP ZREENTJ
D239 C3BED2   	JP RTRAM
D23C C36ED4   	JP LOADZ
D23F C3D2D2   	JP RAMWR
D242 C3DED2   	JP RAMRD
D245 C3E6D2   	JP RAMJP
              ;

そしてこちらがそのジャンプ先、RAMWRです。

              ;
D2D2 3EFF     RAMWR:LD A,FF
D2D4 D39C     	OUT (9C),A
D2D6 F1       	POP AF
D2D7 77       	LD (HL),A
D2D8 F5       RAMWR2:PUSH AF
D2D9 AF       	XOR A
D2DA D39C     	OUT (9C),A
D2DC F1       	POP AF
D2DD C9       	RET

RAMWRでは、最初に
LD A,FF
OUT (9C),A
を実行して、RAMを選択します。
この時点でROMは非選択になります。

前回DMコマンドでも説明をしましたように、CMコマンドからこのルーチンにジャンプしてきて、ここでROMを非選択にしてもCPUが暴走しないのは、このルーチンがROM/RAMの切り換えに影響されない、アドレス8000〜FFFFの範囲のRAMに書かれているからです。

そして
LD (HL),A
を実行します。

最後に
XOR A
OUT (9C),A
を実行して、ROMを選択します。

以上のようにすることで、0000〜7FFFの範囲に割り付けられたROMに書かれたCMコマンドプログラムで、同じアドレスのRAMの内容を読んで表示したり、内容を書き換えることができるようになりました。

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

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