RPUSH
LD GR1,MIN ; GR1にMINを代入
LOOP CALL FIZBUZ ; FIZBUZを呼び出す
- LAD GR1,1,GR1 ; GR1 <- GR1 + 1
CPL GR1,MAX ; GR1とMAXを比較
- JPL FIN ; GR1 > MAX の場合、FINへジャンプ
+ JZE FIN ; GR1 = MAX の場合、FINへジャンプ
+ LAD GR1,1,GR1 ; GR1 <- GR1 + 1
JUMP LOOP ; LOOPへジャンプ
FIN RPOP
RET
XOR GR4,GR4 ; GR4: 文字列「Fizz」の長さおよびフラグ
XOR GR5,GR5 ; GR5: 文字列「Buzz」の長さおよびフラグ
XOR GR6,GR6 ; GR6: 文字列「FizzBuzz」のフラグ
-GETFIZ LD GR2,FIZNUM ; GR2にFIZNUM=3を代入
+ LD GR2,FIZNUM ; GR2にFIZNUM=3を代入
CALL DIVL ; GR3 <- GR1 % 3(= GR2)
- LD GR3,GR3 ; GR3のフラグ値を取得
- JNZ GETBUZ ; GR3が0でない場合、FIZNUMの倍数ではないので、GETBUZへジャンプ
- LD GR4,FIZLEN ; GR4に文字列「Fizz」の長さFIZLEN=4を代入
-GETBUZ LD GR2,BUZNUM ; GR2にBUZNUM=5を代入
+ LD GR4,GR3 ; GR4 <- GR3
+ LD GR2,BUZNUM ; GR2にBUZNUM=5を代入
CALL DIVL ; GR3 <- GR1 % 5(= GR2)
- LD GR3,GR3 ; GR3のフラグ値を取得
- JNZ PUTS ; GR3が0でない場合、BIZNUMの倍数ではないので、PUTSへジャンプ
- LD GR5,BUZLEN ; GR4のフラグ値を取得
-PUTS LD GR6,GR4 ; GR6 <- GR4
- AND GR6,GR5 ; GR6 <- GR6 and GR4
- JZE CHKFIZ ; GR6が0の場合、GR4かGR5のどちらかが0なので、CHKFIZへジャンプ
- ADDL GR4,GR5 ; GR4 <- GR4 + GR5
- JUMP PUTFIZ ; 「FizzBuzz」を出力するため、PUTFIZへジャンプ
-CHKFIZ LD GR4,GR4 ; GR4のフラグ値を取得
- JZE CHKBUZ ; GR4が0の場合、CHKBUZへジャンプ
-PUTFIZ ST GR4,LEN ; LEN <- GR4
- OUT FIZZ,LEN ;「Fizz」または「FizzBuzz」を出力
+ LD GR5,GR3 ; GR5 <- GR3
+ LD GR6,GR4 ; GR6 <- GR4 or GR5
+ OR GR6,GR5 ; ↓
+ JNZ PUTFIZ ; GR6が0以外の場合、GR4かGR5のどちらかが0以外なので、PUTFIZへジャンプ
+ OUT FIZZ,FBLEN ; 「FizzBuzz」を出力
+ JUMP FIN ; 「FizzBuzz」を出力するため、PUTFIZへジャンプ
+PUTFIZ LD GR4,GR4 ; GR4のフラグ値を取得
+ JNZ PUTBUZ ; GR4が0以外の場合、PUTBUZへジャンプ
+ OUT FIZZ,FIZLEN ;「Fizz」を出力
JUMP FIN ; FINへジャンプ
-CHKBUZ LD GR5,GR5 ; GR5のフラグ値を取得
- JZE PUTNUM ; GR5が0の場合、PUTNUMへジャンプ
-PUTBUZ ST GR5,LEN ; LEN <- GR4
- OUT BUZZ,LEN ;「Buzz」を出力
+PUTBUZ LD GR5,GR5 ; GR5が0以外の場合、PUTNUMへジャンプ
+ JNZ PUTNUM ; ↓
+ OUT BUZZ,BUZLEN ;「Buzz」を出力
JUMP FIN ; FINへジャンプ
PUTNUM CALL OUTL ; GR1の数値を表示
FIN RPOP
BUZZ DC 'Buzz'
FIZLEN DC 4
BUZLEN DC 4
-LEN DS 1
+FBLEN DC 8