MAIN 	START
	CALL PRIME
	RET
	END
;---------------------------------
PRIME	START
	LAD	GR3,1 ;PN参照のインデックスとして使う
	LAD	GR0,2 ;PNに２と３を初期設定する
	ST	GR0,PN
	LAD	GR0,3
	ST	GR0,PN,GR3
	LAD	GR4,2
	ST	GR4,ALL ;現在の素数の個数
	;-------------------------------
	LAD	GR2,5 ; GR2新素数候補かつ被除数
LOOP	LD	GR4,PN,GR3 ;除数
	;CALL	DIVSHIFT
	CALL	DIVHIKI
	;商GR6, 余りGR7として返る
	;---------------------------------
	;CPL	GR7,ZERO ;余りゼロならば
	LD	GR7,GR7 ;余りゼロならば
	JZE	NONPN ;GR2は素数ではない
	;-------
	CPL	GR6,GR4 ;商と除数を比較する
	JMI	NEWPN
	JZE	NEWPN
	;-------------------
	LAD 	GR3,1,GR3
	CPA	GR3,ALL
	JNZ	LOOP
	JUMP	FIN
	;-----------------------------------------
NONPN	LAD	GR2,2,GR2 ;新素数候補作成
	LAD 	GR3,1 ;既素数PNのインデックス初期化
	JUMP LOOP
NEWPN	LD 	GR4,ALL
	ST 	GR2,PN,GR4 ;新素数をPNに格納
	;----------
	LAD 	GR4,1,GR4 ;ALLを更新する
	ST	GR4,ALL
	LAD	GR2,2,GR2 ;新素数候補作成
	;-------------
	CPA GR4,LIM ; ALLとLIMを比較する
	JMI 	RPT
FIN	RET
RPT	LAD 	GR3,1 ;既素数PNのインデックス初期化
	JUMP 	LOOP
ALL	DS 	1    ;計算途中の素数の個数
LIM	DC	3608;3512;1977 ;求める素数の最大個数
PN	DS 	3608;3512;1977 ;素数格納領域
;TTTT	DC	8888
	END
;-----------------------------------------------------
;GR2被除数、GR4除数
;GR6商、GR7余り　返す
DIVHIKI	START
	PUSH 	0,GR2
	PUSH 	0,GR4
	LAD	GR6,-1
D1	LAD	GR6,1,GR6
	SUBL	GR2,GR4
	JPL	D1
	JZE	NOAMARI
	ADDL	GR2,GR4
NOAMARI LD	GR7,GR2 ;余り
	POP 	GR4
	POP	GR2
	RET
	END
;---------------------------------
DIVSHIFT 	START
	PUSH	0,GR2
	PUSH	0,GR3
	PUSH 	0,GR4
	;-----GR4除数を保存する-----------------
	ST	GR2,A
	ST	GR4,B
	;-------
	;PUSH 	0,GR2
	LD 	GR1,A
	LD 	GR2,B
	LAD	GR3,1 ; GR3
LOOP1	CPA	GR1,GR2
	JMI	S1
	SLL	GR3,1
	SLL	GR2,1
	JUMP	LOOP1
;-------------------------------
S1	LAD	GR4,0
LOOP2	CPA	GR1,GR2
	JMI	S2
	ADDA	GR4,GR3
	SUBA	GR1,GR2
S2	SRL	GR2,1
	SRL	GR3,1
	CPA	GR1,B
	JPL	LOOP2
	JZE	LOOP2
	ST	GR4,SYO
	ST	GR1,AMARI
	;------------------
	LD 	GR6,GR4 ; SYO
	LD 	GR7,GR1 ;AMARI
	POP	GR4 ;元の除数を復帰させる
	POP	GR3
	POP	GR2
	RET
A	DC	58;8
B	DC	8
SYO	DS	1
AMARI	DS	1
	END
;-----------------
