atari-home.de - Foren

Software => Coding => Thema gestartet von: simonsunnyboy am Fr 16.01.2009, 08:30:47

Titel: Realisierung von Sprungtabellen/switch() in m68k
Beitrag von: simonsunnyboy am Fr 16.01.2009, 08:30:47
Ich überlege zur Zeit wie man halbwegs effizient ein switch() Statement in m68k abbildet.
Die Idee ist, dass eine Variable part besagt, welcher case-Fall aufgerufen werden soll.
Im Prinzip geht es um die Realisierung eines Endlichen Automaten...
in C etwa das folgende:
switch(part)
{
case 0:
  ...
  break;
case 1:
  ...
  break;
}

Meine Idee für m68k wäre in etwa wie folgt:
mainloop:
         lea jump_table,a0
         move.l #part,d0
         movea.l 0(a0,d0),a0
         jmp (a0)
...
jump_table:
            dc.l part1,part2,part3,part4

part1:
...
         jmp mainloop
part2:
...
         jmp mainloop

part: ds.l 1

Ideen, Anregungen willkommen :)
ssb
Titel: Re: Realisierung von Sprungtabellen/switch() in m68k
Beitrag von: guest164 am Sa 06.06.2009, 11:59:08
Hallo Matthias,

bin auf deine Frage leider erst etwas spät gestoßen...

Ich mache das auf jeden Fall genauso wie du es vorgeschlagen hast. Nur solltest du d0 noch mit 4 multiplizieren damit es auch funktioniert. ;)

Wenn deine Sprungtabelle nicht mehr als 128 Bytes vom Aufruf entfernt ist, kannst du es auch noch ein kleines bischen beschleunigen.

move.l jump_table(pc,d0),a0
jmp    (a0)