Hi Oleg,

Код:
 void Laser2_PTBL (signed char col, signed char row, unsigned char spn) __naked {
 __asm
              POP HL
              POP BC;  C = col;  B = row
              POP DE;  E = spn
              PUSH DE
              PUSH BC
              PUSH HL
              XOR A;  NOP
              JP _Laser2_PUT_SPRITE
 __endasm;
 } // Laser2_PTBL
Does oberon have function pointers? If not you can use callee convention to save some bytes in your binaries:

Код:
 void Laser2_PTBL (signed char col, signed char row, unsigned char spn) __naked __z88dk_callee {
 __asm
              POP HL
              POP BC;  C = col;  B = row
            dec sp
              POP DE;  D = spn
            push hl
              XOR A;  NOP
            ld e,d  ; E = spn
              JP _Laser2_PUT_SPRITE
 __endasm;
 } // Laser2_PTBL
I had to do something weird in there because of the three bytes but with this in place calls to your subroutine will no longer have pops afterward.

If you do need function pointers, you have to resort to some trickery as sdcc is not fully capable of function calls through pointers with fastcall or callee linkage.