Skip to content

Commit

Permalink
EvmuRom refactor, EvmuBuzzer bugfix, gimbal dates
Browse files Browse the repository at this point in the history
1) Syncing libGimbal submodule
2) evmu_address_space.h
     - added entry for BIOS BCD encoded seconds (seems to be right)
     - added entry for BIOS mode
3) evmu_battery.h, evmu_buzzer.h
     - added file header + todo list for documentation/organization
4) EvmuRom
    - totally and completely refactored
    - biosLoaded() removed, now use biosType() !=
      EVMU_BIOS_TYPE_EMULATED
    - Subroutine enum values are now entry points
    - virtual methods are now actually used + implemented
    - call() takes a PC and returns a PC
    - added biosType() which uses newfound system variable
    - refactored EVERYTHING to use GblDateTime internally + externally
    - removed every reference to old REEST device other than writing
      flash, which will have to go once the flash write signal is redone
    - implemented properties
    - moved random miscellaneous notes and shit to implementation file
5) EvmuBuzzer
    - fixed bug with startup beep and other sounds not working correctly
    - had to remove mute check for inactive PCM from gain accessor,
      since gain is retrieved before a sample is even played
6) EvmuLcd
    - added/embedded logo for evil usage later
  • Loading branch information
gyrovorbis committed Mar 10, 2023
1 parent 516b753 commit 5ce2c5c
Show file tree
Hide file tree
Showing 13 changed files with 374 additions and 292 deletions.
2 changes: 1 addition & 1 deletion legacy/wrappers/cpp/include/evmu-core-cpp/evmu_device.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ inline bool VmuDevice::writeMemoryByte(uint16_t address, uint8_t value) const {
}

inline bool VmuDevice::isBiosLoaded(void) const {
return EvmuRom_biosLoaded(EVMU_DEVICE_PRISTINE_PUBLIC(_dev)->pRom);
return EvmuRom_biosType(EVMU_DEVICE_PRISTINE_PUBLIC(_dev)->pRom) != EVMU_BIOS_TYPE_EMULATED;
}

