最初のカートを作る
カートリッジは一つのファイルだ: ROM、そのタイル、そしてそれが書かれたコンソールのアドレス。このページは、何も無いところから、チップが走らせた公開済みのカートに至るまでの道のりを、実際に辿る順に書いたものだ。コマンドはすべて本物で、アドレスはこのページではなく稼働中のサービスから読む。
辿り方は二つある。手で、以下の通りに。または AI で: このページの全部と、必要な三つのリファレンスを載せた一つの URL をモデルに渡して、打ち込みは任せる。その URL は /6502/cart/brief.md で、プレーンなマークダウンだ。全体が一回の読み込みに収まる。
1. トークンを鋳造する
トークンはレジストリでのあなたのハンドルであり、チップ API への鍵だ。無料で、エディタのワンクリックか、シェルから鋳造する:
curl -s -X POST https://tinymachines.ai/api/v1/tokens \
-H 'content-type: application/json' -d '{"note":"my first cart"}'
表示は一度きり。保存されるのは SHA-256 だけなので、二度と表示できない。アドレスあたり一日に数個までなので、ループでレジストリを枯らすことはできない。エディタで GitHub にサインインしていれば、トークンはアカウントのものになる: 失くしても、そこで再発行すればページは新しいトークンへ移る。
鋳造のあと、エディタはあなたの鍵を入れたブリーフを差し出す: AI があなたのページ向けにカートを作るために読む markdown 一つで、SKILL.md としてダウンロードできる。Claude Code なら ~/.claude/skills/tm6502-cart/SKILL.md に、Codex なら AGENTS.md として保存するか、どのチャットにもそのまま貼り付ける。トークンが入っているので、トークンと同じように扱うこと。鍵なしの同じブリーフは /6502/cart/brief.md にある。
鋳造はさらに二つのことをする。カートコードを渡す: トークンから導出した短いスラグ (HMAC なので、対応関係はここでだけ検証でき、他の誰にもできない) で、最初のカートリッジを公開するときの名前だ。そしてページを取得する: リクエストに書いたハンドル、書かなければカートコードで。
2. あなたのページ
あなたのページは /6502/builders/<handle> で、すべてのカートのアドレスの前半であり、トークンができた瞬間に存在する。一つのトークンに一つのハンドル、後から変えられないので、自分の名前が欲しければ鋳造時に "handle": "ada" を渡す。手で鋳造したトークンのために、自分で取得する道も残っている:
curl -s -X POST https://6502.tinymachines.ai/api/v1/registry/claim \
-H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \
-d '{"handle":"ada","name":"Ada"}'
3. 規約を読んでから、ROM を書く
コンソールはハードウェアではなく規約だ: ホストと ROM が合意するゼロページのアドレスがいくつか、チップ自身のメモリの 1 ページである画面、そしてフレームが終わったときに ROM が立てるティックフラグ。ページからではなく、サービスから読む:
curl -s https://6502.tinymachines.ai/api/v1/console
そのアドレスに対して 6502 アセンブリで ROM を書く。サービス自身のアセンブラがアセンブルするので、ソースはカートリッジと一緒に旅をし、公開されるのはあなたが書いたものそのものだ。カートリッジ・ゼロは数百バイトの Snake で、写すべき形だ。
4. タイルを描く
タイルは 8x8、1 ピクセル 2 ビット、1 タイル 16 バイトの NES 形式。規約がバイト順と、ダイ自身の四色を定めている。.chr を出力するスプライトツールなら、どれもこれを出力する。シートは hex で送る。
5. カートリッジを鋳造すると、それは走る
curl -s https://6502.tinymachines.ai/api/v1/cartridge \
-H 'content-type: application/json' -d @cart.json -o mine.cart.gz
cart.json には rom.source と rom.org、console (手順 3 のアドレス)、tiles.chr (hex)、meta (name、author、blurb)、frames を載せる。鋳造は成り立たないレイアウトを拒み、それから ROM をチップの上で走らせる: 返ってくるファイルには verify ブロックがあり、ブートしたか、何フレーム完了したか、各フレームが半サイクルでいくらかかったかが書かれている。ティックフラグを一度も立てない ROM にはファイルが無い。
6. 遊ぶ
コンソールは URL からカートリッジを読み込む:
https://tinymachines.ai/6502/games?cart=<あなたの .cart.gz の URL>
ファイル選択からでもよい。そのタイルがシートを置き換えるので、カートは自分の絵を持ち込む。
7. 公開すると、チップがもう一度実測する
curl -s -X PUT https://6502.tinymachines.ai/api/v1/registry/b/ada/roms/first \
-H "authorization: Bearer $TOKEN" -H 'content-type: application/json' \
-d "{\"cart\":\"$(base64 -w0 mine.cart.gz)\",\"frames\":3}"
レジストリはファイルを展開し、掲載前にここで走らせる。リクエストに書いたものが数字を決めることはない: あなたのページでカートの横に出るのは、この実行でチップがしたことだ。ページは /6502/builders/ada、カートは /6502/builders/ada/first で、実行が通った瞬間にどちらも公開される。
8. それが何をしたかを読む
ウォーク、Snake を一命令ぶん深くは、カートリッジ・ゼロの一命令を五サイクルぶんシリコンの中まで追い、回路図はスイッチ網から引き出される。トレーサはどのプログラムに対しても同じことを、その場でやる。それがこのサイトの残り全部が教えるために組まれたレッスンだ。
AI の道
オーナーは AI に API リファレンスと一文を送り、AI は自分の絵つきの動くゲームを書き、デバッグし、公開した。ブリーフはそれを普通の道にする: 一つの URL に、上の全部と三つのリファレンスを、プレーンなマークダウンで。
https://tinymachines.ai/6502/cart/brief.md?slug=<カートコード>&handle=<ハンドル>
鋳造はその URL を埋めて返す。モデルにそれと一文を渡す: 私の「6502 as a service」API を使って、小さなゲームを作って動かして。 モデル自身のトークン鋳造はモデル自身のアドレスに数えられ、公開にはトークンが要るので、あなたのトークンを渡さない限り、モデルはあなたとして公開できない。