MAIN 	START
	CALL PRIME
	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
;-----------------
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
	;商GR6, 余りGR7として返る
	;---------------------------------
	CPL	GR7,ZERO ;余りゼロならば
	JZE	NONPN ;GR2は素数ではない
	;-------
	CPA	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を比較する
	JPL	FIN
	JZE	FIN
	LAD 	GR3,1 ;既素数PNのインデックス初期化
	JUMP 	LOOP
FIN	RET
ZERO	DC	0
ALL	DS 	1    ;計算途中の素数の個数
LIM	DC	1976 ;求める素数の最大個数
PN	DS 	1976 ;素数格納領域
TTTT	DC	8888
	END
;-----------------------------------------------------
