Bayer Didget Glucose Meter Technical Documentation 0.1
January 8th, 2026
Original documentation by windwakr -> https://forums.desmume.org/viewtopic.php?id=12756
Additional notes by Shonumi


***************************************************
1. Introduction
***************************************************

The Bayer Didget Glucose Meter is a Slot-2 device for the Nintendo DS capable of processing diabetic testing strips. Created by Bayer AG, it was designed to interact with the game Knock'em Downs: World's Fair and released on May 8th, 2009 in the United States and later in September for Europe. After having bought the rights to the earlier Glucoboy, Bayer repurposed the hardware for the Nintendo DS, resulting in the Didget. This newer version is largely the same as its predecessor, and the premise behind the game is unchanged. Players unlock points by regularly testing their blood sugar levels and staying within healthy levels. These points are then used to purchase minigames, items, costumes, and photographs in-game.


***************************************************
2. General Hardware Information
***************************************************

- Comes in an oversized white cartridge with an ovular top-end.
- Comes with a segmented LCD screen capable of displaying a few digits for glucose levels, time, date, and other statuses.
- Has "M" and UP and DOWN buttons on the sides of the LCD screen, which should work similarly to other glucose meters.  
- Has a slot for accepting blood testing strips at the very top, specifically Bayer's Contour brand test strips.
- Uses a coin cell battery (CR2032) to power the unit's glucose checking functions as well as an internal real-time clock.
- Has a USB Mini slot on the lower side of the unit for PC connection via the GLUCOFACTS DELUXE software.
- The PCB is split into two main sections: top for glucose checking hardware, bottom for internal flash memory.
- Top PCB contains a Panasonic MN101CB microcontroller, presumably used to handle glucose checking and managing the RTC.
- Has an LED at the top left corner that flashes during testing.
- Has an operating tempurature of 5C - 45C (41F - 113F).
- Stores 480 test results internally.


***************************************************
3. Device Detection
***************************************************

The software will read some values from the GBA cart space between 0x8000000 and 0x801FFFF. The following psuedo-code will allow software to properly detect the presence of the Didget:

//Read individual bytes from GBA cart space
if address AND 1
	return 0xF3
else
	return ANY VALUE


***************************************************
4. Accessing Didget Data
***************************************************

The Nintendo DS does not directly test glucose or blood samples. Rather, the Didget handles that on its own and allows the handheld to read back the data stored on the device. The Didget operates in much the same manner as the original Glucoboy with only minor differences. The Didget uses a single, multipurpose 1-byte register mapped to the address 0xA000000, named here as DIDGET_CNT for the purposes of this document. By reading and writing to DIDGET_CNT, data such as reward points, bonus points, short messages, and other miscellaneous hardware information can be extracted. The DS can also push data to the Didget by updating the player's high scores and total available points.

To access data on the Didget, an index must first be written to DIDGET_CNT. Different data — such as reward points earned today or bonus points — are stored at different indices. Once an index is set, the Didget triggers a Game Pak IRQ. Following this, 1-byte, 4-bytes, or 6-bytes, or 64-bytes must be read from/written to DIDGET_CNT, depending on the index. For example, in the case that an index returns 4-bytes of data, DIDGET_CNT must be read a total of 4 times, once per byte. Additional Game Pak IRQs indicate when the next byte is ready to read/write. Evidently, Game Pak IRQs are generated after a brief delay when accessing DIDGET_CNT. For integer values (primarily 4-byte and 6-byte indices) data is read/written MSB-first, therefore, software must also manually adjust LSB-first values on the DS. Other data such as the 64-byte indices for messages is written sequentially. 

The Didget appears to have a sort of "idle" mode when no index is currently specified. These instances seem to happen after initially booting up the DS and the Didget, and it also occurs after the DS has finished reading from/writing to an index. In these instances where the Didget is "idle", reading from DIDGET_CNT twice returns the values 0xBD and 0xDA in that order. Knock'em Downs: World's Fair does this at times to verify that the Didget is ready for read or write operations. During idle mode, the Didget *DOES NOT* generate Game Pak IRQs.

Below is the typical proceedure used to read or write to an index on the Didget of XYZ length:

