2015-01-01から1年間の記事一覧

ハードウェアシミュレータその7

レジスタファイルを作ろうとして、そういえば仕様的におかしいところがあるのを放置していたなあ、と思い出した。それがあるとレジスタファイルを作るのにも困るので、まずそれを直す。

ハードウェアシミュレータその6

前回、ROMを8bit化するのに単純な手を使ったが、色んなものの幅を変えるたびにコードを書いていくのは単純にめんどくさい。 例えば複数の素子が並んでいる状態はRubyの配列に入れておけばよく、配列に入れるのであればそれは繰り返しで処理できるということ…

ハードウェアシミュレータその5

ハードウェアシミュレータの最終目標は、これを使って動作するCPUを作ることである。 前にアセンブラを作ったことはあるからそれで独自命令セットでも何かしらのコードを書くことはできそうだが、俺には高級言語のコンパイラを作る技術は無いので、いずれそ…

ハードウェアシミュレータその4

DeadBeefROMについて。 とりあえず何か作ってみるかと言うことで16進数8桁でdeadbeefと言うデータを書き込んだROMを作って、アドレスを渡すとデータが出てくる、という回路を作ってみた。のでその話。

ハードウェアシミュレータその3

いや、まあ、特に何か記事を書くほどのことがあったわけでもないが、とりあえず進捗はあったので書いて置くことにした。 現状のコードはこちら。 https://gist.github.com/mirichi/cbf87b3626389f4e3c66 以下、変更点など。 処理順変更 いままでは入力に更新…

ハードウェアシミュレータその2

回路図と基板だけ渡されてコード書けって言われる仕事を2回ほどやったことがあるので回路図を読むことはある程度できるが、まともに動作する回路図を書いたことは難しい部分を抽象化したデジタル回路ですら経験が無い。 ということで、適当にハードウェアシ…

ハードウェアシミュレータ

久しぶりの更新。 最近なんとなくデジタル回路などを勉強してて、しかし目的と手段が入れ替わっているので(いつものこと)、勉強した結果として何をするかという目標は無い。 そのうちDE0とかのFPGA学習ボードを買ってなんか作ってみるかもしれないし、何もし…

OpalのNativeモジュール

なんかOpalのドキュメントにも見当たらないのでコードを見ながら機能の勉強。勉強中なのでウソが書いてあるかもしれない。 とりあえずクラスとモジュールの定義部分だけ引っこ抜いてみる。 module Native module Helpers module Kernel class Native::Object …

OpalによるJavaScriptとRubyの連携

OpalはRubyコードの中にJavaScriptを埋め込むことができ、微妙に融合・連携させることができる。ただ、JavaScriptを書かずにOpalをわざわざ使う人がいるとしたら、それはおそらくJavaScriptを書きたくないというのが理由であって、Opalで書けるからと言ってJ…

webMAGURO

Opalがなかなか面白いのでDXRuby互換インターフェイスを少し進めて、Fontクラス追加とちょこっとメソッド追加を行った。ついでにタッチインターフェイスも微妙に対応。 いまんところ試作レベルにも達していないので名前をつけるほどでもないのだが、とりあえ…

Opal:Ruby to Javascript Compiler

RubyのコードをJavaScriptに変換するOpalというソフトウェアがある。Opal自身はRubyで書かれていて、gemでインストールできる。これを使ってRubyコードをJavaScriptに変換してWebサイトにアップロードすると、手元でRubyで書いたコードがブラウザ上で動作し…

x86アセンブラの続き

動的にバイナリを生成して実行できるのでJITアセンブラなわけだが、こいつに簡単な命令をいくつか追加して、ModR/MバイトとSIBバイトも出力できるようにした。これでメモリアクセスやインデックス指定ができるようになったし、ebpやespなども使えるようにな…

x86アセンブラDSLを作ってみるテスト

ずーっと前にStringでバイナリを作ってDLで呼び出すコードを書いたことあったけども、x86アセンブラの文法はわりとそのままRubyで解釈できるんじゃね?って思ってDSLを作ってみるテスト。Rubyも新しくなったからfiddleを使う。 require 'fiddle' module X86A…

DirectSoundとRubyのプログラミング その15

続き。 目立つバグをつぶしてpauseとresumeを実装したので次はフェードイン/アウトを実装してみよう。 どのように作るか 基本的にはフェード処理を流用する。play/stop/pause/resumeそれぞれに引数を追加して、時間と、フェードインの場合は目標値を設定でき…

DirectSoundとRubyのプログラミング その14

続き。 サウンドライブラリによくある機能で不足しているものとして、pauseとresumeがある。再生を一時停止し、再開する。DirectSoundバッファには関数としてplayとstopはあるが、pauseとresumeは無い。じゃあどのように実装するかというと、っていうか、sto…

DirectSoundとRubyのプログラミング その13

続き。 いくつか非常に気になるバグがあるのだが、それを直すのはまた今度として、今回はそれよりも気になる超基本機能の欠落をどうにかしよう。

DirectSoundとRubyのプログラミング その12

続き。 前回の最後のほうで構成について考えたが、現在の構成では波形のリアルタイム生成がやりにくい。できることはできるが、MySoundクラスを作り直す感じになってしまうことになるので無駄に手間がかかる。 IO→デコーダ→MySound→SoundTestという4階層構造…

DirectSoundとRubyのプログラミング その11

続き。 シーク機能 現状、ogg再生中にループすることができないのは、シーク機能が無いからである。いや、vorbisfileにはあるのだが、インターフェイスを作っていない。これを作ってみよう。 vorbisfileには大量のシーク関数が用意されていて、サンプル単位…

DirectSoundとRubyのプログラミング その10

続き。 メモリから読み込む DXRubyでも要望があって開発版で対応したのだが、ファイルからだけじゃなく、メモリに持っているバイナリデータを使って再生する機能を作ってみよう。 といってもそんなに難しい話ではなく、Rubyで書くならファイルの代わりにStri…

DirectSoundとRubyのプログラミング その9

続き。 現状ではストリーミング再生するときにRuby側でスレッドを作っているが、これは固定処理なのでC側に移してみよう。 その前にちょっとクラス構成を 固定処理と言ってもバッファをArrayで返すかStringで返すかで呼ぶメソッドがwritebufになったりwriteb…

DirectSoundとRubyのプログラミング その8

続き。 wavファイルの全体を読み込んで単発で鳴らす いままでストリーミング再生に取り組んできて、前回でoggを再生できるようにまでなった。適当に作り始めたものを気が向くままいじっていたらだんだん高機能になっていく、というのは面白い。 今回はストリ…

DirectSoundとRubyのプログラミング その7

続き。今回はちょっと趣向を変えて、oggファイルの再生をしてみよう。 oggについて 拡張子oggのファイルはOgg Vorbisというファイルフォーマットというか圧縮形式というかのファイルで、OggというコンテナにVorbisという形式のデータが入っている。Vorbisは…

DirectSoundとRubyのプログラミング その6

続き。 前回のバグについて 色々やってたらいくつかバグを見つけた。 まず、8bitのwavファイルのデータは0〜255の符号無しで波形を表現するのでRuby側のunpack文字列は小文字のcじゃなくて大文字のCになる。C側の計算も間違っている。 それから、16bitのwav…

DirectSoundとRubyのプログラミング その5

あけましておめでとうございます。続き。これはたぶん、RubyでDirectSoundを使って何をどこまでできるのか実験してるという感じで、続けていった結果として直接的に何かが完成するというわけではなさそうな気がする。 解放について 前々回の記事に通りすがり…