261cb5dd417407901183cd49b819822204dd72be
[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: 文字列の長さおよびフラグ
22 CHKFIZ  LAD     GR2,3           ; GR2に3を代入
23         CALL    DIVL            ; GR3 <- GR1 % GR2:3
24         LD      GR3,GR3         ; GR3のフラグ値を取得
25         JNZ     CHKBUZ          ; GR3が0でない場合、3の倍数ではないので、CHKBUZへジャンプ
26 SETFIZ  LAD     GR4,4           ; GR4に文字列「Fizz」の長さ4を代入
27 CHKBUZ  LAD     GR2,5           ; GR2に5を代入
28         CALL    DIVL            ; GR3 <- GR1 % GR2:5
29         LD      GR3,GR3         ; GR3のフラグ値を取得
30         JZE     SETBUZ          ; GR3が0の場合、5の倍数なので、SETBUZへジャンプ
31         LD      GR4,GR4         ; GR4のフラグ値を取得
32         JZE     PUTNUM          ; GR4が0の場合、3の倍数でも5の倍数でもないので、PUTNUMへジャンプ
33         JUMP    SETLEN          ; SETLENへジャンプ(3の倍数で5の倍数ではない)
34 SETBUZ  LD      GR4,GR4         ; GR4のフラグ値を取得
35         LAD     GR4,4,GR4       ; GR4に文字列「Buzz」の長さ4を追加
36 SETLEN  ST      GR4,LEN         ; LENにGR4の値を出力
37 CHKFB   JZE     PUTBUZ          ; GR4が0の場合、3の倍数ではないので、PUTBUZへジャンプ
38 PUTFIZ  OUT     FIZZ,LEN        ; 「Fizz」または「FizzBuzz」を出力
39         JUMP    FIN             ; FINへジャンプ
40 PUTBUZ  OUT     BUZZ,LEN        ; 「Buzz」を出力
41         JUMP    FIN             ; FINへジャンプ
42 PUTNUM  CALL    OUTA            ; GR1の数値を表示
43 FIN     RPOP
44         RET
45 FIZZ    DC      'Fizz'
46 BUZZ    DC      'Buzz'
47 LEN     DS      1