-----------------------------------------------------------
XYZ-byte Index Access
-----------------------------------------------------------
WRITE INDEX TO DIDGET_CNT
	WAIT FOR GAMEPAK IRQ

READ OR WRITE BYTE AT DIDGET_CNT
	WAIT FOR GAMEPAK IRQ

REPEAT READ OR WRITE AT DIDGET_CNT FOR XYZ LENGTH
-----------------------------------------------------------

Indices on the Didget are typically read-only or write-only. After writing data to a write-only index, however, reading 1-byte from that same index returns the status of the previous write operation. Any non-zero outputs indicate an error. Once this status byte is read, the Didget presumably returns to idle mode.


***************************************************
5. Index Overview
***************************************************

Below is a brief list of all known indices and their currently understood functions:

-----------------------------------------------------------
Index		| Size 	| Description
-----------------------------------------------------------
0x10 - 0x1F 	| 64	| Read Messages (Banks 0 - 15)
0x20		| 4	| Read System Date
0x21		| 4	| Read New Reward Points
0x22		| 4	| Read New Bonus Points
0x23		| 4	| Read Current Number of Bonus Days
0x24		| 4	| Read Number of Days Until Next Bonus
0x25		| 4	| Read Hardware Flags
0x26		| 4	| Read LD Threshold
0x27		| 4	| Read Serial Number
0x28		| 4	| Unknown Index
0x29		| 4	| Unknown Index
0x2A		| 4	| Unknown Index
0x2B		| 4	| Unknown Index
0x2C		| 4	| Read Current Total Points
0x2D		| 4	| Unknown Index
0x31		| 1	| Read Unknown Flag
0x32		| 1	| Read Unknown Flag
0x6C		| 4	| Write Current Total Points
0xE3		| 6	| Write High Scores (Banks 1 - 12)
-----------------------------------------------------------

The Didget largely copies the Glucoboy for its indices. Many of the indices related to rewards and points are simply renamed while retaining the same purpose. One key difference is that while the Glucoboy stored the total amount of earned points inside the EEPROM inside its cartridge, the Didget dedicates a specific index for this. A number of hardware specific details (flags, serial number, LD threshold), are also read but seemingly unused by the Didget. Additionally, the Didget uses 1KB of its internal storage for short messages.

Any indices present on both the Glucoboy and Didget are assumed to work identically unless further testing reveals otherwise. This document, therefore, will only explore indices exclusively used by the Didget. Refer to documentation on the Glucoboy for further information if necessary.


-----------------------------------------------------------------------
Index 0x10 to 0x1F - Read Messages (Banks 0 - 15)
-----------------------------------------------------------------------

The Didget can store a total of 16 different 64-byte messages using extended ASCII encoding.  NULL characters can terminate the message at any given point. If a message begins with a NULL character, Knock'em Downs: World's Fair ignore it as empty. The software will display any non-empty message it finds, however, the order of the messages is independent of the bank. The message in Bank 0 is always a "Daily Message", while any subsequent messages are numbered from 1 up to 15. That is to say, if a message bank is empty, it does not take up a number when listed. For example, if Banks 0, 1, 2, and 4 have messages, but Bank 3 is empty, Bank 0 will be the Daily Message, and Banks 1, 2, and 4 will be labeled "Message #1", "Message #2", and "Message #3".

The extended ASCII encoding is standard ASCII for the first 128-bytes with non-standard encodings for several accented characters. Encodings vary between the regular copies of Knock'em Downs: World's Fair and the DSi enhanced version. For whatever reason, on regular versions of the game, characters such as "à" (using a value of 0xA0) and "Ñ" have glitched renderings, with the former effectively being invisible.

Regular Encodings
----------------------------------------------------------------------------------------------------------------------------------------------
     |	0	1	2	3	4	5	6	7	8	9	A	B	C	D	E	F
