#uselib "winmm.dll"
	#cfunc timeGetTime "timeGetTime"
#uselib "pdh.dll"
	#func PdhOpenQuery "PdhOpenQuery" int,int,int
	#func PdhCloseQuery "PdhCloseQuery" int
	#func PdhAddCounter "PdhAddCounterA" int,sptr,int,int
	#func PdhCollectQueryData "PdhCollectQueryData" int
	#func PdhGetFormattedCounterValue "PdhGetFormattedCounterValue" int,int,int,int
#packopt hide 1
#packopt name "nbk_bench"
// 設定
	bx = 3096 ; 処理解像度 X
	by = 3096 ; 処理解像度 Y
	process = 4	; 処理する、偽装スレッド(プロセス)の数
	wx = 340 : wy = 240	; ウィンドウのサイズ
	write_hdd = 1024*1024*100 ; HDDベンチ用のバッファ (byte)
	reload = 2				; 何秒ごとに画面を更新するか
	ct2 = 1 ; 一時カウンタ
	bmp_file = ""+dir_desktop+"\\temp.bmp"
	type = "シングル (Single)","デュアル (Dual)","トリプル (Triple)","クアッド (Quad)","?","?","?","オクタ"
// 自分のプロセス番号
	cmdline = dir_cmdline ; cmdline = "p,n"
	number = int(strmid(cmdline,0,1))	; 自分のプロセス番号
		if number ! 0 : process = int(strmid(cmdline,2,3))	; プロセス数
	
	if number = 0{
// プロセッサー使用率取得のための初期化
	alloc CounterValue, 16
		PdhOpenQuery 0, 0, varptr(hQuery)
		path = "\\Processor(_Total)\\% Processor Time"
		PdhAddCounter hQuery, varptr(path), 0, varptr(hCounter)
		PdhCollectQueryData hQuery
	}
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// レジストリ読み込み用
	#include "advapi32.as"
		; powered by http://www.setsuki.com/hsp/
	#define HKEY_CURRENT_USER		0 ;0x80000001
	#define HKEY_LOCAL_MACHINE		1 ;0x80000002
	#define HKEY_USERS				2 ;0x80000003
	#define HKEY_CLASSES_ROOT		3 ;0x80000000
	#define HKEY_DYN_DATA			4 ;0x80000006
	#define HKEY_PERFORMANCE_DATA	5 ;0x80000004
	#module
	#define KEY_ALL_ACCESS         0xF003F
	
	#define REG_BINARY              3   ;バイナリデータ
	#define REG_DWORD               4   ;32ビット整数
	#define REG_DWORD_BIG_ENDIAN    5   ;バイト順がWindowsと逆の32ビット値
	#define REG_EXPAND_SZ           2   ;展開前の環境変数( 例えば %PATH% )
	#define REG_LINK                6   ;Unicodeシンボリック
	#define REG_MULTI_SZ            7   ;二つのVBNULLCHARで終わる文字列
	#define REG_NONE                0   ;未定義のタイプ
	#define REG_RESTORE_LIST        8   ;デバイスドライバリソースリスト
	#define REG_SZ                  1   ;文字列
	#deffunc reginit
		;最初に使用する変数を設定
		Key.0 = 0x80000001
		Key.1 = 0x80000002
		Key.2 = 0x80000003
		Key.3 = 0x80000000
		Key.4 = 0x80000006
		Key.5 = 0x80000004
	
		Type.0 = REG_DWORD
		Type.1 = REG_SZ
		Type.2 = REG_BINARY
	return
	#deffunc regend onexit
	;最後にレジストリキーを閉じる
	if hkey : RegCloseKey hkey : hkey=0
	return
	#deffunc regkey int p1, str kname, int p2
mref stt,64
	if(p1<0)||(p2>5) : stt=1 : return
	;以前のレジストリキーを閉じる
	if hkey : RegCloseKey hkey : hkey=0
	;文字列をコピー
	sdim subkey, strlen(kname)+1 : subkey=kname
	if p2 == 0 {
		;レジストリキーを開く
		RegOpenKeyEx Key.p1, varptr(subkey), 0, KEY_ALL_ACCESS, varptr(hKey)
	} else {
		;新しいレジストリキーを作成
		RegCreateKeyEx Key.p1, varptr(subkey), 0, varptr(class), 0, KEY_ALL_ACCESS, 0, varptr(hKey), 0
	}
	return
	#deffunc getreg var p1, str kname, int p2, int p3
