文字列「FizzBuzz」の長さ取得方法を変更
[fizzbuzz.git] / cnt / casl / fizzbuzz.casl
1 MAIN    START
2         RPUSH
3         LD      GR1,FIZLEN      ; 文字列「FizzBuzz」の長さをFBLENへセット
4         ADDL    GR1,BUZLEN      ; ↓
5         ST      GR1,FBLEN       ; ↓
6         LD      GR1,MIN         ; GR1:カウンター。初期値はMIN
7         LD      GR2,MIN         ; GR2:Fizzカウンター。初期値はMIN
8         LD      GR3,MIN         ; GR3:Buzzカウンター。初期値はMIN
9         XOR     GR4,GR4         ; GR4:FizzBuzzフラグ。初期値は0
10 SETFIZ  CPL     GR2,FIZNUM      ; GR2 = FIZNUM:3 ではない場合、SETBUZへジャンプ
11         JNZ     SETBUZ          ; ↓
12         LAD     GR2,0           ; GR2 <- 0
13 SETBUZ  CPL     GR3,BUZNUM      ; GR3 = BUZNUM:5 ではない場合、PUTFBへジャンプ
14         JNZ     PUTFB           ; ↓
15         LAD     GR3,0           ; GR3 <- 0
16 PUTFB   LD      GR4,GR2         ; GR4 <- GR2 or GR3
17         OR      GR4,GR3         ; ↓
18         JNZ     PUTFIZ          ; GR4が0ではない場合、GR2とGR4のどちらかが0ではないので、PUTFIZへジャンプ
19         OUT     FIZZ,FBLEN      ; 「FizzBuzz」を出力
20         JUMP    LEND            ; LENDへジャンプ
21 PUTFIZ  LD      GR2,GR2         ; GR2が0ではない場合、PUTBUZへジャンプ
22         JNZ     PUTBUZ          ; ↓
23         OUT     FIZZ,FIZLEN     ; 「Fizz」を出力
24         JUMP    LEND            ; LENDへジャンプ
25 PUTBUZ  LD      GR3,GR3         ; GR3が0ではない場合、PUTNUMへジャンプ
26         JNZ     PUTNUM          ; ↓
27         OUT     BUZZ,BUZLEN     ; 「Buzz」を出力
28         JUMP    LEND            ; LENDへジャンプ
29 PUTNUM  CALL    OUTL            ; GR1の数値を表示
30 LEND    CPL     GR1,MAX         ; GR1 = MAX の場合、FINへジャンプ
31         JZE     FIN             ; ↓
32         LAD     GR1,1,GR1       ; GR1 <- GR1 + 1
33         LAD     GR2,1,GR2       ; GR2 <- GR2 + 1
34         LAD     GR3,1,GR3       ; GR3 <- GR3 + 1
35         JUMP    SETFIZ          ; SETFIZへジャンプ
36 FIN     RPOP
37         RET
38 MIN     DC      1               ; 最小値。FIZNUMとBUZNUMより小さい数値でなければならない
39 MAX     DC      100             ; 最大値。MIN以上65535以下
40 FIZNUM  DC      3
41 BUZNUM  DC      5
42 FIZZ    DC      'Fizz'
43 BUZZ    DC      'Buzz'
44 FIZLEN  DC      4
45 BUZLEN  DC      4
46 FBLEN   DS      1