Fix alignment issues with writing to VRAM, which is half-word addressable
This commit is contained in:
parent
661e60c24a
commit
c1f9630634
@ -3,12 +3,12 @@ FROM wombatant/devenv:latest
|
|||||||
ENV DEVKITPRO /opt/devkitPro
|
ENV DEVKITPRO /opt/devkitPro
|
||||||
ENV DEVKITARM ${DEVKITPRO}/devkitARM
|
ENV DEVKITARM ${DEVKITPRO}/devkitARM
|
||||||
|
|
||||||
RUN dnf install -y qt5-devel
|
RUN dnf install -y qt5-devel llvm libasan
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Install Ox
|
# Install Ox
|
||||||
|
|
||||||
RUN git clone -b release-0.1 https://github.com/wombatant/ox.git /usr/local/src/ox && \
|
RUN git clone -b e976fd3fe62c98be29c4389ba6700a4a1fb8e0ae https://github.com/wombatant/ox.git /usr/local/src/ox && \
|
||||||
cd /usr/local/src/ox && \
|
cd /usr/local/src/ox && \
|
||||||
# setup build dirs
|
# setup build dirs
|
||||||
mkdir -p \
|
mkdir -p \
|
||||||
|
6
Makefile
6
Makefile
@ -10,6 +10,9 @@ endif
|
|||||||
|
|
||||||
make:
|
make:
|
||||||
${ENV_RUN} make -j -C build HOST_ENV=${HOST_ENV}
|
${ENV_RUN} make -j -C build HOST_ENV=${HOST_ENV}
|
||||||
|
build_rom:
|
||||||
|
${ENV_RUN} make -j -C build HOST_ENV=${HOST_ENV}
|
||||||
|
${ENV_RUN} ./build_rom.sh
|
||||||
preinstall:
|
preinstall:
|
||||||
${ENV_RUN} make -j -C build ARGS="preinstall" HOST_ENV=${HOST_ENV}
|
${ENV_RUN} make -j -C build ARGS="preinstall" HOST_ENV=${HOST_ENV}
|
||||||
install:
|
install:
|
||||||
@ -31,12 +34,13 @@ gdb: make
|
|||||||
devenv-build:
|
devenv-build:
|
||||||
docker build --no-cache . -t ${DEVENV_IMAGE}
|
docker build --no-cache . -t ${DEVENV_IMAGE}
|
||||||
devenv:
|
devenv:
|
||||||
docker run -d -v $(shell pwd):/usr/src/project \
|
docker run -d \
|
||||||
-e LOCAL_USER_ID=$(shell id -u ${USER}) \
|
-e LOCAL_USER_ID=$(shell id -u ${USER}) \
|
||||||
-e DISPLAY=$(DISPLAY) \
|
-e DISPLAY=$(DISPLAY) \
|
||||||
-e QT_AUTO_SCREEN_SCALE_FACTOR=1 \
|
-e QT_AUTO_SCREEN_SCALE_FACTOR=1 \
|
||||||
-v /tmp/.X11-unix:/tmp/.X11-unix \
|
-v /tmp/.X11-unix:/tmp/.X11-unix \
|
||||||
-v /run/dbus/:/run/dbus/ \
|
-v /run/dbus/:/run/dbus/ \
|
||||||
|
-v $(shell pwd):/usr/src/project \
|
||||||
-v /dev/shm:/dev/shm \
|
-v /dev/shm:/dev/shm \
|
||||||
--restart=always \
|
--restart=always \
|
||||||
--name ${DEVENV} \
|
--name ${DEVENV} \
|
||||||
|
@ -2,9 +2,11 @@
|
|||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
padbin 32 build/gba-release/src/player/nostalgia.bin
|
${DEVKITARM}/bin/padbin 32 build/gba-release/src/player/nostalgia.bin
|
||||||
echo NOSTALGIA_MEDIA_HEADER_________ > media_header.txt
|
echo NOSTALGIA_MEDIA_HEADER_________ > media_header.txt
|
||||||
|
|
||||||
oxfs format 32 1m nostalgia_media.oxfs
|
oxfs format 32 1m nostalgia_media.oxfs
|
||||||
./build/current/src/tools/nost-pack -fs nostalgia_media.oxfs -img charset.png -inode 1 -tiles 40 -c
|
./build/current/src/tools/nost-pack -fs nostalgia_media.oxfs -img charset.png -inode 1 -tiles 40 -c
|
||||||
|
|
||||||
cat build/gba-release/src/player/nostalgia.bin media_header.txt nostalgia_media.oxfs > nostalgia.gba
|
cat build/gba-release/src/player/nostalgia.bin media_header.txt nostalgia_media.oxfs > nostalgia.gba
|
||||||
gbafix nostalgia.gba
|
${DEVKITARM}/bin/gbafix nostalgia.gba
|
||||||
|
@ -13,15 +13,15 @@
|
|||||||
namespace nostalgia {
|
namespace nostalgia {
|
||||||
namespace core {
|
namespace core {
|
||||||
|
|
||||||
typedef struct { uint32_t data[8]; } Tile, Tile4;
|
typedef struct { uint32_t data[8]; } __attribute__((aligned(4))) Tile, Tile4;
|
||||||
// d-tile: double-sized tile (8bpp)
|
// d-tile: double-sized tile (8bpp)
|
||||||
typedef struct { uint32_t data[16]; } Tile8;
|
typedef struct { uint32_t data[16]; } __attribute__((aligned(4))) Tile8;
|
||||||
// tile block: 32x16 tiles, 16x16 d-tiles
|
// tile block: 32x16 tiles, 16x16 d-tiles
|
||||||
typedef uint16_t Pallete[256];
|
typedef uint16_t Pallete[256];
|
||||||
typedef Tile CharBlock[512];
|
typedef Tile CharBlock[512];
|
||||||
typedef Tile8 CharBlock8[256];
|
typedef Tile8 CharBlock8[256];
|
||||||
|
|
||||||
struct GbaImageData {
|
struct __attribute__((packed)) GbaImageData {
|
||||||
Pallete pal;
|
Pallete pal;
|
||||||
uint16_t tileCount;
|
uint16_t tileCount;
|
||||||
uint8_t bpp;
|
uint8_t bpp;
|
||||||
|
@ -133,7 +133,7 @@ void initConsole() {
|
|||||||
REG_BG0CNT |= (1 << 7); // set to use 8 bits per pixel
|
REG_BG0CNT |= (1 << 7); // set to use 8 bits per pixel
|
||||||
if (fs) {
|
if (fs) {
|
||||||
FileStore32::FsSize_t readSize = 0;
|
FileStore32::FsSize_t readSize = 0;
|
||||||
fs->read(1, 516, 64 * 38, &TILE8_ADDR[0][1], nullptr);
|
fs->read(2, __builtin_offsetof(GbaImageData, tiles), 64 * 38, &TILE8_ADDR[0][1], nullptr);
|
||||||
fs->read(1, 0, 512, &MEM_PALLETE_BG[0], &readSize);
|
fs->read(1, 0, 512, &MEM_PALLETE_BG[0], &readSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,8 +73,9 @@ int run(ClArgs args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QMap<QRgb, int> colors;
|
QMap<QRgb, int> colors;
|
||||||
const auto imgDataBuffSize = sizeof(Pallete) + argTiles * 64;
|
const auto imgDataBuffSize = sizeof(GbaImageData) + 1 + argTiles * 64;
|
||||||
uint8_t imgDataBuff[imgDataBuffSize];
|
uint8_t imgDataBuff[imgDataBuffSize];
|
||||||
|
memset(&imgDataBuff, 0, imgDataBuffSize);
|
||||||
GbaImageData *id = (GbaImageData*) imgDataBuff;
|
GbaImageData *id = (GbaImageData*) imgDataBuff;
|
||||||
id->bpp = 8;
|
id->bpp = 8;
|
||||||
id->tileCount = argTiles;
|
id->tileCount = argTiles;
|
||||||
@ -90,7 +91,7 @@ int run(ClArgs args) {
|
|||||||
colors[c] = colorId;
|
colors[c] = colorId;
|
||||||
colorId++;
|
colorId++;
|
||||||
}
|
}
|
||||||
((uint8_t*) &id->tiles)[destI] = colors[c];
|
id->tiles[destI] = colors[c];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user