プログラム支援室 A
CPU8A プログラミング

はじめに

CPU8Aの使い方を簡単なプログラムで説明します。



  • 2進数8桁の加算     
  • 2進数16桁の加算    
  • 2進数32桁の加算    
  • 2進数8桁の減算     
  • 2進数16桁の減算    
  • 2進数32桁の減算    
  • 2進数8桁の乗算    
  • 2進数16桁の乗算   
  • 2進数8桁の除算    
  • 2進数16桁の除算   


2進数8桁の加算

CPU8A は8桁の汎用レジスタを4個持つプロセッサです 。
Y=A+B の計算をレジスタに置き換えて R0=R0+R1 とし ます。
A と B が固定された既知の値ならレジスタに即値を 代入して次のプログラムになります。
MOVI     R0,12
MOVI     R1,34
ADD      R0,R1

END

仮に A が 12、 B が 34 とした場合の計算プログラ ムです。

計算の桁あふれを検知して分岐したい場合には次の ようにします。

         MOVI      R0,12
         MOVI      R1,34
         ADD       R0,R1
         JMPC      over
         NOP       ; 桁あふれなし
         NOP
         JMP       owari
over:    NOP       ; 桁あふれあり
         NOP
owari:   NOP

END



2進数16桁の加算

2進数の8桁以上の加算では下位から上位への桁上がり を上位に累算しながら計算を進めます。

         MOVI      R0,0FFH
         MOVI      R1,0FFH
         MOVI      R2,0FFH
         MOVI      R3,0FFH

; -----------------------------------------------
;    下位
; -----------------------------------------------
         ADD       R0,R2     ; 加算

         JMPC      X0        ; 桁上げあり
         XOR       R2,R2
         JMP       X1        ; 桁上げなし
X0:      MOVI      R2,1      ; 桁上げ

; -----------------------------------------------
;    上位
; -----------------------------------------------
X1:      ADD       R1,R2     ; 桁上げ加算

         JMPC      X2        ; 桁上げあり
         XOR       R2,R2
         JMP       X3        ; 桁上げなし
X2:      MOVI      R2,1      ; 桁上げ

; -----------------------------------------------
X3:      ADD       R1,R3     ; 加算

         JMPC      X4        ; 桁上げあり
         MOVI      R3,0FFH
         ADD       R3,R2     ; 桁上げ加算の桁上げを使用
         
X4:      NOP

END



2進数32桁の加算

桁上がりを考慮した加算プログラムをサブルーチンに して多バイトの加算プログラムを簡単に構成できるよ うにしたものです。

; ===============================================
;    4バイト加算
; ===============================================
         MOVI      R0,P1
         MOVI      R1,P1>>8
         MOVRX     RP0      ; 引数 1

         MOVI      R0,P2
         MOVI      R1,P2>>8
         MOVRY     RP0      ; 引数 2

; -----------------------------------------------
;    第1バイト
; -----------------------------------------------
         MOVMR     R0,IX
         MOVMR     R1,IY

         XOR       R2,R2
         ADD       R2,R2

         CALL      PRO       ; 加算

         MOVI      R2,A1
         MOVI      R3,A1>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    第2バイト
; -----------------------------------------------
         INC       IX
         INC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         
         CALL      PRO       ; 加算

         MOVI      R2,A1+1
         MOVI      R3,(A1+1)>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    第3バイト
; -----------------------------------------------
         INC       IX
         INC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         
         CALL      PRO       ; 加算

         MOVI      R2,A1+2
         MOVI      R3,(A1+2)>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    第4バイト
; -----------------------------------------------
         INC       IX
         INC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         
         CALL      PRO       ; 加算

         MOVI      R2,A1+3
         MOVI      R3,(A1+3)>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    終了     
; -----------------------------------------------
         NOP
         NOP

