const F_CPU=20000000 avr.device = atmega328p avr.clock = F_CPU avr.stack = 64 uart.baud = 19200 uart.recv.enable uart.send.enable struct eNTRY word fnAddr string text[12] endstruct dim a as byte dim ps as sptr dim pd as dptr dim m as MemoryBlock print 12;"pointer and superimpose example" print m.New(64) m.WordValue(0) = 0xaabb m.CString(2) = "entry Nr. 1 " m.WordValue(14) = 0xccdd m.CString(16) = "entry Nr. 2 " m.WordValue(28) = 0xeeff m.CString(30) = "entry Nr. 3 " ps = m.Ptr 'Speicheradresse der MemoryBlock-Daten pd = table.Addr 'Speicheradresse der Tabelle im Flash 'direkt über Objektfunktionen print "(sram) ";34;ps.StringValue(2,12);34 print "(flash) ";34;pd.StringValue(2,12);34 print 'SuperImpose ' 'SuperImposing ist das "darüberlegen" einer Strukturdeklaration auf einen beliebigen Speicherbereich. 'D.h. wenn man bspw. eine Struktur in Form eines Menüelements deklariert hat, lässt sich mit Pointern 'diese Strukturdeklaration auf den Speicherbereich abbilden und kann dann die elemente der 'Struktur elegant lesen. Bei Angabe eines Arrayindex (Konstante) bei einer Struktur, wird der 'Offset automatisch berechnet. print "sram:" print "fnAddr = 0x";hex(ps.eNTRY(0).fnAddr);", menu text = ";34;ps.eNTRY(0).text;34 print "fnAddr = 0x";hex(ps.eNTRY(1).fnAddr);", menu text = ";34;ps.eNTRY(1).text;34 print "fnAddr = 0x";hex(ps.eNTRY(2).fnAddr);", menu text = ";34;ps.eNTRY(2).text;34 print print "flash:" print "fnAddr = 0x";hex(pd.eNTRY(0).fnAddr);", menu text = ";34;pd.eNTRY(0).text;34 print "fnAddr = 0x";hex(pd.eNTRY(1).fnAddr);", menu text = ";34;pd.eNTRY(1).text;34 print "fnAddr = 0x";hex(pd.eNTRY(2).fnAddr);", menu text = ";34;pd.eNTRY(2).text;34 print print "Aufruf per Icall aus der Tabelle:" icall pd.eNTRY(0).fnAddr icall pd.eNTRY(1).fnAddr icall pd.eNTRY(2).fnAddr print print "ready" do loop procedure myfunc1() print "myfunc 1" endproc procedure myfunc2() print "myfunc 2" endproc procedure myfunc3() print "myfunc 3" endproc 'Wichtiger Hinweis: 'Adressen von Labels, Objekten oder Methoden liegen im Flash immer an einer Word-Grenze, sie werden 'im Flash-Objekt daher auch als Word-basierte Adresse abgelegt. Möchte man mit der Byte-Adresse arbeiten, 'muss man den Wert wie im Assembler mit 2 multiplizieren. data table eNTRY { myfunc1, "Menu Nr. 1" } eNTRY { myfunc2, "Menu Nr. 2" } eNTRY { myfunc3, "Menu Nr. 3" } enddata