--- /dev/null
+MAIN START
+ LAD GR2,16
+ LAD GR3,16
+ CALL OUTPBM
+ END
--- /dev/null
+MAIN START
+ LAD GR1,GRAPH
+ CALL PBM16
+ RET
+GRAPH 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
+ END
--- /dev/null
+;;; casl2 call_rotate.casl ../../casl2lib/outb_w.casl ../../casl2lib/divl.casl ../../casl2lib/rev.casl rotate.casl | cat 16_16.pbm - >five_rot.pbm
+MAIN START
+ LAD GR1,ORG
+ LAD GR2,RES
+ CALL ROTATE
+ LAD GR2,0
+LOOP LD GR1,RES,GR2
+ CALL OUTB
+ LAD GR2,1,GR2
+ CPA GR2,HEIGHT
+ JZE FIN
+ JUMP LOOP
+FIN RET
+ORG 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
+HEIGHT DC 16
+RES DS 16
+ END
--- /dev/null
+;;; casl2 call_rotate3.casl ../../casl2lib/outb_w.casl ../../casl2lib/divl.casl ../../casl2lib/rev.casl rotate3.casl | cat 16_16.pbm - >five_rot3.pbm
+MAIN START
+ LAD GR1,ORG
+ LAD GR2,RES
+ LAD GR3,8
+ CALL ROTATE
+ LAD GR2,0
+LOOP LD GR1,RES,GR2
+ CALL OUTB
+ LAD GR2,1,GR2
+ CPA GR2,HEIGHT
+ JZE FIN
+ JUMP LOOP
+FIN RET
+ORG 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
+HEIGHT DC 16
+RES DS 16
+ END
--- /dev/null
+;;; casl2 outl_call.casl outl.casl
+MAIN START
+ LAD GR2,0
+LOOP LD GR1,VAL,GR2
+ CALL OUTB
+ LAD GR2,1,GR2
+ CPA GR2,HEIGHT
+ JZE FIN
+ JUMP LOOP
+FIN RET
+VAL 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
+HEIGHT DC 16
+ END
--- /dev/null
+;;; PBM16
+;;; GR1で指定されたアドレス以降のメモリを 16×16 の
+;;; 白黒ビットマップ画像データ(白:0 黒:1)とみなし、
+;;; PBM画像ファイルとして出力
+;;; 入力: GR1 画像データの先頭アドレス
+;;; 依存副プログラム: outl.casl
+PBM16 START
+ PUSH 0,GR1
+ PUSH 0,GR2
+ ST GR1,BEG
+ OUT L1,L1LEN
+ OUT L2,L2LEN
+ XOR GR2,GR2
+LOOP CPL GR2,HEIGHT
+ JZE FIN
+ LD GR1,BEG
+ ADDL GR1,GR2
+ LD GR1,0,GR1
+ CALL OUTB
+ LAD GR2,1,GR2
+ JUMP LOOP
+FIN POP GR2
+ POP GR1
+ RET
+L1 DC 'P1'
+L1LEN DC 2
+L2 DC '16 16'
+L2LEN DC 5
+HEIGHT DC 16
+BEG DS 1
+ END
--- /dev/null
+;; 副プログラム ROTATE
+;; 連続する16語に格納した16 × 16 ドットの白黒の図形を,時計回りに90度回転する
+;; 1ドットを1ビットで表し,白は0,黒は1が格納されている。
+;; 1. 図形を表す 16 語の先頭アドレスは GR1 に設定されて,主プログラムから渡される。
+;; 2. 回転した結果の図形を格納する領域の先頭アドレスは GR2 に設定されて, 主プログラムから渡される。
+;; 3. 元の図形と回転した図形は,異なる領域に格納される。
+;; 4. 副プログラムから戻るとき,汎用レジスタ GR1 ~ GR7 の内容は元に戻す。
+ROTATE START
+ RPUSH
+ LD GR3,=16
+LOOP1 LD GR4,=16
+ LD GR5,GR2 ; GR5 ← 結果の領域のアドレス
+ LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容
+LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容
+ SRL GR7,1
+ SLL GR6,1
+ JOV ON
+ JUMP CONT
+ON OR GR7,=#8000
+CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納
+ LAD GR5,1,GR5
+ SUBA GR4,=1
+ JNZ LOOP2
+ LAD GR1,1,GR1
+ SUBA GR3,=1
+ JNZ LOOP1
+ RPOP
+ RET
+ END
--- /dev/null
+;; 副プログラム ROTATE
+;; 連続する16語に格納した16 × 16 ドットの白黒の図形を,時計回りに90度回転する
+;; 1ドットを1ビットで表し,白は0,黒は1が格納されている。
+;; 1. 図形を表す 16 語の先頭アドレスは GR1 に設定されて,主プログラムから渡される。
+;; 2. 回転した結果の図形を格納する領域の先頭アドレスは GR2 に設定されて, 主プログラムから渡される。
+;; 3. 元の図形と回転した図形は,異なる領域に格納される。
+;; 4. 副プログラムから戻るとき,汎用レジスタ GR1 ~ GR7 の内容は元に戻す。
+ROTATE START
+ RPUSH
+ LD GR3,=16
+LOOP1 LD GR4,=16
+ LD GR5,GR2 ; GR5 ← 結果の領域のアドレス
+ LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容
+LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容
+ SRL GR7,1
+ SRL GR6,1
+ JOV ON
+ JUMP CONT
+ON OR GR7,=#8000
+CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納
+ LAD GR5,1,GR5
+ SUBA GR4,=1
+ JNZ LOOP2
+ LAD GR1,1,GR1
+ SUBA GR3,=1
+ JNZ LOOP1
+ RPOP
+ RET
+ END
--- /dev/null
+;; 副プログラム ROTATE
+;; 16 × 16 ドットの図形のうち 左上の n × n ドットの部分だけを時計回りに90度回転する
+;; 1ドットを1ビットで表し,白は0,黒は1が格納されている。
+;; 値 n ( 1 <= n <= 16 )は GR3 に設定されて主プログラムから渡される。
+;; 1. 図形を表す 16 語の先頭アドレスは GR1 に設定されて,主プログラムから渡される。
+;; 2. 回転した結果の図形を格納する領域の先頭アドレスは GR2 に設定されて, 主プログラムから渡される。
+;; 3. 元の図形と回転した図形は,異なる領域に格納される。
+;; 4. 副プログラムから戻るとき,汎用レジスタ GR1 ~ GR7 の内容は元に戻す。
+ROTATE START
+ RPUSH
+ 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 ← 元の図形の1語の内容
+ SLL GR0,0,GR3
+ ST GR0,0,GR6 ; 結果の領域 ← GR0
+ LAD GR5,1,GR5 ; 元の図形の1語のアドレス更新
+ LAD GR6,1,GR6 ; 結果の領域の1語のアドレス更新
+ 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
+LOOP1 LD GR4,N
+ LD GR5,GR2 ; GR5 ← 結果の領域のアドレス
+ LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容
+LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容
+ SRL GR7,1
+ SRL GR6,1
+ JOV ON
+ JUMP CONT
+ON OR GR7,=#8000
+CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納
+ LAD GR5,1,GR5
+ SUBA GR4,=1
+ JNZ LOOP2
+ LAD GR1,1,GR1
+ SUBA GR3,=1
+ JNZ LOOP1
+ RPOP
+ RET
+ END
--- /dev/null
+;;; GR1に格納された値を、空白付きの2進数値として表示
+OUTB START
+ RPUSH
+ LD GR2,BIN ; GR2に2進数の「2」を格納。
+ XOR GR4,GR4 ; GR4: 2進数値の長さ
+STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
+ JMI STLST ; ↓
+ CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納
+ LD GR1,GR3 ; GR1にGR3をコピー
+ LD GR1,NCHAR,GR1 ; GR1を文字に変換
+ ST GR1,STR,GR4 ; (STR + GR4) <- GR1
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ LD GR1,SPC ; GR1 <- SPC
+ ST GR1,STR,GR4 ; (STR + GR4) <- GR1
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ LD GR1,GR0 ; GR0をGR1にコピー
+ JUMP STI ; ループ終端
+STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換
+ ST GR1,STR,GR4 ; (STR + GR4) <- GR1
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+EMLOOP CPL GR4,DIG ; ループ先頭。(GR4 = DIG)の場合は、ループ脱出
+ JZE PRT ; ↓
+ LD GR1,SPC ; GR1 <- SPC
+ ST GR1,STR,GR4 ; (STR + GR4) <- GR1
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ LD GR1,NCHAR ; GR1 <- NCHAR:'0'
+ ST GR1,STR,GR4 ; (STR + GR4) <- GR1
+ LAD GR4,1,GR4 ; GR4 <- GR4 + 1
+ JUMP EMLOOP ; ループ終端
+PRT ST GR4,LEN ; LEN <- GR4
+ LD GR2,LEN ; GR2にLENの値を格納
+ LAD GR1,STR ; GR1に文字列のアドレスを格納
+ CALL REV ; 文字列を逆順に並べ替え
+ OUT STR,LEN ; 文字列を出力
+ RPOP
+ RET
+STR DS 32
+LEN DS 1
+BIN DC 2
+NCHAR DC '01'
+SPC DC ' '
+DIG DC 31
+ END
--- /dev/null
+;;; PBM画像ファイルを出力
+;;; GR1: 画像ビット列の先頭アドレス
+;;; GR2: 画像の幅
+;;; GR3: 画像の高さ
+OUTPBM START
+ OUT HEADER,HLEN
+ PUSH 0,GR1
+ PUSH 0,GR2
+ PUSH 0,GR3
+ PUSH 0,GR4
+ XOR GR4,GR4
+ LD GR1,GR2
+ LAD GR2,WIDTH
+ CALL L2STR
+ LD GR4,GR0
+ LAD GR4,1,GR4
+ LD GR1,SPC
+ ST GR1,WIDTH,GR4
+ LAD GR4,1,GR4
+ LD GR1,GR3
+ LAD GR2,WIDTH,GR4
+ CALL L2STR
+ ADDL GR4,GR0
+ ST GR4,WHLEN
+ OUT WIDTH,WHLEN
+ POP GR4
+ POP GR3
+ POP GR2
+ POP GR1
+ RET
+HEADER DC 'P1'
+HLEN DC 2
+WIDTH DS 32
+SPC DC ' '
+HEIGHT DS 1
+WHLEN DS 1
--- /dev/null
+次のアセンブラプログラムの説明及びプログラムを読んで,設問1~3に答えよ。
+
+〔プログラム1の説明〕
+
+ 連続する 16 語に格納した 16 × 16 ドットの白黒の図形を,時計回りに 90 度回転する 副プログラム ROTATE である。図形の回転の実行例を図1に示す。このとき,1ドットを1ビットで 表し,白は0,黒は1が格納されている。
+
+(1) 図形を表す 16 語の先頭アドレスは GR1 に設定されて,主プログラムから渡される。
+
+(2) 回転した結果の図形を格納する領域の先頭アドレスは GR2 に設定されて, 主プログラムから渡される。
+
+(3) 元の図形と回転した図形は,異なる領域に格納される。
+
+(4) 副プログラムから戻るとき,汎用レジスタ GR1 ~ GR7 の内容は元に戻す。
+
--- /dev/null
+ MAIN START
+ RPUSH
+ LD GR1,ORG
+ LAD GR2,RES
+ORG DC #FC,#FC,#FC,#70,#70,#70,#FC,#FC,#FC,
--- /dev/null
+ ROTATE START
+ RPUSH
+ LD GR3,=16
+LOOP1 LD GR4,=16
+ LD GR5,GR2 ; GR5 ← 結果の領域のアドレス
+ LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容
+LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容
+ SRL GR7,1
+ SLL GR6,1
+ JOV ON
+ JUMP CONT
+ON OR GR7,=#8000
+CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納
+ LAD GR5,1,GR5
+ SUBA GR4,=1
+ JNZ LOOP2
+ LAD GR1,1,GR1
+ SUBA GR3,=1
+ JNZ LOOP1
+ RPOP
+ RET
+ END
--- /dev/null
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
+0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
+0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
+0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
+0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
+0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
+1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
--- /dev/null
+include ../Define.mk
+include ../Test.mk
--- /dev/null
+../../../../casl2 outb_w.casl ../../../../as/casl2lib/outb_w.casl ../../../../as/casl2lib/divl.casl ../../../../as/casl2lib/rev.casl
--- /dev/null
+../../../../casl2 outb_w0.casl ../../../../as/casl2lib/outb_w.casl ../../../../as/casl2lib/divl.casl ../../../../as/casl2lib/rev.casl
--- /dev/null
+;;; casl2 outb_call.casl outb.casl
+MAIN START
+ LAD GR2,0
+LOOP LD GR1,VAL,GR2
+ CALL OUTB
+ LAD GR2,1,GR2
+ CPA GR2,CNT
+ JZE FIN
+ JUMP LOOP
+FIN RET
+VAL DC 0
+ DC #0001,#0002,#0004,#0008
+ DC #0010,#0020,#0040,#0080
+ DC #0100,#0200,#0400,#0800
+ DC #1000,#2000,#4000,#7FFF
+ DC #8000
+ DC #8001,#C000,#E000,#F000
+ DC #F800,#FC00,#FE00,#FF00
+ DC #FF80,#FFC0,#FFE0,#FFF0
+ DC #FFF8,#FFFC,#FFFE,#FFFF
+CNT DC 34
+ END
--- /dev/null
+;;; casl2 outb_call.casl outb.casl
+MAIN START
+ LAD GR2,0
+LOOP LD GR1,VAL,GR2
+ CALL OUTB
+ LAD GR2,1,GR2
+ CPA GR2,CNT
+ JZE FIN
+ JUMP LOOP
+FIN RET
+VAL DC #0001,#8000
+CNT DC 2
+ END