COSMAC 1802 Basic Branching


Introduction to COSMAC 1802 Basic Branching

COSMAC 1802 Basic Branching instructions allow you to execute different parts of code based on certain conditions. These conditions might include inputs that are high, or results of an operation that return a zero value, negative value, etc. In this section, we’ll cover the branching instructions, and how to use each one.

BR, LBR, LBZ, BZ, BNZ Instructions

We don’t need to go through every one of these, but I’ll explain how they work. The BR is a short branch instruction. That is to say, it will branch to a program location that is on the same memory page. In other words, we only need to specify the last byte of an address to branch to.

The LBR is a long branch instruction. This instruction will branch anywhere in memory. When we perform a long branch, we specify both the low and high bytes of the address we need to branch to.

BZ will execute a short branch when the accumulator is zero. Use LBZ if you need a long branch when the accumulator is zero. In the example below, we’ll run up the accumulator to the value of 09, using the low byte of RA as a storage location. We will use the XRI (Exclusive Or Immediate) instruction to know when we reach 09H. When we XOR a value with the accumulator, the result is zero if the numbers are the same. In this case, when the accumulator reaches 09H, and we XOR the accumulator with 09H, the result is zero. At this point we can branch to the stop label.

Our BNZ instruction will branch when the accumulator is not equal to zero. Basically, this is the opposite of BNZ.

Everyday Branch Logic

Let’s take a look at some logic. These are branch instructions that you will probably use in every program. This logic will loop a total of 10 times (0 to 9). After the accumulator reaches 9, the result of our “XRI 09H” will result in a value of zero in the accumulator (D Regsiter). That this point, we branch to the STOP label. In my unit, I have some ROM that will execute a break routine to load the registers into memory before the processor stops. The break routine is on a different memory page. In other words, we need a long branch (LBR) to execute this routine.

BREAK:      EQU     2756H

            ORG     8000H

RA	EQU	10

            LDI     00H
            PLO     RA
            PHI     RA
START:      GLO     RA
            ADI     01H
            PLO     RA
            XRI     09H
            BNZ     START
            BR      STOP
STOP:       LBR     BREAK
            END

Test your work! Register RA (Register 10) should contain the value of 09H once your program finishes.

EF and Q Branches

At this point, we’ll take a look at branches that operate of the value of your EF and Q bits. You have four EF bits that directly connect to the processor (5v = 0, 0v = 1). You also have a Q output on the processor. In this case, my Q output connects to an LED. I have two buttons on my unit that connect to EF1 and EF2.

In this example, we’ll turn on the LED with the SEQ (Set Q) instruction when we press EF1. Likewise, when we press EF1 again, Q shuts off. The cycle repeats infinitely.

B1 – B4 will branch when we press the button. BN1 – BN4 branch when we are not pressing the button. Likewise, BQ branches when Q is on, and BNQ branches when Q is off.

Let’s take a look at the logic:

BREAK:      EQU     2756H

            ORG     8000H

RA	EQU	    10

            LDI     00H
            PLO     RA
            PHI     RA
START:      BN1     CLEARFLAG
            GLO     RA
            BNZ     NOACTION
            B1      EVENTFLAG
NOACTION:   BR      START



EVENTFLAG:  BQ      REQ
SETQ:       LDI     01H
            PLO     RA
            SEQ
            BR      START
            
REQ:        LDI     01H
            PLO     RA
            REQ
            BR      START

CLEARFLAG:  LDI     00H
            PLO     RA
            BR      START
            END

Summary of COSMAC 1802 Basic Branching

In short, branches allow you to jump to different areas of memory based on certain conditions. You can consult the COSMAC 1802 user manual for more types of branches. Here, I’ve just listed a few as an example. Once you learn how the above branches work, the others will mostly be self-explanatory.

For more information, visit the COSMAC Category Page!

— Ricky Bryce

Leave a comment

Your email address will not be published. Required fields are marked *