--- /dev/null
+#include <stdio.h>
+#include <assert.h>
+enum {
+ MIN = 1,
+ MAX = 100,
+ FIZZNUM = 3,
+ BUZZNUM = 5,
+};
+
+int main()
+{
+ assert(MIN <= FIZZNUM && MIN <= BUZZNUM);
+ int i, fizz, buzz;
+
+ for(i = fizz = buzz = MIN; i <= MAX; i++, fizz++, buzz++) {
+ fizz = (fizz == FIZZNUM) ? 0 : fizz;
+ buzz = (buzz == BUZZNUM) ? 0 : buzz;
+ if(fizz == 0 && buzz == 0) {
+ puts("FizzBuzz");
+ } else if(fizz == 0) {
+ puts("Fizz");
+ } else if(buzz == 0) {
+ puts("Buzz");
+ } else {
+ printf("%d\n", i);
+ }
+ }
+ return 0;
+}
--- /dev/null
+MAIN START
+ RPUSH
+ LD GR1,MIN ; GR1:カウンター。初期値はMIN
+ LD GR2,MIN ; GR2:Fizzカウンター。初期値はMIN
+ LD GR3,MIN ; GR3:Buzzカウンター。初期値はMIN
+ XOR GR4,GR4 ; GR4:FizzBuzzフラグ。初期値は0
+SETFIZ CPL GR2,FIZNUM ; GR2 = 3ではない場合、SETBUZへジャンプ
+ JNZ SETBUZ ; ↓
+ LAD GR2,0 ; GR2 <- 0
+SETBUZ CPL GR3,BUZNUM ; GR3 = 5ではない場合、PUTFBへジャンプ
+ JNZ PUTFB ; ↓
+ LAD GR3,0 ; GR3 <- 0
+PUTFB LD GR4,GR2 ; GR4 <- GR2 or GR3
+ OR GR4,GR3 ; ↓
+ JNZ PUTFIZ ; GR4が0ではない場合、GR2とGR4のどちらかが0ではないので、PUTFIZへジャンプ
+ OUT FIZZ,FBLEN ; 「FizzBuzz」を出力
+ JUMP LOPEND ; LOPENDへジャンプ
+PUTFIZ LD GR2,GR2 ; GR2が0ではない場合、PUTBUZへジャンプ
+ JNZ PUTBUZ ; ↓
+ OUT FIZZ,FIZLEN ; 「Fizz」を出力
+ JUMP LOPEND ; LOPENDへジャンプ
+PUTBUZ LD GR3,GR3 ; GR3が0ではない場合、PUTNUMへジャンプ
+ JNZ PUTNUM ; ↓
+ OUT BUZZ,BUZLEN ; 「Buzz」を出力
+ JUMP LOPEND ; LOPENDへジャンプ
+PUTNUM CALL OUTL ; GR1の数値を表示
+LOPEND CPL GR1,MAX ; GR1とMAXを比較
+ JZE FIN ; GR1 = MAX の場合、FINへジャンプ
+ LAD GR1,1,GR1 ; GR1 <- GR1 + 1
+ LAD GR2,1,GR2 ; GR2 <- GR2 + 1
+ LAD GR3,1,GR3 ; GR3 <- GR3 + 1
+ JUMP SETFIZ ; SETFIZへジャンプ
+FIN RPOP
+ RET
+MIN DC 1 ; FIZZNUMとBUZNUMより小さい数値でなければならない
+MAX DC 100
+FIZNUM DC 3
+BUZNUM DC 5
+FIZZ DC 'Fizz'
+BUZZ DC 'Buzz'
+FIZLEN DC 4
+BUZLEN DC 4
+FBLEN DC 8