ブートロード成功
システムとしてはまだ完成してませんが、とりあえずArduinoからZ80のブートロード(と言っていいのか)が上手くいきました。
- BUSRQでバス権を取る
- RAMにプログラムを転送
- 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
そして実測値は、
バッチリ。
……とはいえ、そろそろこの方法から脱却したいですね。今回はArduinoが動作中のZ80ボードに直接繋がっているので、BUSRQでZ80を止めてからRAMを見に行けば複雑な動作の確認も可能ではあります。ですが、ここはもうちょっと踏み込んで、Z80側に「レジスタ内容をRAMにダンプした上でArduinoにバス権を明け渡す」ようなシステムコールを実装する予定です。デバッグするのにすごく役立ちそう。