Programmierung » ClassPad 300 » MCS-File Spezifikation

MCS-File Spezifikation

UNVOLLSTÄNDIG

Das ist das, was ich bis jetzt durch probieren herausgefunden habe. Die Namen werden wahrscheinlich von Casio nicht verwendet.

Der Aufbau der Datei ist folgendermaßen:

MCS_File_Header
MCS_Mem_Image

MCS_File_Header

Dieser besteht aus 24 (0x18) Bytes:

Bytes Name Bedeutung
16 (0x10) FileType ist immer: "CP MCSIMAGEFILE" & 0x00
4 (0x04)    
4 (0x04) ImageBias (Motorola) Start des Speicher-Images im ClassPad. (=0x01530020)

MCS_Mem_Image

Dies ist das Eigentliche Image mit den Daten. Es besteht aus 524288 (0x080000) Bytes. Die Offsets im MCS_Mem_Image (und Unter-Daten) beziehen sich nur auf die Daten des Images (also ohne den MCS_File_Header).

MCS_Mem_Image_Header
MCS_Mem_Image_Folder_List
MCS_Mem_Image_File_List für Ordner1
Daten für Ordner1
MCS_Mem_Image_File_List für Ordner2
Daten für Ordner2
...

MCS_Mem_Image_Header

Dieser besteht aus 256 (0x0100) Bytes und stellt Informationen über das Image bereit.

Bytes Name Bedeutung
4 (0x04) DataEndOffset (Intel) Offset vom Ende der Daten im Image
4 (0x04) MainFolderOffset (Intel) Offset des Folder-List-Eintrags für main
4 (0x04) ImageEndOffset1 (Intel) Offset vom Ende des Images (=0x080000)
4 (0x04) ImageEndOffset2 (Intel) Offset vom Ende des Images (=0x080000)
4 (0x04)    
4 (0x04)    
16 (0x10) ImageSeparator 16 Bytes mit 0xFF
216 (0xD8)   Der Restliche Platz wird mit Null-Bytes gefüllt (0x00).

MCS_Mem_Image_Folder_List

Dies ist eine Liste, die alle 134 Ordner nach folgendem Schema enthält. Jeder Eintrag hat 16 (0x10) Bytes.

Bytes Name Bedeutung
8 (0x08) Name Der Name des Ordners
4 (0x04) FileListOffset (Intel) Offset der Datei-Liste dieses Ordners
2 (0x02) FileCount (Motorola) Die Anzahl der Dateien
1 (0x01) LockByte Verriegelung
1 (0x01)    

LockByte kann folgende Werte annehmen:

Wert Bedeutung
0x00 entriegelt
0x01 verriegelt

MCS_Mem_Image_File_List

Dies ist eine Liste mit allen Dateien, die ein Ordner enthält. Jeder Eintrag hat 20 (0x14) Bytes.

Bytes Name Bedeutung
8 (0x08) Name Der Name des Ordners
4 (0x04) DataOffset (Motorola) Offset (vom Anfang der Datei-Liste) bis zu den Datei-Daten
4 (0x04) DataSize (Motorola) Die Größe der Daten
1 (0x01) DataType Der Typ der Datei
1 (0x01) LockByte Verriegelung
2 (0x02)    

DataType kann folgende Werte annehmen:

Wert Datei-Typ
0x01 EXPR
0x02 INT
0x03 EXPR
0x04 FLT
0x05 STR
0x06 EXPR
0x09 FILE
0x0A LIST
0x0B VECT
0x0C MAT
0x12 EXPR
0x47 {TEXT | EXE | PRGM}
0x48 FUNC
0x4D PICT
0x4E MEM
0x4F EXEC
0x50 GMEM
0x51 G3D
0x53 CONT
0x54 GEO
0x55 REG

LockByte kann folgende Werte annehmen:

Wert Bedeutung
0x00 entriegelt
0x01 verriegelt
0x04 verriegelt, "Variable wird verwendet"

