robo_wolf,

Zitat Zitat von robo_wolf
Ist aber klar, wenn man sich anstelle des Aufrufs die Instruktionen vorstellt.
-> springe ich ja nur eine Instruktion weiter und nicht ueber das komplette macro
esatto, so ist es. Wenn Du wüsstest, wie oft und wie lang ich schon nach Fehlern diesen Typs gesucht habe ! Das ist einer der Gründe, derentwegen ich möglichst nur Sprünge zu Labels verwende und keine relativen.

Ja, durch die Auslagerung ist Dein Quelltext jetzt schön übersichtlich und kompakt. Gefällt mir schon richtig gut . Jetzt können wir noch versuchen, Programmplatz sparen, indem wir die Tastenabfrage im Interruptdienst auf eine Schleife umstellen.

Ja, prinzipiell kann man sich ein Macro schreiben, mit dem man die Parameterübergabe z.B. in die Form "_rcall(ProzedurName,Param1Byte,Param2Byte)" bringt; z.B.:

Code:
.macro _rcall
  ldi r16,@1		;
  ldi zl,low(@2)	;
  ldi zh,high(@2)	;
  rcall @0	;
.endmacro
Im laufenden Quelltext veranlasst die Anweisung
Code:
 _rcall PROZEDURA, 0xFE, 0xABCD
 _rcall PROZEDURB, 0xEF, 0xDCBA
dass Register r16 mit 0xFE, zl mit 0xCD und zh mit 0xAB geladen werden und anschliessend die Prozedur PROZEDURA aufgerufen wird. Anschliessend wird PROZEDURB mit 0xEF in r16 und 0xDCBA in zh:zl aufgerufen. Man muss nur aufpassen und die Veränderungen in r16, zl und zh nicht vergessen. Sehr gern passiert einem sowas
Code:
  ldi r16,0x01
  ldi zl,0x00
  ldi zh 0x00
  _rcall PROZEDURA, 0xFE, 0xABCD
  or zl,zh
  brne Nirwana
und man wundert sich, warum das Programm nach der "brne"-Anweisung nie nach "Nirwana" springt, obwohl es das ja tun müsste ... Das kommt davon, dass das Macro die Benutzung der Register r16, zl und zh versteckt. Umgehen liesse sich diese Gefahr, indem man die Sicherung der Register ebenfalls in das macro übernimmt, z.B. durch
Code:
.macro _rcall
  push r16
  push zl
  push zh
  ldi r16,@1		;
  ldi zl,low(@2)	;
  ldi zh,high(@2)	;
  rcall @0	;
  pop zh
  pop zl
  pop r16
.endmacro
Wenn man solche Vorsichtsmassnahmen trifft, kann man sich eine Macrosammlung aufbauen, mit der man Assemblerprogramme schreiben kann, die schon sehr einer Hochsprache ähneln.

Ausführlicherer Kommentar zu LernProgram_4g_V02 kommt später.

Ciao,

mare_crisium