-------------------------------------------
エラー処理と例外処理はありません。
-------------------------------------------
[全体]
RS.作業用レジスタの内容の退避
MP.主要処理
RR.作業用レジスタの内容の復旧
FN.終了
[全体-フローチャート作成]
/ ̄\
(start )
\__/
┌──┴───┐
│レジスタ退避│
└──┬───┘
┌─┴──┐
│主要処理│
└─┬──┘
┌──┴───┐
│レジスタ復旧│
└──┬───┘
/ ̄\
( end )
\__/
[全体-命令作成]
RS.作業用レジスタの内容の退避
!RPUSH
!!GR1〜GR7を退避しているが、必要なレジスタだけにすることも出来る。
MP.主要処理
!!詳細化が必要
RR.作業用レジスタの内容の復旧
!RPOP
FN.終了
!RET
-------------------------------------------
[詳細化-第1段階]
MP.主要処理
MP-1.下位15ビット中の1の数を数える
MP-2.奇数パリティになる様に、パリティ・ビットを設定する
[詳細化-第1段階-フローチャート作成]
!!このフローで、「全体」のフロー中の「主要処理」を置き換えれば良い。
!!以下の各フローも同様に、置き換える。
┌───────┴───────┐
│下位15ビット中の1の数を数える │
└───────┬───────┘
┌──────┴──────┐
│奇数パリティになる様に、 │
│パリティ・ビットを設定する│
└──────┬──────┘
[詳細化-第1段階-命令作成]
!!フローと同様、「全体」の命令中の「主要処理」を置き換えれば良い。
!!以下の各命令も同様に、置き換える。
!!詳細化が必要
MP.主要処理
MP-1.下位15ビット中の1の数を数える
!!詳細化が必要
MP-2.奇数パリティになる様に、パリティ・ビットを設定する
!!詳細化が必要
-------------------------------------------
[詳細化-第2段階-1]
MP-1.下位15ビット中の1の数を数える
MP-1-1.チェック対象のビット列データを設定
MP-1-2.ビット1数を0にする
MP-1-3.残り反復回数を15にする
MP-1-4.最下位ビット(LSB)が1の時、ビット1数を+1
MP-1-5.ビット列全体を1ビット分右へシフトする
MP-1-6.残り反復回数を−1
MP-1-7.残り反復回数が+の時、MP-1-4へ
[詳細化-第2段階-1-フローチャート作成]
┌─┴──┐
│GR1←GR0│
└─┬──┘
┌───┴───┐
│ビット1数←0 │
└───┬───┘
┌───┴────┐
│残り反復回数←15│
└───┬────┘
┌───→│
│ /\
│ / \ N
│ < GR1 &1 >──┐
│ \ =1/ │
│ \/Y │
│┌───┴───┐│
││ビット1数+1││
│└───┬───┘│
│ │←───┘
│ ┌──┴───┐
│ │GR1←GR1>>1 │…[1ビット分右へシフト
│ └──┬───┘
│┌───┴────┐
││残り反復回数−1│
│└───┬────┘
│ /\
│ / \
│ Y / \
└─<残り反復回数>
\ >0/
\ /
\/N
│
!!フローチャート中の「>>」は、右シフトを表す演算子(計算用の記号)で、
!!C言語など多くの言語で使用されている。
!!左シフトは、「<<」となる。
[詳細化-第2段階-1-命令作成]
MP-1.下位15ビット中の1の数を数える
MP-1-1.チェック対象のビット列データを設定
!LD GR1,GR0
MP-1-2.ビット1数を0にする
!LAD GR2,0
MP-1-3.残り反復回数を15にする
!LAD GR3,15
MP-1-4.最下位ビットが1の時、ビット1数を+1
!LD GR4,GR1
!AND GR4,=1
!JZE MP-1-5
!LAD GR2,1,GR2
MP-1-5.ビット列全体を1ビット分右へシフトする
!SRL GR1,1
!!このプログラムでは、最上位ビットがコピーされても良いので、SRAでも良い。
MP-1-6.残り反復回数を−1
!SUBA GR3,=1
!!SUBAなので、次の命令で使うフラグが設定される。
!!「LAD GR3,-1,GR3」はフラグが設定されないので、駄目。
MP-1-7.残り反復回数が0で無い時、MP-1-4へ
!JPL MP-1-4
!!MP-1-4は、フローチャートと異なるが、次の方法でも実現出来る。
[詳細化-第2段階-1-命令該当部分-変更]
MP-1-4.最下位ビットが1の時、ビット1数を+1
!LD GR4,GR1
!AND GR4,=1
!ADDA GR2,GR4
!!GR4が、足す場合は1、足さない場合は0となることを利用している。
!!分岐命令が無くなって効率が良いこの方法で、置き換えることにしよう。
!!(実行命令数は、足さない場合は減らないが、足す場合は減る。)
!!ただし開発実務では、
!!顧客に承認されたフローチャートに基づいてプログラムを作成する場合、
!!変更出来ない場合もある。
!!フローチャートの該当部分も変更しておこう。
[詳細化-第2段階-1-フローチャート該当部分-変更]
│ ┌──┴───┐
│ │GR4←GR1 & 1│
│ └──┬───┘
│┌───┴────┐
││ビット1数+GR4 │
│└───┬────┘
-----------------------------
[詳細化-第2段階-2]
MP-2.奇数パリティになる様に、パリティ・ビットを設定する
MP-2-1.元のビット列のパリティ・ビットを消去
MP-2-2.ビット1数が偶数の時、パリティ・ビットを設定
!!奇数の時は奇数のまま、偶数の時は奇数に変わる。
[詳細化-第2段階-2-フローチャート作成]
┌───┴────┐
│GR0←GR0 & #7FFF│
└───┬────┘
│
/\
/ \
/ \
/ \ N
< ビット1数 & 1 >─┐
\ =0/ │
\ / │
\ / │
\/Y │
┌────┴────┐│
│GR0←GR0 or #8000 ││
└────┬────┘│
│←────┘
[詳細化-第2段階-2-命令作成]
MP-2.奇数パリティになる様に、パリティ・ビットを設定する
MP-2-1.元のビット列のパリティ・ビットを消去
!AND GR0,=#7FFF
MP-2-2.ビット1数が偶数の時、パリティ・ビットを設定
!AND GR2,=1
!!2進数で最下位ビットが0の時、その数は偶数。
!!最下位ビットが1の時、その数は奇数。
!JNZ MP-2-3
!OR GR0,=#8000
MP-2-3.
!!飛び先用ダミー
!!orを表す演算子として、
!!本来は、前に使っている「&」に対応した「|」を使うべきである。
-------------------------------------------
以下、全体を纏め、定数データや作業領域等を追加し、
ラベル等を適切に設定すれば良いです。
又、適宜コメントを付け加えます。
次回、全体を纏めたものとプログラムの清書を示しますが、
自分でも考えておいて下さい。
又、作成したプログラムを呼出してテストするプログラムである、
テスト用ドライバも考えてみましょう。
テスト用データも考えてみましょう。
|