summaryrefslogtreecommitdiff
path: root/agbx/source/gfx/setpx.c
diff options
context:
space:
mode:
Diffstat (limited to 'agbx/source/gfx/setpx.c')
-rw-r--r--agbx/source/gfx/setpx.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/agbx/source/gfx/setpx.c b/agbx/source/gfx/setpx.c
index 563fd3b..b2c5c2d 100644
--- a/agbx/source/gfx/setpx.c
+++ b/agbx/source/gfx/setpx.c
@@ -8,19 +8,24 @@
#include <agbx/gfx.h>
-void agbx_setpx1(agbx_i10 const _px,agbx_i8 const _col) {
+void agbx_setpx1(agbx_i20 const _vaddr,agbx_i10 const _px,agbx_i8 const _col) {
#if defined(__agbx_dbg)
- agbx_i10 const dispcnt = agbx_get10(0x4000000u);
+ agbx_i10 const dispcnt = agbx_get10(0x400'0000u);
agbx_i8 const md = dispcnt & 0x7u;
- if (md == 0x3u || md == 0x5u) {agbx_done(agbx_err_badmd);}
- if (_px >= 0x9600u) {agbx_done(agbx_err_px2big);}
+ if (md != 0x4u) {agbx_done(agbx_err_badmd);}
+ if (_px >= 0x9600u) {agbx_done(agbx_err_px2big);}
#endif
- __agbx_setpx1(_px,_col)
+ /* We can only write halfwords to VRAM, so we load the adjacent pixel value and combine it into a halfword. */
+ agbx_i20 const addr = _vaddr + _px - (_px & 0x1u) * 0x1u;
+ agbx_i10 col;
+ if (_px & 0x1u) {col = (agbx_i10)agbx_get8(addr) | (agbx_i10)_col << 0x8u;}
+ else {col = (agbx_i10)agbx_get8(addr + 0x1u) << 0x8u | (agbx_i10)_col;}
+ __agbx_set10(addr,col)
}
-void agbx_setpx2(agbx_i10 const _px,agbx_i10 const _col) {
+void agbx_setpx2(agbx_i20 const _vaddr,agbx_i10 const _px,agbx_i10 const _col) {
#if defined(__agbx_dbg)
- agbx_i10 const dispcnt = agbx_get10(0x4000000u);
+ agbx_i10 const dispcnt = agbx_get10(0x400'0000u);
agbx_i8 const md = dispcnt & 0x7u;
if (md == 0x4u) {agbx_done(agbx_err_badmd);}
if (md == 0x5u) {
@@ -31,5 +36,5 @@ void agbx_setpx2(agbx_i10 const _px,agbx_i10 const _col) {
if (_px >= 0x9600u) {agbx_done(agbx_err_px2big);}
}
#endif
- __agbx_setpx2(_px,_col)
+ __agbx_setpx2(_vaddr,_px,_col)
}