既存プログラムの推敲
authorj8takagi <info@j8takagi.net>
Fri, 2 Nov 2012 10:47:54 +0000 (19:47 +0900)
committerj8takagi <info@j8takagi.net>
Fri, 2 Nov 2012 10:47:54 +0000 (19:47 +0900)
c/Makefile
c/fizzbuzz [deleted file]
c/fizzbuzz.c
casl/fizzbuzz.casl
ruby/fizzbuzz.rb

index 0bcad0e..fb2ddc9 100644 (file)
@@ -7,10 +7,15 @@ CASL2SRC := struct.c hash.c
 ASSRC := assemble.c token.c label.c
 EXECSRC := exec.c dump.c
 
-.PHONY: clean
+.PHONY: all clean
 
-fizzubzz: fizzbuzz.c
-       $(CC) $(CFLAGS) -o fizzbuzz  $^
+all: fizzbuzz fizzbuzz2
+
+fizzbuzz: fizzbuzz.c
+       $(CC) $(CFLAGS) -o $@  $^
+
+fizzbuzz2: fizzbuzz2.c
+       $(CC) $(CFLAGS) -o $@  $^
 
 clean:
-       @$(RMF) fizzbuzz
+       @$(RMF) fizzbuzz fizzbuzz2
diff --git a/c/fizzbuzz b/c/fizzbuzz
deleted file mode 100755 (executable)
index 3f12845..0000000
Binary files a/c/fizzbuzz and /dev/null differ
index 87d7802..43e73ed 100644 (file)
@@ -1,4 +1,8 @@
 #include <stdio.h>
+enum {
+    MIN = 1,
+    MAX = 100,
+};
 
 void puts_fizzbuzz(int n)
 {
@@ -19,10 +23,9 @@ void puts_fizzbuzz(int n)
 
 int main()
 {
-    const int max = 100, min = 1;
     int i;
 
-    for(i = min; i <= max; i++) {
+    for(i = MIN; i <= MAX; i++) {
         puts_fizzbuzz(i);
     }
     return 0;
index fff05f0..3866614 100644 (file)
@@ -2,9 +2,9 @@ MAIN    START
         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
@@ -21,30 +21,24 @@ FIZBUZ  START
         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
@@ -55,4 +49,4 @@ FIZZ    DC      'Fizz'
 BUZZ    DC      'Buzz'
 FIZLEN  DC      4
 BUZLEN  DC      4
-LEN     DS      1
+FBLEN   DC      8
index 55b7316..6746370 100755 (executable)
@@ -15,7 +15,7 @@ def puts_fizzbuzz(n)
 end
 
 min = 1
-max = 100
+max = 65535
 
 for i in min..max
   puts_fizzbuzz(i)