2011-08-01から1ヶ月間の記事一覧
今回はオペコード0x04にあたるADD AL, Imm8を実装した。その追加に伴い以下のファイルを作成した ./vm/instruction/add/AddALImm8.rb 中身は require "./vm/register/RegisterIndex.rb" include RegisterIndex class AddALImm8 def execute(vm) al = vm.getR…
前に買ったARMボード用のライブラリを読んで1から自分用に作ってみたいなと思っていたが、ソースコードが全然読めない。頑張れば読めるんだろうけど定数やマジックナンバーが何を表してるのかが分からない。ボードの仕様がどこかにあるんだろうけど、それを…
まず、以下のファイルを作成した ./vm/exception/Exception.rbそして中身は class NotImplementedException < Exception; end これはvmクラスのexecuteメソッドで使っている。取得した命令が未実装の場合、この例外を発生させる。メッセージには命令コードを…
Owatter 0.2でお気に入りユーザを追加できるようにした。お気に入りユーザはツリービューに追加され、それをクリックするとその人のTweet一覧を見ることができる。お気に入りユーザはTwitterのidに関連付けられてOwatterのサーバに保存されるので、Owatterに…
WindowsでcygwinかLinuxかと思ってらVisual Studioという選択肢が!Visual Studioが使えるなら、Windowsでの開発も大分楽になりそうだ
メタセコイアで作ったクマをXファイルで保存してDirectXで読み込んでみた。何かが違う気がするが、まぁ、表示はできた。うーん…
EBPの初期化ミスでEBP-4に書き込みESP-4から読み取りという部分でアクセスしてる番地が違うことから前回のエントリはミスになってしまったようだ。気をつけないと
Text VRAMに文字コードを突っ込んでみたけど文字が表示されなかった。bochsで追いかけてみると、0xB8000をEAXに代入してMOV [EAX], 0x41が実行されていた。ちゃんと実行されてるみたいだけど、何故か表示されない。画面モードが悪いとか? void start(){ cha…
前回のエントリ タイトル:[自作OS]リンクミスで忘れていたことがあった。それはldのオプションに-rを付けることだった。-rを付けたら無事makeが通った。とりあえず原因がわかって良かった
前に作ったやつはメタセコイアの曲面制御を使って作ったもので、他のソフトで読み込ませたら、元の立方体で表示されてしまったので、今回は最初から円を使って作ってみた。これで他のソフトで読み込んでも同じ形のままになった。ちょっと前進
ld -m i386pe -n -Ttext 0xC200 -static -o third.exe --start-group OSStart.o GDT.o IO.obj --end-groupcygwinでリンクしたときに以下のエラーが発生。 GDT.c:11: undefined reference to `lgdt'以下のnasmのファイル(IO.asm→IO.obj)とGDT.hとGDT.cがある…
getCodeの文字コードの取得の部分はkeyesberryさんに教えてもらったString#ordを使うことにした def getCode(index = 0) return @memory[@registers[EIP] + index].ord end
MOV AL, 1を実行できるようにしてみた。追加したファイルは以下の通り。またemulator.rbとVM.rbを変更している。 ./vm/instruction/InstructionMap.rb ./vm/instruction/move/MoveRImm8.rb読み込んでいるファイルはadd まずはMoveRImm8.rbから class MoveRIm…
前回の続きを作ってみた。各パーツの大きさのバランスが難しい
文字列の任意の文字の文字コードの取得方法をsyonbori_techに教えて頂いたので、VMクラスのgetCodeを以下の変更しておく def getCode() return @memory[@registers[EIP]].bytes().to_a()[0] end
とりあえずRubyでx86エミュレータを作ってみる。まず、以下のファイルを作る。 ./emulator.rb ./vm/VM.rb ./vm/register/RegisterIndex.rbまずRegisterIndex.rbから module RegisterIndex EAX = 0 ECX = 1 EDX = 2 EBX = 3 ESP = 4 EBP = 5 ESI = 6 EDI = 7 …
ある文字列の1文字目の文字コードを取得したい場合、1.8の場合は "Hello World!"[0] で良かった気がするけど、1.9でこれやると1文字の文字列が返ってくるようだ。それでsliceなんかも試してみたけど1文字だけのときでも文字列が返ってくるようになったらし…
getCodeをまた修正した def getCode() return @memory[@registers[EIP]].unpack("C")[0] end
何度目かのやり直しOS。無気力が溢れすぎて、なかなか進まない。とりあえずGDTRとSegmentDescriptorを宣言した。あと初期化や設定関数を宣言した。setGDTにGDTRを渡しているが、先頭アドレスだけ渡せばいい気がしていたが一応countとindexをチェックしておく…
クマ作成中…クマに見えるか?!
コミックマーケット80の2日目、『Javaで作る超簡易x86エミュレータ』という冊子を売るために参加した。サークル参加だったが一般参加もしたことがなく、何をすればいいのかよくわからない状況で参加。とりあえず8:00ぐらいには会場に入り準備をした。隣のサ…
来年の四月から専門学校へ行くことが決まった。もともと、大学に入る前は専門学校に行ってみたかったものだが親に反対され大学に行くことになった。それで、今になってまた行ってみたくなったのだが、今度は親の反対もなくすんなりいった。今のうちに学費分…
以下のアセンブリ言語のコードをアセンブラしたものを実行するエミュレータ(アセンブリ言語のコードの更に下)を載せておきます XOR AH, AH MOV AL, 0x03 INT 0x10 MOV SI, MESSAGE MOV AH, 0x0E mloop: MOV AL, [SI] OR AL, AL JE fin INT 0x10 ADD SI, 0x01…
今まで990日分のエントリを書いてきたらしい。エントリ数は1376になっている。あとこれを含めて10日間エントリを書き続ければ1000日分のエントリに到達するようだ。最初のエントリはとりあえず何か書いてみるだった。この頃のブログのタイトルはSwingを使っ…
ちょっと長くなってきた気もするが現時点のものを全部載せてしまおう。 import java.io.FileInputStream; import java.io.BufferedInputStream; import java.io.IOException; public class Emulator{ private byte[] memory; //プログラムを格納するメモリ p…
某イベント用のプログラム。JZで条件分岐するというもの。これだけなら楽勝なはず MOV AL, 0x05 CMP AL, 0x05 JZ move16 fin: JMP fin move16: MOV AL, 0x10 JMP fin TIMES 510 - ($ - $$) DB 0 DB 0x55, 0xAA
美術は苦手なんだよー
某イベントで作る簡易x86エミュレータを公開しておく。この時点だと、まだフラグも無いし汎用レジスタも4つしか用意してないし、セグメントレジスタが無い。しかもプログラムカウンタは0から始めておくというもの。できるだけわかりやすく説明したいです…は…
最近3Dにはまってる気がするので、これを買いたくなってきた。ただちょっと古い気もするが大丈夫だろう。内容はマルチプレイヤーのFPSのゲームを作ることらしいProgramming A Multiplayer FPS In DirectX (Game Development Series)作者: Vaughan Young出版…
まだ、この程度しかできないけど将来は…