Einige der Daten, auf die in der entsprechenden File-List verwiesen wird, haben einen eigenen Header. In diesem werden Informationen wie Bild-Größe oder Länge des Programms gespeichert.

PICT
16 (0x10) Bytes:

Bytes Name Bedeutung
2 (0x02)    
2 (0x02) Width (Motorola) Breite des Bildes
2 (0x02) Height (Motorola) Höhe des Bildes
2 (0x02)    
2 (0x02)    
2 (0x02)    
4 (0x04)    

Anschließend folgen die Bild-Daten. Für jeden Pixel eines Bildes wird 1 Bit verwendet, d.h. 1 Byte repräsentiert einen horizontalen Abschnitt mit 8 Pixel. Wenn das Bit gesetzt ist, dann wird der Pixel gezeichnet. Unsprung des Bildes ist oben links.

TEXT/EXE/PRGM
12 (0x0C) Bytes:

Bytes Name Bedeutung
4 (0x04) TextSize (Motorola) Größe (Länge) des Klartextes des Programms
4 (0x04) CompressedSize (Motorola) Größe (Länge) des komprimierten Textes des Programms
4 (0x04) Modif Ein Modifikator

Entsprechend der Werte entscheided sich der Datei-Typ. Die mit Stern markierten Typen kommen normalerweise nicht vor, werden aber richtig verarbeitet.

TextSize CompressedSize Modif Datei-Typ, Speicher-Schema
gesetzt 0x00000000 0x00000000 TEXT
Parameter-String & 0x00 & Klar-Text & 0x00FF
gesetzt gesetzt 0x00000000 TEXT*
Parameter-String & 0x00 & Klar-Text & 0x00FF & Parameter-String & 0x00 & komprimierter Text & 0x00FF
0x00000000 gesetzt 0x00000001 EXE
Parameter-String & 0x00 & komprimierter Text & 0x00FF
gesetzt gesetzt 0x00000001 PRGM
Parameter-String & 0x00 & Klar-Text & 0x00FF & Parameter-String & 0x00 & komprimierter Text & 0x00FF
gesetzt 0x00000000 0x00000001 PRGM*
Parameter-String & 0x00 & Klar-Text & 0x00FF

Die Gesamt-Größe (im Datei-Header) eines Programms muß durch 4 teilbar sein, fehlende Bytes werden aufgefüllt.
Im komprimierten Text werden für die eingebauten Befehle Byte-Codes verwendet. Das Leerzeichen (0x20) am Anfang eines Terms/Bedingung (wie bei If, ElseIf, Case, ...) wird beibehalten. Adressen haben immer die länge von 4 Bytes.

In dieser Tabelle sind die Befehle und ihr Byte-Code aufgelistet. (Nicht ganz vollständig)

