ちょっと Tea Time!? 記念品購入したみた(Super AKI80,XCC−V Cコンパイラ) 2025.8.28

先日、秋月2Fに行ったところZ80互換CPUをつかったSuper AKI80が280円で売られていました。
通販では保守品として2000円で売られていますが、長期保管品ということで安価になっています。
実は、前回に秋月に行ったときにも見かけたのですが、そのときはあまり琴線に触れませんでしたが、
なぜか商品POPの「記念にどうぞ」とあったので、それに触発されてか1個購入です。
ついでに、その隣にあったXCC−V Cコンパイラなるものも購入です(モニターROM付きで1000円)。


記念品にどうぞ、ということなので折角ですから購入です。


保守品ということで、IC以外は何も実装されていません。



コアCPUは12MHzのようです。


モニターROMは今時では珍しいUV-EPROMの27C256です。チップが小さい。


XCCV(Cコンパイラ)を動かしてみましょう!

折角なので、コンパイラをインストールしてみました。
もともとはXPまでのOS用のようなのですが、Win10にもインストールできました。
ただし、統合環境のソフトは上手く動かないので、コマンドラインでの操作になります。


まずはXCCVをインストールして動かしてみます。

秋月の付録についていたものは、1枚だけの情報でこれでは何が何やらです。
で、関連する情報をDLしてみました。
ただ、こちらも分量が多くて読破する気になりません。
Cコンパイラ XCC-V Z80固有仕様.pdf へのリンク
Cコンパイラ XCC-V 使用手引き.pdf へのリンク
GAIOフレームワーク取扱説明書.pdf へのリンク
アセンブラ XASS-V Z80固有仕様.pdf へのリンク
アセンブラ XASS-V 使用手引き.pdf へのリンク

こういう時のネット頼りです。使い方などについで解説してくれているHPがあり、
勉強させていただきました。

akizuki-Z80-C-tutorial1/README.MD at main ・ KyoichiSato/akizuki-Z80-C-tutorial1 ・ GitHub
2025年04月: PICマイコンは面白い

あえて追加するなら、浮動小数点の算術演算や、入出力関数を使うなら
ライブライを追加しておく必要があります。これがないとリンクのときに、
関数が未定義と文句を言われます。
 なお、このリンク情報を入れているファイルの拡張子がxlsなものだから、
そのままクリックするとエクセルがたちがってしまうのが面倒です。気を付けないと
いけません。

 下記の青記の部分が、追加しておいたほうがよい情報です。

;-------------------------------+
; linkage module |
;-------------------------------+
/Name=DEMO
/modl=startup
/modl=demo
/modl=ass_power
/slib=c:\akiz80\lib\z80\cs\csze1.xlb
/slib=c:\akiz80\lib\z80\math\matze1.xlb
/slib=c:\akiz80\lib\z80\std\stdze1.xlb

このコンパイラですがC言語を一度アセンブラに変換します。
最終的にはHEXファイル(拡張xho)になりますが、途中での情報も色々とでてくるので、
コンパイラがどのような動作をしてるかがよくわかります。