; -----------------------------------------------
;    2進数8桁 加算サブルーチン
; -----------------------------------------------
PRO:     JMPC      PRO_X1
         XOR       R2,R2
         JMP       PRO_X2
PRO_X1:  MOVI      R2,1
PRO_X2:  ADD       R0,R2
         JMPC      PRO_X3
         XOR       R2,R2
         JMP       PRO_X4
PRO_X3:  MOVI      R2,1
PRO_X4:  ADD       R0,R1
         JMPC      PRO_X5
         MOVI      R3,0FFH
         ADD       R2,R3
PRO_X5:  RET

; -----------------------------------------------
;    引数
; -----------------------------------------------
P1:      DB        78H,56H,34H,12H
P2:      DB        0F0H,0DEH,0BCH,9AH

; -----------------------------------------------
;    計算結果
; -----------------------------------------------
A1:      DS        4

END



2進数8桁の減算

Y=A-B の計算をレジスタに置き換えて R0=R0-R1 とします。 A と B が固定された既知の値ならレジスタに即値を代入して次のプログラムになります。

         MOVI      R0,100
         MOVI      R1,50
         SUB       R0,R1

END



2進数16桁の減算

桁上がりを考慮した減算プログラムをサブルーチンに して多バイトの減算プログラムを簡単に構成できるよ うにしたものです。

; ===============================================
;    2バイト減算
; ===============================================
         MOVI      R0,P1
         MOVI      R1,P1>>8
         MOVRX     RP0        ; 引数1

         MOVI      R0,P2
         MOVI      R1,P2>>8
         MOVRY     RP0        ; 引数2

; -----------------------------------------------
;    第1バイト
; -----------------------------------------------
         XOR       R0,R0
         MOVMR     R0,IX
         MOVMR     R1,IY

         CALL      PRO        ; 減算

         PUSH      IX
         MOVI      R2,A1
         MOVI      R3,A1>>8
         MOVRX     RP1
         MOVRM     IX,R0      ; 記録
         POP       IX

; -----------------------------------------------
;    第2バイト
; -----------------------------------------------
         INC       IX
         INC       IY

         MOVMR     R0,IX
         MOVMR     R1,IY

         CALL      PRO        ; 減算

         PUSH      IX
         MOVI      R2,A1+1
         MOVI      R3,(A1+1)>>8
         MOVRX     RP1
         MOVRM     IX,R0      ; 記録
         POP       IX

; -----------------------------------------------
;    2進数8桁 減算サブルーチン
; -----------------------------------------------
PRO:     JMPC      PRO_X1
         JMP       PRO_X2
PRO_X1:  MOVI      R2,1
         SUB       R0,R2
         JMPC      PRO_X2
         XOR       R2,R2
PRO_X2:  SUB       R0,R1
         JMPC      PRO_X3
         SHD       R2,R2
PRO_X3:  RET

; -----------------------------------------------
;    引数
; -----------------------------------------------
P1:      DB        34H,12H
P2:      DB        78H,56H

; -----------------------------------------------
;    計算結果
; -----------------------------------------------
A1:      DS        4

END



2進数32桁の減算

2進数16桁のプログラムを32桁に拡張したものです。

; ===============================================
;    4バイト減算
; ===============================================
         MOVI      R0,P1
         MOVI      R1,P1>>8
         MOVRX     RP0        ; 引数1

         MOVI      R0,P2
         MOVI      R1,P2>>8
         MOVRY     RP0        ; 引数2

; -----------------------------------------------
;    第1バイト
; -----------------------------------------------
         XOR       R0,R0
         MOVMR     R0,IX
         MOVMR     R1,IY

         CALL      PRO        ; 減算

         PUSH      IX
         MOVI      R2,A1
         MOVI      R3,A1>>8
         MOVRX     RP1
         MOVRM     IX,R0      ; 記録
         POP       IX