Befehl Code Bemerkung
abExpR 0xE889  
abExpReg 0xE870  
abs 0xE020  
absExpand 0xE021  
and 0xE004  
andConnect 0xE022  
angle 0xE023  
approx 0xE025  
arcLen 0xE026  
arg 0xE027  
arrange 0xE028  
augment 0xE029  
BinomialCD 0xE8B3  
BinomialPD 0xE8B2  
Box 0xE8BF  
Break 0xE804 & {Adresse von IfEnd | Adresse von SwitchEnd | Adresse von WhileEnd + 6 (0x06) | Adresse von LpWhile + 8 (0x08) + Länge von Bedingung}
Broken 0xE881  
CallUndef 0xE82D  
Case 0xE804 & {Adresse von sich selbst + 14 (0x0E) + Länge von Term & 0xE808 & Term & 0xE803 & {Adresse von nächsten Case + 6 (0x06) | Adresse von Default}}
cExpand 0xE043  
ChiCD 0xE8AF  
ChiPD 0xE8AE  
ChiTest 0xE89F  
ChrToNum 0xE8F6  
Circle 0xE829  
Clear_a_z 0xE91D  
ClearSheet 0xE859  
ClearSheet3D 0xE864  
CloseComPort38k 0xE8DA  
ClrGraph 0xE82A  
ClrText 0xE910  
Cls 0xE82B  
colDim 0xE02A  
collect 0xE02B  
colNorm 0xE02C  
combine 0xE02D  
compToPol 0xE02E  
compToTrig 0xE02F  
conjg 0xE030  
const 0xE0A8  
constn 0xE0A9  
CopyVar 0xE8F2  
cos 0xE050  
cos 0xE051  
cosh 0xE052  
cosh 0xE053  
Cross 0xE88E  
crossP 0xE035  
CubicR 0xE885  
CubicReg 0xE86C  
cuml 0xE036  
Default   Dient nur als "Marke" für die Adresse. (Wagenrücklauf (CR) wird übersetzt!)
DefaultListEditor 0xE897  
DefaultSetup 0xE8E2  
Define 0xE917  
DelFolder 0xE8E7  
DelVar 0xE8E8  
denominator 0xE037  
det 0xE038  
diag 0xE039  
diff 0xE03A  
dim 0xE03B  
DispDfrTbl 0xE865  
DispDQTbl 0xE8D7  
DispFibTbl 0xE8E3  
DispFTable 0xE82E  
DispListEditor 0xE894  
DispQutTbl 0xE8CC  
DispSeqTbl 0xE82F  
DispSmryTbl 0xE830  
DispStat 0xE876  
DispText 0xE911  
Distance 0xE831  
dms 0xE092  
Do   Dient nur als "Marke" für die Adresse. (Wagenrücklauf (CR) wird übersetzt!)
Dot 0xE890  
dotP 0xE03C  
DrawConics 0xE918  
DrawFTGCon 0xE833  
DrawFTGPlot 0xE834  
DrawGraph 0xE835  
DrawSeqCon 0xE836  
DrawSeqPlt 0xE837  
DrawSeqEtrCon 0xE838  
DrawSeqEtrPlt 0xE839  
DrawStat 0xE891  
Draw3D 0xE862  
dSolve 0xE03D  
0xE404 Der Zeichencode dafür ist 0xEE03.
0xE403 Der Zeichencode dafür ist 0xEE02.
eigVc 0xE03E  
eigVl 0xE03F  
eliminate 0xE040  
Else 0xE804 & Adresse von IfEnd
ElseIf 0xE804 & Adresse von IfEnd & 0xE801 & Bedingung & 0xE803 & Adresse von nächsten Else/ElseIf + 6 (0x06)
exchange 0xE041  
expand 0xE042  
ExpR 0xE888  
ExpReg 0xE86F  
ExpToStr 0xE8F7  
expToTrig 0xE044  
factor 0xE045  
factorOut 0xE0A1  
FCD 0xE8B1  
fill 0xE047  
fMax 0xE049  
fMin 0xE048  
For 0xE809 & Anweisung
FPD 0xE8B0  
frac 0xE094  
fRound 0xE0AE  
gcd 0xE04A  
GeoCD 0xE8B7  
GeoPD 0xE8B6  
GetFolder 0xE8E9  
GetKey 0xE909  
getLeft 0xE0A2  
GetPen 0xE90A  
getRight 0xE04B  
GetType 0xE8EA  
GetVar38k 0xE920  
Goto 0xE804 & (4 Bytes:) Adresse von Lbl
GraphType 0xE83A  
GTSelOff 0xE83B  
GTSelOn 0xE83C  
Histogram 0xE87C  
Horizontal 0xE83D  
0xE405 Der Zeichencode dafür ist 0xEE01.
ident 0xE058  
If 0xE801 & Bedingung & 0xE803 & {Adresse von IfEnd | Adresse von nächsten Else/ElseIf + 6 (0x06)}
IfEnd   Dient nur als "Marke" für die Adresse. (Wagenrücklauf (CR) wird übersetzt!)
im 0xE059  
Input 0xE90C  
InputFunc 0xE90E  
InputStr 0xE90D  
int 0xE095  
intg 0xE096  
Inverse 0xE83E  
invert 0xE05B  
InvNorm 0xE8AB  
judge 0xE0A6  
Lbl   Dient nur als "Marke" für die Adresse. (Wagenrücklauf (CR) wird übersetzt!)
lcm 0xE05C  
Ldot 0xE88F  
lim 0xE05D  
Line 0xE83F  
LinearR 0xE882  
LinearReg 0xE869  
LinRegTTest 0xE89E  
listToMat 0xE05E  
ln 0xE05F  
Local 0xE8EB  
Locate 0xE90B  
Lock 0xE8EC  
LockFolder 0xE8F3  
log 0xE060  
LogisticR 0xE88C  
LogisticReg 0xE873  
LogP 0xE85D  
LogR 0xE887  
LogReg 0xE86E  
LpWhile 0xE801 & Bedingung & 0xE802 & Adresse von Do
LU 0xE0B6  
matToList 0xE061  
max 0xE062  
mean 0xE063  
MedBox 0xE87D  
median 0xE064  
MedMed 0xE883  
MedMedLine 0xE86A  
Message 0xE912  
min 0xE065  
mod 0xE066  
ModBox 0xE87E  
mode 0xE09B  
MoveVar 0xE8ED  
mRow 0xE074  
mRowAdd 0xE075  
MultiSortA 0xE892  
MultiSortD 0xE893  
Next 0xE804 & Adresse von zugehörigen To
nCr 0xE067  
NDist 0xE880  
NewFolder 0xE8EE  
norm 0xE068  
normal 0xE09E  
NormalLine 0xE840  
NormCD 0xE8AA  
NormPD 0xE8A9  
not 0xE091  
NPPlot 0xE87B  
nPr 0xE069  
numerator 0xE06A  
NumToChr 0xE8F8  
NumToStr 0xE903  
Off 0xE8B8  
On 0xE8B9  
OnePropZInt 0xE8A5  
OnePropZTest 0xE89A  
OneSampleTInt 0xE8A7  
OneSampleTTest 0xE89C  
OneSampleZInt 0xE8A3  
OneSampleZTest 0xE898  
OneVariable 0xE874  
OneWayANOVA 0xE8A1  
OpenComPort38k 0xE8D9  
or 0xE005  
Pause 0xE827  
percent 0xE08E  
piecewise 0xE0A7  
Plot 0xE82C  
PlotChg 0xE841  
PlotOff 0xE842  
PlotOn 0xE843  
plotTest 0xE0A3  
PoissonCD 0xE8B5  
PoissonPD 0xE8B4  
polyEval 0xE06B  
PowerR 0xE88A  
PowerReg 0xE871  
Print 0xE90F  
PrintNatural 0xE913  
prod 0xE06C  
propFrac 0xE0A0  
PTBrokenThck 0xE848  
PTCross 0xE844  
PTDot 0xE845  
PTNormal 0xE846  
PTSquare 0xE847  
PTThick 0xE849  
PxlChg 0xE84A  
PxlOff 0xE84B  
PxlOn 0xE84C  
pxlTest 0xE0A4  
Q 0xE099  
QStat 0xE48E  
Q 0xE09A  
QStat 0xE490  
QR 0xE0B7  
QuadR 0xE884  
QuadReg 0xE86B  
QuartR 0xE886  
QuartReg 0xE86D  
rand 0xE0AD  
randList 0xE024  
RandSeed 0xE8F5  
rangeAppoint 0xE0B8  
RclGMem 0xE84D  
RclPict 0xE84E  
RclVWin 0xE84F  
re 0xE06E  
Receive38k 0xE91A  
ref 0xE06F  
Rename 0xE8EF  
replace 0xE070  
Return 0xE825  
rewrite 0xE071  
rFactor 0xE046  
rotate 0xE072  
rowAdd 0xE073  
rowDim 0xE076  
rowNorm 0xE077  
rref 0xE078  
rSolve 0xE09F  
Scatter 0xE879  
SelOn3D 0xE863  
Send38k 0xE919  
SendVar38k 0xE91F  
seq 0xE079  
SeqSelOff 0xE850  
SeqSelOn 0xE851  
SeqType 0xE852  
sequence 0xE09C  
SetAxes 0xE8BC  
SetAxes3D 0xE8BD  
SetBG 0xE8BE  
SetCellWidth 0xE8C0  
SetComplex 0xE8C1  
SetCoord 0xE8C2  
SetCoordOff3D 0xE8C3  
SetCoordPol3D 0xE8C4  
SetCoordRect3D 0xE8C5  
SetDecimal 0xE8C6  
SetDegree 0xE8C7  
SetDeriv 0xE8C8  
SetDispGCon 0xE8BA  
SetDrawCon 0xE81C  
SetDrawPlt 0xE81E  
SetFix 0xE8C9  
SetFolder 0xE8F0  
SetFunc 0xE8CA  
SetGrid 0xE8CB  
SetLabel 0xE8CD  
SetLabel3D 0xE8CE  
SetLeadCursor 0xE8CF  
SetNormal 0xE8D0  
SetRadian 0xE8D1  
SetReal 0xE8D2  
SetSci 0xE8D3  
SetSequence 0xE8D4  
SetSimulGraph 0xE8D5  
SetSmryTable 0xE895  
SetSmryTableQD 0xE81B  
SetStandard 0xE8D6  
SetStatWinAuto 0xE8BB  
SetTVariable 0xE8E5  
SetDisp 0xE8D8  
SheetActive 0xE853  
SheetActive3D 0xE867  
SheetName 0xE854  
SheetName3D 0xE866  
shift 0xE07A  
signum 0xE07B  
simplify 0xE07C  
sin 0xE04C  
sin 0xE04D  
sinh 0xE04E  
sinh 0xE04F  
SinR 0xE88B  
SinReg 0xE872  
Skip 0xE804 & {Adresse von zugehörigem Do | Adresse von zugehörigem While}
SmryTSelOn 0xE85F  
solve 0xE07D  
sortA 0xE07E  
sortD 0xE07F  
Square 0xE88D  
sRound 0xE0AF  
StatGraph 0xE877  
StatGraphSel 0xE878  
stdDev 0xE080  
Step 0xE806 & Zahl
StepDisp 0xE8E4  
StoGMem 0xE856  
Stop 0xE826  
StoPict 0xE857  
StoVWin 0xE858  
StrCmp 0xE8FA  
StrInv 0xE8FB  
StrJoin 0xE8F9  
StrLeft 0xE8FC  
StrLen 0xE8FD  
StrLwr 0xE901  
StrMid 0xE902  
StrRight 0xE904  
StrRotate 0xE905  
StrShift 0xE906  
StrSrc 0xE907  
strToExp 0xE0A5  
StrUpr 0xE908  
subList 0xE081  
subMat 0xE082  
sum 0xE083  
sumSeq 0xE09D  
swap 0xE085  
Switch 0xE807 & Term & 0xE804 & Adresse von 1. Case + 6 (0x06)
SwitchEnd 0xE80A  
TableInput 0xE8E6  
tan 0xE054  
tan 0xE055  
TangentLine 0xE85A  
tanh 0xE056  
tanh 0xE057  
tanLine 0xE086  
taylor 0xE087  
TCD 0xE8AD  
tCollect 0xE088  
tExpand 0xE089  
Text 0xE85B  
Then   Dient nur als "Marke" für die Adresse. (Wagenrücklauf (CR) wird übersetzt!)
To 0xE805 & Rechte Seite von Anweisung (an "" (=0x02E009) getrennt) & 0x200020 & End-Ausdruck & 0xE803 & Adresse von Next + 6 (0x06)
toCyl 0xE034  
toDMS 0xE093  
toFrac 0xE098  
toPol 0xE032  
toRect 0xE031  
toSph 0xE033  
TPD 0xE8AC  
trigToExp 0xE08A  
trn 0xE08B  
TwoPropZInt 0xE8A6  
TwoPropZTest 0xE89B  
TwoSampleFTest 0xE8A0  
TwoSampleTInt 0xE8A8  
TwoSampleTTest 0xE89D  
TwoSampleZInt 0xE8A4  
TwoSampleZTest 0xE899  
TwoVariable 0xE875  
TwoWayANOVA 0xE8A2  
unitV 0xE08C  
variance 0xE08D  
Vertical 0xE85C  
ViewWindow 0xE85E  
ViewWindow3D 0xE868  
VWin 0xE896  
Wait 0xE828  
While 0xE801 & Bedingung & 0xE803 & Adresse von WhileEnd + 6 (0x06)
WhileEnd 0xE804 & Adresse von While
xor 0xE006  
xyLine 0xE87A  
ZAuto 0xE832  
ZFactor 0xE860  
0xE003 Der Zeichencode dafür ist 0xEE11.
0xE002 Der Zeichencode dafür ist 0xEE12.
0xE001 Der Zeichencode dafür ist 0xEE13.
0x02E009 Der Zeichencode dafür ist 0xEE0F.
0xE402 Der Zeichencode dafür ist 0xEE04.
0xE401 Der Zeichencode dafür ist 0xEE05.
0xE097 Der Zeichencode dafür ist 0xEE0B.
0xE090 Der Zeichencode dafür ist 0xEE50.
0xE084 Der Zeichencode dafür ist 0xEE51.
0xE06D Der Zeichencode dafür ist 0xEE52.
0xE05A Der Zeichencode dafür ist 0xEE53.
: (Mehrfachanweisung) 0x013A Ein Doppelpunkt (:) entspr. Null-Befehl
0x0D (Wagenrücklauf (CR)) 0x00 Ein Wagenrücklauf (CR) entspr. Null-Befehl

