1.はじめに
秋月さんが秋葉原店で安売りしていた Super AKI-80 から取り外したCPU(東芝製TMPZ84C015)を使って開発した TMPZ84Compact(下の写真)はハードを開発してからかなり時間が経ちましたが、ここで制御用に使用している20ピンの PIC(PIC18F14K50)には8bitの符号無し乗算を1サイクルで実行できる命令があることを思い出しました。今回、この乗算機能を Z80 から利用できるようにしてみたので記録しておきます。| 開発したTMPZ84Compact |
|
|
2.PICの乗算命令
下図は PIC のデータシートから引用した命令表の一部です。黄色マーカー部に記載されているように1サイクルで8bitの乗算が完了します。実は「CPLD(XC9572)で遊ぶ」の記事で書いた XC9572 を使って8x8の乗算器を作って TMPZ84Compact に接続してみようかとも考えていたのですが、上述のように PIC に同様の機能があるのでPIC 側を使うことにしました。
| PICの命令表(抜粋) |
|
|
3.Z80とのインターフェース
もともと PIC から Z80 にパソコンとの通信機能やSDアクセス機能を提供しているので、同様の手法で乗算機能を利用できるように対応するサービスIDを追加しました。具体的には下記のようなコードでZ80が乗算機能を利用できるようにしました。
| 乗算機能使用のサンプルソース(Z80アセンブラ) |
|---|
;+++++++++++++++++++++++++++++++++++++++++++
; PIC18 Mul service test
; ver 0.01 2026/04/01 skyriver
;+++++++++++++++++++++++++++++++++++++++++++
INCLUDE TMPZ84C.INC
0007 MUL_SRV EQU 7 ; MUL service ID
ORG 0100H
0100 3E 07 START: LD A,MUL_SRV
0102 D3 01 OUT (CMDPORT),A ; send mul service ID
0104 2A 0200 LD HL,(MULVAL)
0107 7D LD A,L
0108 D3 00 OUT (DATPORT),A ; send variable0
010A 7C LD A,H
010B D3 00 OUT (DATPORT),A ; send variable1
010D DB 00 IN A,(DATPORT) ; get result(low)
010F 6F LD L,A
0110 DB 00 IN A,(DATPORT) ; get result(high)
0112 67 LD H,A
0113 22 0202 LD (RESULT),HL
0116 C9 RET
ORG 0200H
0200 04 05 MULVAL: DB 4,5
0202 RESULT: DS 2
END
|
CP/M環境でGAME言語を使って下記のソースで 0x00~0xff の全範囲での乗算結果の検証を行い、問題無いことを確認しました。
尚、下記のソースで 1000~1040行の部分は動作確認のためのもので最終的には非実行にしています。
| 乗算機能の検証ソース(GAME言語) |
|---|
1'++++++++++++++++++++++++++++++++++++ 2' PIC18 Mul service function test 3' ver 0.01 2026/04/01 skyriver 4'++++++++++++++++++++++++++++++++++++ 10 M=$2000 20 M(1)=$2100 M(3)=$073E M(4)=$01D3 M(5)=$D37D 30 M(6)=$7C00 M(7)=$00D3 M(8)=$00DB M(9)=$DB6F 40 M(10)=$6700 M(11)=$2200 M(12)=M M(13)=$C9 50 #=2000 1000 /"input val0" M:4)=? 1002 ;=M:4)=0 #=-1 1010 " val1" M:5)=? 1020 >=$2002 1030 /"result:" ?=M(0) 1040 #=1000 2000 I=0,255 2002 "." 2010 M:4)=I 2020 J=0,255 2030 M:5)=J 2040 >=$2002 2050 ;=M(0)<>(I*J) /"error at " ?=I " x " ?=J " ans:" ?=M(0) #=-1 2060 @=J+1 2070 @=I+1 |
4.乗算機能の評価
追加した乗算機能を評価するために ASCIIART のアセンブラソースに適用してみました。この ASCIIART の処理は2バイトの固定小数点を使って高速化しています。2バイトの乗算を行うために乗数をバイトに分割して処理するバイト分割法を使いました。実行した際の画面キャプチャが下図になります。今回追加した乗算機能を使った場合、マンデルブロ描画は 14.5秒で完了しました(TMPZ84C015は
| ASCIIART実行画面 |
|
|
ん~~、思った程には高速化していませんね・・
実は元々のソフト演算による2バイト固定小数点処理を使ったものでは、4.6秒で描画が完了します。
8bitの乗算処理単体では PICから提供する乗算機能の方が速そうですが、2バイト乗算ではバイト分割法によるオーバーヘッドがかなり大きいようです。
最後に、2バイトの固定小数点乗算処理のソースも貼っておきます(後半が元々あったソフト乗算処理)。
| ||
| ※2026/04/03 変更 |
[TOP] [ 前へ ] TMPZ84Compactの開発 [ 次へ ]


AVRと違ってPICはCPIが低いから、Z80比で速くならないかもしれない。
dsPIC30とかをアクセラレータにしてみたい。
Z80には電源供給のみで制御チップがZ80をエミュっているマトリックスのような世界かもしれませんねw