inline void VmuDevice::skipBiosSetup(bool enable) {
Expand Down
4 changes: 2 additions & 2 deletions lib/api/evmu/hw/evmu_address_space.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ extern "C" {
#define EVMU_ADDRESS_SYSTEM_DAY_BCD 0x13 // BCD Day
#define EVMU_ADDRESS_SYSTEM_HOUR_BCD 0x14 // BCD Hour
#define EVMU_ADDRESS_SYSTEM_MINUTE_BCD 0x15 // BCD Minute
// UNKNOWN [1 byte] 0x16 // BCD Second?
#define EVMU_ADDRESS_SYSTEM_SEC_BCD 0x16 // BCD Seconds(?)
#define EVMU_ADDRESS_SYSTEM_YEAR_MSB 0x17 // Non-BCD Year High Byte
#define EVMU_ADDRESS_SYSTEM_YEAR_LSB 0x18 // Non-BCD Year Low Byte
#define EVMU_ADDRESS_SYSTEM_MONTH 0x19 // Non-BCD Month
Expand All @@ -55,7 +55,7 @@ extern "C" {
#define EVMU_ADDRESS_SYSTEM_HALF_SEC 0x1e // 0 or 1, driven by base-timer interrupt every 0.5s, WORK AREA, DON'T WRITE
#define EVMU_ADDRESS_SYSTEM_LEAP_YEAR 0x1f // 0 for no, 1 for yes, WORK AREA, DON'T WRITE
//-------------------- General Bios Variables --------------------
// UNKNOWN [17 bytes] 0x20-0x30 // probably BIOS logic... LOOKS LIKE ITS THE MODE INDEX!!!
#define EVMU_ADDRESS_SYSTEM_MODE 0x30 // probably BIOS logic... LOOKS LIKE ITS THE MODE INDEX!!!
#define EVMU_ADDRESS_SYSTEM_DATE_SET 0x31 // 0xff - date set, 00 - date not set
//0x33 - 0x34 seem to be INACTIVITY COUNTERS for putting the bitch to sleep!!!!
// UNKKNOWN [32 bytes] 0x32-0x49 // other BIOS settings?
Expand Down
8 changes: 8 additions & 0 deletions lib/api/evmu/hw/evmu_battery.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
/*! \file
* \brief BIOS battery monitor + low battery detection circuit
* \ingroup Peripherals
*
* \todo
* - properties
*/

#ifndef EVMU_BATTERY_H
#define EVMU_BATTERY_H

Expand Down
10 changes: 6 additions & 4 deletions lib/api/evmu/hw/evmu_buzzer.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
/*!
* \todo
* implement properties
* stop playback when emulation halts
/*! \file
* \brief Piezoelectric buzzer, PWM tone generation
* \ingroup Peripherals
*
* \todo
* - Stop playback when emulation halts
*/

#ifndef EVMU_BUZZER_H
Expand Down
7 changes: 3 additions & 4 deletions lib/api/evmu/hw/evmu_gamepad.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
/*!
* \todo
* Supposed to only poll for input when latch is set/reset
* reading from pin should not return latch value
/*! \file
* \brief Port 3 button states + back-end polling hooks
* \ingroup Peripherals
*/

#ifndef EVMU_GAMEPAD_H
Expand Down
7 changes: 7 additions & 0 deletions lib/api/evmu/hw/evmu_lcd.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
/*! \file
* \brief LCD display circuit with emulated effects + back-end rendering signals
* \ingroup Peripherals
* \todo
* - Pixel ghosting still needs some work
*/

#ifndef EVMU_LCD_H
#define EVMU_LCD_H

Expand Down
180 changes: 57 additions & 123 deletions lib/api/evmu/hw/evmu_rom.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
/*! \file
* \brief External ROM chip, BIOS, Firmware routines
* \ingroup Peripherals
*
* \todo
* - CLEAN UP IMPLEMENTATION IN GENERAL
* - remove "reestDevice" references (pending Flash updates get moved)
* - EvmuRom_setBiosMode()
* - EvmuRom["biosMode"]: R/W
* - EvmuRom["dateTime"]: R/W (pending on ISO8601 in Gimbal)
* - Maybe signal when entering/exiting BIOS
* - overridable virtuals for whole custom BIOS
* - return elapsed ticks/cycles for subroutine call
* - return BIOS version information and shit
*/
#ifndef EVMU_ROM_H
#define EVMU_ROM_H

Expand All @@ -10,23 +25,13 @@
#define EVMU_ROM_CLASS(klass) (GBL_CLASS_CAST(klass, EvmuRom))
#define EVMU_ROM_GET_CLASS(instance) (GBL_INSTANCE_GET_CLASS(instance, EvmuRom))

#define EVMU_ROM_SIZE 65536

#define EVMU_BIOS_SYS_PROG_ADDRESS_BASE 0x0000
#define EVMU_BIOS_SYS_PROG_SIZE 16384
#define EVMU_BIOS_OS_PROG_ADDRESS_BASE 0xed00
#define EVMU_BIOS_OS_PROG_SIZE 4096

// Firmware calls: utility functions that return execution back to app
#define EVMU_BIOS_ADDRESS_FM_WRT_EX 0x100
#define EVMU_BIOS_ADDRESS_FM_WRTA_EX 0x108
#define EVMU_BIOS_ADDRESS_FM_VRF_EX 0x110
#define EVMU_BIOS_ADDRESS_FM_PRD_EX 0x120
#define EVMU_ROM_SIZE 65536 ///< Total size of external ROM chip

// BIOS routines: control yields to BIOS?
#define EVMU_BIOS_ADDRESS_TIMER_EX 0x130 // Timer update function used as ISR to populate date/time in system variables
#define EVMU_BIOS_ADDRESS_SLEEP_EX 0x140
#define EVMU_BIOS_ADDRESS_EXIT_EX 0x1f0 // MODE button?
#define EVMU_BIOS_SYS_PROG_ADDRESS_BASE 0x0000 ///< Start of Firmware/Subroutines in bytes
#define EVMU_BIOS_SYS_PROG_SIZE 16384 ///< Size of Firmware/Subroutines in bytes
#define EVMU_BIOS_OS_PROG_ADDRESS_BASE 0xed00 ///< Start address of OS/BIOS program
#define EVMU_BIOS_OS_PROG_SIZE 4096 ///< Size of OS/BIOS program in bytes
#define EVMU_BIOS_SKIP_DATE_TIME_PC 0x2e1 ///< BIOS PC address just after setting date/time

#define GBL_SELF_TYPE EvmuRom

Expand All @@ -36,138 +41,67 @@ GBL_FORWARD_DECLARE_STRUCT(GblDateTime);
GBL_FORWARD_DECLARE_STRUCT(EvmuRom);

GBL_DECLARE_ENUM(EVMU_BIOS_SUBROUTINE) {
EVMU_BIOS_SUBROUTINE_FM_WRT_EX,
EVMU_BIOS_SUBROUTINE_FM_WRTA_EX,
EVMU_BIOS_SUBROUTINE_FM_VRF_EX,
EVMU_BIOS_SUBROUTINE_FM_PRD_EX,
EVMU_BIOS_SUBROUTINE_TIMER_EX,
EVMU_BIOS_SUBROUTINE_SLEEP_EX,
EVMU_BIOS_SUBROUTINE_EXIT_EX,
EVMU_BIOS_SUBROUTINE_COUNT
EVMU_BIOS_SUBROUTINE_RESET = 0x000, ///< Regular starting point
// Firmware calls: utility functions that return execution back to app
EVMU_BIOS_SUBROUTINE_FM_WRT_EX = 0x100, ///< Flash memory write, return address variant 1
EVMU_BIOS_SUBROUTINE_FM_WRTA_EX = 0x108, ///< Flash memory write, return address variant 2
EVMU_BIOS_SUBROUTINE_FM_VRF_EX = 0x110, ///< Flash memory page data verify
EVMU_BIOS_SUBROUTINE_FM_PRD_EX = 0x120, ///< Flash memory paged read data
// BIOS routines: control yields to BIOS?
EVMU_BIOS_SUBROUTINE_TIMER_EX = 0x130, ///< System time update, used as Base Timer ISR
EVMU_BIOS_SUBROUTINE_SLEEP_EX = 0x140, ///< Enable sleep mode
EVMU_BIOS_SUBROUTINE_EXIT_EX = 0x1f0 ///< MODE button logic
};

GBL_DECLARE_ENUM(EVMU_BIOS_TYPE) {
EVMU_BIOS_TYPE_EMULATED,
EVMU_BIOS_TYPE_AMERICAN_IMAGE_V1_05 = 0xC825003A,
EVMU_BIOS_TYPE_JAPANESE_IMAGE_V1_04 = 0x8E0F867A,
EVMU_BIOS_TYPE_UNKNOWN_IMAGE
EVMU_BIOS_TYPE_EMULATED, ///< Default, no BIOS, software emulation
EVMU_BIOS_TYPE_AMERICAN_IMAGE_V1_05 = 0xC825003A, ///< CRC for American BIOS
EVMU_BIOS_TYPE_JAPANESE_IMAGE_V1_04 = 0x8E0F867A, ///< CRC for Japanese BIOS
EVMU_BIOS_TYPE_UNKNOWN_IMAGE ///< Any other unknown image
};

GBL_DECLARE_ENUM(EVMU_BIOS_MODE) {
EVMU_BIOS_MODE_UNKNOWN,
EVMU_BIOS_MODE_MAPLE, //connected to DC, maple mode
EVMU_BIOS_MODE_GAME,
EVMU_BIOS_MODE_FILE,
EVMU_BIOS_MODE_TIME,
EVMU_BIOS_MODE_COUNT
EVMU_BIOS_MODE_FILE, ///< File Manager mode
EVMU_BIOS_MODE_GAME, ///< Game/Application mode
EVMU_BIOS_MODE_TIME, ///< Clock/time mode
EVMU_BIOS_MODE_MAPLE, ///< Connected to DC, Maple slave mode
EVMU_BIOS_MODE_UNKNOWN, ///< Unnknown mode (unknown BIOS)
EVMU_BIOS_MODE_COUNT ///< Number of BIOS modes
};

GBL_CLASS_DERIVE(EvmuRom, EvmuPeripheral)
EVMU_RESULT (*pFnLoadBios)(GBL_SELF, const char* pPath);
EVMU_RESULT (*pFnCallBios)(GBL_SELF, EvmuAddress psw);
EVMU_RESULT (*pFnCallBios)(GBL_SELF, EvmuAddress entryPc, EvmuAddress* pRetPc);
GBL_CLASS_END

GBL_INSTANCE_DERIVE_EMPTY(EvmuRom, EvmuPeripheral)

GBL_PROPERTIES(EvmuRom,
(biosActive, GBL_GENERIC, (READ), GBL_BOOL_TYPE),
(biosType, GBL_GENERIC, (READ), GBL_ENUM_TYPE),
(biosMode, GBL_GENERIC, (READ, WRITE), GBL_ENUM_TYPE)
(biosActive, GBL_GENERIC, (READ), GBL_BOOL_TYPE),
(biosType, GBL_GENERIC, (READ), GBL_ENUM_TYPE),
(biosMode, GBL_GENERIC, (READ), GBL_ENUM_TYPE),
(dateTime, GBL_GENERIC, (READ), GBL_STRING_TYPE)
)

EVMU_EXPORT GblType EvmuRom_type (void) GBL_NOEXCEPT;
EVMU_EXPORT GblType EvmuRom_type (void) GBL_NOEXCEPT;

EVMU_EXPORT GblBool EvmuRom_biosLoaded (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT GblBool EvmuRom_biosActive (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT GblBool EvmuRom_biosActive (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_BIOS_TYPE EvmuRom_biosType (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_BIOS_MODE EvmuRom_biosMode (GBL_CSELF) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_loadBios (GBL_SELF, const char* pPath) GBL_NOEXCEPT;
EVMU_EXPORT EvmuAddress EvmuRom_callBios (GBL_SELF) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_RESULT EvmuRom_loadBios (GBL_SELF, const char* pPath) GBL_NOEXCEPT;
EVMU_EXPORT EvmuAddress EvmuRom_callBios (GBL_SELF, EvmuAddress entry) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_skipBiosSetup (GBL_SELF, GblBool enableSkip) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_RESULT EvmuRom_skipBiosSetup (GBL_SELF, GblBool enableSkip) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_dateTime (GBL_CSELF,
GblDateTime* pDateTime) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_setDateTime (GBL_SELF,
const GblDateTime* pDTime) GBL_NOEXCEPT;
EVMU_EXPORT GblDateTime* EvmuRom_dateTime (GBL_CSELF,
GblDateTime* pDateTime) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_setDateTime (GBL_SELF,
const GblDateTime* pDateTime) GBL_NOEXCEPT;

GBL_DECLS_END

#undef GBL_SELF_TYPE

#endif // EVMU_ROM_H


/*
* WHOLE ADDRESS SPACE: BIOS
* Standalone Utility Functions: Firmware/OS routines
* Random routines mid-BIOS: system routines
* All of this shit: subroutines
*
*/

/* FLASH MEMORY VARIABLES USED WITH BIOS FW CALL
* THIS IS IN RAM BANK 1, IN APP-SPACE!!!
* 0x7d Fmbank - Specify flash bank to use (guess bit 0 or 1)
* 0x7e Fmadd_h - Flash memory address (upper 8 bits)
* 0x7f Fmadd_l - Flash memory address (lower 8 bits)
*/

/*
Document all known static metadata regions in the BIOS
1) BIOS version
2) Maple information
3) Font characters
4) Known harness-able utility functions that can be used via stack return attacks
add a public API that allows you to query and extract this info.
Present at 0x14BE in the BIOS, alongside some build info.
0x14BE JAP BIOS version info
0xAA7 US BIOS version info
Visual Memory Produced By or Under License From SEGA ENTERPRISES,LTD.
Version 1.004,1998/09/30,315-6208-01,SEGA Visual Memory System BIOS Produced by Sue
*/

/* Need a list of BIOS initialization registers with default values!
*
*/

#if 0
EVMU_EXPORT EvmuAddress EvmuRom_subroutineAddress (EVMU_BIOS_SUBROUTINE sub) GBL_NOEXCEPT;
EVMU_EXPORT EvmuAddress EvmuRom_subroutineRetAddress (EVMU_BIOS_SUBROUTINE sub) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_callSubroutine (GBL_CSELF,
EVMU_BIOS_SUBROUTINE subroutine) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_biosVersionString (GBL_CSELF, GblStringBuffer* pStr) GBL_NOEXCEPT;

EVMU_EXPORT EvmuWord EvmuRom_readByte (GBL_CSELF, EvmuAddress address) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_readBytes (GBL_CSELF,
EvmuAddress base,
void* pData,
GblSize* pBytes) GBL_NOEXCEPT;

EVMU_EXPORT EvmuWord EvmuRom_writeByte (GBL_CSELF,
EvmuAddress address,
EvmuWord value) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_RESULT EvmuRom_writeBytes (GBL_CSELF,
EvmuAddress base,
void* pData,
GblSize* pBytes) GBL_NOEXCEPT;

EVMU_EXPORT EVMU_BIOS_TYPE EvmuRom_biosType (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_BIOS_MODE EvmuRom_biosMode (GBL_CSELF) GBL_NOEXCEPT;
EVMU_EXPORT EVMU_RESULT EvmuRom_setBiosMode (GBL_CSELF, EVMU_BIOS_MODE mode) GBL_NOEXCEPT;

#endif
// Call this whole fucker "Bios"
// Call the thing that MUXes Flash + Bios "Rom"


// use system clock?
2 changes: 1 addition & 1 deletion lib/lib/libgimbal
8 changes: 5 additions & 3 deletions lib/source/hw/evmu_buzzer.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include "../types/evmu_marshal_.h"

#define EVMU_BUZZER_FREQ_RESP_BASE_OFFSET_ 0xe0
#define EVMU_BUZZER_FREQ_RESP_DEFAULT_VALUE_ 40
#define EVMU_BUZZER_FREQ_RESP_DEFAULT_VALUE_ 30
#define EVMU_BUZZER_FREQ_RESP_MAX_VALUE_ 72

static uint8_t freqResponse_[0x1f] = {
Expand Down Expand Up @@ -224,10 +224,12 @@ EVMU_EXPORT GblSize EvmuBuzzer_pcmFrequency(const EvmuBuzzer* pSelf) {

EVMU_EXPORT float EvmuBuzzer_pcmGain(const EvmuBuzzer* pSelf) {
EvmuBuzzer_* pSelf_ = EVMU_BUZZER_(pSelf);

/* Cannot work when update is called before play! Mutes next tone!
if(!pSelf_->active) {
return 0.0f;
} else if(pSelf->enableFreqResp) {
} else
*/
if(pSelf->enableFreqResp) {
if(pSelf_->tonePeriod < EVMU_BUZZER_FREQ_RESP_BASE_OFFSET_ ||
pSelf_->tonePeriod > EVMU_BUZZER_FREQ_RESP_BASE_OFFSET_ +
GBL_COUNT_OF(freqResponse_))
Expand Down
4 changes: 2 additions & 2 deletions lib/source/hw/evmu_cpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ EVMU_EXPORT EVMU_RESULT EvmuCpu_executeNext(EvmuCpu* pSelf) {

//Check if we entered the firmware
if(!(pMemory_->sfr[EVMU_SFR_OFFSET(EVMU_ADDRESS_SFR_EXT)] & 0x1)) {
if(!EvmuRom_biosLoaded(pRom)) {
if(EvmuRom_biosType(pRom) == EVMU_BIOS_TYPE_EMULATED) {
//handle the BIOS call in software if no firwmare has been loaded
if((pSelf_->pc = EvmuRom_callBios(pRom)))
if((pSelf_->pc = EvmuRom_callBios(pRom, pSelf_->pc)))
//jump back to USER mode before resuming execution.
EvmuMemory_writeInt(pMemory,
EVMU_ADDRESS_SFR_EXT,
Expand Down
18 changes: 18 additions & 0 deletions lib/source/hw/evmu_lcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,24 @@ EVMU_EXPORT EvmuTicks EvmuLcd_refreshRateTicks(const EvmuLcd* pSelf) {
EVMU_LCD_REFRESH_TICKS_83HZ_ : EVMU_LCD_REFRESH_TICKS_166HZ_;
}

EVMU_EXPORT void EvmuLcd_drawLogo(const EvmuLcd* pSelf) {
const static uint8_t byteArray[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
0xff, 0xff, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff,
0x01, 0x70, 0xff, 0xff, 0xff, 0xfe, 0x07, 0x3e, 0x7f, 0xff, 0xff, 0xfc, 0x0f, 0x3f, 0x3f, 0xff,
0xff, 0xf8, 0x3e, 0x3f, 0x9f, 0xff, 0xff, 0xf8, 0x7e, 0xbf, 0xdf, 0xff, 0xff, 0xf0, 0x7e, 0x9f,
0xef, 0xff, 0xff, 0xf0, 0xfa, 0x9f, 0xff, 0xff, 0xff, 0xe0, 0xfa, 0x9f, 0xff, 0xff, 0xff, 0xe1,
0xfa, 0x9f, 0xff, 0xff, 0xff, 0xe1, 0xf8, 0x9f, 0xff, 0xff, 0xff, 0xe1, 0xf8, 0x9b, 0xff, 0xff,
0xff, 0xe1, 0xea, 0x09, 0xf7, 0xff, 0xff, 0xe0, 0xea, 0x09, 0xf7, 0xff, 0xff, 0xf0, 0xe2, 0x81,
0xef, 0xff, 0xff, 0xf0, 0x6a, 0x81, 0xef, 0xff, 0xff, 0xf8, 0x40, 0x80, 0xcf, 0xff, 0xff, 0xf8,
0x20, 0x00, 0x9f, 0xff, 0xff, 0xfc, 0x18, 0x02, 0x1f, 0xff, 0xff, 0xfe, 0x03, 0x00, 0x3f, 0xff,
0xff, 0xff, 0x02, 0x00, 0x7f, 0xff, 0xff, 0xff, 0x82, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x83,
0xff, 0xff, 0xff, 0xff, 0xfc, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff
};

}

static GBL_RESULT EvmuLcd_refreshScreen_(EvmuLcd* pSelf) {
GBL_CTX_BEGIN(NULL);

Expand Down
Loading

0 comments on commit 5ce2c5c

Please sign in to comment.