freem / asm6f

A fork of loopy's ASM6, a 6502 assembler.
96 stars 24 forks source link

Macro parameters not handling any expressions #58

Open Vuurniac opened 6 months ago

Vuurniac commented 6 months ago

I have been trying to simplify things by moving as many function calls inside macros as I can and move away from manually loading function inputs into registers before calling the function, etc. since these things don't cost any CPU time to do from a macro. It seems though that I'm getting incorrect results whenever the macro parameters are not just bare symbols. The example is from a list file where I am demonstrating the issue:

09F13                                   @thing = sfx_denied_thump|param_sfx_pulse
09F13 A2 81                         ldx #@thing
09F15                                   sfx @thing
09F15                                      ; Start sfx ID 0-31 with attribute flags 2,N,P
09F15 A2 83                         ldx #sfx_confirm|param_sfx_pulse
09F17 20 3B 9A                      jsr InitSfx

My macro sfx is supposed to load the X register with the immediate value and then call the function. Other than the sfx ID I can also specify which sound channels I want to use, so the channel flag constants need to be ORd with the sound ID. This produces incorrect results, and it does not matter if I put an extra layer by providing my input in a local symbol either (the local symbol takes on the correct value of 0x81). I initially tried sfx sfx_denied_thump|param_sfx_pulse but that does the same thing, resulting in 0x83 getting loaded into the X register. Even just putting sfx sfx_denied_thump without expressions resolves to ldx #sfx_confirm|param_sfx_pulse even though there was no OR with anything.

For clarity here are the definitions of the macro and the sound IDs:

                                .macro sfx input
                                ; Start sfx ID 0-31 with attribute flags 2,N,P
                                    ldx #input
                                    jsr InitSfx
                                .endm
                                    param_sfx_pulse = %10000000
                                    param_sfx_noise = %01000000
                                    param_sfx_prio  = %00100000 
092DB                           .enum 0
00000                               ; sfx IDs
00000                               sfx_text0           .dsb 1
00001                               sfx_denied_thump    .dsb 1
00002                               sfx_mvsel           .dsb 1
00003                               sfx_confirm         .dsb 1
00004                               sfx_numberofsounds  .dsb 1
00005                           
00005                                   .if sfx_numberofsounds >= 32
00005                                       .error More sound effects than supported.
00005                                   .endif  
00005                           .ende

So I don't know how to proceed with using macros for anything other than very simple things. Any help is appreciated!