; -----------------------------------------------
;    第2バイト
; -----------------------------------------------
         INC       IX
         INC       IY

         MOVMR     R0,IX
         MOVMR     R1,IY

         CALL      PRO        ; 減算

         PUSH      IX
         MOVI      R2,A1+1
         MOVI      R3,(A1+1)>>8
         MOVRX     RP1
         MOVRM     IX,R0      ; 記録
         POP       IX

; -----------------------------------------------
;    第3バイト
; -----------------------------------------------
         INC       IX
         INC       IY

         MOVMR     R0,IX
         MOVMR     R1,IY

         CALL      PRO        ; 減算

         PUSH      IX
         MOVI      R2,A1+2
         MOVI      R3,(A1+2)>>8
         MOVRX     RP1
         MOVRM     IX,R0      ; 記録
         POP       IX

; -----------------------------------------------
;    第4バイト
; -----------------------------------------------
         INC       IX
         INC       IY

         MOVMR     R0,IX
         MOVMR     R1,IY

         CALL      PRO        ; 減算

         PUSH      IX
         MOVI      R2,A1+3
         MOVI      R3,(A1+3)>>8
         MOVRX     RP1
         MOVRM     IX,R0      ; 記録
         POP       IX

; -----------------------------------------------
;    2進数8桁 減算サブルーチン
; -----------------------------------------------
PRO:     JMPC      PRO_X1
         JMP       PRO_X2
PRO_X1:  MOVI      R2,1
         SUB       R0,R2
         JMPC      PRO_X2
         XOR       R2,R2
PRO_X2:  SUB       R0,R1
         JMPC      PRO_X3
         SHD       R2,R2
PRO_X3:  RET

; -----------------------------------------------
;    引数
; -----------------------------------------------
P1:      DB        78H,56H,34H,12H
P2:      DB        0F0H,0DEH,0BCH,9AH

; -----------------------------------------------
;    計算結果
; -----------------------------------------------
A1:      DS        4

END



2進数8桁の乗算

2バイト加算プログラムを流用した1バイト乗算プログ ラムです。 結果は2バイト分を記録しています。

; ===============================================
;    1バイト乗算
; ===============================================
; -----------------------------------------------
;    被乗数設置                   
; -----------------------------------------------
         MOVI      R0,P1
         MOVI      R1,P1>>8
         MOVRX     RP0
         MOVI      R0,12H   ; 被乗数
         MOVRM     IX,R0

; -----------------------------------------------
;    乗数設置                   
; -----------------------------------------------
         MOVI      R0,P2
         MOVI      R1,P2>>8
         MOVRX     RP0
         MOVI      R0,34H   ; 乗数
         MOVRM     IX,R0

; -----------------------------------------------
;    前準備                   
; -----------------------------------------------
         MOVI      R0,W1
         MOVI      R1,W1>>8
         MOVRX     RP0
         MOVI      R0,1
         MOVRM     IX,R0     ; 行程初期化

         MOVI      R0,P2
         MOVI      R1,P2>>8
         MOVRX     RP0
         MOVMR     R2,IX
         MOVI      R0,W2
         MOVI      R1,W2>>8
         MOVRX     RP0
         MOVRM     IX,R2
         INC       IX
         MOVI      R0,0
         MOVRM     IX,R0     ; 乗数上桁移動初期化

         MOVI      R0,A1
         MOVI      R1,A1>>8
         MOVRY     RP0
         MOVI      R0,0
         MOVRM     IY,R0     ; 結果 下 初期化
         INC       IY
         MOVRM     IY,R0     ; 結果 上 初期化

