2021年2月第3週レポート

インプット

📝 Revit勉強中

こちらの書籍を使ってRevitの使い方を勉強し始めました。

BIMオペレータになりたいというわけではありません。が、業務上でBIMデータを取り扱う機会が増えてきており、向こう数年はこの傾向は変わらないだろうと考え、もう少し深く突っ込みたいと思うようになりました。また、「Building Information Modeling」の言葉の通り、「情報」が非常に重要なポイントとなるので、情報処理を生業とする自分にとっては燃えてくる分野でもあります。そこでまずはBIMデータを作る人たちの目線にできるだけ近づくため、Revitをさわりはじめました。

参考書を一通りなぞってみて、建築パースモデルを作成するところまでは出来るようになりました。また、ソフトを触っていく中で、これまで自分の中で理解しづらかった、カテゴリ・ファミリ・タイプというそれぞれの概念が鮮明になってきたので、それだけでもやってみる価値はあったかなと思います。

まだ、フェーズとビューの関連、ファミリの作成過程といったところまでは抑えきれていないですが、これからもRevitの勉強は続けていこうと思います。

📝 「カルチャー崩壊と再構築。 Goodpatchが取り組んだ組織デザインの2年間」を読んだ

カルチャー崩壊と再構築。 Goodpatchが取り組んだ組織デザインの2年間 - 前編|Naofumi Tsuchiya / Goodpatch|note

読んだ感想です。

やはり複数人が働く以上、目的意識であったり価値観はある程度同じ方向を向いていた方がよい(まったく同一である必要はないし、そんなことはできない)のかなあ。自分の過去を振り返りながら考えてみると、方向性が違うズレているというケースより、そもそも違いのことをわかってない、知らない、だから相手(ここでは経営層か)と溝があるように感じる、ということが多い気がします。

そもそも自分の価値観を理解しているか、というのが結構難しいところだと思っていて、相手を知る前にまず自分を知る必要があるのかなと思います。そういった中でGoodpatchさんの取組は自分と相手の価値観を知る良い仕組みが回せたんじゃないかと(勝手に)解釈しています。

過去、YASUI Tsutomuさん (@yattom) / Twitterさんに心理的安全性ゲームをファシリテートしていただいたりしたことがありますが、今一度改めて自分の価値観を見直してみようかと思います。定期的にやったほうが良さそう。

📝 Rust 1.50を導入した

Rust 1.50がリリースされましたので、開発環境をアップデートしました

Rust 1.50を早めに深掘り - OPTiM TECH BLOG

更新内容はこちらを読んで把握しました。bool::thenは地味ながらもコードをシンプルにするのに役立ちそうなので、今作っているNESの方にも置換できるところは置き換えていきたいです。

📝 キャリーフラグとオーバーフロー

キャリーフラグとオーバーフロー (zouri.jp)

キャリーフラグ

加算のときのキャリーフラグはわかっていたのですが、減算のときのキャリーフラグの理解はゆるふわでした(大学時代何やっていたんだ…)

6502だと減算ができないので、引く数を2の補数表現の負数とみなした加算として減算を実現します。このとき繰り下がりがないときはキャリーフラグがセットされ、繰り下がりがあるときはキャリーフラグがクリアされる、というのが感覚的に理解できていませんでした。

これは2進数表現で書いてみるとわりと腑に落ちるものでした。

  • たとえば5-3という演算は5+(-3)として計算している
    • 5:0b0101
    • 3:0b0011 -(2の補数)-> 0b1101
    • これを加算すると 0b0101 + 0b1101 -> 0b10010となる
      • 4bit演算だと考えると繰り上がりが発生するのでキャリーがセットされる
  • 次いで、5-6という演算を考えると
    • 5:0b0101
    • 6:0b0110 -(2の補数)->0b1010
    • これを加算すると0b0101 + 0b1010 -> 0b1111(1の2の補数なので-1) -繰り上がりが発生していないのでキャリーはクリアされる
  • 次いで、5-5という演算を考えると
    • 5:0b0101 -(2の補数)-> 0b1011
    • これを加算すると0b0101 + 0b1011 -> 0b10000でキャリーが発生する

なのでNESで使われているCPUのSBC命令については、減算結果が0以上ならばキャリーをセットするとしてプログラムを書けばOKでした。

オーバーフローフラグ

キャリーフラグと似ているようで全然違うものとしてオーバーフローフラグというものがあります。こちらは2の補数表現による演算の結果の符号に矛盾が発生してしまった状態のことを言います。例をあげてみると

  • 127 + 1という加算計算について

    • 0b0111_1111 + 0b0000_0001 = 0b1000_0000
    • 0b1000_0000というのは8bitの2の補数表現では-128と負数となる
    • 128という結果を期待しているのに矛盾が発生している
  • 127 - (-1)という減算計算について

    • 0b0111_1111 - 0b1111_1111
    • 加算に変換すると
    • 0b0111_1111 + 0b0000_0001 = 0b1000_0000
    • 128という結果を期待しているのに矛盾が発生している

とまあビット数の制約と2の補数というものから、計算に矛盾が発生することは避けられません。じゃあどうやってこれを検知するかというと、計算に使う数値と結果の数値のそれぞれの符号を見れば判定することができます。

  • 同じ符号の数の加算なのに、足される数と結果の符号が反転していればサインドオーバーフローが発生したと言える

加算については分かりやすくて、正数と正数の加算結果は必ず正数で、負数と負数の加算結果は必ず負数となるので、その条件にマッチしなければオーバーフローが発生したと見なせるわけです。

  • 違う符号の数の減算なのに、引かれる数と結果の符号が反転していればサインドオーバーフローが発生したと言える

減算についても、正数から負数を減算すると必ず正数になる、または負数から正数を減算すると必ず負数になる、という条件でオーバーフローを検知することができます。

アウトプット

🛠️ RustでNESエミュレータを作っている

先週に引き続き、nestestを使ってCPUの改善/実装を進めています。前述のキャリーフラグやオーバーフローフラグといったステータスレジスタの制御や、アドレッシングモードの理解が間違っているところを見つけ出すことができたので、隠し命令を必要としないテストについてはすべてパスしました。

CPUが良くなってきた成果なのか、ドンキーコングが起動するようになりました。(ROMは吸い出し機を使って作っています)

タイトルの描画がおかしく、PPUの実装が悪いのかCPUの実装にまだバグがあるのかもわかっていないのですが、とりあえず前に進んではいるのでヨシとします。

その他

🎮 ひたすら工場作っている

Profile
d_yama
元Microsoft MVP for Windows Development(2018-2020)
Sub-category : Windows Mixed Reality
Search