CASL版の修正
[fizzbuzz.git] / casl / fizzbuzz.casl
1 MAIN    START
2         RPUSH
3         LD      GR1,MIN         ; GR1にMINを代入
4 LOOP    CALL    FIZBUZ          ; FIZBUZを呼び出す
5         LAD     GR1,1,GR1       ; GR1 <- GR1 + 1
6         CPL     GR1,MAX         ; GR1とMAXを比較
7         JPL     FIN             ; GR1 > MAX の場合、FINへジャンプ
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 GETFIZ  LD      GR2,FIZNUM      ; GR2にFIZNUM=3を代入
25         CALL    DIVL            ; GR3 <- GR1 % 3(= GR2)
26         LD      GR3,GR3         ; GR3のフラグ値を取得
27         JNZ     GETBUZ          ; GR3が0でない場合、FIZNUMの倍数ではないので、GETBUZへジャンプ
28         LD      GR4,FIZLEN      ; GR4に文字列「Fizz」の長さFIZLEN=4を代入
29 GETBUZ  LD      GR2,BUZNUM      ; GR2にBUZNUM=5を代入
30         CALL    DIVL            ; GR3 <- GR1 % 5(= GR2)
31         LD      GR3,GR3         ; GR3のフラグ値を取得
32         JNZ     PUTS            ; GR3が0でない場合、BIZNUMの倍数ではないので、PUTSへジャンプ
33         LD      GR5,BUZLEN      ; GR4のフラグ値を取得
34 PUTS    LD      GR6,GR4         ; GR6 <- GR4
35         AND     GR6,GR5         ; GR6 <- GR6 and GR4
36         JZE     CHKFIZ          ; GR6が0の場合、GR4かGR5のどちらかが0なので、CHKFIZへジャンプ
37         ADDL    GR4,GR5         ; GR4 <- GR4 + GR5
38         JUMP    PUTFIZ          ; 「FizzBuzz」を出力するため、PUTFIZへジャンプ
39 CHKFIZ  LD      GR4,GR4         ; GR4のフラグ値を取得
40         JZE     CHKBUZ          ; GR4が0の場合、CHKBUZへジャンプ
41 PUTFIZ  ST      GR4,LEN         ; LEN <- GR4
42         OUT     FIZZ,LEN        ;「Fizz」または「FizzBuzz」を出力
43         JUMP    FIN             ; FINへジャンプ
44 CHKBUZ  LD      GR5,GR5         ; GR5のフラグ値を取得
45         JZE     PUTNUM          ; GR5が0の場合、PUTNUMへジャンプ
46 PUTBUZ  ST      GR5,LEN         ; LEN <- GR4
47         OUT     BUZZ,LEN        ;「Buzz」を出力
48         JUMP    FIN             ; FINへジャンプ
49 PUTNUM  CALL    OUTL            ; GR1の数値を表示
50 FIN     RPOP
51         RET
52 FIZNUM  DC      3
53 BUZNUM  DC      5
54 FIZZ    DC      'Fizz'
55 BUZZ    DC      'Buzz'
56 FIZLEN  DC      4
57 BUZLEN  DC      4
58 LEN     DS      1