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

マイコン独立大作戦
ROM/RAM/RTCボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
作戦その3は、SDカードインターフェースです。
作戦その4は、ROM/RAM/RTCボードです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第20回]


●増設RAMリードライトプログラム

久しぶりにソフトウェア作業を再開しました。
考えているLOGファイル作成のポイントは、システムの画面表示プログラム(独立システムではスクリーンエディタプログラム)の中で、1文字データを画面に表示するときに、同時にその文字データをLOGファイル用バッファに書き込むようにすることです。
最終的にはLOGファイルデータをSDカードに書き込みますが、SDカードへのSAVEはセクタ単位(512バイト)で行ないますから、メモリのどこかに512バイトのバッファを確保する必要があります。
しかしシステムの作業領域はほとんどが割り当て済みで、とても512バイトもの空きエリアは残っていません。
そこで目をつけたのがROM/RAM/RTCボード上の増設RAMです。
ここはカラーキャラクタディスプレイインターフェース用に2KBの色コードバッファを設けました(カラーキャラクタディスプレイインターフェース回路の製作[第5回])が、それ以外は未使用でまだがら空きです。
ここに512バイトのLOGバッファを割り当てます。
実はLOGファイルを作成するためにはそれだけでは足りなくて、ほかにも特殊なバッファを用意する必要があると考えているのですが、それについては作業が進んだ時点で具体化していくつもりです。

ROM/RAM/RTCボード上の増設RAMへのアクセスについては、カラーキャラクタディスプレイインターフェース用のプログラムの中で行なっていますが、これからLOGファイルプログラムを作成しているために、デバッグにも使えるように汎用的な増設RAMアクセスプログラムを作っておくことにしました。
最終的には独立化システムROMに組み込むことになりますが、それまではUSB接続型のND80Z3.5で使える形にしておくのが便利ですので、通常のRAM領域で使う形のものとして作成します。

機能から考えると以下のプログラム(サブルーチン)が必要です。
当面はこれだけあれば十分でしょう。

1)バッファWRITE
1バイトのデータを増設RAMの指定アドレスに書き込みます。
Aレジスタ RAMバンクアドレス
Cレジスタ 1バイトのデータ
DEレジスタ 増設RAMのアドレス(0000〜7FFF)

2)バッファREAD
1バイトのデータを増設RAMの指定アドレスから読み出します。
使用レジスタは1)と同じです。

3)バッファMOVE
512バイトのデータを通常のRAM領域と増設RAM領域との間で転送します。
Aレジスタ RAMバンクアドレス
DEレジスタ コピー先アドレス
HLレジスタ コピー元アドレス

Aレジスタに指定するRAMバンクアドレスについては[第3回]で説明しています。
ここまで書いてきて2)は使わないことに気が付きました。
実はこのプログラムは昨日作ってテスト済みなのですが、その時点では気が付きませんでした。
ホームページの記事を書くのはなかなかにエネルギーを必要とするのですが、備忘録を兼ねるというメリットのほかにもそういう思わぬ副産物に恵まれることがあります。
読者の皆様のために書いているというよりも自分自身のために大いに役立っているとあらためて感じます。

ま、それはともかくとしまして、どうせ作ってしまいましたので、当面はそのまま使うこととしまして、まずはプログラムリストです。

;;; BANK RAM READ/WRITE
; 17/9/1
;
        ORG $9000;for test
;
JP BKWR
JP BKRD
JP BKMV
;
;A I/O BANK ADDRESS
;C DATA
;DE BANK ADDRESS
;
;I/O RAM WRITE (1byte)
BKWR:OUT (9C),A
        LD A,C
        LD (DE),A
        XOR A
        OUT (9C),A
        RET
;
;I/O RAM READ (1byte)
BKRD:OUT (9C),A
        LD A,(DE)
        LD C,A
        XOR A
        OUT (9C),A
        RET
;
;MEMORY TO I/O RAM MOVE(512 bytes)
;(HL) to (DE)
;
BKMV:OUT (9C),A
        LD BC,$0200
