Skip to content

環境構築

第2章「犬DOGEを作ろう!」の環境構築手順を掲載します。

準備するもの

  • PC
    • Windows 11
      • カードリーダへの書き込みにWindowsを用います。ドライバの都合でx64版を利用します。
    • Linux環境もしくはmacOS
      • ソフトウェアの開発・ビルドに用います。
      • WSL(WSL1, WSL2)でも問題ありません。記事作成時はWSL1 + Ubuntu 22.04を使用しました。
  • psdevkit
    • SDK本体
    • 後述
  • PocketStation本体
    • BIOSダンプに必要
  • pk201
    • PocketStationエミュレータ
    • Windows向けとAndroid向けがあります
    • Linux、macOSではWineを使って起動できます
  • PS3用メモリーカードアダプタ
    • PocketStationの読み書きに利用します。

手順

ビルド環境の準備

Windows / Linux

Windowsで作業する場合、WSL環境を整えるのが最も簡単にポケステの開発環境を整えることができます。

PowerShell (管理者権限)で以下を実行し、WSL と Ubuntu をインストールします。

powershell
wsl --install

Ubuntu ターミナルを起動し、必要なパッケージをインストールします。ARM 向けクロスコンパイラ arm-none-eabi-gcc もここで一緒に入ります。

sh
sudo apt install make gcc unzip gcc-arm-none-eabi imagemagick

インストール後、コンパイラが起動できるかを確認します。

sh
arm-none-eabi-gcc --version

macOS

macOSで作業する場合、Homebrewにてarm-none-eabi-gccをインストールするとコンパイラが入手できます。

ターミナルを起動し、必要なパッケージをインストールします。ARM 向けクロスコンパイラ arm-none-eabi-gcc もここで一緒に入ります。

sh
brew install arm-none-eabi-gcc make unzip imagemagick

インストール後、コンパイラが起動できるかを確認します。

sh
arm-none-eabi-gcc --version

SDK の用意

ポケステには、OrisonSoftwareが制作した、psdevkitというSDKがあります。以前は無料で手に入ったようですが、現在は有料で販売されています。 https://orionsoft.itch.io/pocketstation-dev-kit から購入し、キットをダウンロードします。これがなければゼロから整備するだけで本が1冊書けてしまうほどになります。感謝感激雨アラモードです。

リポジトリの中身はざっくり以下の構成になっています。

psdevkit/
├── tools/          変換ツール(開発環境側で使う)
├── Example/        サンプル
└── pocketlib.h     ポケステ向けライブラリ本体

ダウンロードしたzipを作業場所に展開します。

ツールのビルド

tools/ 以下の開発環境向けツールは、それぞれツールのディレクトリ内で main.c を手動でコンパイルします。

ビットマップを専用の形式に変換するツールである bmp2ps1b と、バイナリを8KBブロック単位にそろえてくれるツール mcpad の2つは、そのままビルドすると正しくコンパイルできないため、それぞれのmain.cの先頭に #include <string.h> を追加してからビルドします。

sh
cd ascii2sjis && gcc main.c -o ascii2sjis && cd ..
cd tim2mcicon && gcc main.c -o tim2mcicon && cd ..
cd bmp2ps1b   && gcc main.c -o bmp2ps1b   && cd ..   # 事前に #include <string.h> を追加
cd mcpad      && gcc main.c -o mcpad      && cd ..   # 事前に #include <string.h> を追加

bmp2ps1bやmcpadの修正イメージ:

c
#include <stdio.h> // 追加
#include <stdlib.h>
#include <string.h> // 追加

unsigned char   data[128*1024];
// (以下略)

次に、セーブデータ形式である .mcr 生成するために必要な bin2mcr を GitHub から追加で取得します。このリポジトリは筆者のものとなります。psdevkitに付属しているツールだけでは、扱いやすい mcr の形式を作成してくれないため、 mcr 形式に変換するためのツールとなります。

sh
# tools ディレクトリ内で実行
git clone [email protected]:mikuta0407/pocketstation-bin2mcr.git bin2mcr
cd bin2mcr && gcc main.c -o bin2mcr && cd ..

BIOSの吸い出し

MemcardRex 2.0 RC1 と、 PS3 用のメモリーカードアダプターを用い、 BIOS のデータをダンプ(吸い出し)します。

まずは ShendoXT/memcardrex: Advanced PlayStation 1 Memory Card editor より、MemcardRexをダウンロードします。執筆時は、 MemcardRex 2.0 RC1を利用しました。

次に、GitHubでのREADMEのHardware interfaces5. PS3 Memory Card Adaptorを参考にし、Zadigを用いてドライバをインストールします。

