3866614c93003b1a575d76c9ea30e8aa6476f4a8
[fizzbuzz.git] / casl / fizzbuzz.casl
1 MAIN    START
2         RPUSH
3         LD      GR1,MIN         ; GR1にMINを代入
4 LOOP    CALL    FIZBUZ          ; FIZBUZを呼び出す
5         CPL     GR1,MAX         ; GR1とMAXを比較
6         JZE     FIN             ; GR1 = MAX の場合、FINへジャンプ
7         LAD     GR1,1,GR1       ; GR1 <- GR1 + 1
8         JUMP    LOOP            ; LOOPへジャンプ
9 FIN     RPOP
10         RET
11 MIN     DC      1
12 MAX     DC      100
13
14 ;; GR1の値に応じて次を出力
15 ;;    3の倍数: Fizz
16 ;;    5の倍数: Buzz
17 ;;    3の倍数かつ5の倍数: FizzBuzz
18 ;;    それ以外の数: 数値
19 FIZBUZ  START
20         RPUSH
21         XOR     GR4,GR4         ; GR4: 文字列「Fizz」の長さおよびフラグ
22         XOR     GR5,GR5         ; GR5: 文字列「Buzz」の長さおよびフラグ
23         XOR     GR6,GR6         ; GR6: 文字列「FizzBuzz」のフラグ
24         LD      GR2,FIZNUM      ; GR2にFIZNUM=3を代入
25         CALL    DIVL            ; GR3 <- GR1 % 3(= GR2)
26         LD      GR4,GR3         ; GR4 <- GR3
27         LD      GR2,BUZNUM      ; GR2にBUZNUM=5を代入
28         CALL    DIVL            ; GR3 <- GR1 % 5(= GR2)
29         LD      GR5,GR3         ; GR5 <- GR3
30         LD      GR6,GR4         ; GR6 <- GR4 or GR5
31         OR      GR6,GR5         ; ↓
32         JNZ     PUTFIZ          ; GR6が0以外の場合、GR4かGR5のどちらかが0以外なので、PUTFIZへジャンプ
33         OUT     FIZZ,FBLEN      ; 「FizzBuzz」を出力
34         JUMP    FIN             ; 「FizzBuzz」を出力するため、PUTFIZへジャンプ
35 PUTFIZ  LD      GR4,GR4         ; GR4のフラグ値を取得
36         JNZ     PUTBUZ          ; GR4が0以外の場合、PUTBUZへジャンプ
37         OUT     FIZZ,FIZLEN     ;「Fizz」を出力
38         JUMP    FIN             ; FINへジャンプ
39 PUTBUZ  LD      GR5,GR5         ; GR5が0以外の場合、PUTNUMへジャンプ
40         JNZ     PUTNUM          ; ↓
41         OUT     BUZZ,BUZLEN     ;「Buzz」を出力
42         JUMP    FIN             ; FINへジャンプ
43 PUTNUM  CALL    OUTL            ; GR1の数値を表示
44 FIN     RPOP
45         RET
46 FIZNUM  DC      3
47 BUZNUM  DC      5
48 FIZZ    DC      'Fizz'
49 BUZZ    DC      'Buzz'
50 FIZLEN  DC      4
51 BUZLEN  DC      4
52 FBLEN   DC      8