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

マイコン独立大作戦
CRT/VGAIF+KEYIF+SDCARDIFボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
昔はそれが普通のことだったのですが、安価なCRTディスプレイが生産中止となって久しい今日ではそれ
は叶わぬことと諦めていたのですが…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[総合第108回]



●MZ80のディスプレイパターンを追加

前回は新しく作ったVGA/CRT+カラーキャラクタディスプレイインターフェースボード(長いので以後はVGA/CRT/COLORIFボードと呼ぶことにします)では、PC8001とMZ80のキャラクタパターンをソフトウェアで切り換えて表示することができます、と書きました。
そうするためには8PディップスイッチのbRをOFFにしたうえで、VRAMとキャラジェネROMの間にあるショートピンをセットします、という説明もしました。
あるいはお気付きかも知れませんが、そのショートピンは4pinなのでショートピンは2個実装できます。
ショートピンを2個実装すると4通りのキャラジェネパターンが選択できるようになります。
その場合には8PディップスイッチのbRとbSをOFFにします。


ショートピンを2個実装しました。


ソフトウェアの方はといいますと。
前回の説明で文字の色指定に使う下位4ビットのうち空いているビット3をキャラジェネの切換えに使うと書きました。
背景色の指定には上位4ビットを使いますがこちらも3ビットしか使わないので、空いているビット7もキャラジェネの切換えに使うことにします。
 b b b b b b b
↑   背景色   ↑   文字色 

この2ビット(矢印のビット)を使うと4通りの指定ができます。

前回はPC8001とMZ80のキャラジェネを切り換えて表示しました。
昔MZ80をお持ちだった方はご存知かと思いますが、MZ80は画面に文字を表示するのにPC8001のように通常の文字コードを使うのではなくて、それとは別の文字配列のディスプレイコードというものを使ったのだそうです。
つまりMZ80は前回お見せした文字コードとは別のキャラクタパターンがもう一組あったことになります。

こちらは前回もお見せしたPC8001の文字パターンです。
説明の都合上、PC8001とMZ80のパターンの位置を入れ替えました。


こちらは前回お見せしたMZ80の文字パターンです。


そして下がMZ80のディスプレイパターンです。

かなりのキャラクタパターンが共通ですが各パターンに割り当てられた文字コードは全然異なっています。
せっかくなのでこのキャラクタパターンも上で説明しました仕組みを使って切り換えて表示できるように考えました。

ということは、キャラジェネROMにこのパターンも追加しなければなりません。
なかなかに面倒な作業なのです。
なにやらいっぱい書き込みがありますが、実際にひとつひとつ手作業でデータを打ち込んでいった作業のあとなのです。
この作業は私の娘に担当してもらいました。
先にキャラジェネデータとして作成済みのMZ80のパターンと共通のものはできるだけコピーすることで工数を減らしましたが、こちらにしかないものは新規に1バイトずつキーボードから打ち込んで作成しました。
以前からあるパターンでもアドレスを計算してコピーするよりも、新たにキーボードから打ち込んだほうが早い、という場合もありました。

こういう作業にはND80Z3.5が大いに役立ちます。
新規のデータ作成にはCM(チェンジメモリ)コマンドが役立ちます。
データのコピーにはMV(ムーブ)コマンドが役立ちます。
下はその作業を行なったときのログの一部です。

logfile nd80zlog\10152309.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld cgpcmzf.bin,8000
loading CGPCMZF.BIN ...1800(6144)bytes loaded,from 8000 to 97FF
>cm 9000
9000 54-00
9001 14-00
9002 14-00
9003 00-00
9004 8A-00
9005 CD-00
9006 78-00
9007 9C-00
9008 18-
>mv 8b80,8bf7,9680
>mv 8bf8,8bff,9600
>mv 8888,88b7,9608
>cm 90d8
90D8 AA-08
90D9 C3-08
90DA E2-08
90DB 55-08
90DC AA-ff
90DD 46-08
90DE 21-08
90DF 41-08
90E0 A8-08
90E1 31-08
90E2 80-08
90E3 1D-08
90E4 CA-0f
90E5 5D-00
90E6 22-00
90E7 E7-00
90E8 A0-08
90E9 B1-08
90EA 36-08
90EB D0-08
90EC AB-f8
90ED 65-00
90EE C1-00
90EF 9D-00
90F0 21-08
90F1 75-08
90F2 8E-08
90F3 F7-08
90F4 09-0f
90F5 55-08
90F6 AA-08
90F7 15-08
90F8 8E-08
90F9 44-08
90FA 01-08
90FB 15-08
90FC 36-ff
90FD 48-00
90FE 27-00
90FF D7-00

