SuperH-based fx calculators
fx legacy: MCS structure

Beware of MCS inconsistencies!

MCS structure

Main memory resides in RAM 0x88030000..0x8803FFFF (OS 1.02..1.05, OS 1.10..1.11)
or in RAM 0x88030000..0x8803FBFF (OS 2.00).
AlphaMem-variables reside in RAM 0x880020D8..0x880020D8+29*24 (OS 1.02..1.05, OS 1.10..1.11).

The main memory directory resides at offset 0x100..0xA20. It provides for space of 0x93 (147) entries.
62 (63 with OS 2.00) of these entries are occupied by some default-directories.
Every addin needs one directory.
The rest can be used freely (by MCS syscalls).

The default-directories are:
system, library, @REV3, @REV2, @REV1, @LOCAL40..@LOCAL1, @EACT
...offset 0x3E0..0x920 (0x910 with OS 2.00) is the space for 85 (84 with OS 2.00) addin- or any other entries

The directory number, which is used by some MCS syscalls,
starts at "@APLWORK" with 1 and ends at "system" with 0x93.

A directory entry looks like:

struct {
  unsigned char name[8];
  unsigned short count;
  char flags[2];
} TMainMemoryDirectoryEntry;

TMainMemoryDirectoryEntry MainMemoryDirectory[147]; // 0x93

If the member count is above zero, the member addr points to the start of the directory's item-array.
If the member count is zero, the member addr is insignificant.

struct {
  unsigned char name[8];
  int offset;
  int length;
  char flags[4];
} TItemEntry;

TItemEntry ItemArray[ MainMemoryDirectory[i].count ];

A directory's item-array consists of a variable count of TItemEntry-instances.
Every item has a name.
The pointer to the data is calculated by adding the pointer to the start of the item-array and offset.
length is the length of the data stored.
Bit 6 of flags[0] is set, the data may not be changed by some syscalls.
The meaning of the other flags-array-bits is not known yet.

F. i.:
"system" is the directory (dirno=0x93) leading to the BASIC programs.
The count-member holds the count of BASIC programs currently stored.
addr points to the start of the BASIC-programs item-array.

The offset-member points to the start of the BASIC-program's data,
calculated from the start of the BASIC-programs item-array.

F. i.
a BASIC-program's data start with an eight bytes password, which defaults to zeros.
An int-member follows, which defaults to zero and is 0x01000001, if created with the "BASE"-flag.
After those members, the program itself starts. BASIC-programs seem to be stored 4-aligned.

MCS flushing
All those RAM-data are flushed to the flash memory, every time the calc is switched off.
RESET does not save these data.

OS versions below 2.00:
The flash sectors 0xA0230000..0xA0250000 are used for this purpose in a rotating scheme.
One sector holds Alpha- and Setup-Backup in 8 kByte blocks.
One sector holds the last saved main memory.
One sector holds the second last saved main memory.

OS version 2.00:
The flash sectors 0xA0250000..0xA0260000 are used for this purpose alternating.
Alpha-data, setup-data and main memory are backuped in one 64k-sector. To achieve this main memory size has been reduced by 1 k with OS 2.00.

Since OS 1.03, the power-off-logo-display procedure contains a function call, which flushes MCS to the flash memory.
It works well, but it is not a syscall, t. i. it depends on the OS version.
To use such a function, you have to read the OS version, set a corresponding function pointer and call the function via this function pointer.

void (*MCS_Flush)( void ) = 0// the function pointer
unsigned char*OS_version = (void*)0x80010020;
  if ( !strcmp( OS_version, "01.02.0000" ) ) // not supported
  else if ( !strcmp( OS_version, "01.03.0000" ) )MCS_Flush = (void*)0x800535E6;
  else if ( !strcmp( OS_version, "01.04.0000" ) )MCS_Flush = (void*)0x80053846;
  else if ( !strcmp( OS_version, "01.05.0000" ) )MCS_Flush = (void*)0x80053B02;
  else if ( !strcmp( OS_version, "01.05.1000" ) )MCS_Flush = (void*)0x80053B02;
  else if ( !strcmp( OS_version, "01.10.0000" ) )MCS_Flush = (void*)0x8005CD22;
  else if ( !strcmp( OS_version, "01.11.0000" ) )MCS_Flush = (void*)0x8005CEF2;
  else if ( !strcmp( OS_version, "02.00.0000" ) )MCS_Flush = (void*)0x800602C2;
// call the function to flush MCS to the flash memory.
  if (MCS_Flush) (*MCS_Flush)();

The function saves the complete MCS, even if you changed just a bit! It needs about a second.
Has been tested on OS 1.03 to OS 1.10 and on OS 2.00.


(19.03.2011 12:28:14)