bamboo’s blog

Bambooの気まぐれブログ

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

GCCインラインアセンブラの使い方

インラインアセンブラとは、ソースコード内にアセンブリコードを埋め込むことができるというコンパイラの機能である。本記事では、GCCにおけるインラインアセンブラの扱い方について解説する。 書き方 インラインアセンブラは、asmまたは__asm__から始め、()…

連長圧縮について

圧縮の基本ともいえる連長圧縮についておさらい。 連長圧縮とは Wikipediaより引用。 連長圧縮(れんちょうあっしゅく)は、データ圧縮アルゴリズムの一つで、可逆圧縮に分類される。ランレングス圧縮、RLE (Run Length Encoding) とも呼ばれる。 アルゴリズ…

WSLのUbuntuでllamaをビルド

llamaは3DSのfirmエミュレータ。ビルドするためにはいくつかパッケージをインストールする必要があったためメモ。 手順 まずはパッケージの更新。 sudo apt update && sudo apt upgrade -y 続いて必要なパッケージをインストール。 sudo apt install cargo p…

bssセクション初期化の必要性

概要 最近バイナリサイズ削減や高速化について試行錯誤しているのだが、そこでふと疑問に思った。bssセクションの初期化(0クリア)はスタートアップルーチンで当たり前のように行われているが、これは必ずしも必要なものなのだろうか。今回はこれについて調べ…

3DSのスレッド遅延処理(ASM)

前回の記事では入力キーの判定をASMコードに埋め込み、フラッシュ表示を行うという内容を扱った。(まだ読んでいない方はこちら) 今回はスレッド遅延処理を前回のコードを用いて実装してみる。 方法 svc命令の一種であるSleepThreadを使用する。引数に遅延さ…

入力キー判定をASMに埋め込む

GWコードには予め入力キーを判定するコードが用意されているが、今回はこれをASMコードに埋め込み、フラッシュ表示してみる。 方法 入力キーを読み取り、指定されたキーコードと等しい場合にフラッシュ表示のフラグとカラーコードを書き込む。ちなみに入力キ…

3DSにおけるプロセス間通信

今回はプロセス間通信(IPC)を用いて、ホームボタンを押す処理をGatewayコードで実装してみる。 仕組み IPCのリクエストが行われると、リクエスト内容がスレッドローカルストレージという場所の0x80番地に書き込まれる。これがSendSyncRequestと呼ばれるsvc命…