MCS 8 Assembly Language Programming Manual Preliminary Edition Nov73

MCS_8_Assembly_Language_Programming_Manual_Preliminary_Edition_Nov73 MCS_8_Assembly_Language_Programming_Manual_Preliminary_Edition_Nov73

User Manual: manual pdf -FilePursuit

Open the PDF directly: View PDF PDF.
Page Count: 204

DownloadMCS 8 Assembly Language Programming Manual Preliminary Edition Nov73
Open PDF In BrowserView PDF
INTEL CORP. 3065 Bowers Avenue, Santa Clara, California 95051 • (408) 246-7501

Assembly
Language Programming
Manual
MCST~8

PRELIMINARY EDITION

November 1973
©

Intel Corporation 1973

-- TABLE

OF CONTENTS --

8008 PROGRAMMING MANUAL

Page No.
1.0

INTRODUCTION

1-1

2.0

COMPUTER ORGANIZATION

2-1

2.1

THE CENTRAL PROCESSING UNIT

2-3

2.1.1 WORKING REGISTERS
2. 1 .2 THE STACK
2.1.3 ARITHMETIC AND LOGIC UNIT

2-3
2-5
2-7

MEMORY
COMPUTER PROGRAM REPRESENTATION IN MEMORY
MEMORY ADDRESSING

2-8
2-8
2-10

2.4.1
2 .4 .2
2.4.3
2.4.4
2.4.5

2-11
2-13
2-13
2-14

2.2
2.3
2.4

2.5

3.{)

DIRECT ADDRESSING
INDEXED ADDRESSING
INDIRECT ADDRESSING
IMMEDIATE ADDRESSING
SUBROUTINES AND USE OF THE STACK FOR
ADDRESSING

2-15

CONDITION BITS

2-18

2.5.1
2 .5 • 2
2 .5 . 3
2 •5 . 4

2-18
2-19
2-19
2-20

CARRY BIT
SIGN BIT
ZERO BIT
PARITY BIT

THE 8008 INSTRUCTION SET

3-1

3.1

ASSEMBLY LANG UAGE

3-1

3.1.1
3.1.2
3 • 1. 3
3.1.4
3 • 1 .5
3.1.6

3-1
3-4
3-5

HOW ASSEMBLY LANGUAGE IS USED
STATEMENT MNEMONICS
LABEL FIELD
CODE FIELD
OPERAND FIELD
COMMENT FIELD
i

3-7
3-7
3-15

Page No.

3.2

3.3

3.4
3.5

DATA STATEMENTS

3-15

3.2.1 TWO'S COMPLEMENT
3.2.2 DB DEFINE BYTE(S) OF DATA
3.2.3 DW DEFINE WORD (TWO BYTES) OF DATA
3.2.4 DS DEFINE STORAGE (BYTES)

3-16
3-20
3-21
3-22

SINGLE REGISTER INSTRUCTIONS

3-23

3.3.1
3.3.2

3-24
3-24

MOV INSTRUCTION
REGISTER OR MEMORY TO ACCUMULATOR INSTRUCTIONS

3-25
3-28

3.5.1 ADD ADD REGISTER OR MEMORY TO ACCUMULATOR
3.5.2 ADC ADD REGISTI:R OR MEMORY TO ACCUMULATOR

3-29

3.5.3
3.5.4
3.5.5
3.5.6
3.5.7
3.5.8
3.6

INR INCREMENT REGISTER
DCR DECREMENT REGISTER

WITH CARRY
SUB SUBTRACT REGISTER OR MEMORY FROM
ACCUMULATOR
SBB SUBTRACT REGISTER OR MEMORY FROM
ACCUMULATOR WITH BORROW
ANA LOGICAL" AND" REGISTER OR MEMORY
WITH ACCUMULATOR
XRA EXCLUSIVE - OR REGISTER OR MEMORY WITH
ACCUMULATOR (ZERO ACCUMULATOR)
ORA LOGICAL" OR" REGISTER OR MEMORY WITH
ACCUMULATOR
CMP COMPARE REGISTER OR MEMORY WITH
ACCUMULATOR

3-31
3-32
3-34
3-36
3-37
3-40
3-41

ROTATE ACCUMULATOR INSTRUCTIONS

3-43

3.6.1
3.6.2
3.6.3
3.6.4

3-44
3-45
3-46
3-47

RLC
RRC
RAL
RAR

ROTATE ACCUMULATOR LEFT
ROTATE ACCUMULATOR RIGHT
ROTATE ACCUMULATOR LEFT THROUGH CARRY
ROTATE ACCUMULATOR RIGHT THROUGH CARRY

ii

Page No.

3.7

IMMEDIATE INSTRUCTIONS

3-49

3.7.1 MVI MOVE IMMEDIATE DATA
3.7.2 ADI ADD IMMEDIATE TO ACCUMULATOR
3.7.3 ACI ADD IMMEDIATE TO ACCUMULATOR WITH CARRY
3.7.4 SUI SUBTRACT IMMEDIATE FROM ACCUMULATOR
3.7.5 SBI SUBTRACT IMMEDIATE FROM ACCUMULATOR

3-50
3-51
3-53
3-54

3.7.6
3.7.7
3.7.8
3.7.9
3.8

3.9

WITH BORROW
ANI AND IMMEDIATE WITH ACCUMULATOR
XRI EXCLUSIVE - OR IMMEDIATE WITH ACCUMULATOR
o RI OR IMMEDIATE WITH ACCUMULATOR
CPI COMPARE IMMEDIATE WITH ACCUMULATOR

3-55
3-57
3-58
3-59
3-60

JUMP INSTRUCTIONS

3-61

3.8.1
3.8.2
3.8.3
3.8.4
3.8.5
3.8.6
3.8.7
3.8.8
3.8.9

CARRY
NO CARRY
ZERO
NOT ZERO
MINUS
POSITIVE
PARITY EVEN
PARITY ODD

3-62
3-64
3-65
3-65
3-66
3-66
3-67
3-67
3-68

CALL SUBROUTINE INSTRUCTIONS

3-70

3.9.1
3.9.2
3.9.3
3.9.4
3.9.5
3.9.6
3.9.7
3.9.8
3.9.9

3-71
3-72
3-72
3-73
3-74
3- 7

JMP
JC
INC
JZ
INZ
JM
JP
JPE
IPO

JUMP
JUMP
JUMP
JUMP
JUMP
JUMP
JUMP
JUMP
JUMP

IF
IF
IF
IF
IF
IF
IF
IF

CALL
CC CALL IF CARRY
CNC CALL IF NO CARRY
CZ CALL IF ZERO
CNZ CALL IF NOT ZERO
CM CALL IF MINUS
CP CALL IF PLUS
CPE CALL IF PARITY EVEN
CPO CALL IF PARITY ODD

iii

Page No.

3.10 RETURN FROM SUBROUTINE INSTRUCTIONS
3. 10. 1
3. 10. 2
3.10.3
3.10.4
3.10.5
3.10. 6
3.10.7
3.10.8
3.10.9

RET RETURN
RC RETURN IF CARRY
RNC RETURN IF NO CARRY
RZ RETURN IF ZERO
RNZ RETURN IF NOT ZERO
RM RETURN IF MINUS
RP RETURN IF PLUS
RPE RETURN IF PARITY EVEN
RPO RETURN IF PARITY ODD

3.11 RST INSTRUCTION
3.12 INPUT/OUTPUT INSTRUCTIONS

3-84
3-85

3-88
3-89

3.13 HLT HALT INSTRUCTION
3.14 PSEUDO - INSTRUCTIONS

4.0

,3;:::79
3-79
3-80
3-80
3-81
3-81
3-82
3-83
3-83

3-86
3-87

3 • 1 2. 1 IN INPUT
3.12.2 OUT OUTPUT

3.14.1
3.14.2
3.14.3
3.14.4
3.14.5
3.14.6

3-78

ORG ORIGIN
EQU EQUATE
SET
END END OF ASSEMBLY
IF AND ENDIF CONDITIONAL ASSEMBLY
MACRO AND ENDM MACRO DEFINITION

3-90
3-91
3-93
3-94
3-95 .
3-96

PROGRAMMING WITH MACROS

4-1

4.1
4.2

WHAT ARE MAC ROS?
MACRO TERMS AND USE

4-1
4-5

4.2.1
4.2.2
4.2.3
4.2.4

4-5
4-7
4-8
4-9

4.3

MACRO DEFINITION
MACRO REFERENCE OR CALL
MACRO EXPANSION
PARAMETER SUBSTITUTION

REASONS FOR USING MACROS

1v

4-14

Page No.

4.4

USEFUL MACROS

4-15

4.4.1
4.4.2
4.4.3

4-15
4-16·

4.4.4
4.4.5

5.0

4-17
4-20
4-20

PROGRAMMING TECHNIQUES

5-1

5.1
5.2
5.3
5.4

5-1
5-4

5.5

6.0

LOAD ADDRESS MACRO
LOAD INDIRECT MACRO (WITHOUT SUBROUTINES)
MEMORY INCREMENT SUBROUTINE AND LOAD
INDIRECT MACRO (WITH SUBROUTINE)
OTHER INDIRECT ADDRESSING MACROS
CREATE INDEXED ADDRESS MACRO

BRANCH TABLES PSEUDOSUBROUTINE
SOFTWARE MULTIPLY AND DIVIDE
MULTIBYTE ADDITION AND SUBTRACTION
SUBROUTINES
TRANSFERRING DATA TO SUBROUTINES

"A"
"B"
"C"
"D"
"E"

5-13
5-15

6-1

INTERRUPTS

APPENDIX
APPENDIX
APPENDIX
APPENDIX
APPENDIX

5-9

INSTRUCTION SUMMARY
INSTRUCTION MACHINE CODES
INSTRUCTION EXECUTION TIMES
ASCII TABLE
BINARY-DECIMAL-HEXADECIMAL CONVERSION
TABLES

v

A-I
B-1
C-l

D-l

E-l

-- TERMS --

DESCRIPTION

TERMS
Address

A 14 bit number assigned to a memory location corresponding to its sequent~al position.

Bit

The smallest unit of information which can be repres ented. (A bit may be in one of two states, o· or I).

Byte

A group of 8 contiguous bits occupying a single memory

location.
Console

The INTELLEC 8 front panel, containing switches and
indicators that allow a user to operate the computer
and monitor program execution.

Instruction

The smallest single operation that the computer can
be directed to execute.

Obj ect Program

A program which can be loaded directly into the computer's
memory and which requires no alteration before execution.
An object program is usually on paper tape, and is produced by assembling (or compiling) a source program.
Instructions are represented by binary machine code in
an object program.

Program

A sequence of instructions which, taken as a group,
allow the computer to accomplish a desired task.

Source Program

A program which is readable by a programmer but which
must be transformed into object program format before it
can be loaded into the computer and executed. Instructions in an assembly language source program are represented by their assembly language mnemonic.

System Program

A program written to help in the process of creating
user programs.

User Program

A program written by the user to make the computer
perform any desired task.

TERMS

Word

A group of 16 contiguous bits occupying two
successive memory locations. (2 bytes).

nnnnB

nnnn represents a number in binary format.

nnnnD

nnnn represents a number in decimal format.

nnnnO

nnnn represents a number in octal format.

nnnnQ

nnnn represents a number in octal format.

ijklH

ijkl represents a number in hexadecimal format.

1 •a

INTRODUCTION

This manual has been written to help a design engineer program the INTEL
8008 microcomputer in assembly language, and to show why it is both economical and practical to do so. Accordingly this manual assumes that the
reader has a good understanding of logic, but is completely unfamiliar with
programming concepts.
For those readers who do understand programming concepts, several features of
the INTEL 8008 microcomputer are described below. They include:

•

8-Bit parallel CPU on a single chip.

•

48 instructions, including extensive memory reference
and jump on condition capability.

•

Direct addres sing for 16,384 bytes of memory •

•

Seven 8-bit registers, and a seven 14-bit re;ister stack.

INTEL 8008 microcomputer users will have widely differing programming needs.
Some users may wish to write a few short programs, while other users may have
extensive programming requirements.
For the user with limited programming needs, three system programs resident
on the INTELLEC 8 are provided; they are an Editor, an Assembler, and a System
Monitor. Use of the INTELLEC 8 and its three system programs is described
in the INTELLEC 8 Operator's Manual.
For the user with extensive programming needs, cross assemblers are available
which allow programs to be generated on any computer having a FORTRAN compiler whose word size is 32 bits or greater, limiting INTELLEC 8 use to final
checkout of programs only.
Whether a user's programming needs are limited or extensive, this manual
describes how to wtite efficient assembly language programs that may be
assembled either on the INTELLEC 8, or using a cross assembler.
The experienced programmer should note that the assembly language has a
macro capability which allows users to tailor the assembly language to
individual needs I yet still generate object programs which are compatible.
with any 8008 system. The value of this feature will qu1ckly become apparent
to the inexperienced programmer.

1-1

2. a

COMPUTER ORGANIZATION

This section provides the programmer with a functional overview of the
INTELLEC 8 computer. Information is presented in this section at a level
that provides a programmer with necessary background in order to write
efficient programs.
Functionally the computer can be divided into the following three blocks,
a s ill u stra ted in Figure 2 -1 :
•
•
•

Central Processing Unit
Memory
Input/Output and Output Modules

To the programmer, the computer is better represented a s consisting of the
following parts:
( 1) Seven working registers in which all data operations actually occur,
and which may therefore be visualized as a conduit through which
all data must flow. The seven working registers form part of the
Central Processing Unit.
(2) A stack, which is a device used to facilitate execution of subroutines I
as described later in this section. The stack forms part of the Central
Processing Unit.
(3) An arithmetic and logic unit which executes instructions and forms part
of the Central Processing Unit.
( 4) Memory, which is a pa ssive depository of data and instructions, and
must be addressed, byte by byte, in order to access stored information.
(5) Input/Output, which is the interface between a program and the real,
outside world.
The rest of Section 2 explains how the functional blocks of the 8008 computer
as illustrated in Figure 2-1 support its programming capabilities.

2-1

f'''-oH

r-- . - --I
I

8 Re~: 5 rl!!'''-$
l~

>

b~
.. ~
DI -

sto..c K
~,..; ~11V\<.L. t-i ~
4-l"'\d
a.A

I t!)~
~

to.