----------------------------------------------------------------------------------------------------------------------------------------------
0x80 |	À 	Á	Â	Ä			È	É	Ê	Ë	Ì	Í	Î	Ï	Ñ	Ò
0x90 |	Ó	Ô	Ö			Ù	Ú	Û	Ü
0xA0 |		á	â	ä			è	é	ê	ë	ì	í	î	ï	ñ	ò
0xB0 |	ó	ô	ö			ù	ú	û	ü	¡	¿
----------------------------------------------------------------------------------------------------------------------------------------------


DSi Enhanced Encodings
----------------------------------------------------------------------------------------------------------------------------------------------
     |	0	1	2	3	4	5	6	7	8	9	A	B	C	D	E	F
----------------------------------------------------------------------------------------------------------------------------------------------
0x80 |	À 	Á	Â	Ã	Ä	Å	Æ	Ç	È	É	Ê	Ë	Ì	Í	Î	Ï	
0x90 |	Ñ	Ò	Ó	Ô	Õ	Ö	Œ	Ø	Ù	Ú	Û	Ü			
0xA0 |	à	á	â	ã	ä	å	æ	ç	è	é	ê	ë	ì	í	î	ï	
0xB0 |	ñ	ò	ó	ô	õ	ö	œ	ø	ù	ú	û	ü	¡	¿	◌̇
----------------------------------------------------------------------------------------------------------------------------------------------

These messages were transferred from the Bayer Didget website when connecting the device via USB to a PC.





-----------------------------------------------------------------------
Index 0x20 - Read System Date
-----------------------------------------------------------------------

This index returns the current system date according to the Didget's RTC. The clock is used internally to decide if glucose testing has been performed on a consistent schedule in order to give out reward points. It is entirely independent from the DS' own clock. Knock'em Downs: World Fair does not seem to make use of this data, however. 4 bytes are returned representing a date. The complete 32-bit value uses these fields for time:

-----------------------------------------------------------
Bits	| Description
-----------------------------------------------------------
0  - 5	| Minutes (0 - 59)	
6  - 11	| Hours (0 - 23)
12 - 16	| Days (1 - 31)
20 - 23	| Months (1 - 12)
24 - 30	| Years (2001 - 2100)
-----------------------------------------------------------

Days and Months always start counting at 1. That is to say, a binary value of 0 will translate to 1, so the maximum value for each category should be 11 and 30 respectively.

Years starts counting at 2100. That is to say, a binary value of 0 will translate to the year 2100. A binary value of 1 will translate to the year 2001, and so on. Essentially, this value can be added to 2000 to get the current date, with 0 being a special case.





-----------------------------------------------------------------------
Index 0x21 - Read New Reward Points
-----------------------------------------------------------------------

This represents the amount of reward points earned since the player last checked in with the game. Internally, this value is presumably added to the total amount of points in index 0x2C automatically. The exact amount is determined by factors such as whether the levels were healthy and whether the test was done in accordance to a regular schedule. The DS does not seem to have access to the components that calculate these points, so it only reads whatever the hardware reports.

The 4 bytes returned by this index form a signed 32-bit integer. Only positive numbers are valid, so the maximum allowed value is therefore 2147483647.





-----------------------------------------------------------------------
Index 0x22 - Read New Bonus Points
-----------------------------------------------------------------------

This represents the amount of bonus points earned by maintaining healthy glucose levels over a specific number of days since the player last checked in with the game. The Didget likely updates this internally when the "Number of Good Days Until Bonus Rewarded" value reaches zero and reloads to a new value. At that time, these bonus points are also added to the total amount of points.

The 4 bytes returned by this index form a signed 32-bit integer. Only positive numbers are valid, so the maximum allowed value is therefore 2147483647.





-----------------------------------------------------------------------
Index 0x23 - Read Current Number of Bonus Days
-----------------------------------------------------------------------

This index represents the number of continuous days were the player consistently checked their glucose levels and those same levels were within an acceptable range. Failing to meet those requirements would presumably reset the this value.

The 4 bytes returned by this index form a signed 32-bit integer. Only positive numbers are valid, so the maximum allowed value is therefore 2147483647.





-----------------------------------------------------------------------
Index 0x24 - Read Number of Days Until Next Bonus
-----------------------------------------------------------------------

This index represents the number of remaining days needed until the bonus points would be granted. This value likely decreases by one every 24-hours, so long as the player's glucose levels were kept in check regularly.