ドライバのインストールが完了したら、PS3用メモリーカードアダプタを接続した上で、ポケステを差し込みます。

OptionsからPreferencesに入り、Active hardware interfacePS3 MC Adaptorに設定します。

Preferences

PS3 MC AdaptorPocketStationDump BIOSを選択します

Dump Menu

ダンプが開始されます

Dumping

ダンプが終わると、吸い出したBIOSの情報が表示されます。

Dump info

左下Save BIOSから、データを保存します。このとき、後ほどpk201(エミュレータ)で使うため、KROMという名前で保存しておきます。拡張子は不要です。

エミュレータの用意

ポケステのエミュレータは pk201 を使います。

DEEPER THAN POCKETS から、pk201 をダウンロードできます。

pk201 の動作には 2 つのファイルが必要です。

  • KROM : ポケステ本体に内蔵された BIOS ROM のダンプ。おそらく Kernel ROM の略称
  • FROM : メモリカードのフラッシュ ROM に対応するファイル

これらは pk201 で読み込ませるためにはファイル名が固定となります。 KROMが、先程吸い出したファイルになります。 FROM は、自分でビルドした .mcr ファイル(PS1のメモリーカード用のファイル形式)を、 FROM という名前に変更したものです。

これらを準備した状態で、 pk201 の File メニューの Misc 内から両方ロードさせ、 Run メニューから Start させることで、ポケステのエミュレートができるようになります。

エミュレータ起動中

BIOS起動後

操作方法は、 WASD キーが上下左右、 K キーが右のボタンとなります。S キー K キーを押して時計設定をひとまず終えると(WASD, K キーで操作ができます)、待受状態になります。


example を動かしてみる

まず付属の example サンプルをビルドして、ちゃんと動く環境かどうか確認してみましょう。

元の Example/Makefile のままでは bin2mcr を使った .mcr 生成が設定されていないため、以下の修正が必要です。

Example/Makefile の修正箇所

  1. LDarm-none-eabi-ld から arm-none-eabi-gcc に変更

    makefile
    LD = arm-none-eabi-gcc
  2. LDFLAGS を以下に変更

    makefile
    LDFLAGS = -nostartfiles -lc -lgcc #-Map ${PROG}.map
  3. ${PROG}.bin ターゲットの mcpad のパスの変更と、bin2mcr の呼び出しを追加

    makefile
    ${PROG}.bin: ${PROG}
         ${OBJCOPY} -O binary ${PROG} ${PROG}.bin # ここまで同じ
    	    ../tools/mcpad/mcpad ${PROG}.bin # 相対パスに変更
    	    ../tools/bin2mcr/bin2mcr BESNESP00000GAMETEST ${PROG}.bin ${PROG}.mcr # 追加

完成版は以下です

Makefile
PROG    = test

SRCS    = ${PROG}.c
OBJS    = header.o ${SRCS:.c=.o}

CC      = arm-none-eabi-gcc
LD      = arm-none-eabi-gcc
AS      = arm-none-eabi-as
OBJCOPY = arm-none-eabi-objcopy
OBJDUMP = arm-none-eabi-objdump

LDFLAGS = -nostartfiles -lc -lgcc #-Map ${PROG}.map
CFLAGS  = -Os -msoft-float
ASFLAGS =

all:    ${PROG}.bin

${PROG}.bin: ${PROG}
    ${OBJCOPY} -O binary ${PROG} ${PROG}.bin
    ../tools/mcpad/mcpad ${PROG}.bin
    ../tools/bin2mcr/bin2mcr BESNESP00000GAMETEST ${PROG}.bin ${PROG}.mcr

${PROG}: ${OBJS}
        ${LD} -o ${PROG} ${OBJS} -Tldscript ${LDFLAGS}

clean:
        rm -f ${OBJS} ${PROG} ${PROG}.map

fclean: clean
        rm -f ${PROG}.bin

disasm:
        ${OBJDUMP} --disassemble ${PROG} > ${PROG}.DISASM.S

修正が済んだら、実際にビルドを行います。

sh
make

正常にビルドが出来ると test.mcr が生成されます。これが先ほど pk201 のところで触れた FROM として渡すファイルになります。

test.mcr を pk201.exe と同じディレクトリに FROM としてリネームして配置し、pk201 を起動して KROM と FROM を読み込み、Run メニューから起動するとエミュレートを開始されます。

時計設定後、S キーで右画面に移動すると、Pocket Lib EXAMPLE Orion_ と書かれたタイトルページが現れます。

タイトル

ポケステの画面に音楽が流れながら、文字が動くプログラムが起動します。

Example

ここまで動けば開発環境は OK です。

Published by Team SWSD