r .. l:-e,.",,,.

• ~

-.

t

ll ...

te::

t

QI6 ,~

I

t--r
,

1
h~.~~e ..

~

,:.

~
'-___ -1

rH

J:tl PUT /0 VtYvT
...,ot:lvL.~ S

Pe'l .. ; ~f'
; S t r -r_:,,__
. l\~ "ish;;.,. E;
~.C> .<;:~,
\e~, IS·t.Ql' L
'.e~

i

-

-

...,....

n.~ k.,.....u. ~ ~v...lI ~~~~
A ~

<" ..

-I

fJ r

~ ~J--- ~A-''*' ~

~w (Nrl'~,)~ ~-IV~~~_~~~'

>

2.1

THE CENTRAL PROCESSING UNIT

The entire 8008 Central Processing Unit is constructed on one LSI chip.
It consists of seven working registers, a seven register stack, and logic
to enable the INTELLEC 8 instruction set.
Conceptually, the 8008 is a multi-bus machine. Data transfers within the
CPU take place via an internal data bus. Data transfers between CPU and
memory occur via separate data-from-memory and data-to-memory buses.
Separate data input and output buses provide for communication between
CPU and peripheral devices.

2.1.1

WORKING REGISTERS

The 8008 provides the programmer with an accumulator and six additional "scratchpad" registers. The special significance of the accumulator is
that it is accessed by nearly all arithmetic and logical instructions, wherea s
only a limited number of data operations can involve the scratchpad registers.
The seven working registers are numbered and referenced via the integers
0, 1, 2, 3, 4, 5, 6; by convention working registers may also be accessed
via the letters A {for the accumulator}, B, C, D, E, Hand L. The Hand L
registers have special significance in that they are used to store memory
addresses, as described in Section 2.4. ] .
While in theory working registers could be used by the programmer in any way,
certain types of use either lend themselves to efficient programming, or are
forced on the programmer by the design of the computer. The following working
register assignments are recommended:

2-3

Register A

Most mathematical or logical operations act on,
and change the contents of this register. Use
register A as the destination for data operations,
never to save or store data.

Registers B, C, D, and E

Use these registers to transfer data between
program modules, and to store intermediate answers
during extended computations.

Registers Hand L

Use only for addres sing.

For the novice programmer, the above working register assignments will not yet
be meaningful, but the rationale for having such assignments will become clear
after examining the programming examples of Sections 3 and 4.

2-4

2.1. 2

THE STACK

The stack consists of seven 14 -bit registers used to hold memory addresses.
The concept of memory addresses is described in Section 2.2, but briefly stated,
memory can be visualized as a sequence of bytes (8 bit data units) numbered
sequentially from a to the highest memory byte present. The address of a memory
byte is the same a s its sequential number in memory. Having 14 bits, a stack
register can address up to 16,384 bytes of memory. (Addresses run from a to
11111111111111 B = 3FFFH = 16,383D, providing 16,384 memory addresses),
Stack operations consist of writing an address to the stack, and reading an
address from the stack. In order to understand these operations, it may be
helpful to visualalize the stack as seven registers on the surface of a cylinder,
as shown below:
...--- pOinter

a and b represent any
two memory addresses.
There is no top or bottom to the stack. Every stack register is adjacent to
two other stack registers. The 8008 keeps a pointer to the next stack register
available.
Writing an Address to the Stack:
To perform a stack write operation;
( 1)

The address is written into the register indicated by the pointer.

( 2)

The pointer is advanced to the next sequential register.

Any register may be used to hold the first address written to the stack. More
than seven addresses may be written to the stack; however, this will cause a
corresponding number of previously stored addresses to be overwritten und lost.
This is illustrated in Figure 2-2.

2-5

After 7 writes

After 6 writes

After 8. writes

a

a

h

b

b

b

c

c

c

d

d

d

e

e

e

f

f

f

g

g

a

I

b

I

C

I

die

I

fig

....

I

h represent any 8 memory addresses.
represents the stack pointer.

FIGURE 2-2.

Stack Write Operations.

Storing the 8th addres s (h) overwrites the first address stored (a).
Reading an address from the stack:
To perform a stack read operation;
(1 )

The pOinter is backed up one register.

(2)

The memory address indicated by the pointer is read.

The address read remains in the stack undisturbed. Thus if 8 addresses are
written to the stack and then three reads are performed, the stack wi!! appear
as in Figure 2-3.
I

2-6

First Read:
Address h is read

Second Read:
Address g is read

Third Read:
Address f is read

h

h

h

b

b

b

c

c

c

d

d

d

e

e

e

b

f

f

g

g

g

b

I

C

I

d,e

I

f,g

...

I

...

h represent any 7 memory addresses.
represent the stack pointer.

FIGURE 2-3.
Stack Read Operations.

The stack is zeroed when power is first applied to the 8008 or after a RESET
operation has occurred; thus if a stack read is performed from a stack register
which has not been written, a memory address of 0 will be read.
Section 2.4.5 describes how the stack is used by programs.

2 • 1 .3

ARITHMETIC AND LOGIC UNIT

The arithmetic and logic unit ALU of the 8008 computer provides the logic
for executing instructions. The representation of the ALU in Figure 2-115
sufficient for the programmer, who need know nothing about the ALU in order
to program the 8008.

2-7

2.2

MEMORY

The 8008 can be used with read only memory, programmable read only memory
and read/write memory. A program can cuase data to be read from any type of
memory ,but can only cause data to be written into read/write memory.
The programmer visualizes memory as a sequence of bytes, each of which may
store 8 bits (two hexadecimal digits). Up to 16,384 bytes of memory may be
present, and an individual memory byte is addressed by its sequential number,
between 0 and 16,383. The hexadecimal degits stored in a memory byte may
represent the encoded form of an instruction, or it may be data, as described
in Section 3.2.
2.3

COMPUTER PROGRAM REPRESENTATION IN MEMORY

A computer program consists of a sequence of instructions. Each instruction
enables an elementary operation such a s the movement of a data byte, an
arithmetic or logical operation on a data byte, or a change in instruction
execution sequence. Instructions are described individually in Section 3.
A program will be stored in memory as a sequence of hexadecimal digits which
represent the instructions of the program. The memory address of the next
instruction to be executed is recorded in a 14-bit register called the Program
Counter and thus it is possible to track a program as it is, being executed. Just
before each instruction is executed, the program counter is advunced to the address
of the next sequential instruction. Program execution proceeds sequentially
unless a transfer-of-control instruction (jump or call) is executed, which causes
the program counter to be set to a specified address. Execution then continues
sequentially from this new address in memory.
Upon examining the contents of a memory byte, there is no way of telling
whether- the byte contains an encoded instruction or data. For example, the
hexadecimal code lAR has been arbitrarily selected to encode the instruction
RAR ( rotate the contents of the accumulator right through carry); thus, the
value lAR stored in a memory byte could either represent the instruction RAR
.
'
. or It could represent the data value lAR. It is up to the logic of a program to
insure that data is not misinterpreted as a instruction code, but this is simply
done as follows:

2-8

Every program has a starting memory address, which is the memory address of
the byte holding the first instruction to be executed. Before the first instruction
is executed, the program counter will automatically be advanced to address the
next instruction to be executed, and this procedure will be repeated for every
instruction in the program. 8008 instructions may require I, 2, or 3 bytes to
encode an instruction; in each case the program counter is automatically advanced
to the start of the next instruction, as illustrated in Figure 2-4.
Memory
Address
0212
0213
0214
0215
0216
0217
0218
0219
021A
021B
021C
021D
021E
021F
0220
0221

Instruction
Number

}

I
I}
l

I

I

Program Counter
Contents

1

0213
0215

2
3

0216
0219

4
5

021B

6

021C
021F

7

8
9
10

Figure 2-4

0220
0221
0222

Automatic Advance of the Program Counter
as Instructions are Executed

In order to avoid errors, the programmer must be sure that a data byte does not
follow an instruction when another instnlctian is expected. Referring to
Figure 2-4, an instruction is expected in byte 021FH, since instruction 8 is
to be executed after instruction 7. If byte 021 FH held data, the program would
not execute correctly. Therefore, when writing a program, do not store data
in between adjacent instructions that are to be executed consecutively.
NOTE: Ita program stores data into a location, that location should not
normally appear among any program instructions. This is because user programs are normally executed from read-only memory, into which data cannot
be stored.

2-9

A class of instructions (referred to as transfer of control instructions) cause
program execution to branch to an instruction that may be anywhere in memory.
The memory address specified by the transfer of control instruction must be the
address of another instruction; if it is the address of a memory byte holding
data, the program will not execute correctly. For example, referring to Figure 2-4,
say instruction 4 specifies a jump to memory byte 021FH, and say instructions
5, 6 and 7 are replaced by data; then following execution of instruction 4, the
program would execute correctly. Buf if, in error, instruction 4 specifies
a jump to memory byte 021 EH, an error would result, since this byte now holds
data. Even if instructions 5, 6 and 7 were not replaced by data, a jump to
memory byte 02IEH would cause an error, since this is not the first byte of the
instruction.
Upon reading Section 3, you will see that it is easy to avoid writing an assembly
language program with jump instructions that have erroneous memory addresses.
Information on this subj ect is given rather to help the programmer who is debugging
programs by entering hexadecimal codes directly into memory.

2.4

MEMORY ADDRESSING

Each byte in memory has an address which is a 14 bit number corresponding to its
sequential location. Thus the range of addresses is 0 to 16,383 (the highest number
which can be represented in 14 bits). The address of a memory location can Oe
held in memory in two consecutive 8 bit bytes; normally the least significant
8 bits of the address are held in one byte, and the most significant 6 bits of the
address are held in the next byte.
By now it will have become apparent that addressing specific memory bytes
constitutes an important part of any computer program; there are a number of
ways in which this can be done, as described in the following subsections.

2-10

2.4.1

DIRECT ADDRESSING

With direct addressing, as the name implies, an instruction provides an
exact memory address. The following instruction provides an example of
direct addressing:
"Load the contents of memory byte I F2AH into the accumulator ( Register A )"
1 F2AH is a direct address. Direct addressing is the principal means used by
the INTELLEC 8 to address memory, and the Hand L registers are used to
hold the direct memory address. For example, the direct addressing instruction
described above might be illustrated as follows:

Arbitrary
Memory
Address
any

IF29
IF2A
IF2B

I(

Memory

Reoisters

A
B

C7

C

instruction being
executed

f

D
E
H

2 A

L

I

~

The instruction encoded by the digits C7H is being executed, and is, in fact,
interpreted to mean:
Load register A ( the accumulator) with the contents of the memory byte whose
address is provided by the Hand L registers.
~

and call instructions on the 8008 provide a special case of direct addressing where the direct address is stored in the two consecutive memory bytes
following the instruction code byte. The low order eight bits of the address are
stored in the first (lower addressed) byte I while the high order six bits of the
address are stored in the second (higher addressed) byte.
I

Thus the instruction:
"Jump to memory location IF22"
would appear in memory as follows:

2-11

Arbitrary Memory
Address
any

any + 1
any + 2

Memory

IF,
44

~----I

22

IF20
IF21
IF22
IF23

2-12

------- Jump

t

instruction code

-Address to which jump is

directed

2.4.2

INDEXED ADDRESSING

An indexed address is computed as the sum of two numbers, a base address
and an index. For example, a table may be one hundred bytes long, in which
case the address of any byte is computed as the address of the table origin
( base address), plus the displacement of the byte from the table origin
( index). On the 8008 the Hand L registers will commonly be used
to hold the base address, while either one or two of the registers B,C,D
and E ( but not A ) will hold the index. If one index register is used, tables
cannot be longer than 256 bytes. If two registers are used to store the index
portion of the address, tables can be as large as memory. Figure 2-5 illustrates
the concept of indexed addressing.

Arbitrary
Memory
Address
2130
2131
2132
2133
2134

Req:i sters

,~

A
B

C

I,

2220
2221
2222
2223

i~

Figure 2-5

Fl

D Index
E

21
30

~} Base

Address

Addressed Byte

Indexed Address, Formed by Hand L Register
(Base) Plus D Register ( Arbitrarily Selected as
Index Register)

Indexed addressing can easily be accomplished on the 8008 by writing a sequence
of instructions referred to as a Macro. (See Section 4.4).
2.4.3

INDIRECT ADDRESSING

An indirect address specifies where in memory a direct address is to be
found. The concept of indirect addressing as applied to the 8008 is
illustrated in Figure 2-6.
I

2-13

Arbitrary
Memory
Address
Memory
any

..

I

I

I

lCll
lC12
lC13
lC14

A

I

13
lC
,
,

Reqisters

I

.'

,

OF02
OF03
OF04
OFOS

Instruction being executed

I
I
I

!~l

~I--

B

OF
03

C
D
E
H
L

This memory byte being referenced

Figure 2-6 Indirect Addressing
In Figure 2-6, the instruction being executed specifies that the address of the
memory byte to be referenced is stored in two memory bytes pOinted to by the
Hand L registers. The Hand L registers contain the memory address OF03H;
therefore the address of the memory byte to be referenced is to be found in
memory bytes OF03H and OF04H. These two memory bytes hold the address
lCI3H, which becomes the referenced memory location. Note that the address
is stored with the least significant 8 bits in the lower addressed memory location
(OF03H) ,while the most significant 6 bits are stored in the higher addressed
location (OF04H). This is the usual method for storing addresses in the 8008.
Indirect addressing on the 8008 can also be accomplished by writing a macro
a s described in Section 4.4.
2.4.4

IMMEDIATE ADDRESSING

An immediate instruction is one that provides its own data. The following is an
example of immediate addressing:
Load register A (the accumulator) with the value 2 EH.
The above instruction would be coded in memory as follows:

2-14

Memory

06

2E

.......

Load accumulator immediate
Value to be loaded into accumulator

Immediate instructions do not reference memory; rather they store data in the
memory byte directly following the instruction code byte.

2.4.5

SUBROUTINES AND USE OF THE STACK FOR ADDRESSING

Before understanding the purpose or effectiveness of the stack
to understand the concept of a subroutine.

I

it is necessary

Consider a frequently used operation such as addition. The INTELLEC 8 provides instructions to add one byte of data to another byte of data, but what
if you wish to add numbers outside the range of 0 to 255 (the range of one
data byte)? Such addition will require a number of instructions to be executed in sequence. It is quite possible that this addition routine may be
required many times within one program; to repeat the identical code every
time it is needed is possible, but very wasteful of memory:

,.
I

I Program
'I

1

-&!Qition
j

•

I Program

.

Addition

I

1 Program

I

,

AddItion
I

etc

2-15

A more efficient means of accessing the addition routine would be to store
it once, and find a way of accessing it when needed:

I

Program
Program

I

I
I~

I
-.,............

... 'Mdition

-

I

Program

I

I
I

l

A frequently accessed routine such a s the addition above is called a subroutine, and the 8008 provides instructions that call subroutines and return
from subroutines.
When a subroutine is executed, the sequence of events may be depicted
as follows:
Main Pro ram

Call instruction __________
~Subroutine

~~------

The arrows indicate the execution s.equence.
When the "Call" instruction Is executed, the address of the "next" instruction is written to the stack. (See Section 2.1.2), and the subroutine is executed. The last executed instruction of a subroutine will always be a special
"Return Instruction", which reads an address from the stack into the program
counter, and thus causes program execution to continue at the" Next" instruc-:tion as illustrated on the next page.

2-16

Memory
Address
OC02
OC03
OC04
OCOS
OC06

Write address of next instruction OC06H to the stack.
Instruction

CALL SUBROUTINE
02

Branch to
subroutines
starting at
OF02H

or

NEXT INSTRUCTION

oroo
OrOl
Or02
OF03

OF4E
OF4F

FIRST SUBROUTINE INSTRUCTION _...----4-.....1
Return to
next instruction
Body of subroutine

RETURN

~

2-]7

READ return address

( OC06H ) from stack

Since the stack provides seven registers, subroutines may be nested up to
seven deep; for example, the addition subroutine could itself call some other
subroutine, and so one. An examination of the sequence of write and read
stack operations will show that the return path will always be identical to the
call path, even if the same subroutine is called at more than one level; however, an attempt to nest subroutines to a depth of more than 7 will cause the
program to fail, since some addresses will have been overwritten.

2.5

CONDITION BITS

To make programming ea sier, four condition ( or statu s) bits are provided by
the 8008 to reflect the results of data operations. The descriptions
of individual instructions in Section 3 specify which condition bits are
affected by the execution of the instruction, and whether the execution of the
instruction is dependent in any way on prior status of condition bits.
In the following discussion of condition bits, a bit is "set" to I, and
reset" to O.
II

2 . 5. 1

CARRY BIT

Certain data operations can cause un overflow out of the high order 7 - bit.
For example addition of two numbers euch of which occupies one byte can
give rise to an answer that does not fit in one byte:
I

I

I

76543210
10101110
01110100

+ AE

74
122

Bit No.

00100010

Carry == 1
An operation that results in a carry out of bit 7 will set the carry bit.
An operation that could have resulted in a carry out of bit 7 but did not will

2-18

reset the carry bit.
NOTE: The 8008 subtract and compare operations (SUB, SBB SUI, SBI, CMP,
CMI)" are exceptions to the above rules. See the appropriate sections for details.
I

2.5.2

SIGN BIT

As described in Section 3.2.1, it is possible to treat a byte of data as having
the numerical range -128 10 to +127 10 , In this case by convention the 7 bit
will always represent the sign of the number; that is, if the 7 bit is 1, the
number is in the range -12810 to -1. If bit 7 is 0, the number is in the range
o to +127 10 ,
At the conclusion of certain instructions (as specified in the instruction description sections of Section 3), the sign bit will be set to the condition of the answer
7 bit in order to reflect the sign of the answer.

2.5.3

ZERO BIT

This condition bit is set if the answer generated by the execution of certain instructions leaves a zero result in a register. The zero bit is reset if the result
is not zero.
A result that has an overflow but a zero answer byte, as illustrated below, will
alos set the zero bit:

Overflow out
of bit 7.

~

I

76543210
10100111 +
01011001
00000000

Zero Answer
Zero bit set to 1.

2-19

Bit Number

2.5.4

PARITY BIT

In order to check that a data transfer operation occurred accurately, byte
"parity" is checked. The number of I bits in a byte are counted, and if the
total is odd, "odd" parity is flagged; if the total is even, "even" parity
is flagged.
The parity bit is set to I for even parity, and is set to 0 for odd parity.

2-20

3.0

THE 8008 INSTRUCTION SET

This section describes the 8008 assembly language instruction set.
For the reader who understands assembly language programming, Appendix
"A" provides a complete summary of the 8008 instructions.
For the reader who is not completely familiar with assembly language, Section
3 describes individual instructions with examples and machine code equivalents.

3.1

ASSEMBLY LANGUAGE

3.1. 1

HOW ASSEMBLY LANGUAGE IS USED

Upon examining the contents of computer memory a program would appear as
a sequence of hexadecimal digits which are interpreted by the CPU as
instruction codes, addresses or data. It is possible to write a program as
a sequence of digits ( just as they appear in memory), but that is slow and
expensive. For example, many instructions reference memory to address
either a data byte or another instruction:
I

I

I

Memory Addres s
1432
1433
1434
1435
1436

11
2

14C3
14C4
14CS
l4C6

36
F8

3-1

Assuming the registers Hand L contain 14H and C3H respectively, the program
operates as foHows:
Byte 1432 specifies that the accumulator is to be loaded with the contents of
byte 14C 3.
Bytes 1433 through 1435 specify that execution is to continue with the instruction starting at byte l4C4.
Bytes 14C4 and 14C5 specify that the L register is to be loaded with the
number "36" H.
Byte 14C6 specifies that the contents of the accumulator are to be stored in
byte 1436.
Now suppose that an error discovered in the program logic necessitates
placing an extra instruction after byte 1432. Program code would have to
change as follows:

Memory Address

Old Code

1432
1433
1434
1435
1436
1437
14"C3
l4C4
14C5
14C6
14C7

C7
44
C4
14

.

E2
36
36
F8

New Code
C7
New Instruction
44
C5
14

E2
36
37
F8

Most instructions have been moved and as a result many must be changed to
reflect the new memory addresses of instructions or data. The potential
for making mistakes is very high and is aggravated by the complete unreadabilHy of the program.

3-2

Writing programs in assembly language is the first and most significant step
towards economical programming; it provides a readable notation for instructions, and separates the programmer from a need to know or specify absolute
memory addresses.
Assembly language programs are written as a sequence of instructions which
are converted to executable hexadecimal code by a special program called
an ASSEMBLER. Use of the INTELLEC 8 assembler is described in the
INTELLEC 8 Operator's Manual.

Assembly language
program written by
programmer

ASSEMBLER
PROGRAM

SOURCE PROGRAM

~

Executable hexadecimal machine
code

OBJECT PROGRAM

Figure 3-1
Assembler Program Converts Assembly Language Source Program
to Hexadecimal Object Program

As illustrated in Figure 3-1, the assembly language program generated by a
programmer is called a SOURCE PROGRAM. The assembler converts the
SOURCE PROGRAM into an equivalent OBJECT PROGRAM, which consists of a
sequence of hexadecimal codes that can be loaded into memory and executed.

3-3

For example:

Source Program

is converted by the
As sembler to

One Possible Version of
the Objectjrogram

NOW:

MOV
CPI
JZ

A,B
'C'
LER

Cl
3C43
687C3D

LER:

MOV

M,A

F8

Now if a new instruction must be added, only one change is required. Even
the reader who is not yet familiar with assembly language will see how simple
the addition is:

NOW:

LER

A,B
MOV
(New instruction inserted here)
CPI
'C'
JZ
LER
MOV

M ,A

The assembler takes care of the fact that a new instruction will shift the rest of
the program in memory.

3.1. 2

STATEMENT MNEMONICS

Assembly language instructions must adhere to a fixed set of rules as described
in this section. An instruction has four separate and distinct parts or FIELDS.
Field 1 is the LABEL field. It is the instruction's label or name
to reference the instruction.

3-4

I

and it is used

Field 2 is the CODE field,
the instruction,

It defines the operation that is to be performed by

Field 3 is· the OPERAND field,
needed by the CODE field,

It provides either any addres s or data information

Field 4 is the COMMENT field, It is present for the programmer's convenience
and is ignored by the assembler ,. The programmer uses comment fields to
describe the operation and thus make the program more readable,
The assembler uses free fields; that is, any number of blanks may separate
fields,
Before describing each field in detail, here are some general examples:

Label

Code

Operand

Comment

HERE:

MVI

C,O

Load the C register with zero

THERE:

DB

3AR

Create a one-byte data constant

LOOP:

ADD

E

Add contents of E register
to the accumulator
Rotate the accumulator left

RLC

3.1.3

LABEL FIELD

This is an optional field, which, if present, may be from I to 5 characters long,
The first character of. the label must be a letter of the alphabet or one of the
special characters @ (at sign) or? (question mark). A colon (:) must follow
the last character, (The operation codes, pseudo - instruction names, and
register names are specially defined within the assembler and may not be used
as labels. Operation codes are given in sections 3.2 - 3,13 and Appendix
A; pseudo - instructions are described in section 3,14.)

3-5

Here are some examples of valid label fields:
LABEL:

F14F:
@HERE:
?ZERO:
Here are some invalid labels:
123:

begins with a decimal digit

LABeL

does not cnd with a colon

ADD:

is an operation code

END:

is a pseudo - instruction

The following label has more than five characters; only the first five will be
recogniz ed:
INSTRUCTION:

will be read as INSTR:

Since labels serve a s instruction addresses, they cannot be duplicated.
example, the sequence:
HERE:

IMP

For

THERE

THERE:

MOV

C,D

THERE:

CALL

SUB

is ambiguous; the assembler cannot determine which THERE: address is to be
referenced by the IMP instruction.
One instruction may have more than one label, however.

3-6

The following sequence

is valid:
LOOPI:
LOOP2:

First label
MOV

C,D

JMP

LOOPI

JMP

LOOP2

Second label

Each IMP instruction will cause program control to be transferred to the same
MOV instruction.
3.1. 4

CODE FIELD

This field contains a code which identifies the machine operation (add, subtract,
jump, etc.) to be performed: hence the term operation code or op-code. The
instructions described in sections 3.2 - 3.13 are each Identift·3d by a mnemonic
label which must appear in the code field. For example, since the "jump" instruction is identified by the letters "JMP", these letters must appear in the
code field to identify the instruction as "jump".
There must be at least one space following the code field.
HERE:

JMP

Thus:

THERE

is legal, but:
HERE:

IMPTHERE

is illegal.
3.1. 5

OPERAND FIELD

This field contains information used in conjunction with the code field to define
precisely the operation to be performed by the instruction. Depending upon the
code field, the operand field may be absent or may consist of one item or two
items separated by a comma.
There are four types of information [(a) through (d) below] that may be requested
as items of an operand field, and the information may be specified in nine ways
[(1) through (9) below].

3-7

The nine ways of specifying information are as follows:
( I)

Hexad.ecimal data. Each hexadecimal number must be fonowed by the
letter 'H' and must begin with a numeric digit ( 0 - 9 ).
Example:

Operand

Label
MVI

HERE:

C,OBAH

Comment
Load register C with the
hexadecimal number BA

( 2)

Decimal data. Each decimal number may optionally be followed by the
letter 'D', or may stand alone.
Example:

Comment

Label

( 3)

E, 105

MVI

ABC:

Load register C with 105

Octal data. ,Each octal number must be followed by one of the letters
'0' or 'Q'.
Example:

Label
LABEL:

Operand
A, 720

MVI

3-8

Comment
Load the accumulator with
the octal number 72

( 4)

Binary data.

Each binary number must be followed by the letter 'B'.

Example:
Label

Code

Operand

NOW:

MVI

lOB

JUMP:

JMP

0010111011111010B

( 5)

I

Comment

11ll01l0B

Load register two ( the C
register) with OF6H
Jump to memory address
2EFA

The current program counter. This is specified as the character $' and
is equal to the address of the current instruction.
I

Example:

Label

Operand

GO:

JMP

$ + 6

The instruction above causes program control to be transferred to the
address 6 bytes beyond where the JMP instruction is loaded.
( 6) An ASCII constant. This is one or more ASCII characters enclosed in
Single quotes. Two successive single quotes must be used to represent
one single quote within an ASCII constant. Appendix D contains a list of
legal ASCII characters and their hexadecimal representations.
Example:

Label
CHAR:

Operand
MVI

E, '*'

3-9

Comment
Load the E r8Jister with the
eight bit ASCII representation
of an a steri sk

( 7) Labels that have been assigned a numeric value by the assembler. (See
section 3.16.2 for the equate procedure). The following equates are built
into the assembler and are therefore always active:
A
B

C
D

E
H
L
M

equated to 0 representing the accumulator
register B
" I
"
2
C
"
"
"
3
D
"
"
"
"
"
E
"
"
" 4
H
"
"
" 5
"
" 6
L
"
"
"
"
a memory reference
"
" 7
fI

fI

Exam21e:
Suppose VALUE has been equated to the hexadecimal number
9FH. Then the following instructions all load the D register
with 9FH:
Label

°2erand

AI:

MVI
MVI
MVI

A2:

A3:

( 8)

D, VALUE
3,9FH
3, VALUE

Labels that appear in the label field of another instruction.
Exam2le:

Label

Code

°2erand

HERE:

JMP

THERE

THERE:

MVI

D,9FH

3-10

Comment
Jump to instruction at THERE:

(9)

Arithmetic and logical expressions involving data types (1) to (8)
above connected by the arithmetic operators + (addition), - (unary
minus and subtraction), * (multiplication), / (division), MOD
(modulo), the logical operators NOT, AND, OR, XOR, SHR, (shift
right), SHL (shift left), and left and right parentheses.

All operators treat their arguments as 16 bit quantities, and generate 16 bit quantities as their result. The programmer must insure that the result generated fits
the reqUirements of the operation being coded. . For example, the second operand
of an MVI instruction must be an 8 bit value.
Therefore the instruction:
MVI

H,NOT

0

is invalid, since NOT 0 produces the 16 bit hexadecimal number FFFF.
the instruction:
MVI

H, NOT

0

AND

However,

OFFH

is valid, since the most significant 8 bits of the result are insured to be 0,
and the result can therefore be represented in 8 bits.
The SHR and SHL operators are linear shifts which cause zeroes to be shifted
into the high order and low order bits, respectively, of their arguments.
NOTE: An instruction in parenthesis isa legal expression in an optional field.
Its value is the encoding of the instruction.
Examples:

