このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

15秒カウンタ

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
TIY    1
TIY    9
CAL TIMER
CY
AO
CY
CAL SHTS
AIY    1
JUMP    13
JUMP    02
CAL ENDS
JUMP    15

電子サイコロ

  • 数字LEDの点灯を使ったサイコロである。
  • 0〜Fのキーのどれかを押し続けている間、LEDの表示1〜6のどれかが止まる。
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
TIY    1
CY
A0
CY
AIY    1
CIY    7
JUMP    0E
TIY    1
KA
JUMP    02
JUMP    0E

2行目〜4行目

  • Yレジスタの内容を表示。

9行目〜10行目

  • KA命令でキー入力を読み取る。
    • キー入力がないと、実行フラグが1になる。
    • キー入力(0〜F)をAレジスタに格納され、実行フラグが0になる。
  • このプログラムではキー入力する値には注目せず、単にどれかが押されていることだけを利用している。
    • キー入力がなけれ02番地にジャンプする。よって、Aレジスタを加算して、7セグメントLEDに表示する処理がまた走る。
    • キー入力があれば0E番地にジャンプする。キー入力を待つ処理が走る。キー入力をし続けている間はここを無限ループする。つまり、7セグメントLEDの表示は変わらない。

Yレジスタを使わずに、Aレジスタだけを利用した例

 次はバグがある例。

  1
  2
  3
  4
  5
  6
  7
  8
  9
TIA    1
A0
AIA    1
CIA    7
JUMP    0C
TIA    1
KA
JUMP    02
JUMP    0C

↓ハンドアセンブル

  1
  2
  3
  4
  5
  6
  7
  8
81
1
91
C7
F0C
81
0
F02
F0C
  • KAを押したときに、押した値がAレジスタに設定され、話したらその値からインクリメントが始まってしまう。つまり、1〜6以外の値、例えば7を押して、離してからまた押したときに8などのサイコロにはない目が出てしまう可能性がある。

16進数1桁の足し算と引き算

  • メモリのデータエリアである50番地に「足される値」、51番地に「足す値」を格納する。
  • プログラムを実行すると数字LEDに計算結果が表示される。もし計算結果が桁上がりをしていた場合は、2進LEDの右端(ビット0番目)が点灯する。
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
TIY    1
MA        ; M(50+Y)=M(50+1)の値をAレジスタに格納。
TIY    0
M+        ; A←A+M(50+Y)=A+M(50+0)=A+M(50)
JUMP    0C    ; 桁上がりをしていたら、2進LEDを表示する処理にジャンプ。
JUMP    10    ; そうでなかったら、いきなり数字LEDを表示する処理にジャンプ。
TIY    0
CAL SETR
A0
JUMP    11

↓ハンドアセンブル

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
A1
5
A0
6
F0C
F10
A0
E1
1
F11

引き算を行うように改造する

  • 4行目の"M+"を"M-"にすると、引き算ができる。
    • 50番地は「引かれる値」、51番地は「引く値」であり、51番地の値の方が50番地の値の方が大きいと、結果がマイナスになるため2進LEDが点灯し、数字LEDには-1を意味するFが表示される。

足す値をキー入力できるようにする。

  • 50番地だけに「足される値」を設定しておき、足す値をキー入力できるようにする。
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
KA
JUMP    00
TIY    0
M+        ; A←A+M(50+Y)=A+M(50+0)=A+M(50)
JUMP    0E    ; 桁上がりをしていたら、2進LEDを表示する処理にジャンプ。
JUMP    12    ; そうでなかったら、いきなり数字LEDを表示する処理にジャンプ。
TIY    0
CAL SETR
A0
JUMP    13

↓ハンドアセンブル

  1
  2
  3
  4
  5
  6
  7
  8
  9
0
F00
A0
6
F0E
F12
A0
E1
1
F13

2つの入力値を加算する

  • 以下のプログラムにはバグがある。
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
KA
JMP    00
TIY    0
AM        ; M(50+Y)=M(50+1)の値をAレジスタに格納。
KA
JMP    07
M+        ; A←A+M(50+Y)=A+M(50+0)=A+M(50)
JUMP    12    ; 桁上がりをしていたら、2進LEDを表示する処理にジャンプ。
JUMP    16    ; そうでなかったら、いきなり数字LEDを表示する処理にジャンプ。
TIY    0
CAL SETR
A0
JUMP    19

↓ハンドアセンブル

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
0
F00
A0
4
0
F07
6
F12
F16
A0
E1
1
F19

 答えはキー入力1回したつもりでも、すでに内部的にキー入力が2回走ってしまうという点である。つまり、実際に動かすとRUNした後に3を押すと、キーを離す前に数字LEDに6が表示されてしまうのである。