このようにして作成したデータはDM(ダンプメモリ)コマンドで表示して確認することができますが、8ビットのデータがただ並んで表示されるだけなので、キャラジェネパターンとして正しいデータなのかどこかにミスがあるのかを確かめることは困難です。
こんな感じです。

>dm 9000,907f
9000  00 00 00 00 00 00 00 00-18 24 42 7E 42 42 42 00  .........$B~BBB.
9010  7C 22 22 3C 22 22 7C 00-1C 22 40 40 40 22 1C 00  |""<""|.."@@@"..
9020  78 24 22 22 22 24 78 00-7E 40 40 78 40 40 7E 00  x$"""$x.~@@x@@~.
9030  7E 40 40 78 40 40 40 00-1C 22 40 4E 42 22 1C 00  ~@@x@@@.."@NB"..
9040  42 42 42 7E 42 42 42 00-1C 08 08 08 08 08 1C 00  BBB~BBB.........
9050  0E 04 04 04 04 44 38 00-42 44 48 70 48 44 42 00  .....D8.BDHpHDB.
9060  40 40 40 40 40 40 7E 00-42 66 5A 5A 42 42 42 00  @@@@@@~.BfZZBBB.
9070  42 62 52 4A 46 42 42 00-18 24 42 42 42 24 18 00  BbRJFBB..$BBB$..

実際にROMに焼いて画面に表示させてみるという手もありますが、作業の途中でそれをやるのも面倒です。
ND80Z3.5はそういう局面でも大いに役立ちます。
そういうときには簡単にBASICプログラムをささっと書いてしまいましょう。
BASICを使うとこんなことができてしまいます。

>logfile nd80zlog\10161416.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld cgprint2.txt,a000
loading CGPRINT2.TXT ...017a(378)bytes loaded,from A000 to A179
>/ld cgpcmzh.bin,8000
loading CGPCMZH.BIN ...1800(6144)bytes loaded,from 8000 to 97FF
>r.

>/ld cgpcmzh.bin,8000
loading CGPCMZH.BIN ...1800(6144)bytes loaded,from 8000 to 97FF
>/load cgprint2.txt,a000
    10 FOR A=$9000 TO $97F8 STEP 64
    20 FOR D%=0 TO 7
    30 PRINT HEX$(A+D%*8,4);"     ";
    40 NEXT D%
    50 PRINT 
    60 FOR N=0 TO 7
    70 FOR D%=0 TO 7
    80 B%=PEEK(A+D%*8+N)
    90 FOR C%=7 TO 0 STEP -1
   100 IF BIT(B%,C%)=1 THEN PRINT "@";ELSE PRINT ".";
   110 NEXT C%
   120 PRINT " ";
   130 NEXT D%
   140 PRINT 
   150 NEXT N
   160 NEXT A
data end
>r.
9000     9008     9010     9018     9020     9028     9030     9038     
........ ...@@... .@@@@@.. ...@@@.. .@@@@... .@@@@@@. .@@@@@@. ...@@@.. 
........ ..@..@.. ..@...@. ..@...@. ..@..@.. .@...... .@...... ..@...@. 
........ .@....@. ..@...@. .@...... ..@...@. .@...... .@...... .@...... 
........ .@@@@@@. ..@@@@.. .@...... ..@...@. .@@@@... .@@@@... .@..@@@. 
........ .@....@. ..@...@. .@...... ..@...@. .@...... .@...... .@....@. 
........ .@....@. ..@...@. ..@...@. ..@..@.. .@...... .@...... ..@...@. 
........ .@....@. .@@@@@.. ...@@@.. .@@@@... .@@@@@@. .@...... ...@@@.. 
........ ........ ........ ........ ........ ........ ........ ........ 
9040     9048     9050     9058     9060     9068     9070     9078     
.@....@. ...@@@.. ....@@@. .@....@. .@...... .@....@. .@....@. ...@@... 
.@....@. ....@... .....@.. .@...@.. .@...... .@@..@@. .@@...@. ..@..@.. 
.@....@. ....@... .....@.. .@..@... .@...... .@.@@.@. .@.@..@. .@....@. 
.@@@@@@. ....@... .....@.. .@@@.... .@...... .@.@@.@. .@..@.@. .@....@. 
.@....@. ....@... .....@.. .@..@... .@...... .@....@. .@...@@. .@....@. 
.@....@. ....@... .@...@.. .@...@.. .@...... .@....@. .@....@. ..@..@.. 
.@....@. ...@@@.. ..@@@... .@....@. .@@@@@@. .@....@. .@....@. ...@@... 
........ ........ ........ ........ ........ ........ ........ ........ 
9080     9088     9090     9098     90A0     90A8     90B0     90B8     
.@@@@@.. ...@@... .@@@@@.. ..@@@@.. ..@@@@@. .@....@. .@....@. .@....@. 
.@....@. ..@..@.. .@....@. .@....@. ....@... .@....@. .@....@. .@....@. 
.@....@. .@....@. .@....@. .@...... ....@... .@....@. .@....@. .@....@. 
.@@@@@.. .@....@. .@@@@@.. ..@@@@.. ....@... .@....@. ..@..@.. .@.@@.@. 
.@...... .@..@.@. .@..@... ......@. ....@... .@....@. ..@..@.. .@.@@.@. 
.@...... ..@..@.. .@...@.. .@....@. ....@... .@....@. ...@@... .@@..@@. 
.@...... ...@@.@. .@....@. ..@@@@.. ....@... ..@@@@.. ...@@... .@....@. 
........ ........ ........ ........ ........ ........ ........ ........ 
90C0     90C8     90D0     90D8     90E0     90E8     90F0     90F8     
.@....@. ..@...@. .@@@@@@. ....@... ....@... ....@... ....@... ....@... 
.@....@. ..@...@. ......@. ....@... ....@... ....@... ....@... ....@... 
..@..@.. ..@...@. .....@.. ....@... ....@... ....@... ....@... ....@... 
...@@... ...@@@.. ...@@... ....@... ....@... ....@... ....@... ....@... 
..@..@.. ....@... ..@..... @@@@@@@@ ....@@@@ @@@@@... ....@@@@ @@@@@@@@ 
.@....@. ....@... .@...... ....@... ........ ........ ....@... ........ 
.@....@. ....@... .@@@@@@. ....@... ........ ........ ....@... ........ 
........ ........ ........ ....@... ........ ........ ....@... ........ 
9100     9108     9110     9118     9120     9128     9130     9138     
..@@@@.. ....@... ..@@@@.. ..@@@@.. .....@.. .@@@@@@. ...@@@.. .@@@@@@. 
.@....@. ...@@... .@....@. .@....@. ....@@.. .@...... ..@..... .@....@. 
.@...@@. ..@.@... ......@. ......@. ...@.@.. .@@@@... .@...... .....@.. 
.@.@@.@. ....@... ....@@.. ...@@@.. ..@..@.. .....@.. .@@@@@.. ....@... 
.@@...@. ....@... ..@@.... ......@. .@@@@@@. ......@. .@....@. ...@.... 
.@....@. ....@... .@...... .@....@. .....@.. .@...@.. .@....@. ...@.... 
..@@@@.. ..@@@@@. .@@@@@@. ..@@@@.. .....@.. ..@@@... ..@@@@.. ...@.... 
........ ........ ........ ........ ........ ........ ........ ........ 

簡単に、と書きましたがプログラムに不慣れな方には何をやっているのかさっぱりわからないというようなプログラムです。
キャラジェネデータは仮の作業場所としてRAMに作成しました。
たとえば”A”のデータはメモリアドレス9008から900Fにあります。
18 24 42 7E 42 42 42 00 です。
”B”は9010から9017で、”C”は9018から901Fです。
各ビットの1を @ で 0を . に置き換えて表示します。
そのままPRINT文で表示すると縦にだらだらと表示されてしまいます。
そこでちょいと工夫して横に8キャラクタずつ表示するようにしました。
こうするとうんと見易くなるのですが、逆にプログラムは分かりにくいものになります。
こういうプログラムは慣れないとなかなか簡単には書けないとは思いますが、しかしこんなことが「簡単に」できてしまうというところも、ND80Z3.5の優れた点なのです。

本日は時間がなくなってしまいました。
次回に続きます。

CRT/VGAIF+KEYIF+SDCARDIFボードの製作[総合第108回]
2017.10.17upload

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