; 平成２３年度春　図形の回転
; 連続する 16 語に格納した 16 × 16 ドットの白黒の図形を，
; 時計回りに 90 度回転する 副プログラム ROTATE である。
; 図形の回転の実行例を図１に示す。
; このとき，１ドットを１ビットで 表し，
; 白は０，黒は１が格納されている。
;----------------------------------
;図形の問題のときは、CASL2 Visible Insideの
;設定を変更するとたいへんわかりやすく
;たのしい表示になります。メインメニュの
;「表示」--> 「表示スタイルの選択」
;--> 「メモリ領域の表示スタイル」を
;黒白丸の表示スタイルに変更します。
;その後アセンブルします。
;メモリのZUKEI領域に漢数字の「五」が見えます。
;実行するとメモリのKAITENZ領域に、
;９０度右回転した漢数字の「五」が現れます。
;白丸はゼロビット、黒丸は１ビットを表しています。
;----------------------
; (1) 図形を表す 16 語の先頭アドレスは GR1 に設定されて，
;     主プログラムから渡される。
;----------
;(2) 回転した結果の図形を格納する領域の先頭アドレスは
;    GR2 に設定されて， 主プログラムから渡される。
;----------
ROTATE  START
	LAD GR1,ZUKEI
	LAD GR2,KAITENZK
;-----------
	RPUSH
  LD GR3,=8 ; 16から8に変更
;LOOP1 LD GR4,=16
;------------------------
	ST     GR3,N          ; n を保存
   LD     GR4,GR3        ; GR4 ← n
   LD     GR5,GR1        ; GR5 ← 元の図形のアドレス
   LD     GR6,GR2        ; GR6 ← 結果の領域のアドレス
   LD     GR7,=16
   SUBA   GR7,GR3        ; GR7 ← 16-n
SHIFT LD  GR0,0,GR5      ; GR0 ← 元の図形の１語の内容
	SLL 	 GR0,0,GR3
	 ST     GR0,0,GR6      ; 結果の領域 ← GR0
   LAD    GR5,1,GR5      ; 元の図形の１語のアドレス更新
   LAD    GR6,1,GR6      ; 結果の領域の１語のアドレス更新
   SUBA   GR4,=1         ; n 語処理済み？
   JNZ    SHIFT
COPY	SUBA   GR7,=1      ; 残りの語の内容を結果の領域に複写
	JMI LOOP1
	LD     GR0,0,GR5
   ST     GR0,0,GR6
   LAD    GR5,1,GR5
   LAD    GR6,1,GR6
   JUMP   COPY
;N      DS     1 ; END命令の直前に移動した。
LOOP1  LD     GR4,N
;------------------------------------
	LD GR5,GR2
; GR5 ← 結果の領域のアドレス
	LD GR6,0,GR1
; GR6 ← 元の図形の先頭語の内容
LOOP2 LD  GR7,0,GR5
; GR7 ← 結果の領域の１語の内容
	SRL    GR7,1
;+++++++++++++++++++++++++++++
  SLL    GR6,1 ;変更前の行
;	SRL GR6,1 ;変更後の行
;+++++++++++++++++++++++++++++
  JOV    ON
  JUMP   CONT
ON   OR GR7,=#8000
CONT ST GR7,0,GR5
; 処理した１語を結果の領域に格納
	LAD GR5,1,GR5
	SUBA   GR4,=1
  JNZ    LOOP2
	LAD	GR1,1,GR1
  SUBA   GR3,=1
  JNZ    LOOP1
  RPOP
  RET
ZUKEI DC #FFFC
	DC #FFFC
	DC #FFFC
	DC #0700
	DC #0700
	DC #0700
	DC #FFFC
	DC #FFFC
	DC #FFFC
	DC #071C
	DC #071C
	DC #071C
	DC #FFFF
	DC #FFFF
	DC #FFFF
	DC #0000
KAITENZK DS 16
N      DS     1
  END