; -----------------------------------------------
;    乗算処理                     
; -----------------------------------------------
X1:      MOVI      R0,P1
         MOVI      R1,P1>>8
         MOVRX     RP0       ; IX <- 被除数

         MOVI      R0,W1
         MOVI      R1,W1>>8
         MOVRY     RP0       ; IY <- 行程

         MOVMR     R0,IX     ; 被乗数
         MOVMR     R1,IY     ; 行程(桁検査位置)
         AND       R1,R0
         JMPZ      X2        ; 加算なし

         MOVI      R0,W2
         MOVI      R1,W2>>8
         MOVRX     RP0       ; IX <- 乗数上桁移動
         MOVI      R0,A1
         MOVI      R1,A1>>8
         MOVRY     RP0       ; IY <- 結果
         CALL      ADDW      ; 加算サブルーチン

         MOVI      R0,PRO_A1
         MOVI      R1,PRO_A1>>8
         MOVRY     RP0
         MOVMR     R0,IY     ; 加算結果読み出し 下
         INC       IY
         MOVMR     R1,IY     ; 加算結果読み出し 上

         MOVI      R2,A1
         MOVI      R3,A1>>8
         MOVRY     RP1
         MOVRM     IY,R0     ; 累積加算下記憶
         INC       IY
         MOVRM     IY,R1     ; 累積加算下記憶

; -----------------------------------------------
;    乗数上桁移動                 
; -----------------------------------------------
X2:      MOVI      R0,W2
         MOVI      R1,W2>>8
         MOVRX     RP0
         MOVMR     R2,IX
         INC       IX
         MOVMR     R3,IX     ; R2,R3 <- 乗数上桁移動

         SHU       R2,R2
         JMPC      X5
         SHU       R3,R3
         JMP       X6
X5:      SHU       R3,R3
         MOVI      R0,1
         OR        R3,R0     ; R2,R3 連結上桁移動

X6:      MOVRM     IX,R3
         DEC       IX
         MOVRM     IX,R2     ; 乗数上桁移動 <- R2,R3

; -----------------------------------------------
;    行程計数                     
; -----------------------------------------------
         MOVI      R0,W1
         MOVI      R1,W1>>8
         MOVRX     RP0
         MOVMR     R0,IX     ; IX <- 行程
         MOVI      R1,80H
         AND       R1,R0
         JMPZ      X3        ; 行程継続
         JMP       X4        ; 行程終了
X3:      SHU       R0,R0
         MOVRM     IX,R0     ; 行程増加
         JMP       X1
         
; -----------------------------------------------
;    終了                         
; -----------------------------------------------
X4:      NOP
         NOP

; ===============================================
;    データ域
; ===============================================
; -----------------------------------------------
;    作業域                             
; -----------------------------------------------
W1:     DS         1     ; 行程
W2:     DS         2     ; 乗数上桁移動

; -----------------------------------------------
;    引数                             
; -----------------------------------------------
P1:     DS         1     ; 被乗数
P2:     DS         1     ; 乗数

; -----------------------------------------------
;    結果                             
; -----------------------------------------------
A1      DS         2

; ===============================================
;    サブルーチン 2バイト加算
; ===============================================
ADDW:
; -----------------------------------------------
;    第1バイト
; -----------------------------------------------
         MOVMR     R0,IX
         MOVMR     R1,IY

         XOR       R2,R2
         ADD       R2,R2

         CALL      PRO       ; 加算

         MOVI      R2,PRO_A1
         MOVI      R3,PRO_A1>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    第2バイト
; -----------------------------------------------
         INC       IX
         INC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         
         CALL      PRO       ; 加算

         MOVI      R2,PRO_A1+1
         MOVI      R3,(PRO_A1+1)>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    終了     
; -----------------------------------------------
         RET

; -----------------------------------------------
;    2進数8桁 加算サブルーチン
; -----------------------------------------------
PRO:     JMPC      PRO_X1
         XOR       R2,R2
         JMP       PRO_X2
PRO_X1:  MOVI      R2,1
PRO_X2:  ADD       R0,R2
         JMPC      PRO_X3
         XOR       R2,R2
         JMP       PRO_X4
PRO_X3:  MOVI      R2,1
PRO_X4:  ADD       R0,R1
         JMPC      PRO_X5
         MOVI      R3,0FFH
         ADD       R2,R3
