CASL2コードで、ローカル以外のラベルを使わないように修正
authorj8takagi <j8takagi@nifty.com>
Sun, 31 Jan 2010 03:45:07 +0000 (12:45 +0900)
committerj8takagi <j8takagi@nifty.com>
Sun, 31 Jan 2010 03:45:07 +0000 (12:45 +0900)
outa, outl, outb, outd_q15で、ststrを呼び出していた部分を修正
outa_call, outl_call, outb_callのEND位置を修正
hanoiで、インデントを修正

as/FUNC/hanoi.casl
as/FUNC/outa.casl
as/FUNC/outa_call.casl
as/FUNC/outb.casl
as/FUNC/outb_call.casl
as/FUNC/outd_q15.casl
as/FUNC/outl.casl
as/FUNC/outl_call.casl

index 6d294e7..da6b56f 100644 (file)
@@ -1,49 +1,46 @@
 ; ハノイの塔を解くプログラム
-MAIN   START
-       LD      GR0,N
-       LD      GR1,A
-       LD      GR2,B
-       LD      GR3,C
-       CALL    HANOI
-       RET
-
-HANOI  CPA     GR0,=1
-       JZE     DISP
-       SUBA    GR0,=1
-       PUSH    0,GR2
-       PUSH    0,GR3
-       POP     GR2
-       POP     GR3
-       CALL    HANOI
-       PUSH    0,GR2
-       PUSH    0,GR3
-       POP     GR2
-       POP     GR3
-       CALL    DISP
-       PUSH    0,GR1
-       PUSH    0,GR2
-       POP     GR1
-       POP     GR2
-       CALL    HANOI
-       PUSH    0,GR1
-       PUSH    0,GR2
-       POP     GR1
-       POP     GR2
-       ADDA    GR0,=1
-       RET
-
-DISP   ST      GR1,MSG1
-       ST      GR3,MSG2
-       OUT     MSG,LNG
-       RET
-
-N      DC      3       ;輪の総数
-LNG    DC      11      ;メッセージの長さ
-A      DC      'A'
-B      DC      'B'
-C      DC      'C'
-MSG    DC      'from '
-MSG1   DS      1
-       DC      ' to '
-MSG2   DS      1
-       END
+MAIN    START
+        LD      GR0,N
+        LD      GR1,A
+        LD      GR2,B
+        LD      GR3,C
+        CALL    HANOI
+        RET
+HANOI   CPA     GR0,=1
+        JZE     DISP
+        SUBA    GR0,=1
+        PUSH    0,GR2
+        PUSH    0,GR3
+        POP     GR2
+        POP     GR3
+        CALL    HANOI
+        PUSH    0,GR2
+        PUSH    0,GR3
+        POP     GR2
+        POP     GR3
+        CALL    DISP
+        PUSH    0,GR1
+        PUSH    0,GR2
+        POP     GR1
+        POP     GR2
+        CALL    HANOI
+        PUSH    0,GR1
+        PUSH    0,GR2
+        POP     GR1
+        POP     GR2
+        ADDA    GR0,=1
+        RET
+DISP    ST      GR1,MSG1
+        ST      GR3,MSG2
+        OUT     MSG,LNG
+        RET
+N       DC      3               ; 輪の総数
+LNG     DC      11              ; メッセージの長さ
+A       DC      'A'
+B       DC      'B'
+C       DC      'C'
+MSG     DC      'from '
+MSG1    DS      1
+        DC      ' to '
+MSG2    DS      1
+        END
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
-        ST      GR0,LEN         ; LENの初期化
+        LAD     GR5,0           ; 整数値の長さ
         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    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を文字に変換
-        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領域に格納
-        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領域に格納
-        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         ; 文字列を出力
@@ -37,18 +42,6 @@ STR     DS      17
 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
index 8b7c205..b2aaf05 100644 (file)
@@ -9,7 +9,6 @@ LOOP    CPA     GR2,CNT
         LAD     GR2,1,GR2
         JUMP    LOOP
 FIN     RET
-        END
 VAL     DC      0
         DC      #0001,#0002,#0004,#0008
         DC      #0010,#0020,#0040,#0080
@@ -21,3 +20,4 @@ VAL     DC      0
         DC      #FF80,#FFC0,#FFE0,#FFF0
         DC      #FFF8,#FFFC,#FFFE,#FFFF
 CNT     DC      34
+        END
index 7d52dad..a619779 100644 (file)
@@ -3,28 +3,33 @@ OUTB    START
         RPUSH
         LAD     GR2,2           ; GR2に2進数の「2」を格納。
         LAD     GR0,0           ; GR0 <- 0