Operand

Label
HERE:

MVI

H, HERE SHR 8

Arbitrary Memory Addres s
2EIA

The above instruction loads the hexadecimal number 2EH (l4-blt address of HERE
shifted right 8 bits) into the H register.

3-11

Operand
NEXT:

MVI

D,

34 + 40H/2

The above instruction will load the value 34 + (64/2) = 34 + 32 = 66 into the D
register.

Operand
INS:

DB

(ADD

C)

The above instruction defines a byte of value 82H (the encoding. of ADD C instruction) at location INS:.
.

Operand

NEXT:

MVI

D, 34 + 40H/2

The above instruction will load the value 34 + (64/2) = 34 + 32 ~ 66 into the D
register.
Operators within an expression are evaluated in the following order:

1.
2.
3.
4.

Left and right parentheses
*,/, MOD, SHL, SHR
+, - (unary and binary)
NOT
5. AND
6. OR
XOR
Thus the instruction:
MVI

D, (34 + 40H) /2

will load the value
(34 + 64 ) /2 = 49 into the D register.
The operators MOD, SHL, SHR, NOT, AND, OR, and XOR must be separated
from their operands by at least one blank. Thus the instruction:
MVI

C, VALUE ANDOPH

is invalid.
Using some or all of the above nine data specifications, the following four types
of information may be requested:
(a) A register ( or code indicating memory reference) to serve as the source or
destination in a data operation - Methods I, 2, 3, 4, 7, or 9 may be used
to specify the register or memory reference, but the specification must
finally evaluate to one of the numbers 0 - 7 as follows:

~

Register
A (accumulator)

o

1

B
C

2

D

3
4
5
6
7

E

H
L
Memory Reference

3-12

Example:
Label
INS1:
INS:Z:
INS3:

Code

Operand

MVI
MVI
.MVI

REG4, 2EH
4H, 2EH
8/2, 2EH

Assuming REG4 has been equated to 4, all the above instructions will load
the value 2EH into register 4.
(b) Immediate data, to be used directly as a data item.
Example:

Label

Code

HERE:

MVI

Operand
H, DATA

Oomment
Load the H register with
the value of DATA

Here are some examples of the form DATA could t(lke:
ADDR AND OFFH (where ADDR is a 14-bit address)
127

'.'
VALUE (where
VALUE has been equated
to a number)
.
.
3EH + 10 / ( 2 AND 2 )
(c) A 14 -bit address, or the label of another instruction in memory.

3-13

Example:

Operand

Label

JMP
JMP

HERE:

THERE
2EADH

Comment
rump to the instruction at THERE
Jump to addres s 2 EAD

(d) A number in a specific range, required by certain instructions.
The RST and IN instructions require a number in the range 0 - 7 •
Example:

Label

,Code
-

GOOD:

RST

lUB

Value of 7, valid

OK:

IN

15 - OAH

Value of 5, valid

BAD:

RST

Operand

10

Comment

Value of 10, invalid instruction

The OUT instruction requires a number in the range 8 - 31 decimal.
Example:
Label

~

, Operand

GOOD:

OUT

20 + 11

Value 31 decimal, valid

BAD:

OUT

20 + 11 H

Value 37 decimal, invalid

3-14,

Comment

The INR and DCR instructions require a number in the range 1 - 6, specifying
one of registers B, C, D, E, H, or L.
Example:
Label

Operand

OK:

3.1. 6

Comment

INR

4

Increment register E

INR

110B

Decrement register L

COMMENT FIELD

The only rule governing this field is that it must being with a semi colon
(;)

.

HERE:

MVI

C, 0 ADH

; This Is a comment

A comment field may appear alone on a line:

Begin loop here

3.2

DATA STATEMENTS

This section describes ways in which data can be specified in and interpreted by a program. Any 8 bit byte contains one of the 256 possible combinations of zeros and ones. MY particular combination may be interpreted
in various ways. As previously mentioned, the code IAH may be interPreted
as a machine instruction ( Rotate Accumulator Right through Carry), as a
hexidecimal value lAH = 26D, or merely as the bit pattern 00011010

Arithmetic instructions assume that the data bytes upon which they operate are
in a special format called "two's complement", and the operations performed
on these bytes are called "two's complement arithmetic. "

3-15

3.2.1

TWO'S COMPLEMENT

When a byte is interpreted as a signed two's complement number, the low
order 7 bits supply the magnitude of the number, while the high order bit is
interpreted as the sign of the number ( 0 for positive numbers, 1 for negative) .
The range of positive numbers that can be represented in signed two's complement notation is, therefore, from 0 to 127:

o

=

00000000 B

=

OR

1

=

00000001 B

=

IH

126D ==

011111110 B

=

7EH

127D =

011111111

:::-

7FH

B

To change the sign of a number represented in two's complement, the following
rules are applied:
(a) Invert each bit of the number ( producing the so-called one's
complement) .
(b) Add one to the reSUlt, ignoring any carry out of the high order
bit position.
Example: Produce the two's complement representation of - lOD.
the rules above,

Following

+ laD = 0 a a 0 1 0 1 0
Invert each bit
Add one

1 1 1 1 01 0 I
1 1 1 1 aI 1 0

Therefore the two's complement representation of - IOD is F6H.
the sign bit is set indicating a negative number.)
I

(Note that

I

Example: What is the value of 86 H interpreted as a signed two'S complement
number? The high order bit is set, indicating that this is a negative
number. To obtain its value again invert each bit and add one.
I

3-16

=

86H
Invert each bit
Add one

1 0 0 0 0 110

8

011110018
011110108

Thus, the value of 86 H is - 7A H

= - 122

D

The range of negative numbers that ean be represented in
plement notation is from -I to -128.

=

- 2 =

1 III 111 1 8
111111108

=
=

FFH
FEH

=
=

10000001B
10000000B

=

81H
80H

-I

-127D
-128D

=

~gned

two's com-

To perform the subtraction IAH - OCH, the following operations are performed:
Take the two's complement of OCH

= F4H

Add the result to the minuend:
lAH = 0 0 0 1 1 0 1 0
F4H = 1 1 1 1 0 1 0 0
o0 0 0 1 1 1 0

+ (-OCH) -

= OEH

the correct answer

When a byte is interpreted as an unsigned two's complement number, its value
is considered positive and in the range 0 to 255 10 :

o0
o0

000 000 8
000 001 8

=

=

=

01111111 B
1 000 0 0 0 0 8

=

7FH
80H

=

111111 1 1 B

:-

FFH

0
1

=

127D
128D

=

255D

=

=

OH
IH

Twois complement arithmetic is still valid. When performing an addition operation,
the earlY bit is set when the result is greater than 255D. When performing subtraction, the cafIY bit is reset when the result is positive. If the carry bit is
set, the result is negative and present in its two's complement form.

3-17

Example: Subtract 98D from 197D using unsigned two's complement arithmetic.

Overflow

197D =
-98D =
"1

1 1 0 0 0 1 0 1 = C5 H
1 0 0 1 1 1 1 0 = 9 EH
o 1 1 0 0 0 1 1 = 63H = 99D

Since the overflow out of bit 7=1, indicating that the answer is correct and
positive, the subtract operation will reset the carry bit.
Example:

Subtract 15D from 12 D using unsigned two's complement arithmetic.

l2D =
-lSD =
Overflow
.. 0

o0

0 0 1 1 0 0 = OCH
1 1 1 1 0 0 0 1 = OFlH
1 1 1 1 1 1 0 1 = -3D

Since the overflow out of bit 7=0, indicating that the answer is negative and in
its two's complement form, the subtract operation will set the carry bit. (This
also indicates that a "borrow" occurred while subtracting multibyte numbers.
See Section S. 3) •
NOTE: The 8008 instructions which perform the subtraction operation are SUB,
SUI, SBB, SBI, CMP, and CM!. Although the same result will be obtained by
addition of a complemented number or subtraction of an un complemented
number, the resulting carry bit will be different.
Example:

If the result -3 is produced by performing an "ADD" operation on the
numbers +12D and -lSD, the carry bit will be reset; if the same
result is produced by performing a "SUB" operation on the numbers
+12D and +15D, the carry bit will be set. Both operations indicate
that the result is negative; the programmer must be aware which
operations set or reset the carry bit.

"ADD" +12D and -15D

"SUB" +lSD from +12D

+12D = o 0 001 100
+(-lSD) = 1 1 1 1 000 1
0] 1 1 1 1 1 1 0 1 = -3D
L.-causes carry to be reset

+12D = 0 0 0 0 1 1 0 0
- (+15 D) = 1 1 1 1 0 0 a 1
0]
1 1 1 1 1 1 0 1 = -3D
~auses carry to be set

WIN TWO'S COMPLEMENT?
Using two's complement notation for negative numbers, any subtraction problem
becomes a sequence of bit inversions and additions. Therefore, fewer circuits
need to be built to perform subtraction.
3-19

3.2.2

DB DEFINE BYTE (S) OF DATA

Format:
Label

Operand

HERE:

DB

LIST

