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

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

昔ながらの BASIC(6)

Z80フィボナッチ数列の例を変換した結果から

    PUSH HL
    POP HL

は不要なので取り除くと以下のようになります。「CALL OUTPUT」で数値を出力できるものとします。

; フィボナッチ数列
    LD HL, 10
    LD (var_N), HL    ; N = 10
    LD HL, 1
    LD (var_I), HL    ; I = 1
    LD HL, 1
    LD (var_A), HL    ; A = 1
    LD HL, 1
    LD (var_B), HL    ; B = 1
LABEL_100:
    LD HL, (var_A)
    PUSH HL
    CALL OUTPUT      ; A を出力
    LD HL, (var_B)
    LD (var_T), HL    ; T = B
    LD HL, (var_A)
    PUSH HL
    LD HL, (var_B)
    PUSH HL
    POP DE
    POP HL
    ADD HL, DE
    LD (var_B), HL    ; B = A + B
    LD HL, (var_T)
    LD (var_A), HL    ; A = T
    LD HL, (var_I)
    PUSH HL
    LD HL, 1
    PUSH HL
    POP DE
    POP HL
    ADD HL, DE
    LD (var_I), HL    ; I = I + 1
    LD HL, (var_I)
    PUSH HL
    LD HL, (var_N)
    PUSH HL
    POP DE        ; DE = N
    POP HL        ; HL = I
    OR A          ; キャリーフラグをクリア
    SBC HL, DE    ; I - N を計算
    JP Z CMP_TRUE_0    ; 0 のとき CMP_TRUE_0 へ
    JP M CMP_TRUE_0    ; 負のとき CMP_TRUE_0 へ
    LD HL, 0
    PUSH HL      ; I - N <= 0 ではないときスタックに 0 を PUSH
    JP CMP_END_0    ; CMP_END_0 へ
CMP_TRUE_0:
    LD HL, 1
    PUSH HL      ; I - N <= 0 のときスタックに 1 を PUSH
CMP_END_0:
    POP HL       ; HL は I - N <= 0 のとき 1、そうではないとき 0
    LD A, H
    OR L         ; HL が 0 かどうかを調べる
    JP NZ, LABEL_100    ; I - N <= 0 のとき LABEL_100 へ
; 本来はここで終了

; --- Variable Declarations ---
var_N: DW 0
var_A: DW 0
var_I: DW 0
var_B: DW 0
var_T: DW 0

良さそうです。