HSP性エミュを作るスレ Part1

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
お前ら、HSPでNESエミュを作るんで見ててください。
2デフォルトの名無しさん:02/01/25 23:02
無理です。なぜならHSPだからです。自明の解です。よって終了です。
31:02/01/25 23:06
頑張ります。
無理など言わず見守って。
4デフォルトの名無しさん:02/01/25 23:08
わらってしまった。
まず邪場でつくってみれ。
それとも
#deffunc main...
:
:
*start
main
goto *start
かな?
CPUエミュレーションもHSPで作るの?
まあ無理無理。
61:02/01/25 23:11
フェッチする

解析して実行

フェッチに戻る

これだけだ。
簡単だ。
71:02/01/25 23:21
なぁ、NESの命令わかるやついるか?
役に立つページとかでもいいから知ってたら教えて。
81:02/01/25 23:40
>>4
少し気になったんだがそのスクリプトなんだ?
9デフォルトの名無しさん:02/01/25 23:46
>>7
バカかお前は
>>7
自分で解析しろよ。
111:02/01/26 00:01
解析のやり方がわかりません
  人从人从人从人从人从
 <              >
  <  サムライロボット   >
 <      殺介〜〜! >
  <             ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ヽ人从人从人从人 我輩は殺介ナリ!1をぶった切るぜ!アヒャヒャヒャ!!
              _____  ____
    _,,,,,,,,,,_        γ⌒ヽ  ∨
    ((=゚Д゚=O     。( ゚∀゚)
    (O(∇)ノ'’     `O| ̄^|O
    (_)_)        (___)__)
131:02/01/26 00:12
人ががんばってんのを何たる不届き物ゴゥァ
>>11
まず実機を用意します。
>>13
君のがんばりが無駄に終わることは
君自身にもわかってるはずだ。
161:02/01/26 00:15
>>14
わかりました。押入れから出してきます。
171:02/01/26 00:18
>>14
出してきましたがこれからどうすればいいでしょう?
>>17
次に持ってるソフト名をすべて挙げる。
191:02/01/26 00:26
ソフトはもう殆ど売ってしまっていて、ドラクエ1、2、3しかありません
エミュスレ玉砕の歴史

家庭用ゲーム機エミュレータ in ム板
http://pc.2ch.net/tech/kako/1002/10029/1002915408.html
エミュを作りたいのですが
http://pc.2ch.net/test/read.cgi/tech/1008334719/
■エミュレータ■
http://pc.2ch.net/test/read.cgi/tech/1011011864/
>>19
ドラクエ1:勇者の名前と初期ステータスの関連を考察する。
ドラクエ2:ローレシアの王子の名前とサマルトリアの王子、ムーンブルクの王女の名前の関連を考察する。
ドラクエ3:バックアップ電池が切れてないか調べる。
6502 CPU のエミュレータと
ハードウエアのエミュレータを
それぞれ DLLにして 誰か作って貰えば出来る可能性もあるね


231:02/01/26 00:41
>>21
3は見事に切れてました。1と2は少し調べてます。
久しぶりで懐かしんだり。
>>23
ちなみに解析にはディスクシステムとファミリーベーシックが必須。
251:02/01/26 03:39
NESエミュ諦めました。皆さんの言うとおりでした。
逝ってきます。
めでたいな。
諦めちゃったの!?
つまんないよ、作ろうよぉ〜
グラフィック部分がHSPだと大変かな?
CPU部分はなんとかなるでしょ。
HSPってでかいファイル読めたっけ? ロードが一番大変かも。
HSP がエミュ作りに向いているとは思えない。
いいわ、プログラム得意じゃないけど1に変わってわたしが作ってあげるっ!
分からないことは聞くから貴様ら、やさしく答えてネっ☆
HSPで256通りの分岐っするときってif elseを連発するしかないのかしら?
もっといい方法を知ってたらわたしに教えてネっ☆
関数テーブル、ってサブルーチンもないんだっけか。
DLL で全部作ってプログラムのディスパッチだけ HPS にしたら?
とりあえずテキトーに資料は集めてみたの。
そしたら1が6で書いてる内容のテキストをSNESのhpiの中で見つけちゃったd(⌒o⌒)b
あんたこれ読んでNESエミュなんて作ろうなんて思い上がったわけネっ(^Q^;) あはは!
じゃ、わたしも1が考えてた方向で作ってくことにするわ。
6502のレジスタはA,P,X,Y,SとPCがあればOKっぽいと。
メモリはバンク切り替えを考えて$8000-$ffffとその他で分けた方がいいカナ?
まぁ、細かいことはまた今度ネっ!
やっぱり最初からHSPで書くのは無謀ね。
最初はNesterJベースで作ってそこから少しずつHSPにしてくことにしたわ。
NNNesterJは余分な機能がいっぱいだから読みやすいNesterJベースにしたの。
CPU、メモリ、PPUの順番でHSP化してく予定よ。
貴様らっ! やさしく応援してねっ!
ファミコンの6502CPUならHSPでもエミュレータ作れるだろ。
問題はハードウェアエミュの方。タイミングとか難しそうだ。
あと、速度的に問題になるのは必至。

>>22
それはHSP製とは言えないよな(;´Д`)

>>24
確かに解析にはそれが有れば有用だけど、
ファミコンの資料ならWEBに腐るほどあるよ。

>>27
HSPでもROMイメージ程度の大きさのファイルは読めるよ。
グラフィック展開は既にプラグインが公開されているよ。

>>31=32
期待してます。
>>33
マヂレスうれしいわっ!! ホントに大カンゲキ(o^v^o)
グラフィック展開のhpiの名前も教えてくれたらいいこいいこしてあ・げ・る♪
そうそうNesterJのソースに資料が入ってたの、灯台下暗しってことネっ☆
じゃ、ぜーんぶNesterJにおまかせバージョンのソースから逝くわよ

#uselib "nesterJ.dll"
#func nes_init nes_init $2
#func nes_loadrom nes_loadrom $6
#func nes_run_frame nes_run_frame $2
#func nes_clean nes_clean $100
nes_init
nes_loadrom "c:\\test.nes"
*emu_loop
nes_run_frame
await 16
goto *emu_loop


//こっちがNesterJ側のソース
//winmain.cppの最後に追加してDLLにコンパイルすれば完成よっ!

#include "hspdll.h"
EXPORT BOOL WINAPI nes_init(BMSCR *p1, int p2, int p3, int p4 ){
InitControlsNStuff();
NESTER_settings.Load();
main_window_handle = p1->hwnd;
g_main_instance = GetModuleHandle("nesterj.dll");
init();
assertWindowSize();
CenterWindow();
UpdateWindow(p1->hwnd);
SetFocus(p1->hwnd); return 0;
}
EXPORT BOOL WINAPI nes_loadrom(BMSCR *p1, char *file, int p3, int p4 ){
LoadROM(file);
emu->reset(); return 0;
}
EXPORT BOOL WINAPI nes_run_frame(BMSCR *p1, int p2, int p3, int p4 ){
emu->do_frame(); return 0;
}
EXPORT BOOL WINAPI nes_clean(int p1, int p2, int p3, int p4 ){
if(emu) FreeROM();
iDirectX::releaseAll(); return 0;
}
まだ動くか試してないけどHSPでメインループを作ってみたバージョンネっ☆
hpiを対応させるのがめんどくさくなったから試してないの、ゴメンねm(_ _)m

nes_init
nes_loadrom "c:\\test.nes"
*emu_loop
gosub *run_frame
await 16 : goto *emu_loop
*run_frame
nes_ppu_start ; 0 〜 239 ラインは描画するのね☆
Cycle = 113 ; 1 ラインあたりCPUは 113 サイクル動くの♪
repeat 240
gosub *cpu_exec
nes_ppu_line cnt
loop
nes_ppu_end
gosub *cpu_exec ; 240 ラインからは描画しないの☆
nes_ppu_line 240
nes_ppu_vblank_start ; ここから241 ラインVBlankが始まるのね☆
Cycle = 1 : gosub *cpu_exec
nes_cpu_IRQ ; 割り込みがかかるみたい
Cycle = 112 : gosub *cpu_exec
Cycle = 113
repeat 19 242 ; 242 〜 261 ライン ; VBlank中はCPUだけがんばるわ♪
gosub *cpu_exec
loop
nes_ppu_vblank_end
return
*cpu_exec
nes_cpu_exec Cycle
return
>>34
頑張ってるようですね。
ただ、HSP側で操作できないと、HSPで作る意味が無いので、
レジスタ・RAM・ROMにアクセスできるといいな〜。
DLLでファイルを読み込むのではなくて、HSPで読込んで、DLLで実行とか。

それから33のグラフィック展開プラグインは、エミュレータ用のものではなく
ttp://www.geocities.co.jp/SiliconValley/1145/yy-chr.gif
で使われている、ROMの中の画像を覗けるプラグインです。
一応プラグインも公開されてるけど、ドキュメントがいいかげんだったり…
38デフォルトの名無しさん:02/02/05 23:13
ところで、NesterJのソースって今は公開されてないようだけど
どこで手に入れたの?
♪わぁい ヽ(∇⌒ヽ)(ノ⌒∇)ノ わぁい♪
マヂレスしてみる(;´Д`) さん情報ありがとう!
(^o^)\(^^ ) いーこいーこ♪
>38
ttp://www.zophar.net/
に色々あるからソース付きのをとにかく調べてるところなの。
NesterJも通信対戦機能とかがじゃまでわかりにくいから別のもみてるのよ。
精度よりもとにかく動くことを優先して作るって方針でいいよネっ。

やっぱりHSPメインループバージョンはバグってたわ(>0<)
だからプログラムは苦手なのよ。(T-T)くすん‥
240ラインからは描画しないっていってるのにnes_ppu_line 240なんてしてるし
241ラインくらいから始まる割り込みはIRQじゃなくてNMIだったし
キー入力処理はいってないし、APU無視してるし、画面に描画してないし‥
次は*cpu_execの部分にとりかかる予定☆
ネカマキモイ
41デフォルトの名無しさん:02/02/07 01:36
>>40
それぐらい我慢できんのか雰囲気読めん糞厨が。
>>41
そこでキレル君もなんだな。
>>42
そこで冷めた目でみている君もなんだな。
(T-T)エーン‥、40がいじめるのぉ〜
わたしだってネカマに慣れてないの、まだキャラも固まってないからしょうがないじゃない☆○(゜ο゜)oトリャっ
と、そんなことは\(^^\) (/^^)/ 置いといて〜
ホンっトにムカついてる事が2つあるの、聞いてよぉ〜
一体どこの誰よ、HSPにサブルーチンがないって布教してるのは!!
す〜っかり騙されてたじゃない! ヘルプのモジュールんとこ読んだらちゃんとあったの!!(`_´メ)
もうひとつは#defineが糞使えないのぉ〜
何よ、式の置き換えくらいできなきゃ使う意味ないじゃないの! (ノ-_-)ノ ~bSH
ただのネカマ口調に過剰反応する40はネット初心者。

ということで、レス。
「HSPにサブルーチンがないって布教してる」のはあまり聞いたこと無いです(;´Д`)
私がHSPを長く使ってるから使えて当たり前と思ってるからかもしれませんが。
#defineが糞なのはまぁ、とって付けたような仕様だからでしょうね(;´Д`)
HSP2.6は仕様を一新してもっとまともになるそうですが…まだまだ先でしょう。

「HSPが糞と思えるような処理」を作るならDLL側で作るのがいいですね。
まぁ44さんの目的はHSP製のエミュレータだから全部DLLでやるのはアレだけど(笑
マヂレスしてみる(;´Д`) さん、やさしいのね (*^。^*)ポッ♪
30もサブルーチンないって言ってるし、結構誤解してる人は多いと思うの
じゃ、今日もフルHSPエミュを目指してがんばるわ♪

#define C_FLAG 0x01
#define Z_FLAG 0x02
#define I_FLAG 0x04
#define D_FLAG 0x08
#define B_FLAG 0x10
#define R_FLAG 0x20
#define V_FLAG 0x40
#define N_FLAG 0x80
#define NMI_VECTOR 0xfffa
#define RESET_VECTOR 0xfffc
#define IRQ_VECTOR 0xfffe

dim opecycle, 256
opecycle.0x00 = 7,6,2,8,3,3,5,5,3,2,2,2,4,4,6,6
opecycle.0x10 = 2,5,2,8,4,4,6,6,2,4,2,7,5,5,7,7
opecycle.0x20 = 6,6,2,8,3,3,5,5,4,2,2,2,4,4,6,6
opecycle.0x30 = 2,5,2,8,4,4,6,6,2,4,2,7,5,5,7,7
opecycle.0x40 = 6,6,2,8,3,3,5,5,3,2,2,2,3,4,6,6
opecycle.0x50 = 2,5,2,8,4,4,6,6,2,4,2,7,5,5,7,7
opecycle.0x60 = 6,6,2,8,3,3,5,5,4,2,2,2,5,4,6,6
opecycle.0x70 = 2,5,2,8,4,4,6,6,2,4,2,7,5,5,7,7
opecycle.0x80 = 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4
opecycle.0x90 = 2,6,2,6,4,4,4,4,2,5,2,5,5,5,5,5
opecycle.0xa0 = 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4
opecycle.0xb0 = 2,5,2,5,4,4,4,4,2,4,2,5,4,4,4,4
opecycle.0xc0 = 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6
opecycle.0xd0 = 2,5,2,8,4,4,6,6,2,4,2,7,5,5,7,7
opecycle.0xe0 = 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6
opecycle.0xf0 = 2,5,2,8,4,4,6,6,2,4,2,7,5,5,7,7

って、定数を書いてみました (^-^*)
CPUの命令を実行するのにかかるクロック数をopecycleにまとめてみたんだけど
この数値が参考にしたエミュごとにビミョーに違ってて (´〜`;)うーん‥
とりあえずMaratモノを使ってみることにしたの
47デフォルトの名無しさん:02/02/08 13:06
CPUのレジスタを初期化する部分はこんな感じカナ☆

#deffunc cpu_reset
A=0 : P=Z_FLAG|R_FLAG : X=0 : Y=0 : S=0xff
mem_read RESET_VECTOR : PC=stat
dup STACK, Ram.0x100
dim ZN_table,256
repeat 0x80,0x00 : ZN_table.cnt=0 : loop
repeat 0x80,0x80 : ZN_table.cnt=N_FLAG : loop
ZN_table.0 = Z_FLAG
return

CPUループHSPバージョンその1
ほっとんどhpiまかせ、nes_ からはじまる命令は全部hpiがやってるの f(^_^)
#deffunc cpu_exec
mref Cycle,0
totalcycle = 0
repeat
nes_cpu_getPC : mem_read stat : op = stat ; フェッチ♪
totalcycle += opecycle.op
nes_cpu_exec 1
if totalcycle > Cycle : break
loop
return

ここからダミーの実行ルーチンをいれて
#deffunc cpu_exec
mref Cycle,0
totalcycle = 0
repeat
nes_cpu_getPC : mem_read stat : op = stat ; フェッチ♪
if op=0x00 : goto *next
if op=0x01 : goto *next
(256通りに分岐 ながいから しょ〜りゃくっ!)
if op=0xff : goto *next
*next
totalcycle += opecycle.op
nes_cpu_exec 1
if totalcycle > Cycle : break
loop
return
って命令の分岐をいれてみたらもう L(・o・)」あんびり〜ばぼ〜☆
激遅のおっそおそになっちゃって、Ghzクラスのマシンじゃカクカク(;_;)
HSPの恐ろしさを思い知ったわ
48デフォルトの名無しさん:02/02/08 15:51
なんかすげーな。
よくわからないが、エミュは出来たのか?
サブルーチンが無いっていうか、ローカル変数が無いんだろ?
ローカル変数を使いたかったら、ソールを分けなければならないって
話だったと思うけど。
50デフォルトの名無しさん:02/02/08 16:17
>>49
別にソース分けなくても出来るよ。
>>49
ローカル変数はモジュール単位になるね。
ローカル変数は無いと思ったほうがいい。
構造体は使えるの?
>>52
基本的にないがdupでやれないことはない。
>>47
>if op=0x00 : goto *next

if(128>op){
   if(64>op){
      if(32>op){
      }else{
      }
   }else{
   }
}else{
}
って書くのはどうだろう?
>54
ついでに、オペコードの使用頻度を使って分けるといいかも。
HSPのモジュールは物凄く遅いので、エミュレータのような速度が重要な場合は
どうしてもと言う場合を除いて、使わない方が懸命ですね。

たぶん、画像処理等を行なわない簡単な演算なら
標準命令>サブルーチン>>プラグイン>>>>>>>>>>>>モジュール
くらいで標準命令が速いかも。

コードは見難くなるけど、遅いHSPでは>>54-55は基本ですね。
それでもHSPだけではかなり無理がありますけどね。
遅いのは承知だよ。実用目的じゃなくて遊びの範疇。
58デフォルトの名無しさん:02/02/09 15:20
なんGくらいのCPUを使えば実用的になりますか?
重力は無関係です
>>51
HSPのモジュールって、他の言語におけるサブルーチンくらいの意味だから
あると思ったほうが近いのでは。
ローカル変数はあるが自動変数は無い
お昼だけど ヾ( ' - '*)おはよ♪

>>54
すっごい!! つっ、使えるわ d(>_ ・ )グッ!!
って思ったけど、ifの{}と一行分岐を混ぜるなキケンって書いてあるわね
( ̄Д ̄;)う゛っ、よーやく半分くらいオペコードの実装が終わったのに直すの?
(>_<)うぇぇーん、めんどくさいよぉー

>標準命令>サブルーチン>>プラグイン>>>>>>>>>>>>モジュール
ハーイ(^O^)/、とりあえずgosubと#deffuncのよびだし速度をくらべてみましたっ♪
結果はgosubの方がちょっと(1.5〜2倍)くらい速いカナ☆

#module〜#globalもしらべてみましたっ♪
ローカル変数ってゆーか、かってに変数の名前を変えてくれる機能みたい
たとえばAがA@m1みたいになるの
だから#moduleを使った部分からグローバル変数を使うことはムリっぽいのぉー(T-T)
6502の命令を実行するのにかかるクロック数のギモンが解けたのっ♪\(^o^)/
条件付き分岐命令とかで分岐するときとしないときでクロック数が違ってたわ
つまり、クロック数の表を作ってちゃ正確なえみれとができないっぽい‥ o(_ _o)ぽて
でも、もうおつかれだからこのまま突っ走るわ!
>>62

name@
でグローバル
そう。
m(__)m ご、ごめんなさいですぅ
いそがしくて遊んでられないですぅ
なのでしばらくすとっぷするですの
; コソーリと再開するです

sdim file 100000 : sdim sp 60,9
repeat 9: i=cnt: sp.i="\t": repeat i: sp.i+=" ": loop: loop
goto main

#deffunc iew
mref a0,0 : mref a1,1 : mref a2,2 : file+=sp.a1
if a0=0: file+="if (op & "+a2+") {\n": else: file+="} else {\n"
return

*main
i=255;
repeat 2 : iew cnt,0,0x80
repeat 2 : iew cnt,1,0x40
repeat 2 : iew cnt,2,0x20
repeat 2 : iew cnt,3,0x10
repeat 2 : iew cnt,4,0x08
repeat 2 : iew cnt,5,0x04
repeat 2 : iew cnt,6,0x02
repeat 2 : iew cnt,7,0x01
file+=sp.8+"; ここに機械語 "+i+" の処理を書くです\n" : i-
loop: file+=sp.7+"}\n": loop: file+=sp.6+"}\n"
loop: file+=sp.5+"}\n": loop: file+=sp.4+"}\n"
loop: file+=sp.3+"}\n": loop: file+=sp.2+"}\n"
loop: file+=sp.1+"}\n": loop: file+=sp.0+"}\n"
strlen len, file
bsave "inst.as", file, len
これを実行するとinst.asってファイルがでっきまーすっ☆
でも、それみたらやる気が萎えたですぅ
どうなったんだろう?
70デフォルトの名無しさん:02/04/25 00:17
あげてみる
密かに面白そうだな。
かなり暇だったら俺もやって見たいものだ。
72デフォルトの名無しさん:02/05/18 16:20
agege
HSBは知らんがJavaでは書いたぞ。
HSBってなんすか?
HSpBoy
76デフォルトの名無しさん:02/06/09 00:25
5get
>>67
マクロなしで書いたら地獄だな。
age
gosubでもいいけど。
ていうかその方が処理速かったような。
80デフォルトの名無しさん:02/07/09 05:33
中途age
期待age
82デフォルトの名無しさん:02/07/12 02:46
HSPって何言語で作られてるんですか?
HSPでエミュレータを作ることはおもしろいことなのか?
それならJavaってたほうがイクナイ?
HSPで作ることに何か意義を見出したんじゃないのか?
HSPのエミュ(互換ソフト)を作るほうがいいな。
まずHSPの言語仕様をちゃんと定義してくれ。
87デフォルトの名無しさん:02/07/13 03:41
ytrydrty
 
90デフォルトの名無しさん:02/08/19 01:26
age
91デフォルトの名無しさん
age