BKMV1:LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        DEC BC
        LD A,B
        OR C
        JP NZ,BKMV1
        XOR A
        OUT (9C),A
        RET
;

たったこれだけの簡単なものです。
こちらはアセンブルリストです。

2017/9/1  22:19  bkrwsb1.txt
END=902B
              ;;; BANK RAM READ/WRITE
              ; 17/9/1
              ;
                ORG $9000;for test
              ;
9000 C30990   JP BKWR
9003 C31190   JP BKRD
9006 C31990   JP BKMV
              ;
              ;A I/O BANK ADDRESS
              ;C DATA
              ;DE BANK ADDRESS
              ;
              ;I/O RAM WRITE (1byte)
9009 D39C     BKWR:OUT (9C),A
900B 79         LD A,C
900C 12         LD (DE),A
900D AF         XOR A
900E D39C       OUT (9C),A
9010 C9         RET
              ;
              ;I/O RAM READ (1byte)
9011 D39C     BKRD:OUT (9C),A
9013 1A         LD A,(DE)
9014 4F         LD C,A
9015 AF         XOR A
9016 D39C       OUT (9C),A
9018 C9         RET
              ;
              ;MEMORY TO I/O RAM MOVE(512 bytes)
              ;(HL) to (DE)
              ;
9019 D39C     BKMV:OUT (9C),A
901B 010002     LD BC,$0200
901E 7E       BKMV1:LD A,(HL)
901F 12         LD (DE),A
9020 23         INC HL
9021 13         INC DE
9022 0B         DEC BC
9023 78         LD A,B
9024 B1         OR C
9025 C21E90     JP NZ,BKMV1
9028 AF         XOR A
9029 D39C       OUT (9C),A
902B C9         RET
              ;
BKMV         =9019  BKMV1        =901E  BKRD         =9011  
BKWR         =9009  

簡単なプログラムですが忘れてはならないのは、最後に必ず増設RAMアクセスからシステムROMアクセスに戻すことです。
汎用ではありますが、このプログラムの目的はLOGファイルの作成のため、です。
上に書きましたように最終的には独立型システムのスクリーンエディタプログラムに組み込むことになりますから、リターンする前にバンクを切り換えてROMアクセスに戻しておく必要があります。
ちなみにこのサブルーチンプログラムそのものはROMに組み込むのではなくて、システム起動時にRAM(8000〜FFFF)のどこかにコピーして、そこをスクリーンエディタプログラムがコールするようにします(そのようにしないとシステムが暴走してしまいます)。
今回作成したプログラムも通常のRAM領域に置かれますが、それはあくまで一時テスト用です。
最終的にはシステム用のエリア(E000〜F7FF)のどこかに置くように考えます。

さっそくテストプログラムを作ってテストをしてみました。

2017/9/1  22:19  bkwtest1.txt
END=9114
              ;;; BANK RAM WRITE TEST
              ; 17/9/1
              ;
                ORG $9100;for test
              ;
                BKWR=$9000
                REENT=$1033
              ;
9100 110070   WTEST:LD DE,$7000
9103 010002     LD BC,$0200
9106 3EEF     WTEST1:LD A,EF
9108 CD0090     CALL BKWR
910B 13         INC DE
910C 0B         DEC BC
910D 78         LD A,B
910E B1         OR C
910F C20691     JP NZ,WTEST1
9112 C33310     JP REENT
              ;
BKWR         =9000  REENT        =1033  WTEST        =9100  
WTEST1       =9106  

これは手抜きプログラムです。
512バイトのデータを増設RAM(バンクEF)の7000〜71FFに書き込みますが、書き込むデータを置くCレジスタはカウンタを兼ねていますから00からスタートしてBCレジスタが0000になるまでダウンカウントします。

書き込みテストが正しく実行されたかどうかを確認するためには、それを読み出してみる必要があります。
そのためのテストプログラムです。
今度はBKMVを使います。

