|
プログラム支援室 A
CPU8A プログラミング |
| はじめに |
| CPU8Aの使い方を簡単なプログラムで説明します。 |
| 2進数8桁の加算 |
|
CPU8A は8桁の汎用レジスタを4個持つプロセッサです
。 Y=A+B の計算をレジスタに置き換えて R0=R0+R1 とし ます。 A と B が固定された既知の値ならレジスタに即値を 代入して次のプログラムになります。 |
MOVI R0,12 MOVI R1,34 ADD R0,R1 END |
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
|