Autor Thema: Realisierung von Sprungtabellen/switch() in m68k  (Gelesen 12544 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.807
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Realisierung von Sprungtabellen/switch() in m68k
« 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
« Letzte Änderung: Fr 16.01.2009, 08:32:25 von simonsunnyboy »
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

guest164

  • Gast
Re: Realisierung von Sprungtabellen/switch() in m68k
« Antwort #1 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)