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

新製品の紹介(プチ連載です)
27C256WRITER組立キット

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
たまにはちょいと息抜きで小品も作ってみたいものです。
簡単にチョイチョイと…。
でも、なかなかそうは簡単にはいかなくて、いつものごとく回を重ねてしまうことになるのかも…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


[第20回]


●JP@コマンドの働き

前回はJP@コマンドの実行によって、CMコマンドやDMコマンドの働きが変わりました。
何が起きたのでしょうか?
というところで終りました。
今回はその続きです。

JP@コマンドは「裏RAM」へのジャンプ命令です。
これは危険なコマンドです。
不用意に使うとシステムが暴走します。
といってもパソコンそのものが暴走したりはしませんから安心してください。
ただ最悪の場合DOS窓(DOSプロンプト)内でキー入力できなくなって、DOS窓(DOSプロンプト)を強制終了(右上のXをクリック)しなければならなくなります。
またND80ZV(ND80Z3.5)はリセットが必要になります。

もっともJPコマンドそのものも危険なコマンドです。
適切なアドレスにジャンプしないと、やっぱり同じことがおきてしまいます。
JP 1033[Enter]
は安全です。
1033はシステムのリエントリポイントです。
すべてのシステムプログラムは終了後はここに戻ります。
ということは、JP 1033[Enter]は何もしないでエントリポイントに戻れ、という命令になります。

では、JP@1033はどうでしょうか。
もしも「裏RAM」の1033にまともなプログラムが何もなかったとすると、上に書いたように暴走してしまうことになります。
しかし前回のように、それ以前に/W256 Sが実行されて、その結果「裏RAM」にもシステムROMがコピーされていれば、JP@1033は表のシステムROMから「裏RAM」のシステムへの入口へのジャンプになります。
それと同時に瞬時にバンクが切り換わって、システムの制御が表のROMから裏のRAMに移行します。

自分で言うのも何なのですが、これは結構すごいことなのです。
その直前まで一切変更不能だったROM版のシステムROMプログラムだったものが、瞬時にして書き換え可能なRAM版のシステムRAMプログラムになって、しかもシームレスでシステムの制御がROMからRAMに移行してしまいます。
前回はその証として、CMコマンドで確認してみました。
本来ならばROMであるはずのアドレス7FF0の値が書き換わったことで、現在システムがRAM上にあって動作していることが確認できました。

システムがRAM上で動作するとということは、システムを書き換えてそれをテスト的に実行してみることが可能だということを意味しています。
もちろん何でもできるということではありません。
当然そこには制約があります。

システムプログラムは複数の処理プログラムで構成されています。
それぞれの処理プログラムは先頭部分に内部へのジャンプアドレスが配置されています。
不用意にここを書き換えるとシステムが暴走してしまいます。
また各処理プログラムは個別または共通のワークアドレスを使っています。
そこを不用意にさわるとやはりシステムが暴走してしまいます。

そんなことを言ったら何もさわれないじゃないか。
ま、そういうことでもありません。
これは上級者向けの機能ということになりますでしょう。

ND80ZV(ND80Z3.5)もMYCPU80も、付属CDROMにはシステムプログラムのソースプログラムが入れてあります。
それをマシン語に変換するためのZ80アセンブラ(8080アセンブラ)も付属しています。
今まではそれは単に参考資料に過ぎませんでした。
今回の27C256WRITERプログラムの組込みによって、さらに進んでユーザーがシステムプログラムを書き換えて、オリジナルのシステムに作り変える、なんていうことも可能になります。

もっとも、そのためには、もう少し詳しいシステムプログラムの情報が必要でありましょう。

●ND80ZV(ND80Z3.5)システムROMメモリマップ

ちっとも詳しくはありませんけれど、とりあえずシステムROMのメモリマップです(2016.2.27現在)。


各プログラムの機能についても、そのうち時間があれば解説などできればよいと思っています。
上級者でしたら、各プログラムの先頭部分にある変数名定義部分と、処理ルーチンへのジャンプ先につけられたラベル名によって、何をしているルーチンかというおおよその見当がつくと思います。

余り適切な例ではありませんが、ひとつの例として、システムプログラムの一部を書き換えて、それをRAM上でテストしてみることにいたします。

●DMコマンドを書き換えてみる

DMコマンドプログラムはZENTRYプログラムの中にあります。
下はZENTRY2Iのアセンブルリストの先頭部分です。
DMへのジャンプはアドレス181Eにあります。

