mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-21 19:10:37 +01:00
97 lines
2.1 KiB
ObjectPascal
97 lines
2.1 KiB
ObjectPascal
program eeprom;
|
|
|
|
{$mode objfpc}
|
|
|
|
uses
|
|
ctypes, nds9, sysutils;
|
|
|
|
var
|
|
header1: array [0..511] of cchar;
|
|
header2: array [0..511] of cchar;
|
|
vtype, vsize: integer;
|
|
data: array [0..511] of cchar;
|
|
|
|
procedure pause();
|
|
begin
|
|
iprintf('Press start...'#10);
|
|
while true do
|
|
begin
|
|
scanKeys();
|
|
if (keysDown() and KEY_START)<>0 then
|
|
exit;
|
|
swiWaitForVBlank();
|
|
end;
|
|
scanKeys();
|
|
end;
|
|
|
|
var
|
|
x, y: integer;
|
|
c: u8;
|
|
|
|
begin
|
|
consoleDemoInit();
|
|
|
|
iprintf('Reading cart info...'#10);
|
|
|
|
sysSetBusOwners(true, true); // give ARM9 access to the cart
|
|
|
|
while true do
|
|
begin
|
|
// Read the header twice to verify.
|
|
// If the card is being encrypted, we will get random junk
|
|
cardReadHeader(@header1);
|
|
cardReadHeader(@header2);
|
|
|
|
// Make sure we got the same data twice
|
|
while (CompareMem(@header1, @header2, 32)) do
|
|
begin
|
|
// If not, the card needs ejected and reinserted into the DS
|
|
iprintf('Please eject & reinsert DS card.'#10);
|
|
pause();
|
|
cardReadHeader(@header1);
|
|
cardReadHeader(@header2);
|
|
end;
|
|
|
|
// Add a null char right after the game title, so we can print it
|
|
header1[32] := cchar(#0);
|
|
|
|
// Read some various info about the EEPROM
|
|
vtype := cardEepromGetType();
|
|
vsize := cardEepromGetSize();
|
|
|
|
iprintf('Game ID: %s'#10, header1[0]);
|
|
iprintf('EEPROM:'#10);
|
|
iprintf(' Type: %d'#10, vtype);
|
|
iprintf(' Size: %d'#10, vsize);
|
|
pause();
|
|
|
|
// Read the first 512 bytes of EEPROM
|
|
cardReadEeprom(0, @data, 512, vtype);
|
|
|
|
iprintf('First 160 bytes of EEPROM: '#10);
|
|
|
|
// Print 20 rows of 8 bytes each
|
|
for y := 0 to 19 do
|
|
begin
|
|
// print 8 bytes as hex
|
|
for x := 0 to 7 do
|
|
begin
|
|
iprintf('%02x ', data[y*8 + x]);
|
|
end;
|
|
|
|
// print 8 bytes as characters
|
|
for x := 0 to 7 do
|
|
begin
|
|
c := data[y*8 + x];
|
|
if not (char(c) in [#0..#7, #14..#31, #127]) then // only display if it's a printable character
|
|
iprintf('%c', c)
|
|
else
|
|
iprintf('.');
|
|
end;
|
|
end;
|
|
|
|
iprintf('Insert a new card to read again'#10);
|
|
pause();
|
|
end;
|
|
end.
|