アセンブラファイルとテストの整理
[YACASL2.git] / as / FUNC / inl.casl
diff --git a/as/FUNC/inl.casl b/as/FUNC/inl.casl
new file mode 100644 (file)
index 0000000..09c505a
--- /dev/null
@@ -0,0 +1,60 @@
+;;; 入力された数値をGR0で返す
+INL     START
+        RPUSH
+        IN      IBUF,ILEN
+        LAD     GR1,0
+        LAD     GR2,10          ; 10進数の「10」
+        LAD     GR3,0           ; 値の一時格納
+        LAD     GR4,0           ; インデックス
+ISTOL   CPL     GR4,ILEN        ; ループ先頭。(GR4 = ILEN)の場合、ループ脱出
+        JZE     ICP             ; ↓
+        LD      GR1,IBUF,GR4
+        CPL     GR1,INCHR       ; (GR1 < (INCHR = '0'))の場合、IOVへジャンプ
+        JMI     IOV             ; ↓
+        CPL     GR1,='9'        ; (GR1 > '9')の場合、IOVへジャンプ
+        JPL     IOV             ; ↓
+        SUBL    GR1,INCHR
+        ST      GR4,NLEN
+        LD      GR4,ILEN
+        SUBA    GR4,NLEN
+MUL10   CPL     GR4,=1
+        JZE     ISNEXT
+        CALL    MULL
+        LD      GR1,GR0
+        LAD     GR4,-1,GR4
+        JUMP    MUL10
+ISNEXT  LD      GR4,NLEN
+        ADDL    GR3,GR1
+       LAD     GR4,1,GR4
+        JUMP    ISTOL           ; ループ終端
+IOV     LAD     GR0,1
+        ADDL    GR0,=#FFFF
+        JUMP    IFIN
+ICP     LD      GR0,GR3
+IFIN    RPOP
+        RET
+INCHR   DC      '0123456789'
+IBUF    DS      5
+ILEN    DS      1
+NLEN    DS      1
+        END
+;GR1の値とGR2の値の積をGR0に格納
+MULL    START
+        RPUSH
+        LAD     GR3,1           ; 対象ビット
+        LAD     GR0,0           ; 積
+MLOOP   CPL     GR3,GR2         ; ループ先頭。(GR2 = GR3)の場合、ループ脱出
+        JPL     MFIN            ; ↓
+        PUSH    0,GR3           ; GR2の、GR3が示したビットが0の場合、MNEXTへジャンプ
+        AND     GR3,GR2         ; ↓
+        POP     GR3             ; ↓
+        JZE     MNEXT           ; ↓
+        ADDL    GR0,GR1         ; GR0 <- GR0 + GR1
+        JOV     MFIN            ; オーバーフローした場合、ループ脱出
+MNEXT   SLL     GR3,1           ; GR3を1回左シフト
+        SLL     GR1,1           ; GR1を1回左シフト
+        JOV     MFIN            ; オーバーフローした場合、ループ脱出
+        JUMP    MLOOP           ; ループ終端
+MFIN    RPOP
+        RET
+        END