MAIN START
	CALL EX09H20
	CALL EX10A30
		;CALL EX11A30
		;CALL EX11A20	
		;CALL EX12A30 暴走する
	CALL EX13A30
		;CALL EX13H20 IN OUT あり
	;CALL EX14A20 ; IN OUT あり
	;CALL EX14H20 ; 実行時メモリ範囲外のエラーとなる。
		;CALL EX15A20 ; Msg多数表示となる。
	;CALL EX15H30
		;CALL EX16A30 ; LAD GR2,#FFFF問題
	;CALL EX16H20
	;CALL EX17A02
		;CALL EX17H21 ; OUT 命令表示の後停止あるいはループになる。
	;CALL EX19A03
	;CALL EX19H31
	RET
	END
;---------------------
;Exam2013H25秋Prg3 平均時間　数字列を数値に変換.txt
;-----------------------
EX13A30 START
	LAD GR1,RUNNER1
	LAD GR2,RUNNER2
	LAD GR3,RUNNER3
	LAD GR4,RUNNER4
	ST GR1,ADR1
	ST GR2,ADR2
	ST GR3,ADR3
	ST GR4,ADR4
	LAD GR1,TBL
	CALL AVERAGE
	RET
RUNNER1 DC '2238'
RUNNER2 DC '2310'
RUNNER3 DC '2458'
RUNNER4 DC '2720'
;２２分３８秒、２３分１０秒、・・・の意味です。
TBL DS 0 ;選手のタイムのアドレステーブル
ADR1 DS 1
ADR2 DS 1
ADR3 DS 1
ADR4 DS 1
	END
;------------------
AVERAGE START
	RPUSH
	LD GR2,=4;
	LD GR3,GR1
	LD GR4,=0
LOOP5 LD GR1,0,GR3  ;選手のタイムの先頭アドレス
	CALL TOSEC;
	ADDA GR4,GR0   ;各選手のタイムの小合計値（秒）　答　ア
	LAD GR3,1,GR3
	SUBA GR2,=1    ;カウンタ１減算
	JNZ LOOP5      ;ゼロで全員の時間合計作業終了
	SRL GR4,2 ;４で割り平均を求める：２回右シフト
	LD GR0,GR4
	LAD GR1,RESULT
	CALL TOTIME
	OUT RESULT,LEN4
	RPOP
	RET
LEN4 DC 4
RESULT DS 4
	END
;-------------------------------------
;例えば１２３８秒を２０分３８秒に変換する。
TOTIME START
	RPUSH
	LD GR2,=3       ;ループ回数
	LAD GR3,VALUE2
LOOP3 LD GR4,0,GR3  ;ＧＲ４＜－－割る値
	LD GR5,=0
LOOP4 CPA GR0,GR4   ;ＧＲ０割るＧＲ４
	JMI NEXT
	ADDA GR5,=1
	SUBA GR0,GR4
	JUMP LOOP4
NEXT OR GR5,='0'    ;割り算結果の商を数値から数字に変換　
	;文字コードの規則性を利用している。参照：文字コード表
	ST GR5,0,GR1    ;答　カ
	LAD GR3,1,GR3
	LAD GR1,1,GR1
	SUBA GR2,=1
	JNZ LOOP3
	OR GR0,='0'    ; GR0の中に割り切れずに残った値
	;数値から数字に変換　参照：文字コード表
	ST GR0,0,GR1   ;　　　答　ア
	RPOP
	RET
VALUE2 DC 600,60,10
	END
;--------------------------------
;例えば２０分３８秒を１２３８秒に変換する。
TOSEC START
	RPUSH
	LD GR5,=0
	LD GR2,=4      ;ループ回数
	LAD GR3,VALUE1
LOOP1 LD GR0,0,GR1  ;ＧＲ０＜－－－時間の一桁
	AND GR0,=#000F  ;数値を取り出す
	ADDA GR0,GR5
	SUBA GR2,=1
	JZE FIN
	LD GR4,0,GR3  ;ＧＲ４＜－－－掛ける値
	LD GR5,=0
LOOP2 SRL GR4,1   ;以下でＧＲ０ＸＧＲ４を行う
	JOV INCR
	JNZ CONT   ;ゼロならば次の行を実行する　答え　イ
	LAD GR3,1,GR3
	LAD GR1,1,GR1
	JUMP LOOP1
INCR ADDA GR5,GR0
CONT SLL GR0,1
	JUMP LOOP2
FIN RPOP
	RET
VALUE1 DC 10,6,10
	END
;-------------------------