PRO_X5:  RET

; -----------------------------------------------
;    計算結果
; -----------------------------------------------
PRO_A1:      DS        2

END



2進数16桁の乗算

4バイト加算プログラムを流用した2バイト乗算プログ ラムです。 結果は4バイト分を記録しています。

; ===============================================
;    2バイト乗算
; ===============================================
; -----------------------------------------------
;    被乗数設置                   
; -----------------------------------------------
         MOVI      R0,P1
         MOVI      R1,P1>>8
         MOVRX     RP0
         MOVI      R0,34H   ; 被乗数 下
         MOVRM     IX,R0
         MOVI      R0,12H   ; 被乗数 上
         INC       IX
         MOVRM     IX,R0

; -----------------------------------------------
;    乗数設置                   
; -----------------------------------------------
         MOVI      R0,P2
         MOVI      R1,P2>>8
         MOVRX     RP0
         MOVI      R0,78H   ; 乗数 下
         MOVRM     IX,R0
         MOVI      R0,56H   ; 乗数 上
         INC       IX
         MOVRM     IX,R0

; -----------------------------------------------
;    前準備                   
; -----------------------------------------------
         MOVI      R0,W1
         MOVI      R1,W1>>8
         MOVRX     RP0
         MOVI      R0,1
         MOVRM     IX,R0     ; 行程初期化 0
         XOR       R0,R0
         INC       IX
         MOVRM     IX,R0     ; 行程初期化 1
         INC       IX
         MOVRM     IX,R0     ; 行程初期化 2
         INC       IX
         MOVRM     IX,R0     ; 行程初期化 3

         MOVI      R0,P2
         MOVI      R1,P2>>8
         MOVRX     RP0
         MOVMR     R2,IX
         INC       IX
         MOVMR     R3,IX
         MOVI      R0,W2
         MOVI      R1,W2>>8
         MOVRX     RP0
         MOVRM     IX,R2     ; 乗数上桁移動初期化 0
         INC       IX
         MOVRM     IX,R3     ; 乗数上桁移動初期化 1
         INC       IX
         MOVI      R0,0
         MOVRM     IX,R0     ; 乗数上桁移動初期化 2
         INC       IX
         MOVRM     IX,R0     ; 乗数上桁移動初期化 3

         MOVI      R0,A1
         MOVI      R1,A1>>8
         MOVRY     RP0
         MOVI      R0,0
         MOVRM     IY,R0     ; 結果 0 初期化
         INC       IY
         MOVRM     IY,R0     ; 結果 1 初期化
         INC       IY
         MOVRM     IY,R0     ; 結果 2 初期化
         INC       IY
         MOVRM     IY,R0     ; 結果 3 初期化

; -----------------------------------------------
;    乗算処理                     
; -----------------------------------------------
X1:      MOVI      R0,P1
         MOVI      R1,P1>>8
         MOVRX     RP0       ; IX <- 被除数

         MOVI      R0,W1
         MOVI      R1,W1>>8
         MOVRY     RP0       ; IY <- 行程

         MOVMR     R0,IX     ; 被乗数 下
         MOVMR     R1,IY     ; 行程(桁検査位置) 下
         AND       R1,R0
         JMPZ      XA0       ; 次バイト検査
         JMP       XA1       ; 加算あり
XA0:     INC       IX
         INC       IY
         MOVMR     R0,IX     ; 被乗数 上
         MOVMR     R1,IY     ; 行程(桁検査位置) 上
         AND       R1,R0
         JMPZ      X2        ; 加算なし
