[libgens] VdpPalette: Added 32X CRam accessor functions.
authorDavid Korth <gerbilsoft@gerbilsoft.com>
Sat, 5 Sep 2015 02:21:14 +0000 (22:21 -0400)
committerDavid Korth <gerbilsoft@gerbilsoft.com>
Sat, 5 Sep 2015 02:21:14 +0000 (22:21 -0400)
- Added assertions to the 16-bit standard CRam functions.
- VdpPalette::reset(): Clear 32X CRam. (m_cram32X)

src/libgens/Vdp/VdpPalette.cpp
src/libgens/Vdp/VdpPalette.hpp

index 3fe55c4..460cb9f 100644 (file)
@@ -120,7 +120,8 @@ VdpPalette::~VdpPalette()
 void VdpPalette::reset(void)
 {
        // Clear CRam.
-       memset(&m_cram, 0x00, sizeof(m_cram));
+       memset(&m_cram, 0, sizeof(m_cram));
+       memset(&m_cram32X, 0, sizeof(m_cram32X));
 
        // Mark the active palette as dirty.
        m_dirty.active = true;
index f799bcd..deb508f 100644 (file)
 #ifndef __LIBGENS_MD_VDPPALETTE_HPP__
 #define __LIBGENS_MD_VDPPALETTE_HPP__
 
+// C includes.
 #include <stdint.h>
 
+// C includes. (C++ namespace)
+#include <cassert>
+
 #include "VdpTypes.hpp"
 // ColorDepth is in MdFb.
 #include "../Util/MdFb.hpp"
@@ -104,6 +108,36 @@ class VdpPalette
                 */
                void writeCRam_16(uint8_t address, uint16_t data);
 
+               /** 32X CRam functions. **/
+
+               /**
+                * Read 8-bit data from 32X CRam.
+                * @param address 32X CRam address.
+                * @return 32X CRam data. (8-bit)
+                */
+               uint8_t readCRam32X_8(uint16_t address) const;
+
+               /**
+                * Read 16-bit data from 32X CRam.
+                * @param address 32X CRam address. (Must be 16-bit aligned!)
+                * @return 32X CRam data. (16-bit)
+                */
+               uint16_t readCRam32X_16(uint16_t address) const;
+
+               /**
+                * Write 8-bit data to 32X CRam.
+                * @param address 32X CRam address.
+                * @param data 32X CRam data. (8-bit)
+                */
+               void writeCRam32X_8(uint16_t address, uint8_t data);
+
+               /**
+                * Write 16-bit data to 32X CRam.
+                * @param address 32X CRam address. (Must be 16-bit aligned!)
+                * @param data 32X CRam data. (16-bit)
+                */
+               void writeCRam32X_16(uint16_t address, uint16_t data);
+
                /** Properties. **/
 
                // Color depth.
@@ -261,6 +295,8 @@ inline uint8_t VdpPalette::readCRam_8(uint8_t address) const
  */
 inline uint16_t VdpPalette::readCRam_16(uint8_t address) const
 {
+       assert((address & 1) == 0);
+
        address &= cram_addr_mask;
        return m_cram.u16[address >> 1];
 }
@@ -288,12 +324,74 @@ inline void VdpPalette::writeCRam_8(uint8_t address, uint8_t data)
  */
 inline void VdpPalette::writeCRam_16(uint8_t address, uint16_t data)
 {
+       assert((address & 1) == 0);
+
        address &= cram_addr_mask;
        m_cram.u16[address >> 1] = data;
        // TODO: Per-color dirty flag?
        m_dirty.active = true;
 }
 
+/** 32X CRam functions. **/
+
+/**
+ * Read 8-bit data from 32X CRam.
+ * @param address 32X CRam address.
+ * @return 32X CRam data. (8-bit)
+ */
+inline uint8_t VdpPalette::readCRam32X_8(uint16_t address) const
+{
+       assert(address < 0x200);
+
+       address &= 0x1FF;
+       return m_cram32X.u8[address ^ U16DATA_U8_INVERT];
+}
+
+/**
+ * Read 16-bit data from 32X CRam.
+ * @param address 32X CRam address. (Must be 16-bit aligned!)
+ * @return 32X CRam data. (16-bit)
+ */
+inline uint16_t VdpPalette::readCRam32X_16(uint16_t address) const
+{
+       assert(address < 0x200);
+       assert((address & 1) == 0);
+
+       address &= 0x1FF;
+       return m_cram32X.u16[address >> 1];
+}
+
+/**
+ * Write 8-bit data to 32X CRam.
+ * @param address 32X CRam address.
+ * @param data 32X CRam data. (8-bit)
+ */
+inline void VdpPalette::writeCRam32X_8(uint16_t address, uint8_t data)
+{
+       assert(address < 0x200);
+
+       address &= 0x1FF;
+       m_cram32X.u8[address ^ U16DATA_U8_INVERT] = data;
+       // TODO: Per-color dirty flag?
+       m_dirty.active = true;
+}
+
+/**
+ * Write 16-bit data to 32X CRam.
+ * @param address 32X CRam address. (Must be 16-bit aligned!)
+ * @param data 32X CRam data. (16-bit)
+ */
+inline void VdpPalette::writeCRam32X_16(uint16_t address, uint16_t data)
+{
+       assert(address < 0x200);
+       assert((address & 1) == 0);
+
+       address &= 0x1FF;
+       m_cram32X.u16[address >> 1] = data;
+       // TODO: Per-color dirty flag?
+       m_dirty.active = true;
+}
+
 /** Properties. **/
 inline MdFb::ColorDepth VdpPalette::bpp(void) const
        { return m_bpp; }