1 ;; 副プログラム ROTATE 2 ;; 16 × 16 ドットの図形のうち 左上の n × n ドットの部分だけを時計回りに90度回転する 3 ;; 1ドットを1ビットで表し,白は0,黒は1が格納されている。 4 ;; 値 n ( 1 <= n <= 16 )は GR3 に設定されて主プログラムから渡される。 5 ;; 1. 図形を表す 16 語の先頭アドレスは GR1 に設定されて,主プログラムから渡される。 6 ;; 2. 回転した結果の図形を格納する領域の先頭アドレスは GR2 に設定されて, 主プログラムから渡される。 7 ;; 3. 元の図形と回転した図形は,異なる領域に格納される。 8 ;; 4. 副プログラムから戻るとき,汎用レジスタ GR1 ~ GR7 の内容は元に戻す。 9 ROTATE START 10 RPUSH 11 ST GR3,N ; nを保存 12 LD GR4,GR3 ; GR4 ← n 13 LD GR5,GR1 ; GR5 ← 元の図形のアドレス 14 LD GR6,GR2 ; GR6 ← 結果の領域のアドレス 15 LD GR7,=16 16 SUBA GR7,GR3 ; GR7 ← 16-n 17 SHIFT LD GR0,0,GR5 ; GR0 ← 元の図形の1語の内容 18 SLL GR0,0,GR3 19 ST GR0,0,GR6 ; 結果の領域 ← GR0 20 LAD GR5,1,GR5 ; 元の図形の1語のアドレス更新 21 LAD GR6,1,GR6 ; 結果の領域の1語のアドレス更新 22 SUBA GR4,=1 ; n語処理済み? 23 JNZ SHIFT 24 COPY SUBA GR7,=1 ; 残りの語の内容を結果の領域に複写 25 JMI LOOP1 26 LD GR0,0,GR5 27 ST GR0,0,GR6 28 LAD GR5,1,GR5 29 LAD GR6,1,GR6 30 JUMP COPY 31 N DS 1 32 LOOP1 LD GR4,N 33 LD GR5,GR2 ; GR5 ← 結果の領域のアドレス 34 LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容 35 LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容 36 SRL GR7,1 37 SLL GR6,1 38 JOV ON 39 JUMP CONT 40 ON OR GR7,=#8000 41 CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納 42 LAD GR5,1,GR5 43 SUBA GR4,=1 44 JNZ LOOP2 45 LAD GR1,1,GR1 46 SUBA GR3,=1 47 JNZ LOOP1 48 RPOP 49 RET 50 END