折角クロスコンパイラが動くのだから、その動作確認のためにSuper AKI80も
単に記念品として置いておくだけでなく、動かしたくなります。
記念品としては、次に秋月に行ったときにでゲットしましょう(笑。
マニアが同じものを3個買うのと似ているかなあ〜。
1個は使う為、1個は観賞用、1個は予備とか(爆。

Super AKI80を動かしてみる!

本来、この基板を動かすにはROMを差し込む必要がありますがROMなんて持っていません。
探せばあるかもしれませんが、ライターもなければミスしたときのイレーサー(紫外線蛍光灯)
もありません。
 基板上には搭載された32kBのRAMはアドレスは0x8000〜から割り付けてあります。
Z80はリセットされるとアドレス0x0000からスタートしますから、RAMの配置変更が必要です。
 もういっそのこと、現在のRAM(32kB)をとりはずして、容量の大きなRAMに入れ替えて
64kBの空間をすべてRAMにしてしまおうか?それとも、現在のRAMのアドレスだけ
0x0000-0x7fffに変更しようか?色々と悩みます。
 なお、RAMへの書き込みは、Z80のバスにPICかPICOのGPIOを接続しておいて、
そこから強制的にRAMに書き込めばいいでしょう。

RAMは64kB置き換えで!

最初はメモリーは32kBで十分だろうと思っていましたが、
下記のような浮動小数点演算や入出力関数(sprintf)を入れたら、
なんとちょっとのプログラムでバイナリー容量が32kBを越えてきました。
 どうやら、リンクされるファイル容量がかなりおおきそうです。

#include "stdio.h"
#include "math.h"

main()
{
 double a,b,c,d,e;
 char buf[100];

 a = 1.235;
 b=sin(a);
 c=tan(b);
 d = atan(c);
 sprintf(buf,"%f %f %f",a,b,c);
}

32kBのRAMのままだと、動かない可能がでてくるので、ここはRAMが64kBに増設しておいたほうがよさそうです。


まずは既存のRAMを取り外しです。



メモリー回りは部品をかなり省略します。RAMのCS(Pin20)は使わないので常にGND接続です。


取り換えのSRAM(M68127B:128kx8)については、
Pin2(A16)をROMの#CS(A15)に接続。Pin31(A15)はVCCに接続です。



RAMを載せ替えです。128kBのRAMなので半分だけ使います。


不要なロジックも取り外しです。


基板の裏側です。Super AKI80では、なぜかA8〜A15がコネクタの接続されていないので、
アドレスやデータ線はROM位置からピンを接続してつかうことにします。



マイコンはPICで

本当はPICO(RP2040マイコン)が速度や容量の点から使いたかったのです。フラッシュROMが2MBあるので、
色々なサンプルプログラムのバイナリーを格納することができます。ただRP2040は3.3Vロジックなので、
5VのZ80と接続するには、レベル変換が必要です。とくにDATAラインは入出力兼用なので、PICOから送り出す
ときは3.3V→5Vに変換して、Z80からPICOに受信する場合は5V→3.3Vに変換が必要です。5V動作のPICであれば
Z80のデータラインとPICのGPIOは直結できますが、PICOの場合だと74AC245(3.3Vを5Vロジックへ)と74LVC245
(5Vを3.3Vロジックへ)をつかって変換する必要があり、すこし面倒です。

 PICで5V動作品であれば、レベル変換などの面倒なことは考慮しなくて済みます。
そしてPIC18F47Q43をつかえば、フラッシュ容量が128kBはあるので2〜3個はZ80用のプログラムが搭載できる
でしょう。まあ、今回はSuper AKI80を動かしてみるのが目的ですから、そう欲張った仕様にしなくてもいいので、
PICで組むことにしましょう。


PICでSuperAKI80のRAMの書き換えを行います。回路は簡単です。配線も多そうですが、やりだしたら早いでしょう。

製作にかかりましょう! 2025.8.29


Super AKI80の動作テスト基板ができました。


配線はこんな感じです。なかなか綺麗には出来ないなあ〜。まだまだ修行が必要です。



変更版の回路図です。40PinのPICだとI/Oが35本確保できるので、3本余りました。これがRP2040ボードだと2本足りない事態になります。

動かしてみましょう! 2025.8.31

既存のZ80モニタープログラムを修正して組み込みです。
配線の見直しなども含めて、デバッグです。

ん?動かなくなったぞ?

あ!電源逆接してしまったあ〜!

配線の見直しのときは当然のことながら電源をはずしますが、
再度とりつけるときに電源クリップの正負を逆に挟んでいることに気付きました!
ああ〜大丈夫かなあ〜。

今回は基板にICを直付けしているので、それらが壊れたら心が折れそうです。
で、電源をもとに戻して、素子をチェックです。
まず、PICとそれに接続しているロジックICは大丈夫そうです。
つぎは、Z80ですがクロックもでているし、各線から信号は出ている感じです。

でも、メモリー(SRAM)がおかしいです。読み出しデータがすべて0xFFになっています。
こりゃ、メモリーのバッファー部分がやられたかなあ〜。

ということで、メモリーの交換です。メモリーは初期のメモリーバッファーを作ったときに
SRAMの予備を買っていたので余裕があり、助かりました。


動き出したかな?

ようやく、Super AKI80が動き出したような感じです。電源の逆接でAKI80の裏面に実装してある
PIOは大丈夫かな?超簡単なプログラムを書いて動かしてみましょう!

機械語で直接プログラムです。0000番地から下記の
命令を書き込みます。

 3E  80  ; PPIのコマンド設定(ポートA,B,Cはすべて出力設定)
 D3 33  ; PPIのコマンドアドレスに書き込み(0x33番地)
 3E 00  ; ポートAに00を書きこむ準備(レジスタAに設定) クロック7
 D3 30  ; PPIのポートAに書き込み(0x30番地) クロック11
 3E FF  ; ポートAにFFを書きこむ準備(レジスタAに設定) クロック7
 D3 30  ; PPIのポートAに書き込み(0x30番地) クロック11
 C3 04 00 ; 青記の最初の部分にジャンプ(0004番地) クロック10


実行すると下記のようにポートから信号がでました。

PIOから信号がでました。信号の周期は267kHzになります。

青記のループ部分のクロック数はトータルで46クロックになります。
Z80の動作周波数が12.288MHzなので46で割ると、267kHzになりますから、
CPUも含めて正常に動いているようです。

ついでに、C言語でも書けるようにoutp()なる関数を作ってみました。
う〜ん、なんか10倍くらい遅くなりました。
もうちょと、工夫しないといけないなあ〜。

void outp(int port,int data)
{
 #asm
 push   IX
 ld     IX,0
 add    IX,SP
 ld     B,(IX+6)
 ld     C,(IX+4)
 OUT   (C),B
 ld     SP,IX
 pop    IX
 #endasm
}

void main()
{
  outp(0x33,0x80);
  for(;;){
    outp(0x30,0xff);
    outp(0x30,0x00);
  
}
}


信号の出力周期は27kHzになりました。必要クロックは450です。
かなりかかるなあ〜。


とりあえず
電源を逆接したときは、一時はどうなることかと思いましたが、
なんとか復旧できてよかったです。でないと、明日からの出張中に
悶々としそうです。


音源IC(AY-3-8910A)を搭載しましょう! 2025.9.3

単にSuper AKI80を動かすだけでは面白くないので、
なにかI/Oをつけようということで、音源IC(AY-3-8910A)を
PPIに接続してみることにしました。
 クロック源は1.78977MHzが必要なこともあり、Si5351のクロックジェネレータを
搭載して、I2CでPICで制御します。


折角なのでSuper AKI80のPPIに音源ICを2個接続してみることにしました。


実装完了です!


Super AKi80の真下に隠れてしまいますが、まあ仕方ないです。


(つづく)