/*
 przykladowy program wykorzystujacy strukture .PROC i .MACRO
 program realizuje zamiane wartosci typu WORD na postac hexadecymalna
*/

 org $2000

@stack_address = $400  ; wymagane przez MADS etykiety
@stack_pointer = $ff

main
 lda #0
 sta @stack_pointer    ; zerujemy wskaznik stosu
 
 hex #*                ; wywolujemy procedure HEX, parametrem jest wartosc=aktualny adres
 
loop jmp loop          ; petla bez konca


* ------- *
*  MACRO  *
* ------- *
// przykladowe makro, ktore odwola sie do parametru na stosie
// rezygnujac z tego makra mozemy sami odwolywac sie do parametrow dzieki czemu
// bedziemy mieli mozliwosc optymalizacji (nadmiarowe LDX @stack_pointer), przykladem
// takiej optymalizacji jest procedura LHEX
@GetPar .macro
loop
 ldx @stack_pointer
 lda :1,x

 .endm

* ----------- *
*  PROCEDURE  *
* ----------- *
// procedurka reprezentujaca wartosc 1-bajtowa (BYTE)
// w postaci HEXadecymalnej
lHex .proc {.byte low .word wynik}
hlp equ $80

 ldx @stack_pointer
 lda wynik,x
 sta hlp
 lda wynik+1,x
 sta hlp+1

 lda low,x
 pha
 :4 lsr @
 tay
 
 lda thex,y
 ldy #0
 sta (hlp),y
 
 pla
 and #$0f
 tay

 lda thex,y
 ldy #1
 sta (hlp),y
 
 .exit

thex dta d'0123456789ABCDEF'

 .endp

// procedurka reprezentujaca wartosc 2-bajtowa (WORD)
// w postaci HEXadecymalnej
hex .proc {.word par1}

 @GetPar par1
 
 lHex @,#$bc42       ; @ oznacza ze pierwszy parametr to zawartosc akumulatora
                     ; tylko na pierwszej pozycji jest on rozpoznawany przez makro .CALL
 @GetPar par1+1
 
 lHex @,#$bc40
 
 //.exit #0         ; mozliwe jest przekazanie wartosc przez .EXIT (do akumulatora)

 .endp              ; w przypadku braku .EXIT dyrektywa .ENDP wywola @ExitProc


 opt l-

 icl '\macros\call.asm'
 icl '\macros\ExitProc.asm'

; ---
 run main
