CASL2コードで、ローカル以外のラベルを使わないように修正
[YACASL2.git] / as / FUNC / outa.casl
index ad3ff53..52c5c60 100644 (file)
@@ -4,7 +4,7 @@ OUTA    START
         LAD     GR2,10          ; GR2に10進数の「10」を格納。
         LAD     GR0,0           ; GR0 <- 0
         LAD     GR4,0           ; 負数フラグ。GR1が負数の場合、GR4は1
         LAD     GR2,10          ; GR2に10進数の「10」を格納。
         LAD     GR0,0           ; GR0 <- 0
         LAD     GR4,0           ; 負数フラグ。GR1が負数の場合、GR4は1
-        ST      GR0,LEN         ; LENの初期化
+        LAD     GR5,0           ; 整数値の長さ
         AND     GR1,GR1         ; GR1をテスト
         JZE     ZPRT            ; GR1が0の場合、ZPRTにジャンプ
         JPL     STI             ; GR1が正数の場合、STIにジャンプ
         AND     GR1,GR1         ; GR1をテスト
         JZE     ZPRT            ; GR1が0の場合、ZPRTにジャンプ
         JPL     STI             ; GR1が正数の場合、STIにジャンプ
@@ -15,19 +15,24 @@ STI     CPL     GR1,GR2         ; ループ先頭。(GR1 < GR2)の場合は、
         CALL    ODIVL           ; GR1とGR2の、商をGR0、剰余をGR3に格納
         LD      GR1,GR3         ; GR1にGR3をコピー
         LD      GR1,NCHAR,GR1   ; GR1を文字に変換
         CALL    ODIVL           ; GR1とGR2の、商をGR0、剰余をGR3に格納
         LD      GR1,GR3         ; GR1にGR3をコピー
         LD      GR1,NCHAR,GR1   ; GR1を文字に変換
-        CALL    STSTR           ; GR1をSTR領域に格納
+        ST      GR1,STR,GR5     ; (STR + GR5) <- GR1
+        LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
         LD      GR1,GR0         ; GR0をGR1にコピー
         JUMP    STI             ; ループ終端
 STLST   LD      GR1,NCHAR,GR1   ; GR1を文字に変換
         LD      GR1,GR0         ; GR0をGR1にコピー
         JUMP    STI             ; ループ終端
 STLST   LD      GR1,NCHAR,GR1   ; GR1を文字に変換
-        CALL    STSTR           ; GR1をSTR領域に格納
+        ST      GR1,STR,GR5     ; (STR + GR5) <- GR1
+        LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
         AND     GR4,GR4         ; 正数の場合
         JZE     PRT             ; ↓
         LD      GR1,='-'        ; 負数の場合、「-」をSTR領域に格納
         AND     GR4,GR4         ; 正数の場合
         JZE     PRT             ; ↓
         LD      GR1,='-'        ; 負数の場合、「-」をSTR領域に格納
-        CALL    STSTR           ; ↓
+        ST      GR1,STR,GR5     ; (STR + GR5) <- GR1
+        LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
         JUMP    PRT             ; PRTにジャンプ
 ZPRT    LD      GR1,NCHAR       ; 「0」をSTR領域に格納
         JUMP    PRT             ; PRTにジャンプ
 ZPRT    LD      GR1,NCHAR       ; 「0」をSTR領域に格納
-        CALL    STSTR           ; ↓
-PRT     LD      GR2,LEN         ; GR2にLENの値を格納
+        ST      GR1,STR,GR5     ; (STR + GR5) <- GR1
+        LAD     GR5,1,GR5       ; GR5 <- GR5 + 1
+PRT     ST      GR5,LEN         ; LEN <- GR5
+        LD      GR2,LEN         ; GR2にLENの値を格納
         LAD     GR1,STR         ; GR1に文字列のアドレスを格納
         CALL    REV             ; 文字列を逆順に並べ替え
         OUT     STR,LEN         ; 文字列を出力
         LAD     GR1,STR         ; GR1に文字列のアドレスを格納
         CALL    REV             ; 文字列を逆順に並べ替え
         OUT     STR,LEN         ; 文字列を出力
@@ -37,18 +42,6 @@ STR     DS      17
 LEN     DS      1
 NCHAR   DC      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
         END
 LEN     DS      1
 NCHAR   DC      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
         END
-;; GR1をSTR領域に格納し、LENをインクリメント
-STSTR   START
-        PUSH    0,GR1
-        PUSH    0,GR2
-        LD      GR2,LEN         ; GR2にLENの値をロード
-        ST      GR1,STR,GR2     ; STR+GR2 <- GR1
-        LAD     GR2,1,GR2       ; GR2 <- GR2 + 1
-        ST      GR2,LEN         ; LENにGR2を格納
-        POP     GR2
-        POP     GR1
-        RET
-        END
 ;;; GR1の値とGR2の値の、商をGR0、剰余をGR3に格納する
 ;;; 0〜65535の範囲の数値を扱う
 ODIVL   START
 ;;; GR1の値とGR2の値の、商をGR0、剰余をGR3に格納する
 ;;; 0〜65535の範囲の数値を扱う
 ODIVL   START