既存プログラムの推敲
[fizzbuzz.git] / casl / fizzbuzz.casl
index fff05f0..3866614 100644 (file)
@@ -2,9 +2,9 @@ MAIN    START
         RPUSH
         LD      GR1,MIN         ; GR1にMINを代入
 LOOP    CALL    FIZBUZ          ; FIZBUZを呼び出す
-        LAD     GR1,1,GR1       ; GR1 <- GR1 + 1
         CPL     GR1,MAX         ; GR1とMAXを比較
-        JPL     FIN             ; GR1 > MAX の場合、FINへジャンプ
+        JZE     FIN             ; GR1 = MAX の場合、FINへジャンプ
+        LAD     GR1,1,GR1       ; GR1 <- GR1 + 1
         JUMP    LOOP            ; LOOPへジャンプ
 FIN     RPOP
         RET
@@ -21,30 +21,24 @@ FIZBUZ  START
         XOR     GR4,GR4         ; GR4: 文字列「Fizz」の長さおよびフラグ
         XOR     GR5,GR5         ; GR5: 文字列「Buzz」の長さおよびフラグ
         XOR     GR6,GR6         ; GR6: 文字列「FizzBuzz」のフラグ
-GETFIZ  LD      GR2,FIZNUM      ; GR2にFIZNUM=3を代入
+        LD      GR2,FIZNUM      ; GR2にFIZNUM=3を代入
         CALL    DIVL            ; GR3 <- GR1 % 3(= GR2)
-        LD      GR3,GR3         ; GR3のフラグ値を取得
-        JNZ     GETBUZ          ; GR3が0でない場合、FIZNUMの倍数ではないので、GETBUZへジャンプ
-        LD      GR4,FIZLEN      ; GR4に文字列「Fizz」の長さFIZLEN=4を代入
-GETBUZ  LD      GR2,BUZNUM      ; GR2にBUZNUM=5を代入
+        LD      GR4,GR3         ; GR4 <- GR3
+        LD      GR2,BUZNUM      ; GR2にBUZNUM=5を代入
         CALL    DIVL            ; GR3 <- GR1 % 5(= GR2)
-        LD      GR3,GR3         ; GR3のフラグ値を取得
-        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」を出力
+        LD      GR5,GR3         ; GR5 <- GR3
+        LD      GR6,GR4         ; GR6 <- GR4 or GR5
+        OR      GR6,GR5         ; ↓
+        JNZ     PUTFIZ          ; GR6が0以外の場合、GR4かGR5のどちらかが0以外なので、PUTFIZへジャンプ
+        OUT     FIZZ,FBLEN      ; 「FizzBuzz」を出力
+        JUMP    FIN             ; 「FizzBuzz」を出力するため、PUTFIZへジャンプ
+PUTFIZ  LD      GR4,GR4         ; GR4のフラグ値を取得
+        JNZ     PUTBUZ          ; GR4が0以外の場合、PUTBUZへジャンプ
+        OUT     FIZZ,FIZLEN     ;「Fizz」を出力
         JUMP    FIN             ; FINへジャンプ
-CHKBUZ  LD      GR5,GR5         ; GR5のフラグ値を取得
-        JZE     PUTNUM          ; GR5が0の場合、PUTNUMへジャンプ
-PUTBUZ  ST      GR5,LEN         ; LEN <- GR4
-        OUT     BUZZ,LEN        ;「Buzz」を出力
+PUTBUZ  LD      GR5,GR5         ; GR5が0以外の場合、PUTNUMへジャンプ
+        JNZ     PUTNUM          ; ↓
+        OUT     BUZZ,BUZLEN     ;「Buzz」を出力
         JUMP    FIN             ; FINへジャンプ
 PUTNUM  CALL    OUTL            ; GR1の数値を表示
 FIN     RPOP
@@ -55,4 +49,4 @@ FIZZ    DC      'Fizz'
 BUZZ    DC      'Buzz'
 FIZLEN  DC      4
 BUZLEN  DC      4
-LEN     DS      1
+FBLEN   DC      8