mref stt,64
	if(hKey == 0) : stt=1 : return
	;文字列をコピー
	sdim subkey, strlen(kname)+1 : subkey=kname
	if p3<1 {
		; p3 が 1以下だった場合は、サイズを取得
		RegQueryValueEx hKey, varptr(subkey), 0, 0, 0, varptr(size)
	} else {
		size = p3
	}
	;データを取得する
	RegQueryValueEx hKey, varptr(subkey), 0, 0, varptr(p1), varptr(size)
	return
	#global
	reginit
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// 一時ファイルがあったら消す
	exist ""+dir_desktop+"\\bye.call"
		if strsize ! -1 {
			delete ""+dir_desktop+"\\bye.call"
		}
	exist ""+dir_desktop+"\\start.call"
		if strsize ! -1 {
			delete ""+dir_desktop+"\\start.call"
		}
	exist bmp_file
		if strsize ! -1 {
			delete bmp_file
		}
		repeat process-1,
			exist ""+dir_desktop+"\\exit"+cnt
			if strsize ! -1 : delete ""+dir_desktop+"\\exit"+cnt
		loop
	
// 終了時
	onexit *bye
// 作成されているかチェックする...
	exist "nbk_bench.exe"
		if strsize = -1{
			dialog "プログラムが作成されていません。スクリプトエディタにもどり、 Ctrl+F9 を押し、実行ファイルを作成してからもう一度試してください。",1,"ERROR"
			end
		}
	if number = 0{
		repeat process-1,1
			exec "nbk_bench.exe "+cnt+","+process
			exist ""+dir_desktop+"\\stop.bmp"
				if strsize ! -1 : end 			; 無限に起動したときの緊急停止用
			wait 1
		loop
	}
