目次 †
TK-85の動作確認を行う †
1:次のプログラムのマシン語の部分を、8000h番地から入力していった。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| | ORG 8000H
8000: 21 F8 83 START: LXI H,83F8H
8003: 3E 08 MVI A,08
8005: 36 40 LOOP: MVI M,40H
8007: CD 14 80 CALL ADDR1
800A: 36 00 MVI M,00
800C: 23 INX H
800D: 3D DCR A
800E: C2 05 80 JNZ LOOP
8011: C3 00 80 JMP START
8014: 16 40 ADDR1: MVI D,40H
8016: 06 00 ADDR2: MVI B,00
8018: 05 ADDR3: DCR B
8019: C2 18 80 JNZ ADDR3
801C: 15 DCR D
801D: C2 16 80 JNZ ADDR2
8020: C9 RET
|
2:入力後にまた8000h番地に移動して、AUTOにスイッチが入っていることを確認してから、[RUN]を押す。
3:LEDの上を矢印が左から右に移動していけば、TK-85がきちんと動作し、しかもプログラムに間違いがないことが判明する(動画)。
プログラムの解説 †
2〜10行目がメインプログラム(注目する桁を変化させる処理を担当)、12行目〜18行目が待機処理用サブルーチン(同じ桁で矢印が表示され続ける処理を担当)になっている。
- 2行目の「LXI H,83F8H」でHLレジスタに83F8hをセット(H=83h,L=F8h)。
- 83F8h番地はアドレスディスプレイの上1桁目のためのセグメントデータバッファである。
- 3行目の「MVI A,08」でAレジスタに8をセット。
- LEDが8桁あることに関係する。
- Aレジスタは注目しているLEDの桁数に対応する。
- 4行目の「MVI M,40H」でHLレジスタにセットされているアドレス値に40hをセット。
- 40hはハイフンを対応するセグメントデータである。
- つまり、アドレスディスプレイの上1桁目にハイフンが表示される。
- 5行目の「CALL ADDR1」でラベル名ADDR1のアドレス値(12行目)の命令が呼び出される。
- 6行目の「MVI M,00」でHLレジスタにアドレス値に00hをセット。
- 00hは表示なしを意味する。
- つまり、アドレスディスプレイの上1桁目のハイフンの表示が消える。
- 7行目の「INX H」でHLレジスタの内容を+1する。
- 8行目の「DCR A」でAレジスタの内容を-1する。
- 9行目の「JNZ LOOP」でZフラグが0ならばラベル名LOOPのアドレス値にジャンプする。
- 10行目の「JMP START」でラベル名STARTのアドレス値にジャンプする。
- Aを8からデクリメントしていき、0になるとゼロフラグが立つので、Aに8をセットするところまで戻る。つまり、8桁目→7桁目→…→1桁目→8桁目→…と注目する桁が変化していく(これは矢印の動きに対応)。
- 12行目の「MVI D,40H」でDレジスタに40hをセットする。
- このDレジスタは矢印がその場で表示され続ける時間に対応している。
- 13行目の「MVI B,00」でBレジスタに0をセットする。
- 14行目の「DCR B」でBレジスタの内容を-1する。
- この処理が実行されると、Bレジスタは常に-1になる。
- 15行目の「JNZ ADDR3」でZフラグが0ならばラベル名ADDR3のアドレス値にジャンプする。
- 16行目の「DCR D」でDレジスタの内容を-1にする。
- 17行目の「JNZ ADDR2」でZフラグが0ならばラベル名ADDR2のアドレス値にジャンプする。
- つまり、Dレジスタが40hからデクリメントされていき、最終的に0になったら、ジャンプせずに18行目のRET命令によりサブルーチンを抜け出す。
プログラムの改造 †
上記プログラムの8014〜8015番地を「MVI D,40H」から「MVI D,20H」に変更するして、同じく8000h番地に移動してからプログラムを走らせると、矢印の動きが早くなったことを確認できるはずである(動画)。
参考文献 †