Substituting branching instructions for jumps is also a good way of reducing the number of bytes or cycles in a routine when hacking games (you need to watch your cycle times when the display is being constructed tho). Branches use 1 less byte and 1 less cycle than a JMP. The downside is that they can only direct a program to go 128 bytes forward or back. Branch descriptions:
BCC - branch on carry clear. This is most commonly used to check values that are
less than what you are comparing it to...
LDA $DF ;get value of a ram location
CMP #$0A ;check if it's a value of 10
BCC $50 ;if $DF is less than that, take the branch
You can also use it to check for rollovers during arithmatic. You should use CLC or SEC instructions just prior to using ADC or SBC (respecively) if there is a possibility of the byte rolling over $FF or under $00. The status of that carry can also be used in adding or subtracting values that are larger than $FF...
LDA $A8 ;load the low byte of our "score"
CLC ;clear the carry flag
ADC #$01 ;add 1 point **
STA $A8 ;...and save it
LDA $A9 ;load the high byte of our "score"
ADC #$00 ;if the carry flag was set by **, it will be adding 1 here
STA $A9 ;...and then save it
BCS - branch on carry set. This is the opposite from above, the branch is taken if the result is
greater than the value you are checking for.
BEQ - branch on zero. This one checks if they are equal. If our example $DF is equal to $0A...there will be no remainder when comparing it against a value of $0A - branch on zero. You can also use it just to see if the contents of a memory location are equal to zero...
LDA $DF ;load the ram location
BEQ $50 ;if it's zero, take the branch
BNE - branch if not zero. The opposite from the above...the program will take the branch if the result is anything BUT zero (i.e. not equal to).
BMI - branch on minus. The branch is taken if the high bit is set ($80 to $FF are considered to be negative)
BPL - branch on plus. The opposite from the above, the branch is taken if the result is between $00 and $7F. Really handy to use in loops that count down. You'll see it used often in display kernals where a specific amount of time needs to be wasted...
LDX #$10 ;start with a value of 16 decimal
DEX ;subtract 1 (doing nothing for 2 cycles)
BPL $FD ;also using 2 cycles, branch back up until X rolls over to $FF.
BVC - branch on overflow clear. This is similar to BPL...you are just looking at one bit in the value to see if it's not set (the second-highest bit...which has a value of $40)
BVS - chanch on overflow set. The opposite from the above. The branch will be taken if that bit is on. Since the 2600 is seriously limited for ram space, variables are often shared in a single ram location. No need to waste a full byte if all you want to do is toggle something on or off

The code...
LDA $F0 ;load a ram location
AND #$40 ;keep only the second-highest bit
BEQ $E0 ;branch if that bit is off
...can be shortened to...
LDA $F0 ;load a ram location
BVC $E0 ;branch if bit 6 is off
...and if you don't want your accumulator's value to be overwritten, you could even do this...
BIT $F0 ;check a ram location
BVC $E0 ;branch if bit 6 is off
...but I won't go into that
That covers branches...but JMP also has a couple of formats. You probably already know JMP $location...always jump to the address unconditionally, but there is another one that is used when you want to have a choice of jumping to one of many locations from within the program. It's
indirect jumping...that is to say that the program looks up 2 ram locations and jumps to the address that THEY contain. Although all of the 2600's ram is located only on single-byte zero page locations, the instruction still uses 3...so the high byte is usually zero...
Example:
JMP ($00D0)
This instruction is looking at the contents of $D0 and $D1 for the address to jump to. If $D0=$05 and $D1=$F1, the jump will go to $F105. Often, these values are located in a table located someplace in Rom...and the program puts the one it needs (depending on what is currently happening) into the ram locations just prior to using the indirect JMP.
And as stated above, JSR acts as Basic's GOSUB. It jumps to a new location, and saves the return address for when an RTS instruction is met. You still need to watch out for how many "nests" you can perform at one time tho. So the program might overwrite some of the ram locations used for variables if you use too many JSR's at the same time. JSR's are also the biggest wasters of cycle time...6 cycles to jump there and 6 cycles to return - that's 12 cycles and you didn't even do anything there!