XA1:     MOVI      R0,W2
         MOVI      R1,W2>>8
         MOVRX     RP0       ; IX <- 乗数上桁移動
         MOVI      R0,A1
         MOVI      R1,A1>>8
         MOVRY     RP0       ; IY <- 結果
         CALL      ADDQ      ; 加算サブルーチン

         MOVI      R0,PRO_A1
         MOVI      R1,PRO_A1>>8
         MOVRY     RP0
         MOVMR     R0,IY     ; 加算結果読み出し 0
         INC       IY
         MOVMR     R1,IY     ; 加算結果読み出し 1
         INC       IY
         MOVMR     R2,IY     ; 加算結果読み出し 2
         INC       IY
         MOVMR     R3,IY     ; 加算結果読み出し 3

         PUSH      RP1
         MOVI      R2,A1
         MOVI      R3,A1>>8
         MOVRY     RP1
         POP       RP1
         MOVRM     IY,R0     ; 累積加算下記憶 0
         INC       IY
         MOVRM     IY,R1     ; 累積加算下記憶 1
         INC       IY
         MOVRM     IY,R2     ; 累積加算下記憶 2
         INC       IY
         MOVRM     IY,R3     ; 累積加算下記憶 3

; -----------------------------------------------
;    乗数上桁移動                     
; -----------------------------------------------
X2:      MOVI      R0,W2
         MOVI      R1,W2>>8
         MOVRX     RP0
         MOVMR     R1,IX     ; R1 <- 乗数上桁移動 0

         SHU       R1,R1
         MOVRM     IX,R1
         JMPC      XA2
         XOR       R2,R2
         JMP       XA3
XA2:     MOVI      R2,1
XA3:     INC       IX
         MOVMR     R1,IX     ; R1 <- 乗数上桁移動 1
         SHU       R1,R1
         LDSR                ; 桁上げを保存
         OR        R1,R2
         MOVRM     IX,R1
         SHU       R0,R0     ; 桁上げを戻す
         JMPC      XA4
         XOR       R2,R2
         JMP       XA5
XA4:     MOVI      R2,1
XA5:     INC       IX
         MOVMR     R1,IX     ; R1 <- 乗数上桁移動 2
         SHU       R1,R1
         LDSR                ; 桁上げを保存
         OR        R1,R2
         MOVRM     IX,R1
         SHU       R0,R0     ; 桁上げを戻す
         JMPC      XA6
         XOR       R2,R2
         JMP       XA7
XA6:     MOVI      R2,1
XA7:     INC       IX
         MOVMR     R1,IX     ; R1 <- 乗数上桁移動 3
         SHU       R1,R1
         OR        R1,R2
         MOVRM     IX,R1

; -----------------------------------------------
;    行程計数                     
; -----------------------------------------------
         MOVI      R0,W1+1
         MOVI      R1,(W1+1)>>8
         MOVRX     RP0
         MOVMR     R1,IX     ; R1 <- 行程 1
         MOVI      R2,80H
         AND       R2,R1
         JMPZ      X3        ; 行程継続
         JMP       X4        ; 行程終了
X3:      DEC       IX
         MOVMR     R1,IX     ; R1 <- 行程 0
         SHU       R1,R1
         MOVRM     IX,R1
         JMPC      XA8
         XOR       R2,R2
         JMP       XA9
XA8:     MOVI      R2,1
XA9:     INC       IX
         MOVMR     R1,IX     ; R1 <- 行程 1
         SHU       R1,R1
         OR        R1,R2
         MOVRM     IX,R1
         JMP       X1
         
; - - - - - - - - - - - - - - - - - - - - - - - -
;    終了                         
; - - - - - - - - - - - - - - - - - - - - - - - -
X4:      NOP
         NOP

; ===============================================
;    データ域
; ===============================================
; -----------------------------------------------
;    作業域                             
; -----------------------------------------------
W1:     DS         2     ; 行程
W2:     DS         4     ; 乗数上桁移動

; -----------------------------------------------
;    引数                             
; -----------------------------------------------
P1:     DS         2     ; 被乗数
P2:     DS         2     ; 乗数

; -----------------------------------------------
;    結果                             
; -----------------------------------------------
A1      DS         4

