News:

;) This forum is the property of Proton software developers

Main Menu

Odd select case code being generated

Started by TimB, Apr 20, 2026, 04:58 PM

Previous topic - Next topic

TimB


I was trying to see why the select case code was failing to work and came across this quirck

This is the basic code. You can see its a simple Proc
It gets passed a byte and then calls another sub based on the result of the paramiter

But look close at the ASM

Note that in case 1 I use a different proc name and the code generated looks right but using name that almost matches the current proc name the code produced is wrong



Proc SelectBlock(pBlockNum As Byte)
    Dim bIndex As Byte

    Select pBlockNum
        Case 1
            SendBlock1()
        Case 2
            SelectBlock2()
        Case 3
            SelectBlock3()
        Case 4
            SelectBlock4()
        Case Else
            '--- Invalid block - send 12 0xFF bytes as error response ---
            For bIndex = 1 To 14
                AddByteToTXB(0xFF)
            Next
    EndSelect

EndProc



;---------------------------------------------
F1_001983 equ $ ; in [V16.BAS] Proc SelectBlock(pBlockNum As byte)
SelectBlock
F1_001986 equ $ ; in [V16.BAS] Select pBlockNum
F1_001987 equ $ ; in [V16.BAS] Case 1
    movlw 1
    movlb 1
    subwf SelectBlockpBlockNum,W,1
    movlb 0
    bnz _lbl__475
F1_001988 equ $ ; in [V16.BAS] SendBlock1()
    call SendBlock1
    bra _lbl__474
_lbl__475
    movlw 42
    movwf PBS_VAR0H,0
    movlw 220
    movwf PBS_VAR0,0
F1_001989 equ $ ; in [V16.BAS] Case 2
    movf PBS_VAR0H,F,0
    bnz _lbl__478
    movf PBS_VAR0,W,0
    movlb 1
    subwf SelectBlockpBlockNum,W,1
    movlb 0
    bnz _lbl__478
F1_001990 equ $ ; in [V16.BAS] SelectBlock2()
    call SelectBlock2
    bra _lbl__474
_lbl__478
    movlw 43
    movwf PBS_VAR1H,0
    movlw 114
    movwf PBS_VAR1,0
F1_001991 equ $ ; in [V16.BAS] Case 3
    movf PBS_VAR1H,F,0
    bnz _lbl__480
    movf PBS_VAR1,W,0
    movlb 1
    subwf SelectBlockpBlockNum,W,1
    movlb 0
    bnz _lbl__480
F1_001992 equ $ ; in [V16.BAS] SelectBlock3()
    call SelectBlock3
    bra _lbl__474
_lbl__480
    movlw 43
    movwf PBS_VAR2H,0
    movlw 234
    movwf PBS_VAR2,0
F1_001993 equ $ ; in [V16.BAS] Case 4
    movf PBS_VAR2H,F,0
    bnz _lbl__482
    movf PBS_VAR2,W,0
    movlb 1
    subwf SelectBlockpBlockNum,W,1
    movlb 0
    bnz _lbl__482
F1_001994 equ $ ; in [V16.BAS] SelectBlock4()
    call SelectBlock4
F1_001995 equ $ ; in [V16.BAS] Case else
    bra _lbl__484
_lbl__482
F1_001997 equ $ ; in [V16.BAS] For bIndex = 1 To 14
    movlb 1
    movlw 1
    movwf SelectBlockbIndex,1
_frlb__485
    movlw 15
    movlb 1
    subwf SelectBlockbIndex,W,1
    movlb 0
    bc _nxlb__486
F1_001998 equ $ ; in [V16.BAS] AddByteToTXB(0xFF)
    movlb 1
    setf AddByteToTXBpdata,1
    movlb 0
    call AddByteToTXB
_ctlb__487
F1_001999 equ $ ; in [V16.BAS] Next
    movlb 1
    incf SelectBlockbIndex,F,1
    movlb 0
    bnc _frlb__485
_nxlb__486
F1_002000 equ $ ; in [V16.BAS] EndSelect
_lbl__484
_lbl__474
F1_002002 equ $ ; in [V16.BAS] EndProc
    return 0 ; EndProc 

top204

Thanks for spotting that Tim.

It seems to be a problem with the lexical scanner, and is enabling ByRef for some strange reason, when it sees the procedures that nearly match the name of the procedure they are in.???

A strange one indeed, and I am now into .

The workaround is to make the procedure calls slightly more different names, or the procedure they are in have a slightly different name. For example:

'-------------------------------------------------------------------------------------------------------------
' The main program starts here
'
Main:
    SelectBlock(1)

'-------------------------------------------------------------------------------------------------------------
Proc SelectBlock(ByVal pBlockNum As Byte)
    Dim bIndex As Byte

    Select pBlockNum
        Case 1
            SendBlock1()
        Case 2
            SelectBlock_2()
        Case 3
            SelectBlock_3()
        Case 4
            SelectBlock_4()
        Case Else
            For bIndex = 1 To 14
                AddByteToTXB(0xFF)
            Next
    EndSelect
EndProc
 
'-------------------------------------------------------------------------------------------------------------
Proc SendBlock1()
EndProc

'-------------------------------------------------------------------------------------------------------------
Proc SelectBlock_2()
EndProc

'-------------------------------------------------------------------------------------------------------------
Proc SelectBlock_3()
EndProc

'-------------------------------------------------------------------------------------------------------------
Proc SelectBlock_4()
EndProc

'-------------------------------------------------------------------------------------------------------------
Proc AddByteToTXB(pParam As Byte)
EndProc

Regards
Les