Shop OBEX P1 Docs P2 Docs Learn Events
PASM - cmp instruction — Parallax Forums

PASM - cmp instruction

lanternfishlanternfish Posts: 366
edited 2010-12-06 15:53 in Propeller 1
I am having a few problems to get the following section of code to run properly.
:SignalCOGs             wrbyte  C0_NextCOG, C0_COGSync                'C0_NextCOG = 1 for :IsItMe loop test
                                                                      'COGSync Address = $1FFC                            

:IsItMe                 rdbyte  C0_ActiveCOG, C0_COGSync              'Get current decimating cog
                        cmp     C0_ActiveCOG, C0_ThisCOG  wz          'Is it this COG?
                        if_nz   jmp :IsItMe                           'Jump if it isn't. Else do ...

If C0_NextCOG = 1 then appears to jump to non code address $005F.
If C0_NextCOG = 0 then appears to jump to code address $0013.

EDIT :IsItMe is address $003

What I want to happen is that C0_ActiveCog (=1 in this case; located at $1FFC in Main Memory) is compared with the value of C0_ThisCOG (= 0 in this case). If not equal then loop and test again. If equal then continue with rest of code,

I am testing code in Gear.

Thanks in advance for any help.

The complete code is:
{{SVGA Scaler 800 x 600 to 400 x 300}}

PUB Main
 {Launch COG's}

  'coginit(7, @InitCOG0, 0) 'Launch COG 7
  'coginit(6, @InitCOG0, 0) 'Launch COG 6
  'coginit(5, @InitCOG0, 0) 'Launch COG 5
  'coginit(4, @InitCOG0, 0) 'Launch COG 4
  'coginit(3, @InitCOG3, 0) 'Launch COG 3
  'coginit(2, @InitCOG2, 0) 'Launch COG 2
  'coginit(1, @InitCOG1, 0) 'Launch COG 1
  coginit(0, @InitCOG0, 0) 'Launch COG 0

CON
 _clkmode = xtal1 + pll16x
 _xinfreq = 5_000_000

DAT
  {COG0 Pixel Decimation}

                        org 0

InitCOG0                mov     dira, C0_FIFOReadPin                  'Set P7 output (FIFO RD pulse +ve)
                        mov     outa, #0                              'P7 Low
                                                                      
:SignalCOGs             wrbyte  C0_NextCOG, C0_COGSync                'C0_NextCOG = 0 for :IsItMe loop test
                                                                      'COGSync Address = $1FFC                            

:IsItMe                 rdbyte  C0_ActiveCOG, C0_COGSync              'Get current decimating cog
                        cmp     C0_ActiveCOG, C0_ThisCOG  wz          'Is it this COG?
                        if_nz   jmp :IsItMe                           'Jump if it isn't. Else do ...

:InitDecimation         mov     C0_COGPointer, #$40
                        mov     C0_PixelCounter, #400                

:ReadFIFO               xor     outa, C0_FIFOReadPin                  'P7 High
                        'mov     C0_RGB1Value, ina                     'Read RGB value from FIFO and store at address RGBAddress
                        mov     C0_RGB1Value, C0_PseudoIna            'Store pseudo-ina data at address RGBAddress 
                        xor     outa, C0_FIFOReadPin                  'P7 Low
                        nop
                        xor     outa, C0_FIFOReadPin                  'P7 High
                        'mov     C0_RGB2Value, ina                     'Read RGB value from FIFO and store at address RGBAddress
                        mov     C0_RGB2Value, C0_PseudoIna            'Store pseudo-ina data at address RGBAddress 
                        xor     outa, C0_FIFOReadPin                  'P7 Low

:DecimatePixel          add     C0_RGB1Value, C0_RGB2Value            'Add 1st and 2nd RGB longs
                        shr     C0_RGB1Value, #1                      'Divide by 2 (get average of two longs)

                        movd    :WriteRGB, C0_COGPointer              'Prepare self modifying code  
                        nop                                           'to write RGB data to COG RAM
:WriteRGB               mov     0-0, C0_RGB1Value                     'Write RGB data to COG RAM

                        add     C0_COGPointer, #1                     'Point to next COG RAM address
                        djnz    C0_PixelCounter, #:ReadFIFO           'If C0_PixelCounter not zero then repeat @ ReadFIFO

:SignalNextCOG          wrbyte  C0_NextCOG, C0_COGSync                'COGSynch Address = $1FFF: HUB RAM Cog Synch address        

:RGB2HUBInit            mov     C0_COGPointer, #$40
                        mov     C0_PixelCounter, #400

:ReadCOGRAM             movs    :RGBRead, C0_COGPointer               'Prepare self modifying code
                        nop                                           'to read RGB long from COG RAM                        
:RGBRead                mov     C0_RGB1Value, 0-0                     'Read RGB long from COG RAM

:Write2HUB              wrlong  C0_RGB1Value, C0_HUBPointer           'Write RGB data to HUB RAM

                        add     C0_COGPointer, #1                     'Next COG RAM address
                        add     C0_HUBPointer, #1                     'Point to next HUB RAM long address
                        djnz    C0_PixelCounter, #:ReadCOGRAM         'If C0_PixelCounter not zero then repeat @ DecimateLoop
                        {
                        add     C0_HUBPointer, C0_HUBCountInc
                        djnz    C0_LineCounter, #:IsItMe

                        mov     C0_HUBPointer, #0
                        mov     C0_LineCounter, #8
                        }

:ForeverLoop            jmp     #:ForeverLoop                         'Loop forever



                        
C0_COGPointer           long $40
C0_PixelCounter         long 400
C0_PseudoIna            long $00_2A_15_2A
C0_FIFOReadPin          long |< 7
C0_RGB1Value            long 0
C0_RGB2Value            long 0
C0_HUBPointer           long $0
C0_COGSync              long $1FFC
C0_ThisCOG              long 0
C0_NextCOG              long 0
C0_ActiveCOG            long 0
C0_HUBCountInc          long 1599
C0_LineCounter          long 8

Comments

  • Phil Pilgrim (PhiPi)Phil Pilgrim (PhiPi) Posts: 23,514
    edited 2010-12-06 14:15
    Your jump should read
    jmp #:IsItMe

    -Phil
  • lanternfishlanternfish Posts: 366
    edited 2010-12-06 14:27
    Hi Phil

    Don't I feel foolish! I'm frequently forgetting the # when it is most needed.

    Thanks
  • Phil Pilgrim (PhiPi)Phil Pilgrim (PhiPi) Posts: 23,514
    edited 2010-12-06 15:21
    lanternfish,

    Don't feel bad: I do it all the time, too. It's a habit from other assemblers which has become set, I'm afraid. So, after entering a bit of PASM code, I always do a search for jmps in my program, and check each of them to make sure I included the # where it's needed.

    -Phil
  • lanternfishlanternfish Posts: 366
    edited 2010-12-06 15:31
    Cheers

    I have to say I am really enjoying the challenge of both PASM and the great flexibilty of the Propeller.

    Thanks again for the assist.
  • Cluso99Cluso99 Posts: 18,069
    edited 2010-12-06 15:53
    bst will catch these errors for you. I get caught often.. in fact I couldn't see your problem until I read Phil's reply :(
Sign In or Register to comment.