プログラム支援室 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 |