2017/9/1  22:20  bkmvt1.txt
END=920D
              ;;; BANK RAM MOVE(READ) TEST
              ; 17/9/1
              ;
                ORG $9200;for test
              ;
                BKMV=$9006
                REENT=$1033
              ;
9200 210070   MVTEST:LD HL,$7000
9203 110082     LD DE,$8200
9206 3EEF       LD A,EF
9208 CD0690     CALL BKMV
920B C33310     JP REENT
              ;
BKMV         =9006  MVTEST       =9200  REENT        =1033  

増設RAM(バンクEF)の7000(〜71FF)から512バイトのデータを読み出してRAMの8200〜83FFに書き込みます。

以上のプログラムをND80Z3.5(USB接続版)にロードして実行してみました。

>/ld bkrwsb1.bin,9000
loading BKRWSB1.BIN ...002e(46)bytes loaded,from 9000 to 902B
>/ld bkwtest1.bin,9100
loading BKWTEST1.BIN ...0017(23)bytes loaded,from 9100 to 9116
>jp 9100
>/ld bkmvt1.bin,9200
loading BKMVT1.BIN ...0010(16)bytes loaded,from 9200 to 920F
>jp 9200
>dm 8200,83ff
8200  00 FF FE FD FC FB FA F9-F8 F7 F6 F5 F4 F3 F2 F1  ................
8210  F0 EF EE ED EC EB EA E9-E8 E7 E6 E5 E4 E3 E2 E1  ................
8220  E0 DF DE DD DC DB DA D9-D8 D7 D6 D5 D4 D3 D2 D1  .゚゙ンワロレルリラヨユヤモメム
8230  D0 CF CE CD CC CB CA C9-C8 C7 C6 C5 C4 C3 C2 C1  ミマホヘフヒハノネヌニナトテツチ
8240  C0 BF BE BD BC BB BA B9-B8 B7 B6 B5 B4 B3 B2 B1  タソセスシサコケクキカオエウイア
8250  B0 AF AE AD AC AB AA A9-A8 A7 A6 A5 A4 A3 A2 A1  ーッョュャォェゥィァヲ・、」「。
8260  A0 9F 9E 9D 9C 9B 9A 99-98 97 96 95 94 93 92 91  ...............
8270  90 8F 8E 8D 8C 8B 8A 89-88 87 86 85 84 83 82 81  ................
8280  80 7F 7E 7D 7C 7B 7A 79-78 77 76 75 74 73 72 71  .~}|{zyxwvutsrq
8290  70 6F 6E 6D 6C 6B 6A 69-68 67 66 65 64 63 62 61  ponmlkjihgfedcba
82A0  60 5F 5E 5D 5C 5B 5A 59-58 57 56 55 54 53 52 51  `_^]\[ZYXWVUTSRQ
82B0  50 4F 4E 4D 4C 4B 4A 49-48 47 46 45 44 43 42 41  PONMLKJIHGFEDCBA
82C0  40 3F 3E 3D 3C 3B 3A 39-38 37 36 35 34 33 32 31  @?>=<;:987654321
82D0  30 2F 2E 2D 2C 2B 2A 29-28 27 26 25 24 23 22 21  0/.-,+*)('&%$#"!
82E0  20 1F 1E 1D 1C 1B 1A 19-18 17 16 15 14 13 12 11   ...............
82F0  10 0F 0E 0D 0C 0B 0A 09-08 07 06 05 04 03 02 01  ................
8300  00 FF FE FD FC FB FA F9-F8 F7 F6 F5 F4 F3 F2 F1  ................
8310  F0 EF EE ED EC EB EA E9-E8 E7 E6 E5 E4 E3 E2 E1  ................
8320  E0 DF DE DD DC DB DA D9-D8 D7 D6 D5 D4 D3 D2 D1  .゚゙ンワロレルリラヨユヤモメム
8330  D0 CF CE CD CC CB CA C9-C8 C7 C6 C5 C4 C3 C2 C1  ミマホヘフヒハノネヌニナトテツチ
8340  C0 BF BE BD BC BB BA B9-B8 B7 B6 B5 B4 B3 B2 B1  タソセスシサコケクキカオエウイア
8350  B0 AF AE AD AC AB AA A9-A8 A7 A6 A5 A4 A3 A2 A1  ーッョュャォェゥィァヲ・、」「。
8360  A0 9F 9E 9D 9C 9B 9A 99-98 97 96 95 94 93 92 91  ...............
8370  90 8F 8E 8D 8C 8B 8A 89-88 87 86 85 84 83 82 81  ................
8380  80 7F 7E 7D 7C 7B 7A 79-78 77 76 75 74 73 72 71  .~}|{zyxwvutsrq
8390  70 6F 6E 6D 6C 6B 6A 69-68 67 66 65 64 63 62 61  ponmlkjihgfedcba
83A0  60 5F 5E 5D 5C 5B 5A 59-58 57 56 55 54 53 52 51  `_^]\[ZYXWVUTSRQ
83B0  50 4F 4E 4D 4C 4B 4A 49-48 47 46 45 44 43 42 41  PONMLKJIHGFEDCBA
83C0  40 3F 3E 3D 3C 3B 3A 39-38 37 36 35 34 33 32 31  @?>=<;:987654321
83D0  30 2F 2E 2D 2C 2B 2A 29-28 27 26 25 24 23 22 21  0/.-,+*)('&%$#"!
83E0  20 1F 1E 1D 1C 1B 1A 19-18 17 16 15 14 13 12 11   ...............
83F0  10 0F 0E 0D 0C 0B 0A 09-08 07 06 05 04 03 02 01  ................
>

うまくいったようです。

テストとしてはこれでよいと思いましたが、念のために次のようにしてもう一度テストしてみました。

>cm 9200
9200 21-
9201 00-
9202 70-72
9203 11-
>jp 9200
>dm 8200,83ff
8200  A8 AA D4 45 51 11 B8 FD-A6 AA 45 46 55 73 AB 9A  ィェヤEQ.ク.ヲェEFUsォ.
8210  15 55 EB AB AA 2A 79 D5-06 D3 AC BE 8A AB 51 05  .U.ォェ*yユ.モャセ.ォQ.
8220  8A A8 5D 15 5D 54 AE AC-08 2A 55 41 55 95 EA 9A  .ィ].]Tョャ.*UAU...
8230  55 51 BF B8 B2 AE 5D 0D-15 24 A0 8A AA AA 50 14  UQソクイョ]..$.ェェP.
8240  8E CA D5 15 B5 55 A8 EA-A9 AA 65 F9 F4 4D 6A AE  .ハユ.オUィ.ゥェe..Mjョ
8250  5F DD AF A8 2A AA 11 59-97 45 BC B8 AA AA 55 D5  _ンッィ*ェ.Y.EシクェェUユ
8260  A8 AA 75 11 57 0D AA AE-AA AA 11 D0 74 54 4E 9B  ィェu.W.ェョェェ.ミtTN.
8270  5D 75 E9 88 2A 66 31 51-55 55 AA AE A2 AA 75 D5  ]u..*f1QUUェョ「ェuユ
8280  38 AB C5 C5 75 57 A0 84-AA AA F5 76 D5 41 EA 6A  8ォナナuW.ェェ.vユA.j
8290  D5 55 9F 2A AA CA 4F 05-55 7D A9 2A AA AA 53 55  ユU.*ェハO.U}ゥ*ェェSU
82A0  2A AA 75 15 C7 5D 8B AA-AA AA 55 4C 57 D5 AE B2  *ェu.ヌ].ェェェULWユョイ
82B0  17 55 92 82 EA CA 5D D4-55 56 BA AA AE AA 75 5D  .U...ハ]ヤUVコェョェu]
82C0  AA BA 79 35 D5 59 EE E9-AA EA D5 75 51 06 D2 CB  ェコy5ユY..ェ.ユuQ.メヒ
82D0  5D 45 88 A9 A9 AB 0B 5D-E4 4D AA 8B BA A2 5D 7C  ]E.ゥゥォ.].Mェ.コ「]|
82E0  A2 A2 57 ED 40 55 8E B8-A9 F2 5D 3B 6D 05 A9 32  「「W.@U.クゥ.];m.ゥ2
82F0  54 05 1A 1A 2A 9B 5F D7-01 17 A6 AB EA 6A 47 5F  T...*._ラ..ヲォ.jG_
8300  E2 A8 55 75 95 49 BE 8F-AA AB 64 55 71 15 B7 AA  .ィUu.Iセ.ェォdUq.キェ
8310  55 47 E2 B8 E3 8E 54 14-4D 57 39 AB BA 1A 74 47  UG.ク..T.MW9ォコ.tG
8320  AA BA 4F 56 1D 44 3E EE-46 A8 2D 50 48 FD AB C8  ェコOV.D>.Fィ-PH.ォネ
8330  5D 0D A8 A6 8A AA CD 7C-53 11 26 2C DA BA 54 09  ].ィヲ.ェヘ|S.&,レコT.
8340  2A EA D1 45 51 75 E6 AA-AA AA D7 55 51 64 24 2E  *.ムEQu.ェェェラUQd$.
8350  55 F1 29 AA AA A2 55 55-57 45 AB BB AE 2B 79 5D  U.)ェェ「UUWEォサョ+y]
8360  AA AA C5 14 C5 25 BA B2-AA AA 55 90 59 D4 72 AA  ェェナ.ナ%コイェェU.Yヤrェ
8370  5D 55 62 A2 AA 32 F6 55-54 15 B8 D4 EA 22 F5 54  ]Ub「ェ2.UT.クヤ.".T
8380  AA BA 57 0D 4D 51 A3 A7-AA AA 5D 17 C5 55 8B E4  ェコW.MQ」ァェェ].ナU..
8390  19 F4 AA CA AA AA 17 17-51 1D EC A2 AA AA 55 25  ..ェハェェ..Q..「ェェU%
83A0  EE 8B C5 75 54 5B 86 B9-9A AA 20 71 D6 75 A8 AA  ..ナuT[.ケ.ェ qヨuィェ
83B0  55 04 52 A8 A2 AA D7 50-56 55 A9 CE AA EA 51 15  U.Rィ「ェラPVUゥホェ.Q.
83C0  AB AA 55 1D DC 11 ED B8-04 6B 71 37 95 55 62 AE  ォェU.ワ..ク.kq7.Ubョ
83D0  57 56 A2 AA AA AA 01 65-D5 5C A2 2A B8 EF FD 49  WV「ェェェ.eユ\「*ク..I
83E0  AE 8E 55 11 C5 6E 6C 80-4A AB DC 54 FC D8 0E EA  ョ.U.ナnl.JォワT.リ..
83F0  75 D4 AC 22 6B A2 57 7D-D5 55 8A 88 EA BA D4 55  uヤャ"k「W}ユU...コヤU
>cm 9100
9100 11-
9101 00-
9102 70-72
9103 01-
>jp 9100
>jp 9200
>dm 8200,83ff
8200  00 FF FE FD FC FB FA F9-F8 F7 F6 F5 F4 F3 F2 F1  ................
8210  F0 EF EE ED EC EB EA E9-E8 E7 E6 E5 E4 E3 E2 E1  ................
8220  E0 DF DE DD DC DB DA D9-D8 D7 D6 D5 D4 D3 D2 D1  .゚゙ンワロレルリラヨユヤモメム
8230  D0 CF CE CD CC CB CA C9-C8 C7 C6 C5 C4 C3 C2 C1  ミマホヘフヒハノネヌニナトテツチ
8240  C0 BF BE BD BC BB BA B9-B8 B7 B6 B5 B4 B3 B2 B1  タソセスシサコケクキカオエウイア
8250  B0 AF AE AD AC AB AA A9-A8 A7 A6 A5 A4 A3 A2 A1  ーッョュャォェゥィァヲ・、」「。
8260  A0 9F 9E 9D 9C 9B 9A 99-98 97 96 95 94 93 92 91  ...............
8270  90 8F 8E 8D 8C 8B 8A 89-88 87 86 85 84 83 82 81  ................
8280  80 7F 7E 7D 7C 7B 7A 79-78 77 76 75 74 73 72 71  .~}|{zyxwvutsrq
8290  70 6F 6E 6D 6C 6B 6A 69-68 67 66 65 64 63 62 61  ponmlkjihgfedcba
82A0  60 5F 5E 5D 5C 5B 5A 59-58 57 56 55 54 53 52 51  `_^]\[ZYXWVUTSRQ
82B0  50 4F 4E 4D 4C 4B 4A 49-48 47 46 45 44 43 42 41  PONMLKJIHGFEDCBA
82C0  40 3F 3E 3D 3C 3B 3A 39-38 37 36 35 34 33 32 31  @?>=<;:987654321
82D0  30 2F 2E 2D 2C 2B 2A 29-28 27 26 25 24 23 22 21  0/.-,+*)('&%$#"!
82E0  20 1F 1E 1D 1C 1B 1A 19-18 17 16 15 14 13 12 11   ...............
82F0  10 0F 0E 0D 0C 0B 0A 09-08 07 06 05 04 03 02 01  ................
8300  00 FF FE FD FC FB FA F9-F8 F7 F6 F5 F4 F3 F2 F1  ................
8310  F0 EF EE ED EC EB EA E9-E8 E7 E6 E5 E4 E3 E2 E1  ................
8320  E0 DF DE DD DC DB DA D9-D8 D7 D6 D5 D4 D3 D2 D1  .゚゙ンワロレルリラヨユヤモメム
8330  D0 CF CE CD CC CB CA C9-C8 C7 C6 C5 C4 C3 C2 C1  ミマホヘフヒハノネヌニナトテツチ
8340  C0 BF BE BD BC BB BA B9-B8 B7 B6 B5 B4 B3 B2 B1  タソセスシサコケクキカオエウイア
8350  B0 AF AE AD AC AB AA A9-A8 A7 A6 A5 A4 A3 A2 A1  ーッョュャォェゥィァヲ・、」「。
8360  A0 9F 9E 9D 9C 9B 9A 99-98 97 96 95 94 93 92 91  ...............
8370  90 8F 8E 8D 8C 8B 8A 89-88 87 86 85 84 83 82 81  ................
8380  80 7F 7E 7D 7C 7B 7A 79-78 77 76 75 74 73 72 71  .~}|{zyxwvutsrq
8390  70 6F 6E 6D 6C 6B 6A 69-68 67 66 65 64 63 62 61  ponmlkjihgfedcba
83A0  60 5F 5E 5D 5C 5B 5A 59-58 57 56 55 54 53 52 51  `_^]\[ZYXWVUTSRQ
83B0  50 4F 4E 4D 4C 4B 4A 49-48 47 46 45 44 43 42 41  PONMLKJIHGFEDCBA
83C0  40 3F 3E 3D 3C 3B 3A 39-38 37 36 35 34 33 32 31  @?>=<;:987654321
83D0  30 2F 2E 2D 2C 2B 2A 29-28 27 26 25 24 23 22 21  0/.-,+*)('&%$#"!
83E0  20 1F 1E 1D 1C 1B 1A 19-18 17 16 15 14 13 12 11   ...............
83F0  10 0F 0E 0D 0C 0B 0A 09-08 07 06 05 04 03 02 01  ................
>

まず最初に増設RAMのアドレス7200〜73FFを読み出して表示させました。
ランダムなデータが表示されていて、ここにはまだ意味のあるデータが書かれていないことがわかります。
次に同アドレスに対してさきほどのデータ書き込みプログラムを実行したあとで、もう一度読み出してみました。
正しく書き込みが行なわれたことがはっきり確認できました。

ROM/RAM/RTCボードの製作[第20回]
2017.9.2upload

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