プログラミング

haskellでゲームボーイのCPUエミュレータを書いた

一昨年の夏にどうやってもテスト通らなくて放置してたゲームボーイエミュレータを根本的に書き換えてみたらだいぶましになった。最初はlens/Stateを使う方針でCPUのレジスタなんかをレコードのフィールドにぶち込んでそれらを書き換えていく感じだったが、ざ…

GBEのu16+i8、キャリーしてない場合はフラグを立てるっぽいな

前記事においてよくわからんなとかいってたやつ。単純にキャリーしないときにオンにするかんじやな。 .carry = (a ^ i ^ result) & 0x100 != 0を逆にして.carry = (a ^ i ^ result) & 0x100 == 0でよいかんじでした。 fn addU16ToSingedU8WithCarryHalf(a: u…

GBEの16bit+8bitIntのときのフラグがよくわからん

ADD SP NやLD HL SP+N命令においての引き算時のキャリーとハーフキャリーのフラグの建て方がよくわからんかってしばらく詰んでた。昔書いたコード適当にコピペしてパスしたけど、よくわからんままやな。普通の引き算とは違うフラグの建て方してるっぽいんだ…

zigでゲームボーイエミュレータ書いてる

github/kmtoki/gbe-zig エミュレータ開発用テストROMのgb_test_roms/cpu_instrsがパスしたのでcpuはざっくり書けたっぽい。過去にTypescriptとHaskellとRustで書いてて、TSはなんとか動いたけど、haskellとrustはcpuのテストをパスできなかったので三度目の…

Zigでマンデルブロ集合

zigが流行ってると聞いて。人類に手動メモリ管理はまだ早いんだよな。もっと脳が進化してくれないと難しい。足りない脳でやってくしかないのだ現代人たる我(々?)は。 SDLのビルドでつまづいたりした。自分でbuild.zigいじるのいやだったので、パッケージマネ…

Pop_OSインストールしたら夕暮れを壁を挟んで三回背にしてた

PopOSをインストールして環境設定してたらくそめんどくさかったんだけど、何一つメモ残してないから何がめんどくさかったのかわからないまま、ブログアップロードテストを迎えてしまったらいなう。 GドライブのSSDのフォーマットがMBRだったのでハマる 音楽…

SP--してからwrite、readしてからSP++

GBEのPUSH/POPについてはそういうことみたいです。

QMKにNICOLA配列でも設定するか

keymap PreonicのQMKに定義してみた。一年ほど前に。キーマップ書いて一切練習してなかったのを思い出してちょっとやってみるかっと思ってファームウェア書き込んだら、修飾キーあたりが動かんくてなるほど、それで練習しなかったのかとなっとく。調べてみた…

ただのショートカットとしてのnewtypeにMonadState/MonadTrans/MonadIOのinstanceを定義する

{-# LANGUAGE GeneralizedNewtypeDeriving #-} data InnerState = InnerState { _y :: Int } newtype Inner m a = Inner { runInner :: StateT InnerState m a } deriving (Functor,Applicative,Monad,MonadState InnerState,MonadTrans,MonadIO) data AppSt…

WindowsTerminal/powershellでのstack/GHCの文字化け

<stderr>: commitAndReleaseBuffer: invalid argument (invalid character)で動かないぞ 文字コードが悪いらしいぞ chcp 65001でutf8にするぞ 動くようになったけど文字化けするぞ powershellでエンコーディングの設定するぞ 直ったぞ という話。 app\Main.hs:36:27:</stderr>…

たなこふ先生のRustでGBE

Rustでゲームボーイエミュレーターを書いた 僕は最初、Rustで書こうとしたが所有権のあれこれをクリアできず挫折した。 メモリをRc<RefCell<Memory>とかでごまかそうとしたけど、さすがにあかんやろて思った。 Rc<RefCell<>>のオーバーヘッドがどれくらいなのか知らんけど、メモリアク</refcell<></refcell<memory>…

リンクのY位置

LY < 10の時になぜかリンクのYがリセットされる LY == 152でリンクの正しいYがセットされる LY == 144でレンダリングをしていた。リンクの座標がリセットされたままだったため非表示になっていた LY > 152でレンダリングするようにしたら、リンクは表示され…

またゲームボーイエミュレータ触ってる

一年位放置してたゲームボーイエミュレータをここ一週間位気になりだして触ってる。前回まではコントローラーの実装が良くなくてオープニングムービーは流れるけど、そこから操作できず進めないというところで詰んでた。そのへんを考え直して実装し直した。 …

Powershellで数値を二進数に変換

地味にべんりなのでprofile.ps1に入れた function bin($n) { return [convert]::ToString($n,2) }

VimでクリップボードからMarkdownのYoutubeサムネリンクを生成する

MarkdownのYoutubeサムネリンクが欲しいときにこれ。ブラウザ上でURLをコピーしたら、VimでF3でおk。なお関数名。 inoremap <F3> <C-R>=YankToMarkdownYoutubeLink()<CR> function YankToMarkdownYoutubeLink() let l:w = matchstr(@*,'\vwatch?v=([^&]+)') let l:id = m</cr></c-r></f3>…

vimのstatus line

powerlineとかairlineとかlightlineとか、結局やめてこれで十分だった。 set statusline=%<\ %n\ %t\ %m\ %r%h%w%=\ \|\ %{&fenc!=''?&fenc:&enc}\ %{&ff}\ %{&filetype}\ \|\ %l/%LL\ %2vC\ %3p%%

WindowsでRust-SDL2をビルドする

rust-sdl2、vcpkgを使う場合これどうりやってもx86をなぜかインストールするので、cargo vcpkg build --target x64-windows-static-mdと指定しても無視されるので直接vcpkgにtripletを指定して叩くと耳を傾けてくれる。 # Cargo.toml [dependencies.sdl2] ve…

Powershellで正規表現にマッチする内容のファイル名が欲しい時

ls | ? { Get-Content $_ | ? { $_ -match 'hoge' } }

APIを使ってMarkdownをはてなブログに投稿する

はまったこと <content type="text/x-markdown">を指定してもplain textで投稿されてしまう 対策 ブログの設定画面からデフォルトの編集モードをMarkdownモードに設定する。 const http = require('https') const fs = require('fs') const process = require('process') const matter = requ</content>…

Vimで楽にBlogを書く

このブログはMarkdownをGithubにpushすることで公開になる。 流れとしては terminal開く cd $HOME/Github/blog vim開く e strftime("md/%Y%m%d%H%M.md") ブログヘッダーをyamlでtitle,date,categoryを書く 中身書く 保存してvim閉じる git add && git commit…

Next.jsで静的にネストしたルーティングのページを生成する

やりたいこと /blog/[$category]/[$index]みたいなページをビルド時に生成したい やったこと /blog/category/[...id].jsのgetStaticPathsでparamsのidにパスのリストを入れる つまずいたこと /blog/category/[id].jsではネストしたパスのページは生成できな…

VercelにNext.jsで作ったブログをデプロイした

ドチャクソかんたんなんのね、いまどき。HeadlessCMSなしでGitだけでブログエントリー追加していく感じなので良くも悪くもいつも通りな感じ。なじみがあるし、リッチコンテンツゼロなので必要十分。ドメイン買おうかどうしようかと微妙な悩み。一年で20ドル…

ブログなど今時のものじゃないんよ、でも、ほら、そう、僕はそれがいい

Nextjsでブログ作ってる。悪くないんだけど、よくわからないところがあってよくわからない。getStaticPropsで作ったデータがトップのコンポーネントに渡されるわけだけど、そのデータはビルドタイムにもっているだけなのか、クライアント側でも持つことにな…

Powershellをいい感じに設定する

Powershellにおいて、.zshrcや.bashrcにあたるのがprofile.ps1。 echo $PROFILEにどこのパスに設定ファイルを置けばいいか書いてある。 自分の場合はC:\Users\Name\OneDrive\ドキュメント\PowerShell\Microsoft.PowerShell_profile.ps1だった。 profile.ps1…

ぴかちゅう

オープニングが動いたしもういいやって感じになってる。どこを直していいかわからんから。私はこの笑顔を見るために頑張ったんだ...

cpu_instrsテスト通った

作り始めて4か月... 16ビット演算系とdaaで死んでたな。 interruptとかtimerとかは通ってないのでまだ道のり遠く。

ゲームボーイのDAA(BCD)完全に理解した

なにもわからない。どこからともなくコピペして完全に敗北した。 BCD(Binary Coded Decimal)は16進数を10進数に変換したもの。 ゲームボーイではDAA命令を使って変換する。 0x9 -> 0x09 0xa -> 0x10 0xb -> 0x11 0x1a -> 0x20 0x2a -> 0x30 みたいな感じ。 …

公式ゲームボーイ開発マニュアル

archive.org 今更見つけた。。。 初期にこれ見つけれていればGBエミュを3倍くらい早く開発できた気がする。。。 なお、Confidentialのようです。

set Test "POP AF"

本当に悩んで考えて、どうしてもわからなかったから、出てくるわけないだろと思って、テストコードそのままぐぐったら出てきた。 gb-test-rom-emulation-issues つまりFの下位4ビットは何か値が書き込まれても無視するということ。 set_test 5,"POP AF" ld b…

GBのHALTつらい

HALTはInterruptで復帰するんだから、DIしたら帰ってこれない。IME=0のTimerはIF立てるだけでIEは立てないんだからInterruptしない。そういう理解。どないやねん。TimerはIEかIMEをオンにするの?すごい振出しに戻る感あってつらい。