Aus der Tabelle mit dem Befehl-Bytes kann man entnehmen, dass einpaar Befehle ähnlich übersetzt werden. Das folgende sollte das besser erklären.
Wagenrückläufe sind schon eingefügt. (Bei der jeweils letzten Zeile nicht unbedingt notwendig).

If          E801 & Bedingung & E803 & Adresse von IfEnd & 00
Then        00
Break       E804 & Adresse von IfEnd & 00
IfEnd       00

If          E801 & Bedingung & E803 & Adresse von Else + 6 & 00
Then        00
Break       E804 & Adresse von IfEnd & 00
Else        E804 & Adresse von IfEnd & 00
IfEnd       00

While       E801 & Bedingung & E803 & Adresse von WhileEnd + 6 & 00
Break       E804 & Adresse von WhileEnd + 6 & 00
WhileEnd    E804 & Adresse von While & 00

Do          00
LpWhile     E801 & Bedingung & E802 & Adresse von do & 00

Lbl b       00
Goto b      E804 & Adresse von Lbl b & 00
00000000    NNNNNNNNCCCCCCCCMMMMMMMM        (12 Byte: PRGM_Header)
0000000C    00                              (Parameter-Trenner)

0000000D    E801 203939 E803 00000020 00    If x<0
00000019    00                              Then
0000001A    E804 00000021 00                Else
00000021    00                              IfEnd

00000022    E82B 00                         Cls

00000025    E801 203939 E803 00000037 00    While 99
00000031    E804 00000025 00                WhileEnd

00000038    E82B 00                         Cls

0000003B    00                              Lbl b
0000003C    E804 0000003B 00                Goto b

00000043    E82B 00                         Cls

00000046    00                              Do
00000047    E801 20783C30 E802 00000046     LpWhile x<0


@REV3:ICONMENU
12 (0x0c) Bytes:

1 Auswahl aus der Liste rechts oben im Hauptmenü (Lehrgebiete (0x00), Zusätzliches (0x01), Alles (0x02))
3 000000
1 Scroll-Zustand im Hauptmenü
3 000000
1  
3 000000