Z80でLチカ!

f:id:marlesan:20161104012238j:plain:w400
思ったより簡単に動いてくれました。手こずったのはICのGNDつなぎ忘れなどの凡ミスばかり。

Lチカプログラムはとてもシンプルです。

PIOAD:  equ     0
PIOAC:  equ     1

        org     0
;
;       PIO初期設定
        ld      a,11001111b ;ビットモードで動作
        out     PIOAC,a
        ld      a,00001111b ;出力4bit/入力4bit
        out     PIOAC,a
;
;       LEDチカチカ
        ld      a,0
        ld      b,0
BLINK:  inc     a
        out     PIOAD,a
DELAY:  inc     b
        jp      nz,DELAY
        jp      BLINK

これでPIOのAポート最上位ビットにLEDを繋ぐと秒間5回くらいの速度でチカチカします。せっかくなので計算してみましょうか。

000C: 3C       [ 4]     BLINK:  inc     a
000D: D300     [15]             out     PIOAD,a
000F: 04       [ 4]     DELAY:  inc     b
0010: C20F00   [14|14]          jp      nz,DELAY
0013: C30C00   [24]             jp      BLINK

Aレジスタが1回INCするのに15+14*256+10=3609クロック。この256倍が1回の明滅の周期で、923904クロック。これに1クロック=250nsをかけて秒に直すと、230976000/1000000000=0.230976秒。秒間約4.33回チカで体感に近いです。手持ちのテスターでLチカ部分の周波数を計ると…

f:id:marlesan:20161104015141j:plain:w400

バッチリですね!

今回、一番の壁はZ80PIOの扱いだと思ってたんですが、さすがファミリLSI。回路はCPUと直結、プログラムはたかだか4行の設定で何事もなく動いてくれました。次はRAMを組み込むのが順当でしょう。そこまでならギリギリ、ブレッドボードで組めそうです。

あ、Lチカの喜びで忘れてましたが、電源投入時の動作に難があったんでした。写真の回路ではリセットを何回かポチポチしないとCPUが動き始めないのです。さすがに無視できない問題なので、RAMに取り組む前に調査したいと思います。