EmacsLisp版を追加
[fizzbuzz.git] / casl / fizzbuzz.casl
index 261cb5d..6c23dd3 100644 (file)
@@ -18,30 +18,41 @@ MAX     DC      100
 ;;    それ以外の数: 数値
 FIZBUZ  START
         RPUSH
-        XOR     GR4,GR4         ; GR4: 文字列の長さおよびフラグ
-CHKFIZ  LAD     GR2,3           ; GR2に3を代入
-        CALL    DIVL            ; GR3 <- GR1 % GR2:3
+        XOR     GR4,GR4         ; GR4: 文字列「Fizz」の長さおよびフラグ
+        XOR     GR5,GR5         ; GR5: 文字列「Buzz」の長さおよびフラグ
+        XOR     GR6,GR6         ; GR6: 文字列「FizzBuzz」のフラグ
+GETFIZ  LD      GR2,FIZNUM      ; GR2にFIZNUM=3を代入
+        CALL    DIVL            ; GR3 <- GR1 % 3(= GR2)
         LD      GR3,GR3         ; GR3のフラグ値を取得
-        JNZ     CHKBUZ          ; GR3が0でない場合、3の倍数ではないので、CHKBUZへジャンプ
-SETFIZ  LAD     GR4,4           ; GR4に文字列「Fizz」の長さ4を代入
-CHKBUZ  LAD     GR2,5           ; GR2に5を代入
-        CALL    DIVL            ; GR3 <- GR1 % GR2:5
+        JNZ     GETBUZ          ; GR3が0でない場合、FIZNUMの倍数ではないので、GETBUZへジャンプ
+        LD      GR4,FIZLEN      ; GR4に文字列「Fizz」の長さFIZLEN=4を代入
+GETBUZ  LD      GR2,BUZNUM      ; GR2にBUZNUM=5を代入
+        CALL    DIVL            ; GR3 <- GR1 % 5(= GR2)
         LD      GR3,GR3         ; GR3のフラグ値を取得
-        JZE     SETBUZ          ; GR3が0の場合、5の倍数なので、SETBUZへジャンプ
-        LD      GR4,GR4         ; GR4のフラグ値を取得
-        JZE     PUTNUM          ; GR4が0の場合、3の倍数でも5の倍数でもないので、PUTNUMへジャンプ
-        JUMP    SETLEN          ; SETLENへジャンプ(3の倍数で5の倍数ではない)
-SETBUZ  LD      GR4,GR4         ; GR4のフラグ値を取得
-        LAD     GR4,4,GR4       ; GR4に文字列「Buzz」の長さ4を追加
-SETLEN  ST      GR4,LEN         ; LENにGR4の値を出力
-CHKFB   JZE     PUTBUZ          ; GR4が0の場合、3の倍数ではないので、PUTBUZへジャンプ
-PUTFIZ  OUT     FIZZ,LEN        ; 「Fizz」または「FizzBuzz」を出力
+        JNZ     PUTS            ; GR3が0でない場合、BIZNUMの倍数ではないので、PUTSへジャンプ
+        LD      GR5,BUZLEN      ; GR4のフラグ値を取得
+PUTS    LD      GR6,GR4         ; GR6 <- GR4
+        AND     GR6,GR5         ; GR6 <- GR6 and GR4
+        JZE     CHKFIZ          ; GR6が0の場合、GR4かGR5のどちらかが0なので、CHKFIZへジャンプ
+        ADDL    GR4,GR5         ; GR4 <- GR4 + GR5
+        JUMP    PUTFIZ          ; 「FizzBuzz」を出力するため、PUTFIZへジャンプ
+CHKFIZ  LD      GR4,GR4         ; GR4のフラグ値を取得
+        JZE     CHKBUZ          ; GR4が0の場合、CHKBUZへジャンプ
+PUTFIZ  ST      GR4,LEN         ; LEN <- GR4
+        OUT     FIZZ,LEN        ;「Fizz」または「FizzBuzz」を出力
         JUMP    FIN             ; FINへジャンプ
-PUTBUZ  OUT     BUZZ,LEN        ; 「Buzz」を出力
+CHKBUZ  LD      GR5,GR5         ; GR5のフラグ値を取得
+        JZE     PUTNUM          ; GR5が0の場合、PUTNUMへジャンプ
+PUTBUZ  ST      GR5,LEN         ; LEN <- GR4
+        OUT     BUZZ,LEN        ;「Buzz」を出力
         JUMP    FIN             ; FINへジャンプ
 PUTNUM  CALL    OUTA            ; GR1の数値を表示
 FIN     RPOP
         RET
+FIZNUM  DC      3
+BUZNUM  DC      5
 FIZZ    DC      'Fizz'
 BUZZ    DC      'Buzz'
+FIZLEN  DC      4
+BUZLEN  DC      4
 LEN     DS      1