これおもしろい

らふにかいてこ

「エミュレータ研究 PHPで学ぶコンピュータアーキテクチャ」の感想:1 / 3

※最初に断っておくと、完全に感想文です。悪しからず。
f:id:takattata:20181010234632j:plain:w300

面白い連載!

SoftwareDesign2018年6-8月号は読まれましたか?
この3月分には素敵な連載があるのですよ!
その名も「エミュレータ研究 PHPで学ぶコンピュータアーキテクチャ」。
ゲームボーイエミュレータを元にコンピュータアーキテクチャを学ぼうという連載です。

最高ですね!iOSDCに参加された方&&アンカンファレンスであったゲーム機のアーキテクチャを語るを楽しまれた方には心くすぐられるテーマではないでしょうか?

構成は

第1回:CPUのエミュレーション:6月号(8ページ分)
第2回:メモリとI/Oのエミュレーション:7月号(7ページ分)
第3回:画面表示のエミュレーション:8月号(9ページ分)

となっています。
本を読んで記事を書こうとすると、どこまで本の内容に触れて良いのか悩みますね...。
とりあえず、ここが面白かったんですよー!という感じで書いてみようと思います。

github.com この連載で題材となっているエミュレータリポジトリは↑こちら。

第1回:CPUのエミュレーション

はじめに

まず、ゲームボーイのスペックが載っています。
細かいところは分かりませんが、4色モノクロで160x144ピクセルRAM8KB/VRAM8KB、この辺りで歴史を感じてまずテンションが上がりますね!

次に、副読本としてオススメされていた、有志の愛好家によって書かれたゲームボーイの仕様の詳細ドキュメントを見て更にテンションが上がります。
http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf
なんと139ページ!
スペックやプロセッサ、メモリマップなどは勿論のこと、スプライトRAMのバグについても書かれていました。
どうやって調べ上げるんですかね...。すごい...。面白そう...。

CPU

ここまでが大体1ページ分の内容です。期待大の状態で、次はCPUの話に入っていきます。
ゲームボーイのCPUはLR35902なるもので、これはZ80のカスタムCPUだそうです。

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)

この本を過去に途中まで読んだ覚えがあるのですが、8086はZ80と互換性あったりするのでしょうか?
調べてもいまいち分からなかったです...。

レジスタ

レジスタとは、から始まり、LR35902の特徴の紹介、その後にPCレジスタ、SPレジスタ、Fレジスタといった特定用途向けのレジスタ紹介があります。
ゼロフラグとかハーフキャリーフラグとかあったなー!という気持ちになりました。
基本情報技術者試験でも出てきましたっけ?たしか。(落ちてるからなんとも言えない)

命令セット

その後は勿論命令セットの説明です!
これいつも「そうなってるのかー、へー」と理解は出来るものの、実際に動くものを作るイメージがつかないんですよね。

$01 LD BC,d16
普段ずっとこういうものを書いていたらそんなことはないのでしょうが、たまに見る勢としては非常にテンションが上がります。そわそわします。
レジスタ操作、メモリ操作、演算、実行制御などの解説がされていきます。
キャリーフラグなどは演算時に使われますが、その説明を見て、Fレジスタの理解苦手だったなぁというのを思い出しました。
ちゃんと復習したい欲が掻き立てられます。

アセンブラで書かれたものを見た時に「何故ここでわざわざレジスタに格納してから他のレジスタに値を渡すんだろう」とか、「何故ここでわざわざジャンプして処理してから戻ってくるんだろう」と理解に苦しんでいた覚えがありましたが、今思えば効率やメモリマップの制約などがあったのでしょうか?
そう考えると全体を知っていないとろくなものが作れないであろうこの頃の開発者は本当にすごいなと思います。
当時からしたらジェネリクスとか理解出来る今の開発者すごいなとなるのかもしれませんが。

エミュレータ実装

さて!ここまでがゲームボーイ本体の話でした!
エミュレータなので、今まであった動きを実装していかなければなりません。
このコードのところに関しては、別途Kotlinバージョン読んでみた後に記事にしようと思います。
(でないとブログ書くハードルが上がって、この記事アップ出来ない気がする...。)