; ===============================================
;    サブルーチン 4バイト加算
; ===============================================
ADDQ:
; -----------------------------------------------
;    第1バイト
; -----------------------------------------------
         MOVMR     R0,IX
         MOVMR     R1,IY

         XOR       R2,R2
         ADD       R2,R2

         CALL      PRO       ; 加算

         MOVI      R2,PRO_A1
         MOVI      R3,PRO_A1>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    第2バイト
; -----------------------------------------------
         INC       IX
         INC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         
         CALL      PRO       ; 加算

         MOVI      R2,PRO_A1+1
         MOVI      R3,(PRO_A1+1)>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    第3バイト
; -----------------------------------------------
         INC       IX
         INC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         
         CALL      PRO       ; 加算

         MOVI      R2,PRO_A1+2
         MOVI      R3,(PRO_A1+2)>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    第4バイト
; -----------------------------------------------
         INC       IX
         INC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         
         CALL      PRO       ; 加算

         MOVI      R2,PRO_A1+3
         MOVI      R3,(PRO_A1+3)>>8
         PUSH      IX
         MOVRX     RP1
         MOVRM     IX,R0     ; 記録
         POP       IX

; -----------------------------------------------
;    終了     
; -----------------------------------------------
         RET

; -----------------------------------------------
;    2進数8桁 加算サブルーチン
; -----------------------------------------------
PRO:     JMPC      PRO_X1
         XOR       R2,R2
         JMP       PRO_X2
PRO_X1:  MOVI      R2,1
PRO_X2:  ADD       R0,R2
         JMPC      PRO_X3
         XOR       R2,R2
         JMP       PRO_X4
PRO_X3:  MOVI      R2,1
PRO_X4:  ADD       R0,R1
         JMPC      PRO_X5
         MOVI      R3,0FFH
         ADD       R2,R3
PRO_X5:  RET

; -----------------------------------------------
;    計算結果
; -----------------------------------------------
PRO_A1:  DS    4

END



2進数8桁の除算

1バイト除算プログラムです。 余りもあります。

; ===============================================
;    1バイト除算
; ===============================================
         MOVI      R2,23  ; 被除数設置
         MOVI      R1,5   ; 除数設置

         MOVI      R0,0   ; 余り初期化
         MOVI      R3,1   ; 行程計数初期値設置
         MOVX      A0
         MOVRM     IX,R0  ; 結果初期化
; -----------------------------------------------
;    除算処理
; -----------------------------------------------
X0:      SHU       R2,R2
         ROU              ; 被除数 -> 余り に移動
         CMP              ; 余り と 除数 を比較
         JMPC      X1     ; 余り < 除数 なら X1 に分岐
         SUB       R0,R1  ; 余りから除数を引く
         PUSH      RP0
         MOVMR     R0,IX
         SHU       R0,R0
         MOVI      R1,1
         OR        R0,R1
         MOVRM     IX,R0  ; 結果に1を論理和する
         POP       RP0
         JMP       X3
X1:      PUSH      R0
         MOVMR     R0,IX
         SHU       R0,R0
         MOVRM     IX,R0  ; 結果を2進1桁を移動
         POP       R0
X3:      SHU       R3,R3  ; 行程を2進1桁を移動
         JMPC      X2     ; 桁上がりがあったら終わり
         JMP       X0
; -----------------------------------------------
;    終了
; -----------------------------------------------
X2:      NOP
         NOP

; -----------------------------------------------
;    データ
; -----------------------------------------------
A0:      DS        1   ; 結果(商)

END



2進数16桁の除算

2バイト除算プログラムです。 余りもあります。

; ===============================================
;    2バイト除算
; ===============================================
         MOVI      R0,1000&0FFH
         MOVX      P0
         MOVRM     IX,R0
         MOVI      R0,(1000>>8)&0FFH
         INC       IX
         MOVRM     IX,R0   ; 被除数設置

         MOVI      R0,100&0FFH
         MOVX      P1
         MOVRM     IX,R0
         MOVI      R0,(100>>8)&0FFH
         INC       IX
         MOVRM     IX,R0   ; 除数設置