;Exam2011H23秋Prg2
;３２ビット１０進数整数を１０進数文字列に変換
;---------------------
EX11A20 START
	LD GR1,VALUP
	LD GR2,VALLOW
	LAD GR3,ANS
	CALL BTOD3
	RET
VALLOW DC #B06A   ;被除数下位１６ビット
VALUP DC #98C5    ;被除数上位１６ビット
DIVUP DC #0002  ; #25D6 ;除数の下位１６ビット
DIVLOW DC #0002 ;除数の上位１６ビット
ANS DS 7
ANSLOW DS 1        ;商下位１６ビット
ANSUP DS 1        ;商上位１６ビット
AMARILOW DS 1     ;余り下位１６ビット
AMARIUP DS 1      ;余り上位１６ビット
	END
;------------------------
BTOD3 START
	RPUSH
	LAD GR6,4,GR3
	LD GR7,GR3
	LAD GR3,DAT
LP	CALL DIV
	OR GR5,='0'
	ST GR5,0,GR6
	CPL GR6,GR7
	JZE FIN
	LAD GR6,-1,GR6
	JUMP LP
FIN	RPOP
	RET
DAT DC 0
	DC 10
	END
;----------------------
BTOD2 START
	RPUSH
	LD GR6,GR3
	LAD GR7,4,GR3
	LAD GR3,UDAT   ;除数の初期設定
LP CALL DIV
	OR GR2,='0'    ;答え　イ
	ST GR2,0,GR6   ;１０進数字１文字格納　
	CPL GR6,GR7
	JZE FIN
	LAD GR6,1,GR6
	LD GR1,GR4     ;被除数の再設定
	LD GR2,GR5
	LAD GR3,2,GR3  ;答え　イ
	JUMP LP
FIN RPOP
	RET
UDAT DC 0
	DC 10000
	DC 1000
	DC 0
	DC 100
	DC 10
	DC 0
	DC 1
	END
;----------------------------
DIV START
	PUSH 0,GR6
	PUSH 0,GR7
	LD GR6,GR1 　　;被除数上位１６ビット
	LD GR7,GR2 　　;被除数下位１６ビット
	LD GR1,=#FFFF  ;商の初期化
	LD GR2,=#FFFF
LP LD GR4,GR6	　　　; GR1
	LD GR5,GR7 　　;GR2
	ADDL GR2,=1    ;商のカウントアップ
	JOV ADJ1
	JUMP CONT
ADJ1 ADDL GR1,=1    ;a 答え　イ
CONT SUBL GR6,0,GR3
	JOV FIN
	SUBL GR7,1,GR3
	JOV ADJ2        ; b 答え　ウ
	JUMP LP
ADJ2 SUBL GR6,=1
	JOV FIN
	JUMP LP
FIN POP GR7
	POP GR6
	RET
	END
;---------------------


;Exam2010H22FallPrg3   ZZ
;Exam2010H22秋Prg3
;部分ビット列の逆転
;----------------------
EX10A30 START
	LAD GR1,WORD
	LD GR2,P
	LD GR3,Q
	CALL PREVRS
	RET
WORD DC #BE5A  ;
HOZON DC #BE5A ;比較用の元のビット列
P DC 8
Q DC 4
	END
;---------------
PREVRS START
	RPUSH
	LD GR4,0,GR1   ;ビット列を保存
	CALL REVRS     ;ビット列のビットの並びを逆転
	LD GR5,0,GR1   ;GR5 <--- 逆転したビット列
	LD GR6,=16
	SUBA GR6,GR3   ;GR6 <--- 16-q
	SRL GR5,0,GR2  ;逆転した部分ビット列aを右端に移動
	SLL GR5,0,GR6  
    ;逆転した部分ビット列aを左端に移動 　　答え ウ
  SRL GR5,0,GR2  ;逆転した部分ビット列aをＰビット右に移動
    ;------------------------
	LD GR6,=#8000
	SRA GR6,-1,GR3 ;Qビット連続した１の並びを作成
	SRL GR6,0,GR2  ;Ｐビット右へ移動
	XOR GR6,=#FFFF ;１を０に、０を１にビットを反転
	AND GR6,GR4    
    ;元のビット列中の部分ビット列aにゼロを設定
	;-----------------------------
	OR GR6,GR5     ;合成する 　　答え　ア
	ST GR6,0,GR1
	RPOP
	RET
	END	
;------------------------
LREVRS START
	RPUSH
	LD GR3,GR1 ;WORDSの先頭アドレス
	LD GR4,GR2 ;　Ｎ
	SUBA GR4,=1
	JZE LOOP2
	ADDA GR4,GR1
