トップページ⇒tech
91コメント28KB

HSP性エミュを作るスレ Part1

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
お前ら、HSPでNESエミュを作るんで見ててください。
0002デフォルトの名無しさんNGNG
無理です。なぜならHSPだからです。自明の解です。よって終了です。
00031NGNG
頑張ります。
無理など言わず見守って。
0004デフォルトの名無しさんNGNG
わらってしまった。
まず邪場でつくってみれ。
それとも
#deffunc main...
:
:
*start
main
goto *start
かな?
0005デフォルトの名無しさんNGNG
CPUエミュレーションもHSPで作るの?
まあ無理無理。
00061NGNG
フェッチする
↓
解析して実行
↓
フェッチに戻る

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

家庭用ゲーム機エミュレータ 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/
0021デフォルトの名無しさんNGNG
>>19
ドラクエ1:勇者の名前と初期ステータスの関連を考察する。
ドラクエ2:ローレシアの王子の名前とサマルトリアの王子、ムーンブルクの王女の名前の関連を考察する。
ドラクエ3:バックアップ電池が切れてないか調べる。
0022デフォルトの名無しさんNGNG
6502 CPU のエミュレータと
ハードウエアのエミュレータを
それぞれ DLLにして 誰か作って貰えば出来る可能性もあるね


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

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

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

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

>>31=32
期待してます。
0034デフォルトの名無しさんNGNG
>>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


0035デフォルトの名無しさんNGNG
//こっちが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;
}
0036デフォルトの名無しさんNGNG
まだ動くか試してないけど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
0037マヂレスしてみる(;´Д`)NGNG
>>34
頑張ってるようですね。
ただ、HSP側で操作できないと、HSPで作る意味が無いので、
レジスタ・RAM・ROMにアクセスできるといいな〜。
DLLでファイルを読み込むのではなくて、HSPで読込んで、DLLで実行とか。

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

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

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

「HSPが糞と思えるような処理」を作るならDLL側で作るのがいいですね。
まぁ44さんの目的はHSP製のエミュレータだから全部DLLでやるのはアレだけど(笑
0046デフォルトの名無しさんNGNG
マヂレスしてみる(;´Д`) さん、やさしいのね (*^。^*)ポッ♪
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モノを使ってみることにしたの
0047デフォルトの名無しさんNGNG
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の恐ろしさを思い知ったわ
0048デフォルトの名無しさんNGNG
なんかすげーな。
よくわからないが、エミュは出来たのか?
0049デフォルトの名無しさんNGNG
サブルーチンが無いっていうか、ローカル変数が無いんだろ?
ローカル変数を使いたかったら、ソールを分けなければならないって
話だったと思うけど。
0050デフォルトの名無しさんNGNG
>>49
別にソース分けなくても出来るよ。
0051デフォルトの名無しさんNGNG
>>49
ローカル変数はモジュール単位になるね。
ローカル変数は無いと思ったほうがいい。
0052デフォルトの名無しさんNGNG
構造体は使えるの?
0053デフォルトの名無しさんNGNG
>>52
基本的にないがdupでやれないことはない。
0054デフォルトの名無しさんNGNG
>>47
>if op=0x00 : goto *next
を
if(128>op){
   if(64>op){
      if(32>op){
      }else{
      }
   }else{
   }
}else{
}
って書くのはどうだろう?
0055デフォルトの名無しさんNGNG
>54
ついでに、オペコードの使用頻度を使って分けるといいかも。
0056マヂレスしてみる(;´Д`)NGNG
HSPのモジュールは物凄く遅いので、エミュレータのような速度が重要な場合は
どうしてもと言う場合を除いて、使わない方が懸命ですね。

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

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

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

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

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

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

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
0068デフォルトの名無しさんNGNG
これを実行するとinst.asってファイルがでっきまーすっ☆
でも、それみたらやる気が萎えたですぅ
0069デフォルトの名無しさんNGNG
どうなったんだろう?
0070デフォルトの名無しさんNGNG
あげてみる
0071デフォルトの名無しさんNGNG
密かに面白そうだな。
かなり暇だったら俺もやって見たいものだ。
0072デフォルトの名無しさんNGNG
agege
0073デフォルトの名無しさんNGNG
HSBは知らんがJavaでは書いたぞ。
0074デフォルトの名無しさんNGNG
HSBってなんすか?
0075デフォルトの名無しさんNGNG
HSpBoy
0076デフォルトの名無しさんNGNG
5get
0077デフォルトの名無しさんNGNG
>>67
マクロなしで書いたら地獄だな。
0078デフォルトの名無しさんNGNG
age
0079デフォルトの名無しさんNGNG
gosubでもいいけど。
ていうかその方が処理速かったような。
0080デフォルトの名無しさんNGNG
中途age
0081デフォルトの名無しさんNGNG
期待age
0082デフォルトの名無しさんNGNG
HSPって何言語で作られてるんですか?
0083デフォルトの名無しさんNGNG
HSPでエミュレータを作ることはおもしろいことなのか?
それならJavaってたほうがイクナイ?
0084デフォルトの名無しさんNGNG
HSPで作ることに何か意義を見出したんじゃないのか?
0085デフォルトの名無しさんNGNG
HSPのエミュ(互換ソフト)を作るほうがいいな。
0086デフォルトの名無しさんNGNG
まずHSPの言語仕様をちゃんと定義してくれ。
0087デフォルトの名無しさんNGNG
ytrydrty
0088デフォルトの名無しさんNGNG
0089デフォルトの名無しさんNGNG
 
0090デフォルトの名無しさんNGNG
age
0091デフォルトの名無しさんNGNG
age
■ このスレッドは過去ログ倉庫に格納されています