diff --git a/src/consts.rs b/src/consts.rs
index 8005c52dd822e718e22b1156a3b5de683309d62a..46875497ef43aaa899282740c1e91e069ed94fa2 100644
--- a/src/consts.rs
+++ b/src/consts.rs
@@ -14,6 +14,7 @@ pub const SCY_ADDR: u16 = 0xff42;
 pub const SCX_ADDR: u16 = 0xff43;
 pub const LY_ADDR: u16 = 0xff44;
 pub const LYC_ADDR: u16 = 0xff45;
+pub const BGP_ADDR: u16 = 0xff47;
 
 // DMA registers
 pub const DMA_ADDR: u16 = 0xff46;
diff --git a/src/ppu.rs b/src/ppu.rs
index df9bfb920bf81a7ac5e8ff560a17c5d7070cef73..74727e480d5b25ea09f68ce8a14317f3d9b9fde4 100644
--- a/src/ppu.rs
+++ b/src/ppu.rs
@@ -15,7 +15,7 @@ use crate::{
         rgb888_to_rgb565_u16, Pixel, PixelAlpha, RGB1555_SIZE, RGB565_SIZE, RGB888_SIZE, RGB_SIZE,
         XRGB8888_SIZE,
     },
-    consts::{LCDC_ADDR, LYC_ADDR, LY_ADDR, SCX_ADDR, SCY_ADDR, STAT_ADDR},
+    consts::{BGP_ADDR, LCDC_ADDR, LYC_ADDR, LY_ADDR, SCX_ADDR, SCY_ADDR, STAT_ADDR},
     gb::{GameBoyConfig, GameBoyMode},
     mmu::BusComponent,
     util::SharedThread,
@@ -807,9 +807,10 @@ impl Ppu {
             SCY_ADDR => self.scy,
             SCX_ADDR => self.scx,
             LY_ADDR => self.ly,
-            // 0xFF45 — LYC: LY compare
+            // 0xFF45 — LYC
             LYC_ADDR => self.lyc,
-            0xff47 => self.palettes[0],
+            // 0xFF47 — BGP: BG palette data (Non-CGB Mode only)
+            BGP_ADDR => self.palettes[0],
             0xff48 => self.palettes[1],
             0xff49 => self.palettes[2],
             0xff4a => self.wy,
@@ -892,7 +893,8 @@ impl Ppu {
             SCX_ADDR => self.scx = value,
             // 0xFF45 — LYC: LY compare
             LYC_ADDR => self.lyc = value,
-            0xff47 => {
+            // 0xFF47 — BGP: BG palette data (Non-CGB Mode only)
+            BGP_ADDR => {
                 if value == self.palettes[0] {
                     return;
                 }
diff --git a/src/test.rs b/src/test.rs
index 136009be141838dc073b530be6245ea55a8fd591..4c064b0c6344118ae7556b2efea28454edfc0f07 100644
--- a/src/test.rs
+++ b/src/test.rs
@@ -79,8 +79,8 @@ pub fn run_image_test(
 mod tests {
     use crate::{
         consts::{
-            DIV_ADDR, DMA_ADDR, IF_ADDR, LCDC_ADDR, LYC_ADDR, LY_ADDR, SCX_ADDR, SCY_ADDR,
-            STAT_ADDR, TAC_ADDR, TIMA_ADDR, TMA_ADDR,
+            BGP_ADDR, DIV_ADDR, DMA_ADDR, IF_ADDR, LCDC_ADDR, LYC_ADDR, LY_ADDR, SCX_ADDR,
+            SCY_ADDR, STAT_ADDR, TAC_ADDR, TIMA_ADDR, TMA_ADDR,
         },
         data::BootRom,
     };
@@ -119,6 +119,7 @@ mod tests {
         assert_eq!(result.ppu().read(SCX_ADDR), 0x00);
         assert_eq!(result.ppu().read(LY_ADDR), 0x99);
         assert_eq!(result.ppu().read(LYC_ADDR), 0x00);
+        assert_eq!(result.ppu().read(BGP_ADDR), 0xfc);
 
         assert_eq!(result.ppu().read(DMA_ADDR), 0xff);
     }