次は第2回!

メモリとI/Oのところです!これもすごく楽しかったんですよー!
明日書きますー。

第1回が載っている号はこちら。
gihyo.jp

iOS12でUnknown selected data source for Port Speakerが出続ける件

iPhoneXS, iOS12の実機デバッグをしていたところ、ログにすごい勢いでエラーが吐き出されていました。

AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Speaker (type: Speaker)

どうやらAdMobのバグらしく、調査中のようです。 新しい情報が出次第こちらのスレッドを更新してくれるとのことなので、期待して待ちます。

https://groups.google.com/forum/#!searchin/google-admob-ads-sdk/Unknown$20selected$20data$20source$20for$20port%7Csort:date/google-admob-ads-sdk/VR430-cbXt4/O6KAoWULAwAJ

アルゴリズム事典より: Weibull分布

[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

C言語による最新アルゴリズム事典という本が1991年に発売されていたのをご存じですか?
専門学校時代に手元にあると良いよと言われ、持ってはいたものの、あまり開いたことがありませんでした。
今日なんとなく開き、アルゴリズムを学びつつ、Kotlinで書いたらどう書くかというのをブログに書くのも面白いのではと思い、やってみました。

改訂新版を先ほど購入したので、内容自体は改訂新版を元にしています。

Weibull分布

p.429

概要

f:id:takattata:20181005225205j:plain
f:id:takattata:20181005225215j:plain

結論: 理屈分かってないけど、そういう分布の乱数の作り方ということは分かった

コード読解

本を元にC++にしたもの

#include <iostream>
#include <cmath>

using namespace std;

double randWeibull(double alpha) {
    double randomValue = rand() / (double)RAND_MAX;
    return pow(-log(1-randomValue), 1/alpha);
}

int main() {
    cout << randWeibull(0.2);
    return 0;
}

https://www.onlinegdb.com/online_c++_compiler

コードのrandomValueが、F(x)のxのところで、購入randomValueヶ月以内に当たる
alpha〜故障型を決めるパラメータ

引数がalphaだから、
randWeibull関数任意の故障型の購入経過月数の一様分布(=randomValue)において最初に故障する確率が求められる
という認識で合っているのだろうか🤔

Kotlinで書く

Kotlin v1.3-RC

import kotlin.math.*
import kotlin.random.*

fun randWeibull(alpha: Double): Double {
    val randomValue = Random(10).nextDouble(1.0)
    return -ln(1-randomValue).pow(1/alpha)
}

fun main(args: Array<String>) {
    print(randWeibull(1.3))
}

https://try.kotlinlang.org/

Random

github.com

Kotlin 1.3でRandomクラスが出来る予定だそう
Javaと似たものらしい
最初にseedとなる値(コードでは10の定数)を渡して実体を生成してから使う
next〜関数の引数が範囲の上限(bound)で、0〜boundを除いた値の間の乱数が返される

(ミリ秒でも渡せないかと思ったが、Kotlinだけでの時間の取得方法が分からなかったので、ひとまず定数を渡した)

ln関数

ln - Kotlin Programming Language

自然対数(log e)を使う時はlog関数でなくln関数を使う
the natural logarithmより来ていると思われる

pow関数

pow - Kotlin Programming Language

Double, Floatから生えている、べき乗を返す関数

感想

分布の乱数、全然馴染みなかったけど、多少理解出来た気はする。
数式は全然分からないけど、こういうコードを書いたらこの数式と同じ意味になるのか、というのが分かるの面白い。これは面白い題材を見つけた気がする。
アルゴリズムかなり苦手なので、強化も兼ねて続けようと思いました。

認識違いあったらそっとコメントください🙏

参考文献

一様分布の平均,分散,特性関数など | 高校数学の美しい物語
C言語による乱数生成
ガンマ関数 - Wikipedia
数学記号exp,ln,lgの意味 | 高校数学の美しい物語