The 4 bytes returned by this index form a signed 32-bit integer. Only positive numbers are valid, so the maximum allowed value is therefore 2147483647.





-----------------------------------------------------------------------
Index 0x25 - Read Hardware Flags
-----------------------------------------------------------------------

This index represents a set of hardware status flags for the Didget. It is assumed they carry over from the Glucoboy in function and meaning. Knock'em Downs: World's Fair reads this data but makes no use of it. Only 7-bits of the 32-bit index value is used as such:

-----------------------------------------------------------
Bit	| Description
-----------------------------------------------------------
0	| GMEM FAULT
1	| PMEM FAULT
2 	| INCENTIVE
3	| PNEW STATS
4	| MEASUREMENT
5	| GMETER FAULT
6	| PMETER FAULT
-----------------------------------------------------------

The following descriptions are estimates of each bit's likely meaning. Keep in mind these are guesses for the time being.

"GMEM FAULT" and "PMEM FAULT" refer to errors in the memory allocated for blood testing result. The Didget may separate memories for general glucose test result and postprandial glucose test results. If those areas of memory have issues, they would probably be reported here.

"INCENTIVE" refers to the Didget's method of determining how it gives out points. This was dicated by factors such as timeliness in testing, frequency in testing, and whether or not glucose levels were healthy. This flag probably indicates that the player had met these conditions.

"PNEW STATS" possibly refers to new data tracking postprandial glucose levels, conceivably an update to some kind of statistic used to measure the player's performance in relation to INCENTIVE.

"MEASUREMENT" possibly indicates a new glucose reading has been done.

"GMETER FAULT" and "PMETER FAULT" refer to failures with the actual glucose and postprandial meters.

Despite "GMEM/GMETER FAULT" and "PMEM/PMETER FAULT" being potentially serious hardware issues, Knock'em Downs: World's Fair does not take any specific actions on them. For example, the player is not warned if any of these components stops working, although, it may affect retrieving reward points, which does display an error message.





-----------------------------------------------------------------------
Index 0x26 - Read LD Threshold
-----------------------------------------------------------------------

This index holds the value of the "LD Threshold", which possibly refers to a "Low-Data Threshold". This would represent the minimum number of samples from glucose testing needed to get an accurate test.

The 4 bytes returned by this index form an unsigned 27-bit integer. It is used to represent values ranging from 00000000 - 99999999. 





-----------------------------------------------------------------------
Index 0x27 - Read Serial Number
-----------------------------------------------------------------------

This index holds the value of some kind of serial number for the Didget. This appears to be a per-device serial number. Although is is read by Knock'em Downs: World's Fair, the game does not use it. It was, however, read via USB when connecting the Didget to a PC for the Bayer Didget website.

The 4 bytes returned by this index form an unsigned 27-bit integer. It is used to represent values ranging from 00000000 - 99999999.





-----------------------------------------------------------------------
Index 0x28 - Read Unknown Index
-----------------------------------------------------------------------

The exact purpose of this index is unknown. It does not seem to be actively used by Knock'em Downs: World's Fair.





-----------------------------------------------------------------------
Index 0x29 - Read Unknown Index
-----------------------------------------------------------------------

The exact purpose of this index is unknown. It does not seem to be actively used by Knock'em Downs: World's Fair.





-----------------------------------------------------------------------
Index 0x2A - Read Unknown Index
-----------------------------------------------------------------------

The exact purpose of this index is unknown. It does not seem to be actively used by Knock'em Downs: World's Fair.





-----------------------------------------------------------------------
Index 0x2B - Read Unknown Index
-----------------------------------------------------------------------

The exact purpose of this index is unknown. It does not seem to be actively used by Knock'em Downs: World's Fair.





-----------------------------------------------------------------------
Index 0x2C - Read Current Total Points
-----------------------------------------------------------------------

This represents the total amount of points earned. Realistically, it should not be lower than the sum of New Reward Points and Bonus Points, however, Knock'em Downs: World's Fair does not perform any checks or validation on this value. The index is responsible for telling the game how many points the player can spend to get in-game tickets.