2016/2/15  7:19  zentry2i.txt
END=1CED
              ;;; ENTRY FOR NEW BASIC 03/08/11 8/13 12/5 04/4/25
              ;;; 05/08/24
              ;;;entry for nd80z3
              ;;;10/6/18 6/19 6/20 6/21 6/22 6/23 6/27 6/28 6/29
              ;7/1 7/2 7/3 7/23 8/6
              ;9/14
              ;12/6/23 for ZBDOS 6/24
              ;11/20 11/22
              ;13/3/31
              ;16/2/15
              ;
              ORG $1800
              ;;;
                SINSB=$078D
              ;
              PRT0=$1057
              ;;;
              ADISP=$1015
              DEDSP=$1018
              CRLF=$101B
              SPJMP=$1024
              HDCMP=$1027
              WHTDP=$1030
              DECIN=$1036
              SPCDP=$1039
              ASHX1=$103F
              ASHX2=$1042
              ASHX4=$1045
              HXDP2=$104B
              HXDP4=$104E
              ADRD=$1051
              BREAK=$1054
              DECDP=$105D
              BITDP=$1066
                ATMKCK=$106C
              LSRC2=$1075
              LSRC0=$1078
              CRLF2=$107B
              SOUT_M=$10AB
              SIN=$10AE
              ;
              ;;;
              CMDTP=$16DF
              RGTBL=$1FB8
              ;;;
              CNVT=$56BF
              CNVTS=$56C2
              NEWSB=$56CE
              ;;;
              RUN=$2000
              RUN3=$2003
              ERRDP=$200F
              ;
              HELP=$5686
              BSSETSB=$56AD
              HELPSB=$56B6
              ;
              RTRAM=$E239
              RAMWR=$E23F
              RAMRD=$E242
              RAMJP=$E245
              ;;
              VTOP=$DFFF
              LIMIT=$DFFF
              ;
              STCWK=$ED00
              ;
              ;;;
              KEYBF=$F000
              TXTS=$F052
              CADRS=$F054
              SFTCK=$F056
              TXTE=$F063
              PRTR=$F065
              TXTE2=$F066
              VEND=$F06A
              MODE=$F070
              DRCTE=$F078
              LPSW=$F079
              KETA=$F07C
              BRKAD=$F080
              BRKBF=$F082
              BRKCK=$F083
              HLBF2=$F084
              HLBF1=$F08C
              FLG1=$F092
              ACC1=$F093
              IXH=$F097
              IREG=$F098
              SPBF=$F099
              PCL=$F09B
              PCH=$F09C
              NMEND=$F0B6
              DRCTS=$F0CF
              LCDMK=$F0D9
              INTMS=$F0DA
              INTCK=$F0DB
              TRSW=$F0DC
              BSBRKAD=$F0E9
              BSBRKA2=$F0ED
              WRITEP1=$F0FA
              WRITEP2=$F0FC
              ;;;
              ;;;
              SDATA=$F186
              ;;;
              ATCK=$F1A0
              DFLSW=$F1A1
              BFNO=$F1A5
              LNO=$F1AA
              ;
              TXBF=$F200
              RAMCK=$F2D1
              MODE2=$F2F7
              TXTS2=$F2FC
              TXBFC=$F2FE
              ;
              
              STC=$F500
              SPTOP=$F800
              ;
              ATD=$FEE0
              ATLN=$FEE2
              ATRNMK=$FEE4
              EIMK=$FEE6
              ;;;
              ;
              RST7JC=$FFCC
              RST7JA=$FFCD
              ;
              ;;;
1800 C35418   JP START
1803 C3A318   JP ENTRY
1806 C35219   JP SDTIN
1809 C31510   JP ADISP
180C C3AE10   JP SIN
180F C37C19   JP ASOUT
1812 C31A19   JP LNSRC
1815 C3F618   JP ENT4
1818 C38C19   JP AUTO
181B C3DA19   JP MVDBI
181E C3F219   JP DM
1821 C3621A   JP CM
1824 C3D11B   JP BP
1827 C3981B   JP RT
182A C3F41A   JP IN
182D C3D11A   JP OUT
1830 C3B21C   JP LCDOT
1833 C3B41C   JP LINIT
1836 C3B51C   JP JPIN
1839 C3B31C   JP LCDINSB
183C C3C71C   JP RRCOPYSB
183F C30E1B   JP RGDSP
1842 C3AE10   JP SIN;   from INPUT$
1845 C3A61C   JP SIN_NODTRT;  from INKEY$,INPUT$
1848 C3781C   JP LD
184B C38F1C   JP SV
184E C3081A   JP DMSB
1851 C35A1B   JP BROUT1
              ;;;
1854 3EEF     START:LD A,EF
1856 D398       OUT (98),A;ND80Z3 DMAOFF
1858 AF       XOR A


下はそのDMプログラムの先頭の部分です。

              ;
