GBAへ画像を表示
GBA Linuxから目覚めるぼくらのゲームボーイ
https://gyazo.com/8f41a84c728e3cb435af1cd5ac292ee4
PPM形式の画像ファイルをGBA用バイナリ形式に変換
min-camlのリポジトリ内に含まれるスペースシャトルのppmファイル(P6バイナリ形式)を、Macのプレビューアプリで240 x 160にリサイズして保存し(保存時にP3テキスト形式に変換される)、スクリプト ppm2rgb.rb でGBA用バイナリ形式の画像に変換。リンク時に画像のバイナリデータをプログラムの直後にリンクしてあげる。
code:ppm2rgb.rb
# ppmファイルをGBA用のバイナリ形式画像に変換
# usage: ruby ppm2gba.rb shuttle_240x160.ppm > shuttle.gba
data = File.read(ARGV.shift).split
image_data = (data4..-1).map(&:to_i)
image_data.each_slice(3) do |r256, g256, b256|
# 8bitカラーを5bitカラーに変換
r32 = r256 >> 3
g32 = g256 >> 3
b32 = b256 >> 3
# RGBの5bitカラーを以下の形式で2バイトに詰め込む
# 0bbb_bbgg, gggr_rrrr
byte0 = b32 << 2 | g32 >> 3
byte1 = g32 << 5 | r32
print byte1, byte0.pack("C*")
end
code:viewer.s
#define IOBASE 0x04000000
#define VIDEO_MODE3 0x0F03
#define VRAM_START 0x06000000
#define LOOP_COUNT (240 * 160)
.arm
.text
mov r1, #IOBASE
ldr r2, =VIDEO_MODE3
strh r2, r1
mov r3, #VRAM_START
ldr r4, =image_start
ldr r5, =LOOP_COUNT
display:
ldrh r2, r4
strh r2, r3
add r3, r3, #2
add r4, r4, #2
subs r5, r5, #1
bne display
loop:
b loop
code:viewer.ls
OUTPUT_ARCH(arm)
SECTIONS {
.text 0x02000000 : { *(.text) }
.image : {
image_start = . ;
*.gba(*)
}
}
code:Makefile
all: viewer.bin
viewer.bin: viewer.out
arm-none-eabi-objcopy -O binary viewer.out viewer.bin
viewer.out: viewer.o
arm-none-eabi-ld --oformat elf32-littlearm -o viewer.out -T viewer.ls viewer.o -b binary shuttle.gba
viewer.o: viewer.s
arm-none-eabi-cpp viewer.s | arm-none-eabi-as -o viewer.o -
clean:
rm -rf viewer.o viewer.out viewer.bin
transfer: viewer.bin
sudo ../optusb/optusb viewer.bin
参考
PNM(PPM/PGM/PBM)ファイルフォーマット
https://www.mm2d.net/main/prog/c/image_io-01.html