/*
  Alternatywna postać procedur i makr przekazujących parametry do struktury .PROC

  Wolniejsza w cyklach od CALL.ASM, jednak zajmująca mniej miejsca w pamięci, pod warunkiem
  ze uzywamy procedur z zadeklarowanycmi parametrami
*/

* ---------------------------------------------- * 
*  procedury @SAVE_LONG, @SAVE_WORD, @SAVE_BYTE  *
*  zadzialaja wylacznie w n/w kolejnosci         *
* ---------------------------------------------- *

@save_long .proc
 stx @regX+1

 ldx @stack_pointer
 
 sta @stack_address,x
 inx

@regX lda #0 
.endp

@save_word .proc
 sta @stack_address,x
 tya
 inx
.endp

@save_byte .proc
 sta @stack_address,x
 inx
 rts
.endp


* ---------------------------- *
*  adresowanie natychmiastowe  *
* ---------------------------- *
@call_nat .macro

     .if :1='B'
       lda #:2
       @save_byte
     .else
       .if :1='W'
         lda <:2
         ldy >:2
         @save_word
       .else
         stx @stack_pointer
         lda <:2
         ldx >:2
         ldy ^:2
         @save_long
       .endif
     .endif

 .endm


* ----------------------- *
*  adresowanie absolutne  *
* ----------------------- *
@call_abs .macro

     .if :1='B'
       lda :2
       @save_byte
     .else
       .if :1='W'
         lda :2
         ldy :2+1
         @save_word
       .else
         stx @stack_pointer
         lda :2
         ldx :2+1
         ldy :2+2
         @save_long
       .endif
     .endif

 .endm 


* -------------------------------- *
*  przekazanie parametrow na stos  *
* -------------------------------- *
* tylko pierwszy parametr moze byc przekazany przez akumulator @
@call .macro

 .if :2>>24<>$FF .and :3>>24<>$FF .and :4>>24<>$FF

 ldx @stack_pointer

   .if :2='@'
    @save_byte
   .else

    .if :2='#'
     @call_nat :3,:4
    .else
     @call_abs :3,:4
    .endif

   .endif

 .endif


 .if :5>>24<>$FF .and :6>>24<>$FF .and :7>>24<>$FF

   .if :5='#'
    @call_nat :6,:7
   .else
    @call_abs :6,:7
   .endif

 .endif


 .if :8>>24<>$FF .and :9>>24<>$FF .and :10>>24<>$FF

   .if :8='#'
    @call_nat :9,:10
   .else
    @call_abs :9,:10
   .endif

 .endif

 stx @stack_pointer

 jsr :1

 .endm
