アセンブラファイルとテストの整理
[YACASL2.git] / as / YAKUWA / binout.casl
diff --git a/as/YAKUWA/binout.casl b/as/YAKUWA/binout.casl
new file mode 100644 (file)
index 0000000..1d920aa
--- /dev/null
@@ -0,0 +1,55 @@
+;;; BINOUT: 主プログラムから渡された1語の内容を、
+;;;         ゼロ抑制を行った2進表記で出力する
+;;;     八鍬幸信『基本情報処理試験 らくらく突破 CASL II』172ページ
+;;; BINOUTを呼び出す
+MAIN    START
+        LAD     GR2,0
+MLOOP   CPA     GR2,MLEN
+        JZE     MFIN
+        LD      GR1,MWORD,GR2
+        CALL    BINOUT
+        LAD     GR2,1,GR2
+        JUMP    MLOOP
+MFIN    RET
+MWORD   DC      #0000,#0001,#09CD,#8001
+MLEN    DC      4        
+        END
+;;; BINOUT
+BINOUT  START
+        PUSH    0,GR1           ; レジスタの退避
+        PUSH    0,GR2           ; ↓
+        PUSH    0,GR3           ; ↓
+        PUSH    0,GR4           ; ↓
+        LAD     GR2,0           ; 出力ポインタの初期化
+        LAD     GR3,15          ; カウンタの初期化
+        LD      GR4,GR1         ; 全ビット = 0?
+        JZE     OUT1
+LOOP1   JMI     ONE             ; 先行するビット処理
+        LAD     GR3,-1,GR3      ; ↓
+        SLL     GR1,1           ; ↓
+        JUMP    LOOP1
+LOOP2   JMI     ONE             ; 符号ビットの判定
+ZERO    LAD     GR0,48          ; '0'→GR0
+        JUMP    STORE
+ONE     LAD     GR0,49          ; '1'→GR1
+STORE   ST      GR0,OBUF,GR2
+        LAD     GR2,1,GR2
+        LAD     GR3,-1,GR3
+        CPA     GR3,NZERO
+        JMI     OUT2            ; 全ビット終了?
+        SLL     GR1,1
+        JUMP    LOOP2
+OUT1    LAD     GR0,48
+        ST      GR0,OBUF,GR2
+        LAD     GR2,1,GR2
+OUT2    ST      GR2,OLNG
+        OUT     OBUF,OLNG
+        POP     GR4             ; レジスタの復元
+        POP     GR3             ; ↓
+        POP     GR2             ; ↓
+        POP     GR1             ; ↓
+        RET
+OBUF    DS      16
+OLNG    DS      1
+NZERO   DC      0
+        END