;１９７０年１月１日からの日数を求める
;（平年３６５日、うるう年３６６日を考慮する）
;２０１８年秋Prg1試験問題
MAIN	START
	LAD GR2,YEAR
	CALL DAYOFFST
	ST GR0,ALLDAYS
	RET
;YEAR 	DC 1971
;MONTH 	DC 2
;DAY	DC 1
YEAR 	DC 2018
MONTH 	DC 10
DAY	DC 20
ALLDAYS	DS 1
	END
;--------------
DAYOFFST START
	RPUSH
	LD GR5,0,GR2 ; gr5: year
	LD GR3,1,GR2 ; gr3: month
	LD GR1,2,GR2 ; gr1: day
	SUBL GR1,=1 ; gr1 is a day counter
	LAD GR4,ACCMDAYS,GR3 ; a イ
	ADDL GR1,-1,GR4 ; １月１日からの日数（平年）を求める
	CPA GR3,=3 ; 月が３月以降の時うるう年を考慮
	JMI SKIP
	LD GR2,GR5
	CALL LEAPYEAR
	ADDL GR1,GR0
SKIP	LD GR2,=1970 ; １９７０年から（年ー１）年までの間（ただし
LOOP 	CPA GR2,GR5 ; 年＞１９７０）、１年の日数を加算
	JZE BREAK ; b カ
	CALL LEAPYEAR
	ADDL GR0,=365
	ADDL GR1,GR0
	ADDA GR2,=1
	JUMP LOOP
BREAK	 LD GR0,GR1
EXIT	RPOP
	RET
; ACCMDAYSは、平年の各月１月１日からの日数(１月１日は０日目）
ACCMDAYS DC 0, 31,59,90,120,151,181
	DC 212,243,273,304,334
	END
;--------------
LEAPYEAR START
	RPUSH
	SUBA GR0,GR0
	LD GR3,GR2
	AND GR3,=3
	JNZ FIN ; c イ
	LD GR3,=100
	CALL DIVISIBL
	XOR GR0, =1; d　カ
	JNZ FIN
	LD GR3,=400
	CALL DIVISIBL
FIN 	RPOP
	RET
	END
;-------------
;GR2に設定された整数値が、GR3に設定された静数値で
;割り切れた場合は１を、割り切れない場合は０を、
;GR0に設定して呼び出し元にもどる。
;ソースコードは省略されたので自作した。
;引き算の連続で割り算を行う。
DIVISIBL 	START
	LD GR4,GR2
	LD GR5,GR3
	LAD GR0,-1
	LAD GR6,0
	;----------------
LOOP	SUBL GR4,GR5
	JZE FIN1
	JMI FIN0
	LAD GR6,1,GR6
	JUMP LOOP
FIN1 	LAD GR0,1
	RET
FIN0	LAD GR0,0
	RET
	END
;-----------------------------
