; Exam2019R01AkiP3パック１０進数の符号にかかわらず加算
MAIN	START
	LD GR1,AA1
	LD GR2,BB1
	CALL ADDP
	ST GR0,ANS1
	;----------
	LD GR1,AA2
	LD GR2,BB2
	CALL ADDP
	ST GR0,ANS2
	RET
AA1 	DC #246C
BB1	DC #057C
ANS1	DS 1 ; 加算結果　#303C
AA2 	DC #246D
BB2 	DC #057C
ANS2 	DS 1 ; 加算結果　#189D
	END
;-------------------------------------------
ADDP 	START
; 加算する二つの数値が同符号であるか異符号であるかを調べて、
; ADDP1, ADDP2を使い分ける。
	LD GR0,GR1
	;最下位パックの最下位ビットが０であれば正、１は負（題意による）
	XOR GR0,GR2
	;XOR結果の最下位ビットであれば０は同符号、１は異符号
	SRL GR0,1
	;最下位ビットが１ならば、オーバーフロウフラグが１となる
	JOV P2
	CALL ADDP1
	JUMP FIN
P2	CALL ADDP2
FIN 	RET
	END
;-------------------------------
ADDP2	START
	RPUSH
	CPL GR1,GR2
	JPL INI
 	LD GR4,GR1 ;
	LD GR1,GR2
	LD GR2,GR4
INI	ST GR1,A
	ST GR2,B
	LAD GR3,4 ;
	AND GR1,=#000F
	ST GR1,RESULT ;
	LD GR1,A ;
	SRL GR1,0,GR3
	LD GR2,B
	SRL GR2,0,GR3
LOOP	AND GR1,=#000F
	AND GR2,=#000F
	LAD GR0,0
	SUBL GR1,GR2
	JPL MERGE
	JZE MERGE
	ADDL GR1,=10
	LAD GR0,1
MERGE	SLL GR1,0,GR3;
	OR GR1,RESULT ;
	LAD GR3,4,GR3 ;
	CPL GR3,=16
	JZE FIN ;
	ST GR1,RESULT ;
	LD GR1,A
	SRL GR1,0,GR3
	LD GR2,B
	SRL GR2,0,GR3
	SUBL GR1,GR0 ;
	JUMP LOOP
FIN 	LD GR0,GR1
	CPL GR0,=#000D
	JNZ FIN2
	LAD GR0,#000C
FIN2	RPOP
	RET
A	DS 1
B	DS 1
RESULT 	DS 1
	END
;--------------
ADDP1	START
	RPUSH
	ST GR1,A
	ST GR2,B
	LAD GR3,4 ; ビット数カウンタの初期化
	AND GR1,=#000F
	ST GR1,RESULT ;　 (a, ア）
	LD GR1,A ;
	SRL GR1,0,GR3 ;　上位パックを最下位パックにシフト（移動）
	LD GR2,B
	SRL GR2,0,GR3
LOOP	AND GR1,=#000F ; 最下位パックの数値を取り出す
	AND GR2,=#000F
	LAD GR0,0
	ADDL GR1,GR2
	CPL GR1,=10 ; 10以上は桁上げ
	JMI MERGE ; （b, ア）
	SUBL GR1,=10
	LAD GR0,1 ; 桁上げ加算用の１を GR0に仮保持する
MERGE	SLL GR1,0,GR3 ;　（c, イ）　GR1を元に戻す
	OR GR1,RESULT ;　　中間結果との併合
	LAD GR3,4,GR3
	;4->8->12->16シフト用ビット数カウンタを加算
	CPL GR3,=16
	JZE FIN ;終了判定
	ST GR1,RESULT ; 中間結果を退避
	LD GR1,A
	SRL GR1,0,GR3
	LD GR2,B
	SRL GR2,0,GR3
	ADDL GR1,GR0 ; 桁上がり分を加算する
	JUMP LOOP
FIN 	LD GR0,GR1
	RPOP
	RET
A	DS 1
B	DS 1
RESULT 	DS 1
	END
;-------------
