ブートロード成功

システムとしてはまだ完成してませんが、とりあえずArduinoからZ80のブートロード(と言っていいのか)が上手くいきました。

  1. BUSRQでバス権を取る
  2. RAMにプログラムを転送
  3. Z80をリセット(RESETアクティブ中にBUSRQを落とす)

動かしたプログラムはやっぱりLチカです。

        org     0x0000
        ld      sp,0xf000
BLINK:  ld      a,0x01
        out     0,a
        call    DELAY
        ld      a,0x00
        out     0,a
        call    DELAY
        jp      BLINK

DELAY:  push    af
        push    bc
        ld      a,0x00
_LOOP1: ld      b,0x00
_LOOP2: djnz    _LOOP2
        inc     a
        jp      nz,_LOOP1
        pop     bc
        pop     af
        ret

PIOついてないですが、74HC74の余った回路にIORQ&WRをトリガとしてD0をラッチさせるようにして、out命令(アドレスはなんでもいい)によるLチカを実現してます。

動作が正常かどうかの確認は例によってLチカの周波数を測定する方法で。前回前々回と同じように計算していくと……

  • DELAY = 29 + (7 + (13 * 255 + 8) + 22) * 256 + 30 = 858171クロック
  • BLINK = 80 + DELAY * 2 = 1716422クロック
  • Lチカ周波数 = 1 / (BLINK * 250ns) = 約2.33Hz

そして実測値は、

f:id:marlesan:20170507050038j:plain:w400

バッチリ。
……とはいえ、そろそろこの方法から脱却したいですね。今回はArduinoが動作中のZ80ボードに直接繋がっているので、BUSRQでZ80を止めてからRAMを見に行けば複雑な動作の確認も可能ではあります。ですが、ここはもうちょっと踏み込んで、Z80側に「レジスタ内容をRAMにダンプした上でArduinoにバス権を明け渡す」ようなシステムコールを実装する予定です。デバッグするのにすごく役立ちそう。