// CPU情報取得
	if sysinfo(0) = "WindowsNT ver6.0" {
		dialog {"
				WindowsVista で実行されています。
				このプログラムは HKEY_LOCAL_MACHINE にアクセスしますがうまく動作しないことが予想されました。(UAC)
				作者の環境に WindowsVista がないので動作確認ができていません。もしエラーが発生する場合はアクセスしないでください。
				レジストリアクセスを続行しますか?(報告感謝)
				"},3,"OSの制限"
		if stat = 7 : f_noreg = 1
	}
	sdim cpuname
	if f_noreg ! 1{
		regkey HKEY_LOCAL_MACHINE,"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"
		getreg cpuname,"ProcessorNameString",1
	}
	else {
		cpuname = "取得しませんでした..."
	}
	
// 冗談が指定された場合(ぇ (^^;;
	if process <= 0{
		dialog "最低でも1つ以上のプロセスは必要です"
		end
	}
	
// ウィンドウ (バグあり…だれか直して〜 (TT
	px = (wx*number)+30: py = 120
	if ((wx*number)+30) > ginfo(20){
		py = (py+wy) + 40
		r = ((wx*number)+30) / wx
		px = (wx*(r-number))+30
	}
	
	screen 0,wx,wy,6,px,py
		title "HSP de Bench "+(number+1)+""
		syscolor 15 : boxf : syscolor 8
	font "MS UI Gothic"
	if number = 0{
		if (process=4)and(bx=3096)and(by=3096)and(write_hdd=1024*1024*100){
			normal = "■ 標準の値 ■"
		}
		else {
			normal = "☆ 変更された値"
		}
		
		pos 5,10
			mes "情報"
		pos 10,30
			mes "CPU : "+cpuname
			mes "RAM : "+(sysinfo(34)/1024)+"KB ("+(sysinfo(34)/1024)/1024+"MB) ["+sysinfo(33)+"% Used]"
			mes "OS : "+sysinfo(0)+""
			mes ""
			mes "処理するプロセス数 : "+process+" ("+type(process-1)+")"
			mes "処理する解像度 : "+bx+" x "+by
			mes "HDD テスト書き込み量 : "+write_hdd+" Byte\n"
			mes " ----> "+normal
		pos 10,150
			objsize 120,20
			m_type = "選択してください...\n@メーカー製パソコン\n@自作パソコン\n@ショップブランド\n@知るか!\n@ナイショ"
			combox sel_m_type,100,m_type
		pos 150,150
			oc_type = "選択してください...\n@CPU 定格動作\n@オーバークロック\n@ダウンクロック\n@O.Cって何?"
			combox sel_oc_type,100,oc_type
		pos 10,180
			raid_type = "選択してください...\n@通常接続\n@RAID-0\n@RAID-5\n@その他RAID\n@RAIDって何?"
			combox sel_raid_type,100,raid_type
		pos 150,180
			vga_type = "選択してください...\n@オンボード\n@ビデオカート\n@知るか!"
			combox sel_vga_type,100,vga_type
		pos 10,215
			button gosub "START",*start
			
	}
	else {
		repeat
			exist ""+dir_desktop+"\\bye.call"
				if strsize ! -1 {
						gsel 0,-1
						if (number+1) = (process){
							wait 200 : delete ""+dir_desktop+"\\bye.call"
						}
						end
				}
			exist ""+dir_desktop+"\\start.call"
				if strsize ! -1 {
					break
				}
			wait 50
		loop
	}
	gsel 0,2
	if number ! 0 : gosub *START
stop
*START
	if number = 0{
	
	if (sel_raid_type=0)or(sel_vga_type=0)or(sel_oc_type=0)or(sel_m_type=0){
		dialog "選択されてない項目があります... お手数ですが、コンボボックスから選んでください...",1,"STOP!"
		return
	}
	dialog "作動中はデスクトップに一時ファイルが作成されますが、ベンチマークが終わるまで削除しないでください...",1,"!警告!"
	gsel 0,-1
	if number = 0 {
		px = (wx*number)+30: py = 120
		if ((wx*number)+30) > ginfo(20){
			py = (py+wy) + 40
			r = ((wx*number)+30) / wx
			px = (wx*(r-number))+30
		}
		width ,,px,py
	}
	}
	else {
		mes "処理中"
		mes "  スレッド "+number
	}
// 初期化
	cls : syscolor 15 : boxf : syscolor 8 : font "MS UI Gothic"
	buf = ""	:	bsave ""+dir_desktop+"\\start.call",buf
// 処理ファイル作成
	all_time = timeGetTime()
	pos 10,10 : mes "> 一時ファイルを作成しています..."
	buffer 1,bx,by
		cls 4 : color 255,255,255
			mes "ベンチマーク用ファイル..."
		bmpsave bmp_file
	gsel 0,2
// サイズ取得そしてメモリ確保
	mes "> メモリを確保しています..."
	exist bmp_file
		size = strsize : sdim buf,size
	mes "> ファイルを読み込んでいます..."
	bload bmp_file,buf,size
// ベンチマーク開始...
	syscolor 15 : boxf : syscolor 8 
	cpu_time = timeGetTime()
repeat size
// メモリ読み込み
	p = peek(buf,cnt)
// 変更
	p++
	ct++
	
// 補正
	if (dat) >= 256 : dat = 0
	if (dat) <= -1 : dat = 255
// 書き込み
	poke buf,cnt,p
// 表示変更
	if time ! timeGetTime()/1000{
	Sec++ // 一秒ごとにカウンターを回す
	time = timeGetTime()/1000
	prc = int( (double(cnt) / double(size)) *100 )
	// 画面表示更新
		if (Sec\reload) = 0{
			speed = (ct-af)/1024 			; 処理速度
			average_speed = sum_speed/ct2 ; 平均処理速度
			if number = 0 : gosub *GetCPU
			redraw 0
			
				syscolor 15 : boxf : syscolor 8
				
				pos 30,30
					mes cpuname
					mes "peek,poke 処理中... ("+bx+" x "+by+")"
					mes "模擬スレッド "+(number+1)
				pos 60,85
					mes "--> "+cnt/1024+" KB / "+size/1024+" KB ("+prc+"%)"
					mes "--> 処理速度: "+speed+" KB/s"
					mes "--> 平均: "+average_speed+"KB/s\n"
					if number = 0 : mes "--> プロセッサー使用率: "+cpu+"%\n"
					if number = 0 : mes "--> 総合経過時間: "+Sec+" 秒"
					mes "--> 残り予想時間: "+(size-cnt)/(ct-af)+" 秒"
				sum_speed+speed : ct2++
					
			redraw 1
			
			await 0
			
		}
		af = ct
	}
		
loop
	cpu_point = 1000 - Sec
	if number = 0 {
		delete ""+dir_desktop+"\\start.call"
	}
	else {	
		buf = ""	:	bsave ""+dir_desktop+"\\exit"+(number-1),buf
	}
	if number ! 0 : goto *bye
	syscolor 15 : boxf : syscolor 8 
	pos 10,10
		mes "他のプロセスが終了するのを待っています..."
	repeat
		r = 0
		repeat process-1,
			exist ""+dir_desktop+"\\exit"+cnt
			if strsize ! -1 : r++
			if r = process-1 : f_end=1
		loop
		if f_end : break
	wait 1
	loop
	cpu_time = timeGetTime()-cpu_time
	
	syscolor 15 : boxf : syscolor 8 
	pos 10,10
		mes "> HDD ベンチマーク開始"
		mes "> メモリ確保中..."
			sdim buf,write_hdd
		mes "> 書き込み中..."
		time = timeGetTime()
		bsave ""+dir_desktop+"\\hddbench.tmp",buf,write_hdd
		hdd_time = timeGetTime() - time
		mes "> 書き込み完了..."
		write_speed = write_hdd/hdd_time
		
		mes "> 準備中..."
	buffer 10,800,600
		pos 0,0
		picload ""+dir_exe+"\\sample\\demo\\sky_bg.jpg",1
		gzoom 800,600,10,0,0,640,480
	buffer 11
		picload ""+dir_exe+"\\sample\\demo\\btn_hsptv.bmp"
	buffer 12
		picload ""+dir_exe+"\\sample\\demo\\jp6girl.bmp"
	px = (ginfo(20) - 800) / 2
	py = (ginfo(21) - 600) / 2
	
	screen 0,800,600,6,px,py
		gmode 0
		gcopy 10,0,0,800,600
	gsel 0,1
	d_type2 = "標準","半透明"
	Sec = 0
// 描画
repeat
	redraw 0
		color 0,0,0 : boxf
		
		gmode 0
		pos 0,0
			gcopy 10,0,0,800,600
		pos 10,10
			mes "FPS : "+fps
			mes d_type2(d_type3)
			mes ""+Point+" Point"
		pos (800-280)/2,(600-480)/2
			color 0,0,0
			gmode d_type+1,,,128
			gcopy 12,0,0,280,480
		pos gx,gy
			gcopy 11,0,0,200,26
	redraw 1
	if fps_time !  timeGetTime()/1000{
		fps_time = timeGetTime()/1000
		fps = c
		c = 0
		Sec++
		Point+fps
	}
	if (d_type3=0)and(Sec>10){
		average_fps = fps
		d_type = 3
		d_type3 = 1
	}
	if (Sec>=30){
		average_hfps = fps
		break
	}
	if pulsX = 0{
		gx+2
	}
	else {
		gx-2
	}
	if pulsY = 0{
		gy+2
	}
	else {
		gy-2
	}
	if gx+200 > 800{
		pulsX = 1
	}
	if gx < 0{
		pulsX = 0
	}
	if gy+26 > 600{
		pulsY = 1
	}
	if gy < 0{
		pulsY = 0
	}
	c++
	
wait 0
loop
	all_time = timeGetTime()-all_time
	cls 4
	dialog "お疲れ様でした。終了しました。いくつかの項目は記入してください。",0,"END"
	cls 
	
	score = write_speed + point + average_speed + cpu_point
	notesel m_type
		noteget g_m_type,sel_m_type
	notesel oc_type
		noteget g_oc_type,sel_oc_type
	notesel raid_type
		noteget g_raid_type,sel_raid_type
	notesel vga_type
		noteget g_vga_type,sel_vga_type
	buf = "\n"
	buf+= "------------------ ベンチマーク結果 ------------------\n"
	buf+= "\n"
	buf+= "@テスト環境\n"
	buf+= " Setting : "+normal+"\n"
	buf+= " OS      : "+sysinfo(0)+"\n"
	buf+= " Type    : "+g_m_type+" メーカー:(☆記入してください...☆)\n"
	buf+= " CPU     : "+cpuname+"\n"
	buf+= "  --> "+g_oc_type+" (☆記入してください...☆)MHz\n"
	buf+= " RAM     : "+(sysinfo(34)/1024)+"KB ("+(sysinfo(34)/1024)/1024+"MB) ["+sysinfo(33)+"% Used]\n"
	buf+= " Process : "+process+" ("+type(process-1)+")\n"
	buf+= " Size    : "+bx+" x "+by+"\n"
	buf+= " HDD テスト書き込み量 : "+write_hdd+" Byte\n"
	buf+= "  --> "+g_raid_type+"\n"
	buf+= " ビデオーカート名 (☆記入してください...☆)\n"
	buf+= "  --> "+g_vga_type+"\n"
	buf+= "\n"
	buf+="@結果\n"
	buf+=" 総合経過時間 : "+all_time/1000+" 秒\n"
	buf+=" peek,poke 平均処理速度 : "+average_speed+"KB/s\n"
	buf+=" CPU ポイント           : "+cpu_point+" Point\n"
	buf+=" HDD 書き込み速度    : "+write_speed+" KB/s\n"
	buf+=" 描画ポイント      : "+point+" Point\n"
	buf+=" 標準時 FPS       : "+average_fps+" FPS\n"
	buf+=" 半透明時 FPS      : "+average_hfps+" FPS\n"
	buf+="---------------------------------------------\n"
	buf+="合計スコア:"+score+" ポイント\n"
	
	pos 0,0
		mesbox buf,800,600,0
		
return
*GetCPU
// CPU使用率取得
	PdhCollectQueryData hQuery
	PdhGetFormattedCounterValue hCounter, 0x100, 0, varptr(CounterValue)
		cpu = lpeek(CounterValue, 8)
return
*bye
	PdhCloseQuery hQuery
	if number = 0{
		buf = ""	:	bsave ""+dir_desktop+"\\bye.call",buf
	}
end