〔プログラムの説明〕
連続する 16 語に格納されたデータを 16 × 16 ビットの図形とみなす。
副プログラムROTATE は,そのビットの図形を 90 度回転する。
(1) ビットの図形の先頭アドレスは GR1 に格納されて,主プログラムから渡される。
(2) GR3 には 1 又は−1 が格納されて,主プログラムから渡される。GR3 の内容が
1 のときは右に 90 度,−1 のときは左に 90 度回転する。
(3) 回転した図形を,GR2 で指定する領域に格納する。
(4) GR1 と GR2 で指定する領域は,重なっていないものとする。
(5) 副プログラム ROTATE の実行例を図 1 に示す。
図1 副プログラム ROTATE の実行例
(6) 右に 90 度回転する場合は,図 2 に示すように,元の図形の先頭語
のビット列を矢印の方向に 1 ビットずつ
a(結果の図形の右端)のビット列に移す。次に
を b に,
を c に,… と順に処理する。左に
90 度回転する場合は,図 3 に示すように,元の図形の最終語から順に,
を a に,
を b に,
を c に,…と順に処理する。

図2 右に回転する場合の処理順序 図3 左に回転する場合の処理順序
(7) 主プログラムに戻るとき,汎用レジスタ GR1〜GR3 の内容を元に戻す。
〔プログラム〕
ROTATE START ;
PUSH 0,GR1 ;
PUSH 0,GR2 ; レジスタの退避
PUSH 0,GR3 ;
ST GR3,INCR ;
LEA GR3,0,GR3 ;
JPZ RIGHT ;
LEA GR1,15,GR1 ;
LEA GR2,15,GR2 ;
RIGHT ST GR1,SOURCE ;
ST GR2,TARGET ;
LEA GR0,1 ; ビット位置の初期化
ST GR0,BITPOS ;
LEA GR3,16 ; 語数カウンタ
LOOP1 ST GR3,COUNTR ;
LD GR1,0,GR1 ;元の図形の1語→GR1
LD GR0,0,GR2 ;結果の図形の1語→GR0
OR GR0,BITPOS ;結果の1語内のビットをオン
LEA GR3,16 ;ビット数カウンタ
LEA GR1,0,GR1 ; 元の図形のビット検査
LOOP2 JMI RESTOR ;
;オンにしたビットをオフ
RESTOR ST GR0,0,GR2 ;結果の図形に格納
LEA GR3,-1,GR3 ;
JZE NWORD ;
ADD GR2,INCR ; 結果の図形の次語→GR0
LD GR0,0,GR2 ;
OR GR0,BITPOS ;結果の1語内のビットをオン
SLL GR1,1 ; 元の図形のビット検査
;
NWORD LD GR1,SOURCE ;
ADD GR1,INCR ; 元の図形の次語アドレス→GR1
ST GR1,SOURCE ;
LD GR2,TARGET ;結果の図形のアドレス→GR2
LD GR0,BITPOS ;
; ビット位置の更新
ST GR0,BITPOS ;
LD GR3,COUNTR ;
LEA GR3,-1,GR3 ;
;
POP GR3 ;
POP GR2 ; レジスタの復元
POP GR1 ;
RET ;
SOURCE DS 1 ;
TARGET DS 1 ;
BITPOS DS 1 ;
INCR DS 1 ;増分(+1又は-1)
COUNTR DS 1 ;
END ;