; -----------------------------------------------
;    初期値設置
; -----------------------------------------------
         XOR       R0,R0
         MOVX      P2
         MOVRM     IX,R0
         INC       IX
         MOVRM     IX,R0   ; 余り

         XOR       R0,R0
         MOVX      A0
         MOVRM     IX,R0
         INC       IX
         MOVRM     IX,R0   ; 結果

         MOVI      R0,1
         MOVX      P3
         MOVRM     IX,R0
         INC       IX
         XOR       R0,R0
         MOVRM     IX,R0   ; 行程
; -----------------------------------------------
;    除算処理
; -----------------------------------------------
; - - - - - - - - - - - - - - - - - - - - - - - -
;    余り <- 被除数 2進1桁移動
; - - - - - - - - - - - - - - - - - - - - - - - -
X0:      MOVX      P0
         MOVMR     R0,IX
         SHU       R0,R0
         MOVRM     IX,R0   ; 被除数 0 2進1桁上移動
         INC       IX
         MOVMR     R0,IX
         ROU
         MOVRM     IX,R0   ; 被除数 1 2進1桁上移動
         INC       IX
         MOVMR     R0,IX
         ROU
         MOVRM     IX,R0   ; 余り 0 2進1桁上移動
         INC       IX
         MOVMR     R0,IX
         ROU
         MOVRM     IX,R0   ; 余り 1 2進1桁上移動
; - - - - - - - - - - - - - - - - - - - - - - - -
;    余り と 除数 を比較
; - - - - - - - - - - - - - - - - - - - - - - - -
         MOVX      P2+1
         MOVY      P1+1
         MOVMR     R0,IX
         MOVMR     R1,IY
         CMP
         JMPC      X1
         DEC       IX
         DEC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         CMP
         JMPC      X1
; - - - - - - - - - - - - - - - - - - - - - - - -
;    余り から 除数 を引く
; - - - - - - - - - - - - - - - - - - - - - - - -
         SUB       R0,R1
         MOVRM     IX,R0
         INC       IX
         INC       IY
         MOVMR     R0,IX
         MOVMR     R1,IY
         SUBC
         MOVRM     IX,R0
; - - - - - - - - - - - - - - - - - - - - - - - -
;    結果に1を論理和
; - - - - - - - - - - - - - - - - - - - - - - - -
         MOVX      A0
         MOVMR     R0,IX
         MOVI      R1,1
         OR        R0,R1
         MOVRM     IX,R0
; - - - - - - - - - - - - - - - - - - - - - - - -
;    結果 2進1桁上移動
; - - - - - - - - - - - - - - - - - - - - - - - -
X1:      MOVX      A0
         MOVMR     R0,IX
         SHU       R0,R0
         MOVRM     IX,R0
         INC       IX
         MOVMR     R0,IX
         ROU
         MOVRM     IX,R0
; - - - - - - - - - - - - - - - - - - - - - - - -
;    行程計数
; - - - - - - - - - - - - - - - - - - - - - - - -
         MOVX      P3
         MOVMR     R0,IX
         SHU       R0,R0
         MOVRM     IX,R0
         INC       IX
         MOVMR     R0,IX
         ROU
         MOVRM     IX,R0
         MOVI      R1,80H
         CMP
         JMPZ      X2
         JMP       X0
; -----------------------------------------------
;    終了
; -----------------------------------------------
X2:      NOP
         NOP

; -----------------------------------------------
;    データ
; -----------------------------------------------
P0:      DS        2   ; 被除数
P2:      DS        2   ; 余り
P1:      DS        2   ; 除数
P3:      DS        2   ; 行程

A0:      DS        2   ; 結果(商)

END







先頭