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