-        ST      GR0,LEN         ; LENの初期化
+        XOR     GR4,GR4         ; 2進数値の長さ
         AND     GR1,GR1         ; GR1をテスト
-        JZE     ZINS            ; GR1が0の場合、ZINSにジャンプ
+        JZE     ZERO            ; GR1が0の場合、ZEROにジャンプ
 STI     CPL     GR1,GR2         ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
         JMI     STLST           ; ↓
-        CALL    ODIVL           ; GR1とGR2の、商をGR0、剰余をGR1に格納
+        CALL    ODIVL           ; GR1とGR2の、商をGR0、剰余をGR3に格納
+        LD      GR1,GR3         ; GR1にGR3をコピー
         LD      GR1,NCHAR,GR1   ; GR1を文字に変換
-        CALL    STSTR           ; GR1をSTR領域に格納
+        ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
         LD      GR1,GR0         ; GR0をGR1にコピー
         JUMP    STI             ; ループ終端
 STLST   LD      GR1,NCHAR,GR1   ; GR1を文字に変換
-        CALL    STSTR           ; GR1をSTR領域に格納
+        ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
         JUMP    EMB             ; EMBにジャンプ
-ZINS    LD      GR1,NCHAR       ; 「0」をSTR領域に格納
-        CALL    STSTR           ; ↓
-EMB     LD      GR1,NCHAR       ; GR0 <- '0'
-EMLOOP  LD      GR2,LEN         ; GR2 <- LEN
-        CPA     GR2,DIG         ; ループ先頭。(GR2 = DIG)の場合は、ループ脱出
+ZERO    LD      GR1,NCHAR       ; 「0」をSTR領域に格納
+        ST      GR1,STR,GR4     ; ↓ (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
+EMB     LD      GR1,NCHAR       ; GR1 <- '0'
+EMLOOP  CPA     GR4,DIG         ; ループ先頭。(GR4 = DIG)の場合は、ループ脱出
         JZE     PRT             ; ↓
-        CALL    STSTR           ; GR1をSTR領域に格納
+        ST      GR1,STR,GR4     ; ↓ (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
         JUMP    EMLOOP          ; ループ終端
-PRT     LD      GR2,LEN         ; GR2にLENの値を格納
+PRT     ST      GR4,LEN         ; LEN <- GR4
+        LD      GR2,LEN         ; GR2にLENの値を格納
         LAD     GR1,STR         ; GR1に文字列のアドレスを格納
         CALL    REV             ; 文字列を逆順に並べ替え
         OUT     STR,LEN         ; 文字列を出力
@@ -33,53 +38,46 @@ PRT     LD      GR2,LEN         ; GR2にLENの値を格納
 STR     DS      17
 LEN     DS      1
 NCHAR   DC      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-DIG     DC      16        
+DIG     DC      16
         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、剰余をGR1に格納する
+;;; GR1の値とGR2の値の、商をGR0、剰余をGR3に格納する
 ;;; 0〜65535の範囲の数値を扱う
 ODIVL   START
+        PUSH    0,GR1
         PUSH    0,GR2
-        PUSH    0,GR3
-        LAD     GR0,0           ; GR0の初期化。商
-        ST      GR2,ODY         ; DYにGR2の初期値を保存
-        LAD     GR3,1           ; GR3の初期化。対象ビットを表す
-ODSL    CPL     GR2,GR1         ; ループ先頭。(GR3 > GR1)の場合、DLOOPへループ脱出
+        PUSH    0,GR4
+        AND     GR2,GR2         ; GR2が0の場合、ODFINへジャンプ
+        JZE     ODFIN           ; ↓
+        ST      GR2,ODY         ; ODYにGR2の初期値を保存
+        LAD     GR0,0           ; GR0の初期化
+        LAD     GR3,0           ; GR3の初期化
+        LAD     GR4,1           ; GR4の初期化。対象ビットを表す
+ODSL    CPL     GR2,GR1         ; ループ先頭。(GR2 > GR1)の場合、ODLOOPへループ脱出
         JPL     ODLOOP          ; ↓
-        SLL     GR3,1           ; GR3を1回左シフト
+        SLL     GR4,1           ; GR4を1回左シフト
         SLL     GR2,1           ; GR2を1回左シフト
         JOV     ODYOV           ; オーバーフローの場合は、ODYOVにジャンプ
         JUMP    ODSL            ; ループ終端
-ODYOV   SRL     GR2,1           ; GR2を1回右シフト
-        LAD     GR2,#8000,GR2   ; GR2 <- GR2 + #8000
-        SRL     GR3,1           ; GR3を1回右シフト
-        JUMP    ODLPIN          ; ODLPINへジャンプ
-ODLOOP  SRL     GR3,1           ; ループ先頭。GR3を1回右シフト
-        JZE     ODFIN           ; (GR3= 0)の場合、ループ脱出
+ODYOV   SRL     GR2,1
+        LAD     GR2,#8000,GR2
+        SRL     GR4,1
+        JUMP    ODLPIN
+ODLOOP  SRL     GR4,1           ; ループ先頭。GR4を1回右シフト
+        JZE     ODFIN           ; (GR= 0)の場合、ループ脱出
         SRL     GR2,1           ; GR2を1回右シフト
         CPL     GR1,ODY         ; (GR1 < ODY)の場合、ループ脱出
         JMI     ODFIN           ; ↓
         CPL     GR1,GR2         ; (GR1 < GR2)の場合、ループ先頭へジャンプ
         JMI     ODLOOP          ; ↓
 ODLPIN  SUBL    GR1,GR2         ; GR1 <- GR1 - GR2
-        ADDL    GR0,GR3         ; GR0 <- GR0 + GR3
+        ADDL    GR0,GR4         ; GR0 <- GR0 + GR4
         JUMP    ODLOOP          ; ループ終端
-ODFIN   POP     GR3
+ODFIN   LD      GR3,GR1
+        POP     GR4
         POP     GR2
+        POP     GR1
         RET
 ODY     DS      1
-ODMB    DC      #8000        
         END
 ;; アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
 ;; 例: 12345 -> 54321、54321- -> -12345
index 657b17f..9ba7189 100644 (file)
@@ -8,7 +8,6 @@ LOOP    LD      GR1,VAL,GR2
         JZE     FIN
         JUMP    LOOP
 FIN     RET
-        END
 VAL     DC      0
         DC      #0001,#0002,#0004,#0008
         DC      #0010,#0020,#0040,#0080
@@ -20,3 +19,4 @@ VAL     DC      0
         DC      #FF80,#FFC0,#FFE0,#FFF0
         DC      #FFF8,#FFFC,#FFFE,#FFFF
 CNT     DC      34
+        END
index 58a9951..9792d4d 100644 (file)
@@ -3,57 +3,45 @@ OUTD    START
         RPUSH
         LAD     GR2,10          ; GR2に10進数の「10」を格納
         LAD     GR0,0           ; 負数フラグ。GR1が負数の場合、GR0は1
-        ST      GR0,LEN         ; LENを初期化
+        XOR     GR4,GR4         ; 整数値の長さ
         AND     GR1,GR1         ; GR1が0の場合
         JZE     ZPRT            ; ↓
         JPL     STDN            ; GR1が正数の場合、STDNにジャンプ
-        PUSH    0,GR1
-        LD      GR1,='-'        ; GR1が負数の場合、「-」をSTR領域に格納
-        CALL    STSTR           ; ↓
-        POP     GR1
-        CPA     GR1,=#8000      ; GR1が#8000より大きい場合
+        LD      GR5,='-'        ; GR1が負数の場合、「-」をSTR領域に格納
+        ST      GR5,STR         ; ↓
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
+        CPA     GR1,=#8000      ; GR1が#8000より大きい場合、MDNへジャンプ
         JPL     MDN             ; ↓
         LD      GR1,='1'        ; GR1が#8000の場合、-1を出力
-        CALL    STSTR           ; ↓
+        ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
         JUMP    PRT             ; ↓
 MDN     CALL    ABS             ; GR1を正数に変換
-STDN    PUSH    0,GR1           ; GR1を退避
-        LD      GR1,='0'        ; 「0」をSTR領域に格納
-        CALL    STSTR           ; ↓
-        LD      GR1,='.'        ; 「.」をSTR領域に格納
-        CALL    STSTR           ; ↓
-        POP     GR1             ; GR1を復元
+STDN    LD      GR5,='0'        ; 「0」をSTR領域に格納
+        ST      GR5,STR,GR4     ; ↓
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
+        LD      GR5,='.'        ; 「.」をSTR領域に格納
+        ST      GR5,STR,GR4     ; ↓
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
 ;; GR1の内容を小数値と見なし、10進数文字に変換してSTRに格納
-TODIG   AND     GR1,GR1         ; GR4が0の場合は、ループを脱出
+TODIG   AND     GR1,GR1         ; GR1が0の場合は、ループを脱出
         JZE     PRT             ; ↓
         CALL    MUL             ; GR1とGR2の、積をGR1、オーバーフロー値をGR3に格納
-        PUSH    0,GR1           ; G1を退避
-        LD      GR1,GR3         ; GR3をGR1にコピー
-        ADDA    GR1,='0'        ; GR1を文字に変換
-        CALL    STSTR           ; GR1をSTR領域に格納
-        POP     GR1             ; GR1を復元
+        LD      GR5,GR3         ; GR3をGR1にコピー
+        ADDA    GR5,='0'        ; GR1を文字に変換
+        ST      GR5,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
         JUMP    TODIG           ; ループ
-ZPRT    LD      GR1,='0'        ; 「0」をSTR領域に格納
-        CALL    STSTR           ; ↓
-PRT     LAD     GR1,STR         ; ↓
+ZPRT    LD      GR5,='0'        ; 「0」をSTR領域に格納
+        ST      GR5,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
+PRT     ST      GR4,LEN         ; LEN <- GR4
         OUT     STR,LEN         ; ↓
         RPOP
         RET
 STR     DS      20
 LEN     DS      1
         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の値を10倍にし、GR3にオーバーフロー値を格納
 MUL    START
         PUSH    0,GR5
index 47e31b4..1e06891 100644 (file)
@@ -3,23 +3,27 @@ OUTL    START
         RPUSH
         LAD     GR2,10          ; GR2に10進数の「10」を格納。
         LAD     GR0,0           ; GR0 <- 0
-        ST      GR0,LEN         ; LENの初期化
+        XOR     GR4,GR4         ; 整数値の長さ
         AND     GR1,GR1         ; GR1をテスト
-        JZE     ZPRT            ; GR1が0の場合、ZPRTにジャンプ
+        JZE     ZERO            ; GR1が0の場合、ZEROにジャンプ
 STI     CPL     GR1,GR2         ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
         JMI     STLST           ; ↓
         CALL    ODIVL           ; GR1とGR2の、商をGR0、剰余をGR3に格納
         LD      GR1,GR3         ; GR1にGR3をコピー
         LD      GR1,NCHAR,GR1   ; GR1を文字に変換
-        CALL    STSTR           ; GR1をSTR領域に格納
+        ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
         LD      GR1,GR0         ; GR0をGR1にコピー
         JUMP    STI             ; ループ終端
 STLST   LD      GR1,NCHAR,GR1   ; GR1を文字に変換
-        CALL    STSTR           ; GR1をSTR領域に格納
+        ST      GR1,STR,GR4     ; (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; GR4 <- GR4 + 1
         JUMP    PRT             ; PRTにジャンプ
-ZPRT    LD      GR1,NCHAR       ; 「0」をSTR領域に格納
-        CALL    STSTR           ; ↓
-PRT     LD      GR2,LEN         ; GR2にLENの値を格納
+ZERO    LD      GR1,NCHAR       ; 「0」をSTR領域に格納
+        ST      GR1,STR,GR4     ; ↓ (STR + GR4) <- GR1
+        LAD     GR4,1,GR4       ; ↓ GR4 <- GR4 + 1
+PRT     ST      GR4,LEN         ; LEN <- GR4
+        LD      GR2,LEN         ; GR2にLENの値を格納
         LAD     GR1,STR         ; GR1に文字列のアドレスを格納
         CALL    REV             ; 文字列を逆順に並べ替え
         OUT     STR,LEN         ; 文字列を出力
@@ -29,18 +33,6 @@ STR     DS      17
 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
@@ -74,11 +66,11 @@ ODLPIN  SUBL    GR1,GR2         ; GR1 <- GR1 - GR2
         ADDL    GR0,GR4         ; GR0 <- GR0 + GR4
         JUMP    ODLOOP          ; ループ終端
 ODFIN   LD      GR3,GR1
-        POP    GR4
+        POP     GR4
         POP     GR2
         POP     GR1
         RET
-ODY     DS      1        
+ODY     DS      1
         END
 ;; アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
 ;; 例: 12345 -> 54321、54321- -> -12345
index 729cd7e..d20214e 100644 (file)
@@ -8,7 +8,6 @@ LOOP    LD      GR1,VAL,GR2
         JZE     FIN
         JUMP    LOOP
 FIN     RET
-        END
 VAL     DC      0
         DC      #0001,#0002,#0004,#0008
         DC      #0010,#0020,#0040,#0080
@@ -20,3 +19,4 @@ VAL     DC      0
         DC      #FF80,#FFC0,#FFE0,#FFF0
         DC      #FFF8,#FFFC,#FFFE,#FFFF
 CNT     DC      34
+        END