非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

昔ながらの BASIC(8)

8086 の例を参考に 68000 のフィボナッチ数列の例を変換した結果にコメントを追加します。「JSR OUTPUT」で数値を出力できるものとします。

【電子復刻版】bit 1984年07月号(通巻185号)』に「68000の命令セット」という記事があるのでこれも参考になるかもしれません。

; フィボナッチ数列
    MOVE.L #10, -(A7)
    MOVE.L (A7)+, VAR_N    ; N = 10
    MOVE.L #1, -(A7)
    MOVE.L (A7)+, VAR_I    ; I = 1
    MOVE.L #1, -(A7)
    MOVE.L (A7)+, VAR_A    ; A = 1
    MOVE.L #1, -(A7)
    MOVE.L (A7)+, VAR_B    ; B = 1
LABEL_100:
    MOVE.L VAR_A, -(A7)
    JSR OUTPUT            ; A を出力
    MOVE.L VAR_B, -(A7)
    MOVE.L (A7)+, VAR_T   ; T = B
    MOVE.L VAR_A, -(A7)
    MOVE.L VAR_B, -(A7)
    MOVE.L (A7)+, D0
    MOVE.L (A7)+, D1
    ADD.L D0, D1
    MOVE.L D1, -(A7)
    MOVE.L (A7)+, VAR_B   ; B = A + B
    MOVE.L VAR_T, -(A7)
    MOVE.L (A7)+, VAR_A    ; A = T
    MOVE.L VAR_I, -(A7)
    MOVE.L #1, -(A7)
    MOVE.L (A7)+, D0
    MOVE.L (A7)+, D1
    ADD.L D0, D1
    MOVE.L D1, -(A7)
    MOVE.L (A7)+, VAR_I    ; I = I + 1
    MOVE.L VAR_I, -(A7)
    MOVE.L VAR_N, -(A7)
    MOVE.L (A7)+, D0    ; D0 = N
    MOVE.L (A7)+, D1    ; D1 = I
    CMP.L D0, D1        ; I と N を比較
    BLE LABEL_TRUE_0    ; I <= N のとき LABEL_TRUE_0 へ
    MOVE.L #0, -(A7)    ; I - N <= 0 ではないときスタックに 0 を PUSH
    BRA LABEL_END_0    ; LABEL_END_0 へ
LABEL_TRUE_0:
    MOVE.L #1, -(A7)    ; I - N <= 0 のときスタックに 1 を PUSH
LABEL_END_0:
    MOVE.L (A7)+, D0
    TST.L D0         ; D0 が 0 かどうかを調べる
    BNE LABEL_100    ; I - N <= 0 のとき LABEL_100 へ
; 本来はここで終了

    SECTION DATA
VAR_N: DC.L 0
VAR_A: DC.L 0
VAR_I: DC.L 0
VAR_B: DC.L 0
VAR_T: DC.L 0

良さそうです。