The 4 bytes returned by this index form a signed 32-bit integer. Only positive numbers are valid, so the maximum allowed value is therefore 2147483647.





-----------------------------------------------------------------------
Index 0x2D - Read Unknown Index
-----------------------------------------------------------------------

The exact purpose of this index is unknown. It does not seem to be actively used by Knock'em Downs: World's Fair.





-----------------------------------------------------------------------
Index 0x31 - Read Unknown Flag
-----------------------------------------------------------------------

The exact purpose of this index is unknown, however, it seems to act as a flag. Reading any non-zero value causes the Didget to register an error when retrieving points.





-----------------------------------------------------------------------
Index 0x32 - Read Unknown Flag
-----------------------------------------------------------------------

The exact purpose of this index is unknown, however, it seems to act as a flag. Reading any non-zero value causes the Didget to register an error when retrieving points.





-----------------------------------------------------------------------
Index 0x6C - Current Total Points
-----------------------------------------------------------------------

This index sets the total amount of points earned. It receives 4 bytes representing a signed 32-bit integer. This index is updated by Knock'em Downs: World's Fair after converting points from the Didget to in-game tickets.





-----------------------------------------------------------------------
Index 0xE3 - Write High Scores
-----------------------------------------------------------------------

This index is used to write the high scores on each minigame from Knock'em Downs: World's Fair. Although the DS cartridge contains the scores in its own save data, this information was presumably uploaded as part of the official online community surrounding the Didget. Each game has its own "bank" that can be addressed. The format of the 6 bytes written to this index is detailed below:

-----------------------------------------------------------
Bytes	| Description	| Value
-----------------------------------------------------------
0	| Bank High	| Always 0x02
1	| Bank Low	| 0x01 - 0x0C
2 - 5	| Score		| 32-bit signed integer
-----------------------------------------------------------

The specific game is always determined by Byte 1 (Bank Low). The list of games is as follows:

-----------------------------------------------------------
Bank	| Game Name
-----------------------------------------------------------
0x01	| Carnival Chaos
0x02	| Operation Maze
0x03	| Flash Carb
0x04	| Knock'em Down Launch
0x05	| Hook Shot
0x06	| Knock'em Down
0x07	| Puzzle Monster
0x08	| Anglin' Ventures
0x09	| Arena Gladiator
0x0A	| Russian Dolls
0x0B	| Ace of Vase
0x0C	| That's A Wrap
-----------------------------------------------------------
	

***************************************************
6. Point Calculation
***************************************************

The Bayer Didget's formula for calculating reward points is cleary documented in its manual. It uses a rolling average based on the amount of times tested within a 24-hour period and whether the player's glucose levels are below, above, or on target. The chart below shows the amount of points added to the average for any given amount of tests:

----------------------------------------------------------------------------------------------------------------------------------------------
Current Test # 	| Below Target Points	| On Target Points	| Above Target Points 
----------------------------------------------------------------------------------------------------------------------------------------------
1		| 20			| 25			| 20
2		| 40			| 50			| 40
3		| 75			| 100			| 75
4+		| 150			| 200			| 150
----------------------------------------------------------------------------------------------------------------------------------------------

For example, for the first test, the user would receive 20 points if below their target. For the second test, assuming they are on target, they would add 50 points to their average, resulting in (20 + 50) / 2 points (i.e. 35) as the final total. Assuming a third test was done and they were above target, they would add 150 points to their average, resulting in (20 + 50 + 150) / 3 points (i.e. 73 points) as the final total. The average seems to be rounded.

There must be a 6-hour gap between the first and second tests to register points. All subsequent tests require a 2-hour gap. A maximum of 9 tests can be performed in a single day. This averaging mechanism was designed to encourage children to more frequently test themselves. If the player tests 3 times or more in a 24-hour period, this counts towards a streak where bonus points are rewarded after a fixed amount of days:

-----------------------------------------------------------
# of Days	| Bonus Points Awarded
-----------------------------------------------------------
7		| 100
14		| 300
21		| 500
30		| 1000
90		| 5000
-----------------------------------------------------------

After a 90-day streak, the bonus points restart by waiting for a 7-day streak.
