;Exam2014H26FallPrg2
;Exam2014H26秋Prg2 設問３
;キイボードからいくつか数字列を入力し、
;それぞれ１語長２進化１０進数に変換する。
;昇順に並べ替える（SORT）。最後に、
;数値を数字列に再変換して昇順に表示する。
;----------------------------
MAIN START
	LD GR2,=0       ;数字列カウンタを初期化
LOOP3 IN BUF,ILEN
	LD GR0,ILEN
	JZE EOF         ; JMI EOF（試験問題のコードの変更）
;理由：IN 命令でキイボードから文字を入力する場合、
; その文字数がゼロの時 ILEN には -1 ではなくてゼロが
; 格納される。（Visible Inside の仕様）
	LD GR3,=0       ;配列に格納する内容を初期化
	LAD GR4,BUF
LOOP4 LD GR5,0,GR4   ;GR5 <---数字
	AND GR5,=#000F  ;数字の数値化
	SLL GR3,4       ;処理済の内容を桁上げ
	OR GR3,GR5      ;空いた右端４ビットに数値を格納
	ADDA GR4,=1
	SUBA GR0,=1
	JNZ LOOP4
	ST GR3,ARRAY,GR2 ;２進化１０進数にした数字列を格納
	ADDA GR2,=1
	JUMP LOOP3
EOF LAD GR1,ARRAY
	CALL SORT
	LD GR4,=' '      ;空白文字を設定
LOOP5 LD GR0,0,GR1    ;
	LD GR5,=3        ;ループカウンタを設定
LOOP6 LD GR3,GR0 ;
	AND GR3,=#000F   ;問題e 答え イ
	;末桁の数値を取り出す。
	OR GR3,=#0030    ;数値を数字（文字）に変換
	ST GR3,BUF,GR5   ;バッファに数字を設定
	SUBA GR5,=1
	JMI WRITE
	SRL GR0, 4       ; 問題 f 答え オ
	;未処理の数字を右端４ビットに移動格納する。
	JNZ LOOP6
LOOP7 ST GR4,BUF,GR5 ;バッファに空白を設定
	SUBA GR5,=1
	JMI WRITE
	JUMP LOOP7
WRITE OUT BUF,OLEN
	LAD GR1,1,GR1
	SUBA GR2,=1
	JNZ LOOP5
	RET
BUF DS 7 ; 256（変更）
ILEN DS 1
OLEN DC 4
ARRAY DS 10 ; 100 （変更）
	END
;--------------
SORT START
	RPUSH
	SUBA GR2,=1   ;ループカウンタ１を設定
LOOP1 LD GR3,GR2   ;ループカウンタ２を設定
	LD GR4,GR1    ;GR4 <--- 比較する要素のアドレス
LOOP2 LD GR5,0,GR4
	CPL GR5,1,GR4 ;二つの要素を比較
 	JMI CONT      ;答え　ア
	LD GR6,1,GR4  ;二つの要素を入れ替え
	ST GR5,1,GR4
	ST GR6,0,GR4
CONT ADDA GR4,=1
	SUBA GR3,=1
	JPL LOOP2
	SUBA GR2,=1
	JPL LOOP1    ;答え　エ
	RPOP
	RET
	END
;---------------