LOOP1 LD GR5,0,GR3 ;GR3の指す語とGR4が指す語の内容を入れ替える
	LD GR6,0,GR4  ;
	ST GR5,0,GR4  ;
	ST GR6,0,GR3  ;
	LAD GR3,1,GR3 ;GR3を次の語に位置付ける
	LAD GR4,-1,GR4 ;GR4を一つ前の語に位置付ける
	CPA GR3,GR4
	JPL LOOP1 ;ゼロまたはマイナスの時語順逆転完了
LOOP2 CALL REVRS
	LAD GR1,1,GR1 ;次の語のアドレス
	SUBA GR2,=1 ;残りの語数をカウント
	JNZ LOOP2 ;GR2がゼロになると終了
FIN3  RPOP
	RET
	END
;--------------------
REVRS START
	RPUSH
	LD GR4,=0    ;結果のビット列を初期化
	LAD GR2,15   ;ループカウンタ
	LD GR3,0,GR1 ; GR3 <--- ビット列
LOOP SLL GR4,1   ;結果のビット列を左シフト
	SRL GR3,1    ;元のビット列を右シフト
	JOV ON   ;元のビット列右端に１があればＯＮへ　答え　ウ
	JZE FIN1 ;元のビット列の残りのビットはすべてゼロ
	JUMP OFF
ON OR GR4,=#0001
OFF SUBA GR2,=1 ;カウンタから１を引く
	JMI FIN2    ;１６ビット処理済
	JUMP LOOP
FIN1 SLL GR4,0,GR2
;結果のビット列を残りのビット数だけシフト　答え　イ
FIN2 ST GR4,0,GR1
	RPOP
	RET
	END
;----------------


;Exam2009H21Prg シフトによる３２ビット乗算
;被乗数３２ビット、乗数も３２ビット 完成
;----------------
EX09H20 START
	LAD GR1,VALUP ;被乗数の上位語のアドレス
	LAD GR2,MLTUP  ;乗数の上位語のアドレス
	LAD GR3,SEKI  ;積 計算結果の上位語のアドレス
	CALL MUL
	RET
VALUP DC  #0079 ;被乗数の上位語
VALDWN DC #8A03 ;被乗数の上位語
MLTUP DC #0000  ;乗数の上位語
MLTDWN DC #0002 ;乗数の下位語
SEKI DS 2       ;積
	END
;------------------
MUL START
	RPUSH
	PUSH 0,GR3    ;積の上位語アドレス退避
	PUSH 0,GR2    ;乗数上位語アドレス退避
	LD GR2,1,GR2  ;乗数下位語を取り出しＧＲ２に設定
	CALL MULS     ;被乗数Ｘ乗数下位語ー＞積（Ａ）
	POP GR2       ;乗数上位語アドレス復元
	LD GR2,0,GR2  ;答え オ
    ;乗数上位語取り出しＧＲ２に設定　
	LAD GR3,SV    ;結果の格納先として作業領域を設定
	CALL MULS     ;被乗数Ｘ乗数上位語ー＞積（Ｂ）
	LD GR6,1,GR3  ;答え　カ　
	POP GR3       ;
	ADDL GR6,0,GR3
    ;積（Ａ）の上位語と積（Ｂ）の下位語を加算
	ST GR6,0,GR3
	RPOP
	RET
SV DS 2
	END
;----------------
MULS START
	RPUSH
	LAD GR6,0    ;積　上位語の初期化
	LAD GR7,0    ;積　下位語の初期化
	LD GR4,0,GR1 ;被乗数　上位語の取り出し
	LD GR5,1,GR1 ;被乗数　下位語の取り出し
LP SRL GR2,1      ;乗数を１ビット右にシフト
	JOV ADD32    ;答え　ウ
	JZE FIN
	JUMP NEXT      ;加算処理をスキップ
ADD32 ADDL GR6,GR4 ;32bit + 32bit --> 32bit
	ADDL GR7,GR5   ;
	JOV ADJ1       ;答え　ウ
	JUMP NEXT
ADJ1 ADDL GR6,=1 ;桁上げ処理
NEXT SLL GR4,1   ;被乗数（３２ビット）上位語を１ビット左にシフト
	;上のシフト操作で最下位桁が必ずゼロとなる。
	SLL GR5,1   ;被乗数下位語を１ビット左にシフト　答え　エ
	JOV ADJ2
	JUMP LP
ADJ2 OR GR4,=1    ;最下位桁を１にする
;ADJ2 ADDL GR4,=1 ; でも同じはずである。
	JUMP LP
FIN ST GR6,0,GR3  ;乗算結果の格納
	ST GR7,1,GR3
	RPOP
	RET
	END
;-------------------