19F2 CD6C10   DM:CALL ATMKCK
19F5 CD5110   CALL ADRD
19F8 CD081A   DM1:CALL DMSB
19FB CD5410   CALL BREAK
19FE CD2710   CALL HDCMP
1A01 28F5     JR Z,*DM1
1A03 38F3     JR C,*DM1
1A05 C3A318   JP ENTRY
              ;
1A08 E5       DMSB:PUSH HL
1A09 E5       PUSH HL


下は同じDMプログラム(ZENTRY2Iプログラムの一部分)のソースプログラムです。

DM:CALL ATMKCK
CALL ADRD
DM1:CALL DMSB
CALL BREAK
CALL HDCMP
JR Z,*DM1
JR C,*DM1
JP ENTRY
;
DMSB:PUSH HL
PUSH HL
CALL HXDP4
POP HL
CALL SPCDP
LD B,08
DM2:CALL SPCDP
CALL DM2SB
DJNZ *DM2
LD A,2D
CALL ADISP
CALL DM2SB
LD B,07
DM22:CALL SPCDP
CALL DM2SB
DJNZ *DM22
POP HL
CALL SPCDP
CALL SPCDP
LD B,10
DM3:CALL MEMRD
CALL DM4
INC HL
DJNZ *DM3
JP CRLF
;
DM4:CP 20
JR C,*DM5
CP 80
JR C,ADSPJ
CP A0
JR C,*DM5
CP E0
JR C,ADSPJ
DM5:LD A,2E
ADSPJ:JP ADISP
;
DM2SB:PUSH HL
        CALL MEMRD
        LD H,A
CALL HXDP2
POP HL
INC HL
RET


その一部分(DM4:以下の部分)を下のように書き換えました。

;
DM4:CP 20
JR C,*DM5
JP ADISP
DM5:LD A,2E
ADSPJ:JP ADISP
;


もとのプログラムでは、16進数ダンプの右側に表示されるASCII文字のところで、00〜1F、80〜9F、E0〜FFはピリオド(”.”、ASCIIコード2E)に置き換えて表示しているところを、00〜1F以外はそのままASCII文字とみなして表示するように変更しました。
もとのプログラムがそのようになっているのはそれなりに意味があってしていることなので、それを変更することは余りよいことではありませんが、今回はシステムプログラムを書き換えるサンプルとしてそのようにしてみました。

そのように変更したあと、ZENTRYWK.TXTというファイル名で保存し、それをZASMでアセンブルしました。



画面には表示されませんが、アセンブル作業がエラーなく終了すると、マシン語のバイナリファイルZENTRYWK.BINが作成されます。
これでやっと準備が整いました。
それではいよいよテストの開始です。

まずはROM上で普通のDMコマンドを実行して、どのように表示されるかを確認しておきます。
画面右側のASCII文字表示のところで、上で説明した範囲のコードが”.”に置き換えられています。
それを確認したあとで/W256 Sを実行しました。
これでシステムROMの内容が「裏RAM」にコピーされました。

そこまで準備しておいて、/LDコマンドでさきほど作成したZENTRYWK.BINを「裏RAM」にロードしてZENTRYプログラムを上書きしました。
/LDコマンドは0000〜7FFFの範囲を指定すると、「裏RAM」に対してロードが行なわれます。

ここで注意しておきたいことがあります。
/LD,/SVはアドレスが0000〜7FFFの範囲を指定した場合、「裏RAM」に対してアクセスが行なわれます。
そのとき前提として、ROMが選択されていてROM上でシステムが動いているとして実行されますから、/LD、/SVの実行後はROMのシステムに戻ります。
もしも「裏RAM」をアクセスする/LD、/SVの実行前にJP@コマンドで先に「裏RAM」に行っていて、そこで/LD、/SVを実行すると不都合なことが起きる可能性があります。
「裏RAM」をアクセスする/LD、/SVコマンドの実行はROMのシステム上で実行する、と心得ておいてください。

さて、そのように/LDコマンドを実行したあと、念のためにDMプログラムが上書きされたかどうかをDM@コマンドで確認してみました。
このときはまだDM@コマンドはROM上で実行されています。
上の画面コピーで下側に少し見えているアセンブルリストのDM4:のところの通りに、アドレス1A46〜が書き換えられていることが確認できました。

そこまで確認したあと、JP@1033[Enter]を実行して「裏RAM」に行って、DMコマンドを実行しました。
画面右側のASCII文字表示が最初に実行したときと一部異なっていることがわかります。

このようにして変更を加えた「裏RAM」の内容はROMのシステム上で、/SV ファイルネーム,0000,7FFF[Enter]を実行することでバイナリファイルとして保存することができます。
なおJP@で裏RAMに行った後、ROMのシステム制御に戻るには/CSを実行します。
そのようにすることで安全にRAM上のシステムからROM上のシステムに戻ることができます。

27C256WRITER組立キット[第20回]
2016.2.27upload

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