LIST is a Ust of either:
1) Arithmetic and logical expressions involving any of the arithmetic
and logical operators, which evaluate to eight-bit data quantities
2) Strings of ASCII characters enclosed in quotes
Description: The eight bit value of each expression, or the eight bit ASCII
representation of each character is stored in the next available byt(~ of memory
starting with the byte addressed by HERE:

Examples:

Instruction
HERE:
WORD I :
WORD 2
SIR:
MINUS:

Assembled Data (hex)
DB
DB
DB
DB
DB

OA3H
5 * 2, 2 FH - OAH
5ABCH SHR 8
lSTRINGSp1 1
- 03H

A3
OA25
5A
53545 2494E4 72 031
FD

Note: In the first example above, the hexadecimal value A3 must be written as
OA3 since hexadecimal numbers must start with a decimal digit. (See
Section 3. 1 .5) .

3-20

3.2.3

DW DEFINE WORD (TWO BYTES) OF DATA

Format:
Label

Operand
DW

HERE:

LIST

LIST is a list of expressions which evaluate to 16 bit data quantities.
Description: The least significant 8 bits of the expression are stored in the
lower addres s memory byte (HERE:), and the most significant 8" bits are stored
in the next higher addressed byte (HERE:+l). This reverse order of the high and
low address bytes is normally the case when storing addresses in memory. This
statement is usually used to create address constants for the transfer-of-control
instructions: thus LIST is usually a list of one or more statement labels appearing
elsewhere in the program.
Examples:
Assume CaMP addresses memory location 3BICH and FILL addresses memory
location 3EB4.

Instruction
ADDl:
ADD2:
ADD3:

Assembled Data (hex)
DW
DW
DW

CaMP
FILL
3COIH

I

3CAEH

IC3B
B43E
Ol3CAE3C

Note that in each case, the data are stored with the least significant 8 bits first.

3-21

3.2.4

DS

QEFINE .§TORAGE ( BYTES)

Format:
Label

Code

HERE:

DS

Operand
EXP

EXP is a single arithmetic or logica 1 expression.
Description: The value of EXP specifies the number of memory bytes to be
reserved for data storage. N:> data values are assembled into these bytes:
in particular the programmer should not assume that they will be zero, or any
other value. The next instruction will be assembled at memory location
HERE: + EXP ( HERE: + 10 or HERE: + 16 in the example below).

Examples:

HERE:

DS
DS

10

lOH

3-22

Reserve the next 10 bytes
Reserve the next 16 bytes

3.3

SINGLE REGISTER INSTRUCTIONS

This section describes the two instructions which involve a single register.
Instructions in this class occupy one byte as follows:

Ia

a

R

E ,G

I

0

4. . .___---JJO for IN R
1 for DCR

Loot
010

all

100
101
110

Note: REG

F 000

for
for
for
for
for
for

register
register
register
register
register
register

B

C
D
E
H

L

or 111

The general assembly language instruction format is:

Operand

Label
LABEL:

OP

t

REG
I....-_ _ _ _ _ _~B/C/D/E/H/L

---:INR or DCR

I....-_ _ _ _ _ _ _ _

L...-_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

3-23

Optional instruction label

3.3.1

INR

INCREMENT REGISTER

Format:
Label

Code

Operand

Description: The register specified by REG is incremented by one. REG
cannot evaluate to 000 or 111, implying that neither the accumulator nor any
memory location can be incremented by this instruction.
Condition bits affected: Zero, sign, parity
Example:

If register C contains 99H, the instruction:

INR

C

will cause register C to contain 9AR.

3.3.2

DCR

DECREMENT REGISTER

Format:
Label

Code
DCR

Operand
Rr:G

Description: The register specified by REGis decremented by one. REG
cannot evaluate to 000 or Ill, implying that neither the accumulator nor
any memory location can be deqremented by this instruction.

3-24

Condition bits affected: Zero
Example:

I

sign

I

parity

If register L contains zero, the instruction:

DCR

L

will cause register L to contain OFFH
(minus one in two's complement form)

3.4

MOV INSTRUCTION

This section describes the MOV instruction, which transfers data between registers or between memory and registers. This instruction occupies one byte.
Format:
Label

Code

Operand

,

MOV

(1

1

I

D

S

-f
Tis

t

R

t

C

000
001
010
011
100
101
110
III

Note: DDD and SSS cannot both

=

for register A
for register B
for register C
for register D
for register E
for register H
for rp.qister L
for memory reference

III B.

Description: One byte of data is moved from the register specified by SRC ( the
source register) to the register specified by DST ( the destination register).
The data replaces the contents of the destination register; the source re-

3-25

gister remains unchanged. If a memory reference is specified ( SRC or DS'F
= IllB ) the data is fetched from or stored into the memory address contained in the Hand L registers. Register L contains the low-order eight
bits of the address and register H contains the high-order six bits of the
address.
I

Condition bits affected: none
Example 1:

Label

Operand
MOV

A,r:

Comment
Move contents of the E register
to the A register

MOV

D, D

Move contents of the D register
to the D register Ii. e. I this is
a null operation

Note: Any of the null operation instructions MOV X, X can also be specified as N
( no-operation) .
Example 2:
The following set of instruction will store the contents of the accumulator
at memory location 2BE9H.

Label

Code

Operand

START:

MVI
MVI
MOV

H, 2BH
L, OE9H
M,A

3-26

Comment
H = high order address byte
L = low order address byte
Move accumulator to memory

Example 3:
The following set of instructions will store the D register at memory location
FINAL:, wherever that location happens to be in memory.

Operand

Label
START:

MVI
MVI
MOV

H FINAL SHR 8
L, FINAL AND OFFH
M,D
I

Comment
H = high order byte
L = low order byte
Move D to memory
addressed by Hand L

The first two instructions in the example above are so commonly used that
they may be specified by the single macro instruction:
START:

LXI

H,FINAL

as described in Section 4.2.1.

3-27

3.5

REGISTER OR MEMORY TO ACCUMULATOR INSTRUCTION S

This section describes the instructions which operate on the accumulator
u sing a byte fetched from another regi ster or memory. In struction s in this
class occupy one byte as follows:

I
000
001
010
011
100
101
110
111

for
for
for
for
for
for
for
for

ADD
ADC

1I 0

I~ I
t 1
P
I

R

I

E

IG

SUB
SBB

ANA
XRA
ORA

CMP

000
001
010
011
100
101
110
111

for
for
for
for
for
for
for
for

register
register
register
register
register
register
register
memory
reference

When a memory reference is specified, the byte of data is fetched from the
memory location addressed by registers Hand L.
The general assembly language instruction format is:

3-28

A
B

C
D
l~

H
L

Operand

Label

REG

LABEL:

tL..___A, B, C, 0, E, H, L, or M
ADC; SUB, SBB, ANA, XRA, ORA, or CMP
'--_ _ _ _ _ _ _ _ _ _O.ptionalinstruction label

3.5.1

ADD

ADD REGISTER OR !v1EMORY TO ACCUMULATOR

Format:
Operand

Code

REG

/'

Description: The byte in the register specified by REG, or the memory location addressed by Hand L ( if REG=111B) is added to the contents of
the accumulator using two's complement arithmetic. The result is kept
in the accumulator; the byte in REG is unchanged.
I

If there is a carry out of the high-order bit position, the carry bit is set.

The zero bit is set if the result is zero.
The parity bit is set if the result contains an even number of ones ( even
parity) .
The sign bit is set to the most significant bit of the result.
Condition bits affected: Carry, sign, zero, parity

3-29

Example 1:

Label

Operand

Assembled Data

ADl:

MVI

D, 2FR

IE2F

AD2:

MVI

A, 6CR

066C

ADD

D

83

The instructions at ADI: and AD2:
load the D register with 2FR a.td the
accumulator with 6CR, respectively. The ADD instruction performs the
addition as follows:
2ER
6CH
9AR

=
=
=

0 0 1 0 1 I 1 0
OIl 0 1 1 0 0
1 0 0 1 1 0 1 0

The zero and carry bits are reset; the parity and sign bits are set. The
accumulator now contains 9AR.

Example 2:

The instruction:
ADD

A

will double the accumulator.

3-30

3.5.2

ADC

,
ADD REGISTER OR MEMORY TO ACCUMULATOR WITH CARRY

Fonnat:
Operand

Label

I

I

0

I

0"

0, I

I

RI E

I

G

I

Description: The byte in the register specified by REG, or the memory location, addressed by Hand L (if REG = 1118) plus the contents of the
carry bit is added to the contents of the accumulator. The result is kept
in the accumulator; the byte in REG is unchanged.
The carry bit is set if there is a carry out of the high-Qrder bit position.
The zero bit is set if the result is zero.
The parity bit is set if the result ha s even parity.
The sign bit is set to the most significant bit of the result.
Condition bits affected: Carry, Sign, zero, parity
Example:

Label

Code

Operand

Assomled

ADI:
AD2:

MVI
MVI
ADC

C,3DH
A, 42H
C

163D
0642
8A

Assume that the carry bit = o. The instructions at ADl: and AD2: load the
C register and the accumulator with 3D and 42 respectively but do not affect
I

3-31

the condition bits. The ADC instmction performs the addition as follows:
3DH
42 H
CARRY

=
=
=

0 0 1 1 1 1 0 1
0 1 0 0 0 0 10
0

RESULT

=

0 1 1 1 1 1 II=- 7FH

The results can be summarized as follows:

=
=
=

Accumulator
Carry
Sign
Zero
Parity

7FH
0
0
0
0

:::'

:::

If the carry bit had been one at the beginning of the example

I

the following

would have occurred:
3DH
42H
CARRY
RESULT

= 00111 101
= o 1 000 0 1 0
1
=
= lOOOOO{)O = 80H

Accumulator
Carry
Sign
Zero
Parity
3.5.3

SUB

=
=
=
=

80H
0
1
0
0

=

SUBTRACT REGISTER OR MEMORY FROM ACCUMULATOR

Format:
Label

OEerand

Code

SUB

(

1

"

01 0 • 1

-.°1

/
R1E.G

3-32

I

Description: The byte in the register specified by REG or the memory: location
addressed by Hand L (if REG=I11B), is subtracted from the accumulator using
two's complement arithmetic. The result is kept in the accumulator; the byte
in REG is unchanged.
I

If there is no overflow out of the high-order bit position, indicating that a borrow

occurred, the carry bit is set. (Note that this differs from an add operation, which
sets the carry if an overflow occurs.)
The zero bit is set if the result is zero.
The parity bit is set if the result has even parity.
The sign bit is set to the most significant bit of the result.
Condition bits affected: Carry sign, zero parity
I

I

Example:
Assume that the accumulator contains 3EH. Then the instruction:
SUB A
will subtract the accumulator from itself producing a result of zero as follows:
3 EH = a a 1 1 I 1 1 a
+ (-3EH) = 1 1 a a 0 a a 1 Negate and add one
+_____---:=--_ _ _ _ _--=-1 To produce two's complement
Overflow
... 1] 0 0 0 0 0 0 0 0 Result = 0

Since there was an overflow out of the high-order bit position and this is a
subtraction operation, the carry bit will be reset.
I

The parity and zero bits will also be set, and the sign bit will be reset.
Thus the SUB A instruction can be used to reset the carry bit (and zero the
accumulator) .

3-33

SBB

3.5.4

SUBTRACT REGISTER OR MEMORY FROM ACCUMULATOR
WITH BORROW

Format:
~

Label

Operand

i

S~..

G

Description: The carry bit is internally added to the contents of the register
specified by REG, or the memory location addressed by HAnd L (if REG=lllB).
This value is then subtracted from the accumulator using two'S complement
arithmetic. The result is stored in the accumulator; the byte in REG remains
unchanged.
This instruction is most useful when performing multfbyte subtractions. It
adjusts the result of subtracting two bytes when a previous subtraction has
produced a negative result (a borrow). For an example of this I see Section
5.3.
Condition bits affected: Carry I sign, zmo I parity (See Section 3.5.3 for details)
Example:
Label
SB1
SB2

Code

Operand
L, 2 H
A, 4H

MVI

MVI
SBB

Assume that the carry bit

= 1.

Assembled Data
3602
0604

L

Then the SBB instruction will act as follows:

02H + Carry = 03H
Two's Complement of 03H

= 11111101

Adding this to the accumulator produces:
Accumulator == 04H = 000 0 0 10 0
11111101
l~ 0 0 o.n () 0 0 1

~verflOW
3-34

=

= .() 1 H

.~ R~:;u It

1 causing carry to be reset.

The final result stored in the accumulator is one, causing the zero bit to be
reset. The carry bit is reset since this is a subtract operation and there was
an overflow out of the high-order bit position. The parity and the sign bits are
reset.

3-35

3.5.5

ANA

LOGICAL" AND" REGISTER OR MEMORY WITH ACCUMULATOR

Format:

Label

Code

Operand

ANA

REG

j
1

0

I

1

,

0

10

I

/

R I E,G

I

Description: The byte in the register specified by REG, or the memory location addressed by Hand L ( if REG = lllB ), is logically ANDed bit by
bit with the contents of the accumulator.
The result is stored in the accumulator; the byte in REG remains unchanged.
The carry bit is set to zero, while the zero, sign and parity bits are set
according to the result.
The logical AND function is given by the following truth table:

o

o
o

o

1

o

1

I

Logical AND
Condition bits affected: Carry, zero, sign, parity
Example:
Since any bit ANDed with a zero produces a zero and any bit ANDed with a one
remains unchanged, the AND function is often used to zero groups of bits.

3-36

Operand
A, OrCH
C/OrH
C

Code
MVI
MVI
ANA

Label
ANI
AN2 :

Assembled Data
06rC
160r
A2

The ANA instruction acts as follows:

Accumulator
C Register

=
=

o0

1 1 1 1 1 1 0 0
0 0 11 1 1

=

OrCH
OrH

Result in Accumulator

=

o0

=

OCH

=

0 0 1 1 0 0

This particular example guarantees that the high-order four bits of the
accumulator are zero and the low-order four bits are unchanged.
I

3.5.6

XRA EXCLUSIVE - OR REGISTER OR MEMORY WITH ACCUMULATOR
( ZERO ACCUMULATOR)

Fonnat:
Label

Operand
REG

Code
XRA

/

j

I

1

oI

1

0

1

IR ,

E

I

G

I

Description: The byte in the register specified by REG or the memory location
addressed by Hand L ( if REG =- I11B ) is exclusive - ORed bit by bit with
the contents of the accumulator. The result is stored in the accumulator; the
byte in REG remains unchanged. The carry bit is set to zero, sign and parity
bits are set according to the result.
I

I

3-37

The Exclusive - OR function is given by the following truth table:

o

1

o

o

1

1

1

o

Condition bits affected: Carry, zero, sign, parity
Example 1:
Since any bit exclusive - ORed with itself produces zero the exclusive - OR
can be used to quickly zero the accumulator. (The instruction SUB A could
also be used.)
I

Label

Code

Operand

XRA
MOV
MOV

A

B,A
C,A

These instructions quickly zero the A, B, and C register.
Example 2:
The exclusive - OR can be used to test two data bytes for equality.

Label

Code

Operand

XRA

C

If the contents of the C register and the accumulator are equal, the result will

3-38

be zero and the zero bit will be set. If the two quantities differ in any bit
position a one bit will be produced in the result, and the zero bit will not
be set.
Example 3:

Operand

Code

Label

MVI
XRA

A, OFFH
C

Any bit Exclusive - ORed with a one is complemented ( 0 XORI = I, 1 XORI
0 ). The XRA instruction above will therefore store the one's complement
of the C register into the accumulator.

=

Example 4j
Testing for change of status.
Many times a byte is used to hold the status of several ( up to eight) conditions within a program; each bit signifying whether a condition is true
or false, enabled or disabled, etc.
The exclusive - OR function provides a quick means of determing whioh bits
of a word have changed from one time to another.

CHNG:
STAT:

Code
MVI
MVI
MOV
INR
MOV
XRA
ANA

STAT2:
STATI:

DS
DS

Label

LA:
LB:

Operand
H, STAT@ SHR 8
L, STAT@ AND OFFH
A,M
L
B,M
B
B

Load address of status
into Hand L registers
STAT2 to accumulator
Address next location
STATl to B register
Exclusive-OR STAT! and STAT2
AND result with STATl

1
I

'---------..;.-.--..;.-.--------------------------:~.-.....

.)-39

Assume that logic elsewhere in the program has read the status of eight
conditions and stored the corresponding string of eight zeros and ones at
STAT 1 and at some later time has read the same conditions and stored
the new status at STAT2. The Exclusive - OR at CHNG: produces a one
bit in the accumulator wherever a condition has changed between STAT!
and STAT2.
For example:
Bit Number

STATl
STAT2

76543210
01011100
01111000

= 5CB =
= 78B =

Exclusive-OR

:::;

00100 1 0 0

This shows that the conditions associated with bits 2 and 5 have changed
between STATI and STAT2. Knowing this the program can tell whether
these bits were set or reset by ANDing the result with STAT1 .
I

Result =
STAT I =

00100 1 0 0
o1 0 1 1 1 0 0

=

0 0 0 0 0 1 0 0

AND

Since bit 2 is now one, it was set between STATl and STAT2 ; since bit 5
1s zero it was reset.

3.5.7

ORA LOGICAL "OR" REGISTER OR MEMORY WITH ACCUMULATOR

Fonnat:
Label

Code
ORA

°Eerand
REG

I ,°1 " .°1
1

1

•

1

I
R

I

E

I

G

I

Description: The byte in the register specified by REG, or the memory location addres sed by Hand L ( if REG = I11B ), is logically ORed bit by bit
with the contents of the accumulator.

3-40

The result is stored in the accumulator; the byte in REG remains unchanged.
The carry bit is set to zero, while the zero, sign, and IBrity bits are set
according to the result.
The logical OR function is given by the following truth table:
o
1

o

o

1

1

1

1

Condition bits affected: Carry, zero, sign, parity
Example:
Since any bit ORed with a one produces a one, and any bit ORed with a zero
remains unchanged, the OR function is often used to set groups of b1ts to
one.

Code
MVI
MVI
ORA

Label
OR I :
OR 2 :

Operand

Assembled Data

A, 33H

0633
160r
B2

C,OFH
C

The ORA instruction acts as follows:
Accumulator
C register
Result= Accumulator

=
=
=

= 33H

00110011
00001111
00111111

= OFR

= 3FH

This particular exampl'e quarantees that the low-order four bits of the
accumulator are one and the high-order four bits are unchanged.
I

3.5.8

CMP

COMPARE REGISTER OR MEMORY WITH ACCUMULATOR

Format:
Label

Code

~P

Operand
REG

---.

1
_,1 I 11_ REG
I
1 011
_ 1\

J

3-41

_

Description: The byte in the register specified by REG, or the memory location
addressed by Hand L ( if REG 111B ), is compared to the contents of the
accumulator. The comparison is performed by internally subtracting the contents of REG from the accumulator ( leaving both unchanged) and setting the
condition bits according to the result. In particular, the zero bit is set if
the quantities are equal, andreset if they are unequal. Since a subtract operation
is perfonned, the carry bit will be set if there is no overflow out of bit 7, indicating that the contents of REG are greater than the contents of the accumulator,
and reset otherwise.
Note: If the two quantities to be compared differ in sign, the sense of the
carry bit is reversed.
=0

Condition bits affected: Carry, zero, sign, parity
Example 1:

Operand

Assembled Data

MVI

E S

2605

CMP

E

BC

Assume that the accumulator contaips the number OAH.
tion performs the following internal subtractions:

+

Accumulator
( - E register)

=

.DAH

= a0 aa1a1a

=

-SH

=

1 1 1 1 1

0

The compare instruc-

1 1

1 a 0 0 0 a 1 0 1 = result
L.-overflow =1, causing carry to be reset
The accumulator still contains OAR and the E register still contains aSH;
however the carry bit is reset and the zero bit reset, indicating r. less than A.
Example 2:
If the accumulator had contained the number 2H, the internal subtraction would

have produced the following:

3-42

+

Accumulator
( - E register)

=
=

02H
-SH

=

=

0 0 0 0 0 0 1 0
1 1 I 1 1 0 1 1

I 1 1 1 1 1 0 1 = result
1 overflow=O causing carry to be set
The zero bit would be reset and the carry bit set, indicating E greater than A.
Example 3:
Assume that the accumulator contains -ISH. The internal subtraction now
produces the following:

+

Accumulator
( - E register)

=
=

-ISH
-5H

=
=

1 1 1 0 0 1 0 1
1 1 1 1 1 0 1 1

1

11100000
overflow: 1 causing carry to be reset

Since the two numbers to be compared differed in sign, the resetting of the
carry bit now indicates E greater than A.

3. 6

ROTATE ACCUMULATOR INSTRUCTIONS

This section describes the instructions which rotate the contents of the
accumulator. No memory locations or other registers are referenced.
Instructions in this class occupy one byte as follows:

(0 ,

0

o1 o I P
---""!I

I

0

1

01

t

00 for RtC
01 foc RRC
10 for RAt
11 foc RAR

The general assembly language instruction format 1s:

3-43

Label

Code

LABEL:

OP

Operand

LAlways Blank

t

RLC

L..-.._ _ _ _ _

I

RRC

I

RAL or RAR
I

' - - - - - - - - - - - - - - - - - - - O p t i o n a l instruction label

3.6.1

RLC

ROTATE ACCUMULATOR LEFT

Fonnat:
Label

Code

Operand

RLC

\

~

I

0

I

0

,01°1°1

0

1

I

0

I

Description: The carry bit is set equal to the high order bit of the accumulator.
The contents of the accumulator are rotated one bit position to the left with
the high-order bit being transferred to the low-order bit position of the
accumulator.
I

Condition bits affected: Carry
Example:

Label

Code
MVI
RLC

Operand
A, OF2 H

Assembled Data
061'2

02

3-44

Before RLC is

Carry

ex~cuted:

Accumulator

0---..--r-l ld11110101110 IJ
l

I 11 ddol old 011

[!]

After RLC is executed:

. A = OESH

Carry = 1

3.6.2

RRC

J

ROTATE ACCUMULATOR RIGHT

Format:
Operand

Label
RRC

\

oI

0

I

0

I------I
_

0

I

1

_

0

.1

1

I

0

Description: The carry bit is set equal to the low-order bit of the accumulator.
The contents of the accumulator are rotated one bIt position to the right with.
the low-order bit being transferred to the high-order bit position of the
accumulator.
I

Condition bits affected: Carry
Example:

Code

Operand

MVI

A, OP2H

RRC

3-45

Assembled Data

06F2
OA

Before RRC is executed:

Accumulator

Carry

[ 1111 11 11 10 10 III 0 I--r-------- 0

G

After RRC is executed:

[0111111111010111
A = 79H

3.6.3

RAL

Carry = 0

ROTATE ACCUMULATOR LEIT THROUGH CARRY

Format:
Operand

Label

0 0 0 I 1 0 I0 1 0
1
_ " . ' . It
Description: The contents of the accumulator are rotated one bit position to
the left.
The high-order bit of the accumulator replaces the carry bit, while the carry
bit replaces the low-order bit of the accumulator.
Condition bits affected: Carry
Example:

Operand

Label
MVI

A, OBSH

RAL

3-46

As sembled Data

06BS
12

Before RAL is executed:

Carry

After RAL is executed:

El

Accumulator

(0 1 1 0 1 0 1 0

Carry == I

3.6.4

RAR

1

A= 6AH

ROTATE ACCUMULATOR RIGHT THROUGH CARRY

Format:
Operand

Label
RAR

\

....---.-...

0 11 11 0 I 0 I
1_ 0101
_'_ 11_
Description: The contents of the accumulator are rotated one bit position to
the right.
The low-order bit of the accumulator replaces the carry bit, while the carry
bit replaces the high-order bit of the accumulator.
Condition bits affected: Carry
Example:

Operand
A, 6AH

MVI
RAR

3-47

As sembled Data
066A
IA

Accumulator

After RAR is executed:

A=OB5H

3-48

Carry

=0

3.7

IMMEDIATE INSTRUCTIONS

This section describes instructions which perform operations using a byte
of data which is part of the instruction itself.
Instructions in this class occupy two bytes as follows:

( a)

For the MVI instruction:

I ° °I
I

R

I

E

.

I

Gil L I , °I D

~

A

I

I

000
001
000
I
10O
I 0 I
I 1 0
III

°]

I

for
for
for
for
for
for
for
for

T

register A
register B
register C
register D
register E
register H
register L
memory reference

( b ) For the remaining instructions:

°lolo,pliloro Iv

,

A

I

T
I

, A,

--.--

f

000
001
010
I I
100
101
I 1 0
I 1 1

°

for
for
for
for
for
for
for
for

ADI
ACI
SUI
SBI
ANI
XRI
ORI

CPI

When a memory reference is specified in the MVI instruction, the addressed
location is specified by too Hand L registers. The L register holds the low-order

3-49

8 bits of the address; the H register holds the high-order 6 bits of the
address.
The general assembly language instruction format is:
Operand

Label

----

--

L•

MVI

LABEL:

REG, DATA

--....--

8 - bit data quantity

A, B, C, D, E, H, L, or M

- - - - - - - - - - - - O p t i o n a l instruction label
- orOperand

Label

----

OP

LABEL:

DATA
,1:...,.....- - -

8 - bit data quantity

ACI, SUI, SBI, ANI, XRI, ORI, or CPI
~------

3.7.1

MVI

Optional instruction label

MOVE IMMEDIATE DATA

Format:
Label

Operand

------- -----

MVI

REG, DATA

..

Description: The byte of immediate data is stored in the register specified
by REG, or in the memory location addressed by registers H andL ( if REG =
IllB ) •
Condition bits affected: None
Example:
Label

Operand

Ml:
M2:
M3:

MVI
MVI
MVI

Assembled Data
2E3C
36F4
3EFF

H,3CH
L, OF4H
M, OFFH

The instruction at MI: loads the H register with the byte of data at MI: + I,
1. e., 3CH.
Likewise, the instruction at M2: loads the L register with OF4H. The instruction at M3: causes the data at M3: + I ( OFFH ) to be stored at memory
location 3CF4H. The memory location is obtained by concatenating the
contents of the Hand L registers into a 14 bit address.

3.7.2

AD!

ADD IMMEDIATE TO ACCUMULATOR

Format:
Label

[

0

I

o

I

0

Code

Operand

ADI

DATA

1
10 1 0

I

I

I

0

I0

I

~...
D
A
I I I

T
A
I I I

I

Description: The byte of immediate data is added to the contents of the
accumulator using two's complement arithmetic. The result is kept in the
accumulator.

3-51

If there is an overflow out of the high-order bit position, the carry bit is set.

The zero bit is set if the result is zero.
The parity bit is set if the result contains an even number of ones ( even
parity) .
The sign bit is set to the most significant bit of the result.
Condition bits affected: Carry

I

sign, zero, parity

Example:
Label
AD1:
AD2:
AD3:

MVI

ADI
ADI

Operand

Assembled Data

A, 20
66
-66

0614
0442
04BE

The instruction at AD1: loads the accumulator with 14H. The instruction at
AD2: performs the following addition:

=
=

Accumulator
AD2 Immediate Data

The parity bit is set.

14H = 00010100
42H
= 01000010
Result = 01010110

= 56H = New

accumulator

Other status bits are reset.

The instruction at AD3: restores the original contents of the accumulator by
performing the following addition:
Accumulator
AD3 Immediate Data

=
=

56H = 01010110
OBEH = 10111110
Result
= 00010100 = 14H

The carry and parity bits are set.

The zero and sign bits are reset.

3-52

3.7.3

ACI

ADD IMMEDIATE TO ACCUMULATOR WITH CARRY

Format:
Code
ACI

Label

I ,o I
0

0I

/
oI

I

I

1

I

OEerand
DATA

0

I

0

I

/
D

I

A T
I I I I

A
I

I

Description: The byte of immediate data is added to the contents of the
accumulator plus the contents of the carry bit. The result is kept in the
accumulator.
The carry bit is set if there is an overflow out of the high-order bit position.
The zero bit is set if the result is zero.
The parity bit is set if the result has even parity.
The sign bit is set to the most significant bit of the result.
Condition bits affected: Carry, sign, zero, parity
ExamEle:

Assembled
Data

Label
CI:

Code
MVI

C2:

ACI

-66

OCBE

C3:

ACI

66

OC42

°Eerand
A,

56B

0656

Assuming that the carry bit = 0 just before the instruction at C2: is executed
this instruction will produce the same result as instruction AD3: in the example of Section 3.7.2.

I

That is:

Accumu lator
Carry

=
=

14H
1

The instruction at C3: then perrorms the following addition:

C3

= 14H = 0 0 0 1 0 1 0 0
Accumulator
Immediate Data = 42H =; 0 1 0 0 0 0 1 0
Carry bit
=I
=
1

=0

Result

3.7.4

SUI

1 0 1 0 1 II=- 57H

SUBTRACT IMM EDIATE FROM ACCUMULATOR

Format:
Label

Code
SUI

OEerand
DATA

I

I

o
I

010.

I
I

j
I

I

011 I 0 I 0

D
I

A

I

I

T
I

I

A
I I

I

Description: The byte of immediate data is subtracted from tne contents
of the accumulator using two's complement arithmetic. The result is stored
in the accumulator.
Since this Is a subtraction operation, the carry bit is set if there is no overrlow
out of the hlg' -order bit position, and roset if there is an overflow.
The zero bit is set if the result is zero.
The parity bit is set if the result has even parity.
The sign bit is set to the most significant bit of the result.
Condition bits affected: Carry, sign, zero, parity

3"54

Example:
This instruction can be used as the equivalent of the DCR instruction applied
to the accumulator. This is handy since the instruction DCR A is illegal.
I

Label
Sl:

Code

Operand

MVI

A, 0

0600

SUI

1

1401

Assembled Data

The MVI instruction loads the accumulator with zero.
forms the following subtraction:
Accumulator = OH _. 0 0 0 0 0 0 0 0
-S1 Immediate data = -IH = 1 1 1 1 1 1 1 1
Result

=

The SUI instruction per-

two's complement

1 1 1 1 1 1 1 1

-IH

Since there was no overflow, and this is a subtract operation, the carry bit is set.
The zero bit is also reset

3.7.5

SBI

I

while the sign and parity bJts are set.

SUBTRACT IMMEDIATE FROM ACCUMULATOR WITH BORROW

Format:
Label

Code
SBI

I I
oI

0

Operand
DATA

\

0

, 1 ,1

~

~

I

1

0
L

0

I

I

D
I

A

T

A

1

Description: The carry bit is internally added to the byte of immediate data.
This value is then subtracted from the accumulator using two's complement
arithmetic. The result is stored in the accumulator; the byte of immedIate data
Is unchanged.
This instruction and the SBB instruction are most useful when performing multibyte
subtract1ons. For_an example of this, see Section 5.3.

Since this is a subtraction operation, the carry bit is set if there is no overflow out of the high-order position, and reset if there is an overflow.
The zero bit is set if the result is zero.
The parity bit is set if the result has even parity.
The sign bit is set to the most significant bit of the result.
Condition bits affected: Carry, sign, zero, parity
Example:
Code
XRA
SBI

Operand
A

1

Assembled Data
AS
ICOI

The XRA instruction will zero the accumulator ( see example in Section
3.5.6 ). If the carry bit is zero the SBI instruction will produce exactly
the same results as the example of Section 3.7.4.
I

If the carry bit is one

I

the SBI instruction will perform the following op-

eration:
Immediate Data + Carry = 02 H
Two's Complement of 02H == 1111111 0
Adding this to the accumulator produces:
Accumulator = OR= 0 0 0 0 0 0 0 0
111 111 1 0
1 1 1 1 1 1 1 0 = -2H

1 overflow

= 0 causing

= ReSUlt
carry to be set

This time the carry and sign bits are set, while the zero and parity bits are reset.·

3-56

3.7.6

ANI

AND IMMEDIATE WITH ACCUMULATOR

Format:
Code
ANI

Label

I

°eerand
DATA

\

,

I I 01
0

1

0

I

I

1

I0

~

I

D

0

T

A

I I I

I

A

I0 I

I

Description: The byte of immediate data is logically ANDed with the contents
of the accumulator.
The resu It is stored in the accumula tor. The ca rry bit is set to zero whit e the
zero sign and parity bits are set according to the result.
I

I

I

Condition bits affected: Carry

I

zero

I

sign

I

parity

Examele:

Label

Code

AI:

ANI

Q,pernnd
A/C

MOV

OrH

Assembled Data
C2
240r

The contents of the C register are moved to the accumulator. The ANI instruction then zeroes the high-order four bits leaving the low-order four
bits unchanged. The zero bit will be set if and only if the low-order four
bits were originally zero.
I

If the C register contained 3AB, the ANI would perform the following:

3-57

Accumulator
AND (AI Immediate
data}

3.7.7

XRI

=
=

3AH
OFH

=0
=0

0 1 1 1 0 1 0
000 1 1 1 1

Result

=0

0 0 0 1 0 1 0

= OAH

EXCLUSIVE - OR IMMEDIATE WITH ACCUMULATOR

Format:
Label

Code
XRI

I

0

10 1

1

Operand

DA~

-\
0

I

I

III I 0 I olD I

A

&

,

T

A

l

Description: The byte of immediate data is exclusive - ORed with the contents of the accumulator. The result is stored in the accumulator. The
carry bit is set to zero, .while the zero, sign and parity bits are set
according to the result.
Condition bits affected: Carry, zero, sign, parity
Example:
The following instructions cause the two's complement of the C register to
be produced in the accumulator. (See Section 3.5.6 ).

Label

Code

Operand

MOV
XRI
AD!

A,e
OFFH
1

3-58

Comment
C register to accumulator
Produce one's complement
+1 = two's complement

3.7.8

ORI

OR IMMEDIATE WITH ACCUMULATOR

Fonnat:
Code

Label

ORI

Operand
DATA

~...

/
1_ 0

0ll

1_ I

1

olD

10 10
l. I I.'

A
I

Description: The byte of immediate data is logically ORed with the contents
of the accumulator.
The result is stored in the accumulator. The carry bit is set to zero, while the
zero, sign, and parity bits are set according to the result.
Condition bits affected: Carry, zero, sign, parity
Example:

Label
OR1:

Code
MOV
ORI

Operand.
A,C
OFH

Assembled Data
C2
340F

The contents of the C register are moved to the accumulator. The OR! instruction then sets the low-order four bits to on'e, leaving the high-order
four bits unchanged. .
.
If the C register contained OBSH, the ORI would perfonn the following:

Accumulator = OBSH -= orH
OR(ORI Immp.dlate
=
data)
-.
Result

10110101
001 I I I

o0

1 0 1 1 1 111

3--59

:- OBr:H

3.7.9

CPI

COMPARE IMMEDIATE WITH ACCUMULATOR

Format:
Label

Code

OEerand
DATA

CP\

0

I

o

I

1

1

1

I

I

1

I0 I0

I

~...

D

I

T

A

I I

A

I I I

I

Description: The byte of immediate data is compared to the contents of the
accumulator.
The comparison is perfonned by internally subtracting the data from the
accumulator using two's complement arithmetic, leaving the accumulator
unchanged but setting the condition bits by the result.
In particular, the zero bit is set if the quantities are equal
they are unequal.

I

and reset if

Since a subtract operation is perfonned, the carry bit will be set if there is
no overflow out of bit 7, indicating that the immediate data is greater than the
contents of the accumulator, and reset otherwise.
Note: If the two quantities to be compared differ in sign the sense of the
carry bit is reversed.
I

Condition bits affected: Carry zero, sign parity
I

I

Example:
Label

Code
MVI

cpr

OEerand
A, 4AH
40H

The cpr instruction performs the following operation:

3-60

Assembled Data
064A
3C40

Accumulator == 4AH = 0 1 0 0 1 '0 1 '0
+ (-Immediate data ) =-40H= 11 000000
1 0 0 0 0 1 0 1 (j
Result
Overflow = 1 causing carry to be reset
The accumulator st111 contains 4AH, but the zero bit is reset indicating that
the quantities were unequal, and the carry bit is reset indicating
DATA
Accumulator.

<

3.8

JUMP INSTRUCTIONS

This section describes instructions which alter the normal execution sequence
of instructions.
Instructions in this class occupy three bytes as follows:

I- 0 I- 11-

X X
I

I

Xxi
0 01 LOW
I
_ , .' , ,

ADD

!

'I

I".

X X
I

t

I

H I ADD

.""

I

I
_

Lhi9h order 6 bits of
a memory address

"don't care" bits ( 0 or 1 )

low -order 8 bits of a memory address

000
o0 0
o0 1
o1 0
o1 1
10 0
10 1
,1 1 0
1 1 1

1
0
0
0
0
0
0
0
0

for
for
for
for
for
for
for
for
for

IMP
JNC
JNZ
JP

JPO
Je
JZ

1M
JPE

Note that, just as i.lddresses are normally stored in memory with the low order

byte first, so are the addresses reprosented in the Jump Instructions.

3-61

The general assembly language instruction format is:
Label
LABEL:

Code
OP

Operand
EXP

t

L ______

a 14 - bit address

'-------IMP, JC, JNC, JZ, JNZ, 1M, JP, JPE, JPO
1 - - - - - - - - - - - - - - v p t i o n a l instruction label

3.8.1

JMP

JUMP

Format:
Label

/
(

-

Code
IMP

Operand
ADR

;--------~

.....,..

~ I 1 100
0I
_ I
I

I

alLOW
ADD
I I
I
I' ,

I

pL

Description: Program execution continues at the memory address ADR, formed
by concatenating the 6 bits of HI ADD with the 8 bits of LOW ADD.
Condition bits affected: None
Example:

Arbitrary Memory
Address
3COO
3C03

Label

Code

Operand
CLR

AD:

JMP
ADI

2

Assembled
Data
44003E
0402

3DOO
3D02

LOAD:

MVI
1MP

A, 3
3C03H

0603
44033C

3EOO
3EOI

CLR:

XRA
IMP

A

A8
44003D

3-62

~-101H

Normally, program instructions are executed sequentially. Al4 bit register
called the program counter holds the address of the next instruction to be
executed. When an instruction is fetched from memory ( but before it is
executed), the program counter is incremented by the length of the instruction.
Thus, if a two byte instruction at address 3COOH is fetched, the next instruction will be fetched from address 3C02H. The IMP instructfon replaces
the program counter contents with a new address, causing program execution
to continue at that address.
Thus the execution sequence of this example is as follows:
The IMP instruction at 3COO replaces the contents of the program counter
with 3EOO. The next instruction executed is the XRA at CLR: , clearing the
accumulator. The IMP at 3EOI is then executed.
The" $" is a special character which the assembler interprets as the address
of the instruction being assembled.
The program counter is set to 3DOO, and the MVI at this address loads the
accumulator with 3. The IMP at 3D02 sets the program counter to 3C03,
causing the ADI instruction to be executed.
From here, normal program execution continues with the instruction 3COS.

3-6:~

IC

3.8.2

JUMP IF CARRY

Format:
Code

Label

0

I I

I

IC

-/
1

0

I

0

I0

I I,
0

I

o

,

LOW
, ADD,
I

,

X X

,

H
, I, ADD
,,

Description:
If the carry bit is one, program execution continues at the memory
address ADR. If the carry bit is zero, execution continues with the next
sequential instruction.
Condition bits affected: None
For a programming example, see Section 3.8.9.

3-64

JUMP IF NO CARRY

INC

3.8.3

Format:
Code
JNC

Label

I I
0

I

0

°eerand

r------____
ADR

/

t

0

I

...

~

~

001 0
I

, 0 ILOW ADD
,,,
I

I

I

I

I

,

X X

I,

H I

A D D
I

I

Description: If the carry bit is zero, program execution continues at the
memory address ADR. If the carry bit is one, execution continues with the
next sequentia I instruction.
Condition bits affected: None
For a programming example, see Section 3.8.9.

3.8.4

JZ

JUMP IF ZERO

Format:
Label

Code
JZ

°eerand
ADR

./
011101
'.'

I

I

A

/ ------------~

°IOloILOWADDI~xIHIADDl
. . . II'll".
1 .""1_

Description: If the zero bit is one, program execution continues at the memory
address ADR. If the zero bit is zero, execution continues with the next
sequential instruction.
Condition bits affected: None
For a programming example, see Section 3.8.9.

3-65

3.8.5

JUMP IF NOT ZERO

JNZ

Format:
Label

Code
JNZ

//
...

I ° I ° ° °I° ° r'i'¥.1I?1f1
I 1

I

I 1 I

I

I

X X

,

I

,.

H I ADD,
"

I

Description: If the zero bit is zero, program execution continues at the memory
address ADR. If the zero bit is one, execution continues with the next
sequential instruction.
Condition bits affected: None
For a programming example, see Section 3.8.9.

3.8.6

JM

JUMP IF MINUS

Format:
Label

Code
JM

Operand

~-

/

...

IO.lll.ltO.oIOlorLOW
_ .. "II'"
~.

ADDI X XJHI ADDI

~.

""'1

Description: If the sign bit is one ( indicating a minus result), program execution continues at the memory address ADR. If the sign bit is zero, execution
continues with the next sequential instruction.
Condition bit affected: None

3-66

For a programming example

3.8.7

JP

I

see Section 3.8.9.

JUMP IF POSITIVE

Format:
Label

Operand
ADR

Code
JP

--/

o

11~IIIOIOIOIOILOW

-~
ADDI X XJHI ADD

I . . . . . . . '1""'.

'."111

Description: If the sign bit is zero (indicating a positive result), program
execution continues at the memory address ADR. If the sign bit is one
execution continues with the next sequential instruction.
I

Condition bits affected: None
For a programming example

3.8.8

JPE

I

see Section 3.8.9.

JUMP IF PARITY EVEN

Format:
Code
JPE

Labe!

Operand
ADR

--;------

-/

( 0 II

11

I

/1

--_________

'i'II , 0 I 0 I 0 It? 'i ~ ~ ? ? I

...
XXIHI ADD
I

I

I

I

I

,

1

Description: If the parity bit is one ( indicating a result with even parity) ,
program execution continues at the memory address ADR. If the parity bit is
zero, execution continues with the next sequential instruction.

3-67

Condition bits affected: None

3.8.9

JPO

JUMP IF PARITY ODD

Fonnat: .
Label

Code

Operand
ADR

r---------_

JPO

/

...

r I
_

0

I

1

_

0

I

1

I

1

~

I

0

I.

0

I

0

I_

LOW A
I

I

DDI
~ I xl_ ~I !i
1_

III I

~

AD D
I I

I

1
_

Description: If the parity bit is zero (indicating a result with odd parity) ,
program execution continues at the memory address ADR. If the parity bit
is one, execution continues with the next sequential instruction.
Condition bits affected: None
Examples of jump instruction:
Example:
This example shows three different but equivalent methods for jumping to one
of two points in a program based upon whether or not the sign bit of a number
is set. Assume that the byte to be tested is in the C register.

3-6U

Label

Code

Operand

ONE:

MOV
ANI

A,C
80H
PLUS
MINUS

JZ
JNZ
TWO:

MOV
RLC

A,C

INC

PLUS
MINUS

JMP

PLUS:

A,C
0
MINUS
SIGN BIT RESET

MINUS:

SIGN BIT SET

THREE:

MOV
ADI
JM

Assembled
Data
C2
2480
68XXXX

48XXXX
C2
02
40XXXX
44XXXX
C2
0400
70XXXX

The AND - Immediate instruction in block ONE: zeroes all bits of the data
byte except the sign bit, which remains unchanged. If the sign bit was zero,
the zero condition bit will be set, and the J2 instruction will cause program
control to be transferred to the instruction at PLUS:. Otherwise, the J2
instruction will merely update the program counter by three, and the JN2
instruction will be executed, causing control to be transferred to the instruction at MINUS:. (The zero bit is unaffected by any jump instructions) .
The RLC instruction in block TWO: causes the carry bit to be set equal to
the sign bit of the data byte. If the sign bit wa s reset, the INC instruction
causes a jump to PLUS:. Otherwise the IMP instruction is executed, unconditionally transferring control to MINUS: . (Note that, in this instance,
a Ie instruction could be substitutec! for the unconditional jump with identical
results) .
The add-immediate instruction in block THREE: causes the condition bits to
be set. If the sign bit was set, t!1e JM instruction causes program control to
be transferred to MINUS:. Otherwise, program control flows automatically
into the PLUS: routine.

3-69

3.9

CALL SUBROUTINE INSTRUCTIONS

This section describes the instructions which call subroutines. These instructions operate like the jump instructions causing a transfer of program
control. In addition a return address is saved on the address stack ( see,
Section 2.4 ) for use by the RETURN instructions ( Section 3.10 ). A discussion ·of the techniques and reasons for writing and using subroutines
appears in Section 5. 3
I

I

Instructions in this class occupy three bytes as follows:

I I
.

0

I

1

.

X

I

X

I

X

I

xiI I 0

I

LOW ADD

I xl

. . . ' , .11' ' .

---...
X

I.

H I ADD]
I 1'1

L

,_
\

thigh-Order 6 bits of a
memory address

"don't care" bits ( 0 or 1 )

1----

o0 0 1
o0 0 0
o0 1 0
o 10 0
o1 1 0
1
1
1
1

000
0 10
1 00
1 10

for
for
for
for
for
for
for
for
for

Low-order 8 bits of a memory addres s

CALL
CNC
CNZ
CP
CPO
CC
CZ
CM
CPE

Note that, just as addresses are normally stored in memory with the low
order byte first, so are the addresses represented the call instructions.

3-70

Thegenel"alassembly languageinslructl-on fonnat is:
Label

Operand

-

=tAllE!.:

:t:XP

.............

L a 14 - bit memory addres,;
Io....--CALL"

ee, CNC-. cz"

CNZ. CM,GP~ CPE, -CPO

l------------:Optlon81 instruction label

.:Format:
~
CALL

-LaDel

:Operand

SUB

.~
...
~ I .:0. I·'{)l
i 1 . () )LOWA D0l: X xl:
I._(}1
) ..1
1 .J J ~ 1 ., -J. 1 I 1 _ . ) .~
..,

4)

Des.crtpUo~

The

;"-;

D.1.

H I AD
II ,., 1 _

contents of the program counter, which equals the addres s
of the instnrcUon immediately folloWlnq the CALL lnstl'uet!on·~ Is placed on
theaadrcess stal::k for1ater use.:by a Retumlnstnactlon . Program ex~cut1on
cortUnuescat tnememory ca:ddressSl1B.. obtained hY-'OO1l:eat en ating the 6 bits
.oflUADDwttb~e~:btts of LDWcADD.
Coodltioncbitsaft'ectea-:Nbne

3.9.2

CC

CALL IF CARRY

Format:
Label

Code
______ CC

Operand
SUB

~

~

~~~

Description: If the carry bit is one a CALL is performed to subroutine SUB.
The program counter is saved on the address stack and execution continues
with the first instruction of SUB.
I

I

If the carry bit is zero
instruction.

I

Condition bits affected:

program execution continues with the next sequential

None

For programming examples using subroutines

3.9.3

CNC

I

see Section 5.3.

CALL IF NO CARRY

Format:
Label

I

0

1

o

0

Operand
_______ SUB

o , 0 11 , 0

I

-------

,L ,0,

~ ~ I? 9

x

~
X

,

....

H , I , ADD
«
,

Description: If the carry bit is zero a CALL is performed to subroutine SUB.
The program counter is saved on the address stack and execution continues
with the first instruction of SUB.
I

I

3-72

If the carry bit 1s one, program execution continues with the next sequenUal

instruction.
Condition bits affected: None
For programming examples using subroutines, see Section 5.3.

CZ

3.9.4

CALL IF ZERO

Format:
Operand
SUB

Label

[ 0

d

1

~~
--

o

Description: If the zero bit is one, a CALL is performed to subroutine SUB.
The program counter is saved on the address stack, and execution continues
with the first instruction of SUB.
If the zero bit is zero,

program execution continues with the next sequential

instruction.
Condition bits affected: None
For programming examples using subroutines, see Section 5.3.

3-73

3.9.5

CNZ

CALL IF NOT ZERO

Fonnat:
Label

Code

Operand

_ _ _ _ _ _ _CNZ _ _ _ _ _ _ _~
,

*

Description: If the zero bit is zero, a CALL is performed to subroutine SUB.
The program counter is saved on the address stack and execution continues
with the first instruction of SUB.
I

If the zero bit is one, program execution continues with the next sequential

instruction.
Condition bits affected: None
For programming examples using subroutines
CM

3.9.6

I

see Section 5.3.

CALL IF MINUS

Format:
Label

Code
CM

~-

[0

111,1,0,0 11,0

Operand
SUB

/~

I.L,O,W, Ap,D,1 X, X I,H,I ,Ap,DI

Description: If the sign bit is one ( indicating a minus result), a CALL Is
performed to subroutine SUB. The program counter is saved on the address
stack, and execution continues with the first instruction of SUB.

3-74

If the sign bit is zero

I

program execution continues with the next sequential

instruction.
Condition bits affected: None
For programming examples using subroutines

CALL IF PLUS

CP

3.9.7

see Section 5.3.

I

Format:
Code
CP

Label

a

1

Ia

°Eerand
SUB

~
i

1

a Ia

I aI
1

I

LOW
I I

I

~~
ADD
I x x I ~ ~ 91
H I

I

I

i

I

I

I

Description: If the sign bit is zero (indicating a positive resu It ) a CALL
is performed to subroutine SUB. The program counter is saved on the address
stack and execution continues with the first instruction of SUB.
I

I

If the sign bit is one program execution continues with the next sequential
in stru ction .
I

Condition bits affected: None
For programming examples using subroutines

3.9.8

CPE

CALL IF PARITY EVEN

3-75

I

see Section 5.3.

Description: If the parity bit is one ( indicating even parity) a CALL is performed to subroutine SUB. The program counter is saved on the address stack
and execution continues with the first instruction of SUB.
I

If the parity bit is zero

I

program execution continues with the next sequential

instruction.
Condition bits affected: None
For programming examples using subroutines

CPO

3.9.9

I

see Section 5.3.

CALL IF PARITY ODD

Fonnat:
Code
CPO

Label

G I 0:' ~l
t 1

J 1 , 0 [ 1 1.

Operand
SUB

01 t : V{
0,

lA, DID

II

X1 X

liB ~ ~ 9 ~ ]

Description: If the parity bit is zero (indicating odd parity) a CALL is
performed to subroutine SUB. The program counter is saved on the address
stack and execution continues with the first instruction of SUB.
I

I

If the parity bit is one program execution continues with the next sequential
instruction.
I

Condition bits affected: None
For programming examples using subroutines

3-77

I

see Section 5.3.

3.10

RETURN FROM SUBROUTINE INSTRUCTIONS

This section describes the instructions used to return from subroutines.
These instructions transfer program control to the last address saved on the
address stack, and remove that address from the stack. A discussion of the
techniques and reasons for writing and using subroutines appears in Section
5.3.
Instructions in this class occupy one byte as follows:

10 oJx

X

X

xiI

tl--___

I'

for
for
for
for
for
for
1 0 1 0 for
1 1 0 0 for
1 1 1 0 for
O0
o0
o0
o1
o1
1 0

0
0
1
0
1
0

I
0
0
0
0
0

RET
RNC
RNZ
RP
RPO
RC
RZ

RM
RPE

The general assembly language instruction format is:
Label
LABEL:

Code
OP

Operand

+. . _,_____ blank
RC, RNC, RZ, RNZ, RM, RP, RPE, RPO
'--_ _ _ _ _ _ _ _ _ _ Optional statement label

~-7R

3.10.1

RET

RETURN

Operand

Description: The last address saved on the address stack ( by a call
instruction) is removed from the stack and placed in the program counter.
Thus, execution proceeds with the instruction immediately following the
last call instruction.
Condition bits affected: None
For programming examples see Section 5.3.

3.10.2

RC

RETURN IF CARRY

Format:
Label

Code
RC

Operand

t

Description: If the carry bit is one a return operation is performed. Otherwise, program execution continuec:: with the next sequential instruction.
I

3-79

Condition bits affected:

None

For programming examples, see Section 5.3.

3.10.3

RNC

RETURN IF NO CARRY

Format:
Code

Label

Operand

RN\

Description: If the carry bit is zero a return operation is performed. Otherwise program execution continues with the next sequential instruction.
I

I

Condition bits affected: None
For programming examples

3.10.4

RZ

I

see Section 5.3.

RETURN IF ZERO

Format:
Operand

Label

10

I

0

11

I

0

I

1

10

III

DeSCription: If the zero bit is one a return operation is performed.
program execution continues with the next sequential instruction.
I

3-80

Otherwise,

:Condltion bltsaffected: None

£..orPf09r-amminq examples, see Section 5.3.

Rn'URNIf' NOT ZERO

Oper-and

Label

Descrlption!ff the -ZerO bit ls z-ero, a return operation Is performed.
Otherwls-e.. proqram 'execution contlooeswith the next -sequential instructioft.
Condlt1onblts

affected~Nonc

For programmittgexamples, see Section 5.3.
3 .16 •.~

-:RM

RETURN iF MIN-US·

F-Cmnat;

Oserand

-

Description: If the sign bit is one ( indicating a minus result)
operation is performed.

I

a return

Otherwise program execution continues with the next sequential instruction.
I

Condition bits affected: None
For programming examples see Section 5.3.

3.10.7

RP

RETURN IF PLUS

Format:
Label

Code

Operand

RP

\
10 01 0

1

Description: If the sign bit is zero
operation is performed.

0

I

~

0)1

I

I

indicating a positive result)

I

a return

Otherwise program execution continues with the next sequential instruction.
I

Condition bits affected: None
For programming examples see Section 5.3.

3-82

3.10.8

RPE

RETURN IF PARITY EVEN

Fonnat:
Label

Code
RPE

Operand

\
Description: If the parity bit is one ( indicating even parity), a return
operation is perfonned.
Otherwise, program execution continues with the next sequential instruction.
Condition bits affected: None
For programming examples see Section 5. 3.

3.10.9

RPO

RETURN IF PARITY ODD

Format:
Label

Code

Operand

HPO

\
Description: If the parity bit is zero, ( indicating odd parity), a return
operation is perfDnned.

3-H:3

Otherwise program execution continues with the next sequential instruction.
I

Condition bits affected: None
For programming examples see Section 5.3.
3. 11

RST INSTRUCTION

This section describes the RST ( restart) instruction, which is a special
pUrPose subroutine jump. This instruction occupies one byte.
Format:
Label

Code
RST

I

0

I

0

I

E, X

I

P

Operand
EXP

11, 0

Note: EXP must evaluate to a number in the range OOOB to lllB.
Description: The contents of the program counter are placed on the address
stack, providing a return address for later use by a RETURN instruction.
Program execution continues at memory address:

000 0 0 0 0 0 E X P 0 0 0 B

u,

Normally, this instruction is used in conjunction with
to eight eight-byte routines in the lower 64 words of memory in order to service interrupts to the processor. The interrupting device causes a particular RST instruction to be
executed, transferring control to a subroutine which deals with the situation,
as descdbed in Section 6.
A RETURN instruction then causes the program which was originally running to
resume execution at the instruction where the interrupt occurred.
Condition bits affected: None
3-84

Example:

Code
RST

Label

Operand
10 - 7

RST

D SHL 1

RST
RST

8

Comment
Call the subroutine at
address 24 (011 OOOB )
Call the subroutine at address
48 (11 OOOOB ). D is equated
to lIB.
Invalid instruction
Call the subroutine at
address 24 (OllOOOB)

3

For detailed example s of interrupt handling see Section 6.

3.12

INPUT/OUTPUT INSTRUCTIONS

This section describes the instructions which cause data to be input to or
output from the 8008.
Instructions in this class occupy one byte as
follows:

4_____ 0 a E x P
x X EX

for IN

P for OUT (X X -I 0 0 )

XXEXP is an input or output device number which is a hardware characteristic
of the device not under the programmer's control.
I

I

3-85

The general assembly language format is:
~
OP

Label
LABEL:

Operand
EXP
"-v-'

L

bit value from 0 - 7 decimal for IN

5 bit value from 8 - 31 decimal for OUT
' - - - - - - - - - - I N or OUT
'-----------------Optionalinstruction label

3.12.1

IN

INPUT

Format:
Label

Code
IN

I

0

I

I

0 10

1E

Operand
EXP

~
XI

pi I I

Description: An eight bit data byte is read from input device number EXP
( 0 - 7 ) and replaces the contents of the accumulator.
Condition bits affected: None

3-86

Example:

Label

3.12.2

Code
IN

OUT

Operand
0

IN

10/2

IN

8

Comment
Read one byte from input
device #0 into the accumulator
Read one byte from input
device #5 into the accumulator
Invalid instruction

OUTPUT

Format:
Label

Code
OUT

Operand
EXP

E X
I

I

I

Description: The contents of the accumulator are written to output device
number EXP ( 8 - 31 ).
Condition bits affected: None

3-87

Example:

Label

3.13

Code
OUT

HLT

Operand
10

OUT

IFH

OUT

7

Comment
Write the contents of the
accumulator to output device #10
Write the contents of the
accumulator to output device #31
Invalid instruction

HALT INSTRUCTION

This section describes the HLT instruction.
This instruction occupies one byte.

Format:
Label

Operand

Code
HLT

*

J0,0,0,0,0,0,0,0

3-88

I

L_

blank

Description: The program counter is incremented to the address of the next
sequential instruction. The CPU then enters the STOPPED state and no further
activity takes place until an interrupt occurs.

3. 14

PSEUDO - INSTRUCTIONS

This section describes pseudo instructions recognized by the assembler.
A pseudo instruction is written in the same fashion as the machine instructions
described in Sections 3.3 - 3.13, but does not cause any object code to be
generated. It acts merely to pt;ovide the assembler with information to be
used subsequently while generatipg object code.
The general assembly language format of a pseudo - instruction is:
Label
NAMI:

Code
OP

Operand
OPND

Comment

-----

Loperand, may be optional
EQU, SET, END, IF, ENDIF, MAC, ENDM

NAME

May be required, optional, or illegal

Note: Names on pseudo instructions do not end in colons, as do
labels on machine operations.

3-89

3.14.1

ORG

ORIGIN

Fonnat:
Code
ORG

Label

Operand
EXP

---

LA

14 - bit address

I-------Always blank
Description: The assembler's location counter I identified by the special
character $, is set to the value of EXP, which must be a valid 14 bit memory
address. The next machine instruction or data byte (s) generated will be
assembled at address EXP, EXP + 1, etc.
If no ORG appears before the first machine instruction or dara byte In th0
program I assembly will begin at location O.

Example 1:

Memory
Address

Label

1000
1001
1003
1050

NEXT:

Code
ORG
MOV
ADI
IMP
ORG
XRA
=

Assembled
Data

Operand
lOOOH
A,C

C2
0402
445010

2

NEXT
lO50H
A

AS

The first ORG pseudo instruction informs the assembler that the object program will begin at memory address lOOOH. The second ORG tells the assembler to set its location counter to 1050H and continue assembling machine
instructions or data bytes from that point. Note that the range of memory
from 1006H to l04F is still included in the object program but does not
contain assembled data. In particular the programmer should not assume
I

I

3-90

that these locations will contain zero, or any other value.
Example 2:
The ORG pseudo instruction can perform a function equivalent to the DS
( define storage) instruction ( see Section 3.2.4 ). The following two
sections of code are exactly equivalent:

Memory
Address
2COO
2C01
2C04
ZCI0

3.14.2

Label

NEXT:

EQU

Code
MOV
IMP
DS
XRA

°Eerand
A,C
NEXT
12
A

Label

NEXT:

Code
MOV
IMP
ORG
XRA

°Eerand
A,C
NEXT
$+12
A

Assembled
Data
C2
44102C
AS

EQUATE

Format:

--Label
NAME

Code
EOU

°Eerand
EXP
'-v-"

L

An expres sion

Required name
Description: The symbol NAME is assigned the value of EXP by the assembler.
Whenever the symbol NAME is 
In~

West: 17291 Irvine Blvd., Suite 262/(714)838·1126, TWX: 910·595·1114/Tustin, California 92680
Mid-America: 800 Southgate Office Plaza/50 1 West 78th St.I(612)835·6722, TWX: 910·576·2867 /8Ioomington, Minnesota 55437
Northeast: 2 Militia Drive, Suite 4/(617)861·1136, Telex: 92·3493/Lexington, Massachusetts 02173
Mid·Atlantic: 21 Bala Avenue/(215)664·6636/Bala Cynwyd, Pennsylvania 19004
.
Europe: Intel OfficelVester Farimagsgade 7145·1·11 5644, Telex: 19567/DK 1606 Copenhagen V
Orient: Intel Japan Corp.lHan·Ei 2nd Building/l·l, Shinjuku, Shinjuku·Ku/03·354-·8251,Telex: 781·28426/Tokyo 160
© 1973/PrintecJ in U.S.A'/MCS 329-1074-11



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.3
Linearized                      : No
XMP Toolkit                     : Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:56:37
Create Date                     : 2015:01:14 17:31:57-08:00
Modify Date                     : 2015:01:14 16:53:42-08:00
Metadata Date                   : 2015:01:14 16:53:42-08:00
Producer                        : Adobe Acrobat 9.55 Paper Capture Plug-in
Format                          : application/pdf
Document ID                     : uuid:c5a0c0ff-fed6-9844-9a83-6bd147ac5121
Instance ID                     : uuid:e5f3743f-7c31-c544-a7f4-8b8ad0d7ea13
Page Layout                     : SinglePage
Page Mode                       : UseOutlines
Page Count                      : 204
EXIF Metadata provided by EXIF.tools

Navigation menu