SlideShare a Scribd company logo
Intel 8080 8085 assembly language programming 1977 intel
The inforrm.tion in this document is subje<;t to   ~nge   without notK:e.

Intel Corpor<ltion rm.kes no wuunty of <lny kind with reprd to this rm.teri.lJ, includi,., but not limited to, the implMld
varnnttes of merch<lnubility <lnd fitness for <l ~rticul .... purpose. Intel Corpor<ltion HSUrnes no responsibWity for <lny
errors that ma.y <lppur in this doc::ument. Intel Corpor<ltion rNkes no c.ornmitment to upd<t.te nor to keep current the
inforrm.tion conuined in this document.

The softwMe described in this document is furnished under <l Ik.ense ';lOd rNy be    u~   or copied only in iGCOrcRnu with
the terms of such lK:enst.

Intel Cofporiltion <lSsurnes no responsibility for the use or reli<lbility of its softw<lre on equipment tNt is not suppUed by
Intel.

No p<lrt of this doc::ument rm.y be copied or reproduud in any form or by ilny muns without the prklr written consent
of Intel Corpoutt<m.

The   f~lowing   <lre trademMks of Intel Corpoution <lnd rm.y be used only to desc.ribe Intel products:

                                              ICE-30               LIBRARY MANAGER
                                              ICE-48               MCS
                                              ICE-SO              MEGACHASSIS
                                              ICE-8S              MICROMAP
                                              INSITE              MUlTIBUS
                                              INTEL               PROMPT
                                              INTEllEC            UPI
I ---------------,1
r-I




       8080/8085 ASSEMBLY LANGUAGE
             PROGRAMMING MANUAL




                    Copyright © 1977,1978 Intel Corporation

      Intel Corporation, 3065 Bowers Avenue, Santa Clara, California 95051
Intel 8080 8085 assembly language programming 1977 intel
PREFACE


This manual describes programming with Intel's assembly language. It will not teach you how to program a computer.

Although this manual is designed primarily for reference, It also contains some instructional matenal to help the beginning
programmer. The manual is organized as follows:

                       Chapter 1.     ASSEMBLY LANGUAGE AND PROCESSORS

                                      Description of the assembler
                                      Overview of 8080 hardware and instruction set
                                      Description of 8080(8085 differences

                       Chapter 2.     ASSEMBLY LANGUAGE CONCEPTS

                                      General assembly language coding rules

                       Chapter 3.     INSTRUCTION SET

                                      Descriptions of each instruction (these are listed alphabetically
                                           for quick reference)

                       Chapter 4.     ASSEMBLER DIRECTIVES

                                      Data definition
                                      Conditional assembly
                                      Relocation

                       Chapter 5.     MACROS

                                      Macro directives
                                      Macro examples

                       Chapter 6.     PROGRAMMING TECHNIQUES

                                      Programming examples

                       Chapter 7,     INTERRUPTS

                                      Description of the Interrupt system.

Chapters 3 and 4 will fill most of the experienced programmer's reference requirements. Use the table of contents or the
index to locate information quickly,

The beginning programmer should read Chapters 1 and 2 and then skip to the examples in Chapter 6. As these examples
raise questions, refer to the appropriate information in Chapter 3 or 4. Before writing a program, you will need to read
Chapter 4. The 'Programming Tips' in Chapter 4 are intended especially for the beginning programmer.



                                                                                                                              iii
RELATED PUBLICATIONS

         To use your Intellec development system effectively, you should be familiar with the following Intel
         publications:



     ISIS-II 8080/8085 IAACRO ASSEMBLER OPERATOR'S MANUAL, 9800292

         When you activate the assembler, you have the option of specifying a number of controls. The operator's
         manual descriJes the activation sequence for the assembler. The manual also describes the debugging tools
         and the error messages supplied by the assembler.



     ISIS-II SYSTEM   U~;ER'S   GUIDE, 9800306

         User program; are commonly stored on diskette files. The ISIS-II User's GUide describes the use of the text
         editor for entering and maintaining programs. The manual also describes the procedures for linking and
         locating reloc Itable program modules.



     Hardware   Referenc~s


          For addition21 information about processors and their related components, refer to the appropriate User's
          Manual:

                         8080 MICROCOMPUTER SYSTEMS USER'S MANU,A,L, 9800153

                         8085 MICROCOMPUTER SYSTEMS USER'S MANUAL, 9800366




iv
TABLE OF CONTENTS


Chapter 1.   ASSEMBLY LANGUAGE AND PROCESSORS                                1-1

             Introduction                                                    1-1
             What Is An Assembler?                                           1-1
                   What the Assembler Does                                   1-1
                   Oblect Code                                               1-2
                   Program Listing                                           1-2
                   Symbol-Cross-Reference Listing                            1-3
                   Do You Need the Assembler?                                1-3
             Overview of 8080/8085 Hardware                                  1-5
                   Memory                                                    1-5
                         ROM                                                 1-5
                         RAM                                                 1-5
                   Program Counter                                           1-6
                   Work Registers                                            1-7
                   Internal Work Registers                                   1-9
                   Condition Flags                                           1-9
                         Carry Flag                                          1-10
                         Sign Flag                                           1-10
                         Zero Flag                                           1-11
                         Parity Flag                                         1-11
                         Auxiliary Carry Flag                                1-11
                  Stack and Stack Pointer                                    1-12
                        Stack Operations                                     1-13
                        Saving Program Status                                1-13
                  Input/Output Ports .                                       1-14
                  Instruction Set                                            1-15
                        Addressing Modes                                     1-15
                              Implied Addressing                             1-15
                              Register Addressll1g                           1-15
                              Immediate Addressll1g                          1-15
                              Direct Addressll1g                             1-15
                              Register Indirect Addressing                   1-16
                              Combined Addressing Modes                      1-16
                              Ti mll1g Effects of Addressll1g Modes          1-16
                        Instruction Namll1g Conventions                      1-16
                              Data Transfer Group                            1-16
                              Arithmetic Group                               1-17
                              Logical Group                                  1-17
                              Branch Group                                   1-18
                              Stack, I/O, and Machine Control Instructions   1-19
             Hardware/Instruction Summary                                    1-19
                  Accumulator Instructions                                   1-19
                  Register Pair (Word) Instructions                          1-21
                  Branching Instructions                                     1-22
                  Instruction Set Guide                                      1-23




                                                                                    v
8085 Proc ~ssor Differences                                             1-24
                    Pr )gramming for the 8085                                        1-24
                    Cc nditional Instructions                                        1-25


Chapter 2.     ASSEMIIL Y LANGUAGE CONCEPTS                                          2-1

               Introdu( tion                                                         2-1
               Source Line Format                                                    2-1
                     Garacter Set                                                    2-1
                            Delimiters                                               2-2
                     Label/Name Field                                                2-3
                     Ol'code Field                                                   2-4
                     Or'erand Field                                                  2-4
                     Cc mment Field                                                  2-4
               Coding Operand Field Information                                      2-4
                     He xadecimal Data                                               2-5
                     Decimal Data                                                    2-5
                     O( tal Data                                                     2-5
                     Bilary Data                                                     2-5
                     Lc cation Counter                                               2-6
                     A~,CII Constant                                                 2-6
                     Labels Assigned Values                                          2-6
                     Labels of Instruction or Data                                   2-6
                     E> pressions                                                    2-6
                     In ;tructions as Operands                                       2-7
                     R( gister-Type Operands                                         2-7
               Two's Complement Representation of Data                               2-7
               Symbol~ and Symbol Tables                                             2-9
                    Sy mbol ic Addressing                                            2-9
                    Sy mbolic Characteristics                                        2-9
                           Reserved, User-Defined, and Assembler-Generated Symbols   2-9
                          Global and Limited Symbols                                 2-10
                           Permanent and Redefinable Symbols                         2-11
                           Absolute and Relocatable Symbols                          2-11
               Assembl I-Time Expression Evaluation                                  2-11
                    Or erators                                                       2-11
                           Arithmetic Operators                                      2-12
                           Shift Operators                                           2-12
                           Logical Operators                                         2-13
                          Compare Operators                                          2-13
                           Byte Isolation Operators                                  2-14
                    Pe 'missible Range of Values                                     2-15
                    Pr"cedence of Operators                                          2-15
                    Rdocatable Expressions .                                         2-16
                    Cllaining of Symbol Definitions                                  2-18

Chapter 3.     INSTRlCTION SET                                                       3-1

               How tc Use this Chapter                                               3-1
               Timing Information                                                    3-1
                    In ;tructions are listed in alphabetical order
vi
Oupter 4.    ASSEMBLER DIRECTIVES                                     4-1

             Symbol Definition                                        4-2
                 EQU Directive                                        4-2
                  SET Directive                                       4·3
             Data Definition                                          4-3
                  DB Directive                                        4·3
                  OW Directive                                        44
             Memory Reservuion                                        4-5
                  OS Directive                                        4-5
                  Programming Til»;   D.Ha Description and Access     4-6
                        R.mdom Acee..s Versus ReAd Only Memory        4-6
                        Dua Desuiption                                4-6
                        O.. ta Access                                 4-6
                        Add Symbols for DaLli Access                  4-7
             Conditional Assembly                                     4-8
                  IF, ELSE, ENDIF Directives                          4-8
             Assembler Termination                                    4-10
                  END Directive                                       4-10
             Location Counter Control and Relocation                  4-11
                  location Counter Control (Non·Rcloc.aubic Mode)     4-11
                       ORG Directive                                  4-11
                  Introduction to Rdocatability                       4-12
                        Memory Management                             4-12
                        Modular ProgrOlm Development                  4-12
             Directives Used for Relocation                           4-14
                  location Counter Conlrol (Reloc<l.table Programs)   4-14
                        ASEG Directive                                4-14
                        CSEG Directive                                4-15
                        OSEG Directi"e                                4-15
                        ORG Directive (Relocatable Mode)              4-16
                  Program linkage Directives                          4-16
                        PUBLIC Directive                              4-17
                        EXTRN Directive                               4-17
                        NAME Directive                                4-18
                        STKLN Directive                               4-18
                  STACK and MEMORY Reserved Words                     4-19
                  Programming Tips: Testing Relocatable Modules       4-19
                        Init~1ilation Routines                        4-19
                        Input/Output                                  4-20
                        Remove Coding Used for Testing                4-20

Chapter S.   MACROS                                                   5·1

             Introduction to Macros                                   5·1
                   Why Us.e Macros?                                   5-1
                   Wha t Is A Macro!                                  5-1
                  Macros Vs. Subroutines                              5-3


                                                                             vii
Lking M.cros                                              5-3
             MUfo Definition                                        S·)
                 M.cro Ddinition     Directi~s                      S4
                          MACRO   Directj~                          S4
                        ENOM Oirectiw:                              S-5
                        LOCAL Oirel.livc                            S·S
                        REPT Dircllive                              S~
                        IRP Directive                               S·8
                        IRPC Directive                              S-8
                        EXITM Directive                             S·9
                   Sp«i~1 M~CfO (Jpft.ators                         S·IO
                   Nested "bero Definitions                         S·12
          MOlCr~   DU                                              5·12
             Muro DII fOflTWt                                       S·12
             Nested M~uo ulls                                       S·I'
             M.u..ru E).p4n,iun                                     S·IS
          Null M.cros                                               S·16
          s.ample Macros                                            .1·16

Ch.tptt'r 6. PRCXiRAMMING TECHNIQUES                                6·

          Brlinch T.. oles P~udo·Subroutine                          6-
          lr.. mlt'rrinl DOll. [0 Subroutine                       . 6·)
          Soflw.;ue Multiply lind Di"i~                            .6·7
          Multibyte Addition .nd SublrliCiion                        6-11
          DecirTldl Addition                                         6·2
          Oecimal SubU,t..:tlon                                      6-14


Ch .. pter 7.INTERRUPTS                                              7·

          Interrupt ConcepH                                          7·
          Writing Interrupt Subroutint's                             7·4



Ap~ndix A          INSTRUCTIO  SUMMARY                                     A·
Appcndi). 8        ASSEMBLER DIRECTIVE SUMMARY                             B·I
Appendix C         ASCII CHARACTE R SET                                    C.I
Appendi). 0        BINARY·DECIMAL·HEXADECIMAL CONVERSION TABLES·           0·1




 viii
LIST OF ILLUSTRATIONS


Figure

1-1      ASSEMBLER OUTPUTS                           1-2
1-2      COMPARISON OF ASSEMBLY LANGUAGE WITH PL/M   1-4
1-3      8080{8085 INTERNAL REGISTERS                1-6
1-4      INSTRUCTION FETCH                           1-8
1-5      EXECUTION OF MOV M,C INSTRUCTION            1-9




                                                           ix
Intel 8080 8085 assembly language programming 1977 intel
1. ASSEMBLY LANGUAGE AND PROCESSORS


INTRODUCTION

      Almost every line of source coding in an assembly language source program translates directly into a machine
      instruction for a particular processor. Therefore, the assembly language programmer must be familiar with both
      the assembly language and the processor for which he is programming. '

      The first part of this chapter describes the assembler. The second part describes the features of the 8080 micro-
      processor from a programmer's point of view. Programming diffel'ences between the 8080 and the 8085 micro-
      processors are relatively minor. These differences are described in a short section at the end of this chapter.



WHAT IS AN ASSEMBLER?

      An assembler IS a software tool - a program - deSigned to simplify the task of Writing computer programs. If
      you have ever written a computer program directly in a machine-recognizable form such as binary or hexadecimal
      code, you will appreciate the advantages of programming in a symbolic assembly language,

      Assembly language operation codes (opcodes) are easily remembered (MOY for move instructions, JMP for jump).
      You can also symbolically express addresses and values referenced in the operand field of instructions. Since you
      assign these names, you can make them as meaningful as the mnemonics for the instructions. For example, if your
      program nust manipulate a date as data, you can assign it the symbolic name DATE. If your program contains a
      set of instructions used as a timing loop (a set of instructions executed repeatedly until a specific amount of time
      has passed), you can name the instruction group TIMER.



 What the Assembler Does


      To use the assembler, you first need a source program. The source program consists of programmer-written
      assembly language instructions. These instructions are written using mnemonic opcodes and labels as described
      previously.

      Assembly language source programs must be in a machine-readable form when passed to the assembler. The
      Intellec development system includes a text editor that will help you maintain source programs as paper tape
      files or diskette files. You can then pass the resulting source program fife to the assembler. (The text editor is
      described in the ISIS-II System User's GUide.)

      The assembler program performs the clerical task of translating symbolic code into ob/ect code which can be
      executed by the 8080 and 8085 microprocessors. Assembler output consists of three possible files: the object
      fife containing your program translated into object code; the list file printout of your source code, the assembler-
      generated object code, and the symbol table; and the symbol-crass-reference file, a listing of the symbol-cross-
      reference records.




                                                                                                                           1-1
Chapter 1. Assembly   Lan)~uage   and Processors




                                                                                                    OBJECT

                                                                                                      FILE




                 SOU<.CE                                    ASSEMBLER                              PROGRAM
                PROGRAM
                  FIl.E                                      PROGRAM       ~                        LISTING




                                                                                   ~                 CROSS
                                                                                                 REFERENCE
                                                                                                   LISTING




                                                   Figure 1-1. Assembler Outputs



  Oblect Code

        For most mlcrxomputer applications, you probably will eventually load the oblect program into some form of
        read only men ory, However, do not forget that the Intellec development system IS an 8080 microcomputer
        system with raldom access memory, In most cases you can load and execute your oblCct program on the
        development s"stem for teSlJng and debugging, TIllS allows you to test your program before your prototype
        application sys:em IS fully developed,

         A special featu,'e of this assembler IS that it allows you to request oblect code In a relocatable format. This frees
        the programm( r from worrYing about the eventual mix of read only and random access memory In the application
        system; indivicual porlJons of the program can be relocated as needed when the application design is final. Also,
        a lal'ge progranl can be broken Into a number of separately assembled modules, Such modules are both easier to
        code and to te;t, See Chapter 4 of this manual for a more thorough description of the advantages of the relocation
        feature,



   Program Listing


        The program liitlng prOVides a permanent record of both the source program and the object code, The assembler
        also provides diagnostic messages for common programming errors in the program listing. For example, if you
        specify al6-bl value for an InstruclJon that can use only an 8-blt value, the assembler tells you that the value
        exceeds the pe'missible range.




 1-2
Chapter 1. Assembly Language and Processors




Symbol-Crass-Reference Listing


     The symbol-crass-reference listing is another of the diagnostic tools provided by the assembler. Assume, for
     example, that your program manipulates a data field named DATE, and that testing reveals a program logic
     error   In   the handling of this data. The symbol-crass-reference listing simplifies debugging this error because it
     POints you to each instruction that I"eferences the symbol DATE.



Do You Need the Assembler?

     The assembler IS but one of several tools available for developing microprocessor programs. Typically, choosing
     the most suitable tool IS based on cost restraints versus the required level of performance. You or your company
     must determine cost restraints; the reqUired level of performance depends on a number of variables:


             •       The number of programs to be written: The greater the number of programs to be written, the more
                     you need development support. Also, It must be pOinted out that there can be penalties for not
                     wl"lting programs. When your application has access to the power of a microprocessor, you may be
                     able to provide customers with custom features through program changes. Also, you may be able to
                     add features through programming.


             o       The time allowed for programming: As the time allowed for programmll1g decreases, the need for
                     programmll1g support II1creases.


             •       The level of support for eXisting programs: Sometimes programming errors are not discovered until
                     the program has been   111   use for quite a while. Your need for programming support II1creases if you
                     agree to correct such errors for YOUI" customers. The number of supported programs In use can
                     multiply this requirement. Also, program support     15   frequently subrect to stringent time constraints.


      If none of the factors described above apply to your Situation, you may be able to get along without the
     assembler. Intel's PROMPT-80, for example, allows you to enter programs directly Into programmable read only
     memory. You enter the program manually as a string of hexadeCimal digits. Such manual programming IS relatively
     slow and more prone to human error than computer-assisted programmll1g. However, manual systems are one of
     the least expensive tools available for mlcmprocessor programming. Manual systems may be SUitable for limited
     applications, hobbyists, and those who want to explol"e possible applications for microprocessors.


      If most of the factors listed preViously apply to you, you should explore the advantages of PL(M. PL/M IS
      Intel's high-level language for program development. A high-level language is directed more to problem solVing
     than to a particular microprocessor. TIllS allows you to write programs much more qUickly than a hardware·
     oriented language such as assembly language. As an example, assume that a program must move five characters
     from one location 111 memory to anothcr. Thc following cxample illustratcs the coding differences between
     assembly language and PL/M. Since II1structions have not yet been described, the asscmbly language instructions
     arc rcprescn ted by a flowchart.




                                                                                                                                   1-3
Chapter 1. Assembly Lan 5uage and Processors




                  ASSEI ~BL Y LANGUAGE CODING                                    PL/MCODING



            I    LOAD ,<EGISTER WITH NUMBER
                 OF CHARACTERS TO BE MOVED

                                     I
             I   LOAD ,<EGISTER PAIR B WITH
                 ADDRE SS OF SOURCE (FLD1)

                                    I
                 LOAD I~EGISTER PAIR D WITH
                 ADDRESS OF DESTINATION
                 (FLD2)
                                    I

                 LOAD ,CCUMULATOR WITH 1
                 BYTE FROM SOURCE FIELD

                                     I
                 MOVE :HARACTER FROM
                 ACCUIV ULATOR TO DESTINA-
                 TION FIELD

                                     I                                   CALL MOVE(S,FLD2,FLD1);




                                                                               ~
             I   INCREMENT SOURCE ADDRESS


                                    I
                 INCRHIENT DESTINATION
                 ADDRESS

                                     I
             I   DECRE .ENT CHARACTER COUNT




                                 IS
                  NO
                             CHARACTER
                               COUNT
                                   =O?
                                         YES

                            ( CONTINUE


                                         Figure 1-2. Comparison of Assembly Language with PL/M


 1-4
Chapter 1. Assembly Language and Processors




OVERVIEW OF 8080/8085 HARDWARE

     To the programmer, the computer comprises the following parts:


          •     Memory
          •     The program cou nter
          •     Work registers
          •     Condition flags
          •     The stack and stack pointer
          •     Input/output ports
          •     The instruction set

     Of the components listed above, memory is not part of the processor, but is of interest to the programmer.



 Memory

     Since the program required to drive a microprocessor resides'in memory, all microprocessor applications require
     some memory. There are two general types of memory: read only memory (ROM) and random access memory
     (RAM).



   ROM


     As the name Implies, the processor can only read instructions and data from ROM; it cannot alter the contents
     of ROM. By contrast, the processor can both read from and write to RAM. Instructions and unchanging data
     are permanently fixed into ROM and remain intact whether or not power is applied to the system. For this
     reason, ROM is typically used for program storage in single-purpose microprocessor applications. With ROM you
     can be certain that the program is ready for execution when power is applied to the system. With RAM a program
     must be loaded into memory each time power is applied to the processor. Notice, however. that storing programs
     in RAM allows a multi-purpose system since different programs can be loaded to serve different needs.

     Two special types of ROM        PROM (Programmable Read Only Memory) and EPROM (Eraseable Programmable
     Read Only Memory)        are frequently used during program development. These memories are useful during
     program development since they can be altered by a special PROM programmer. In high-volume commercial
     applications. these special memories are usually replaced by less expensive ROM's.



   RAM


     Even if your program resides entirely in ROM. your application is likely to require some random access memory.
     Any time your program attempts to write any data to memory, that memory must be RAM. Also, if your pro-
     gram uses the stack. you need RAM. If your program modifies any of its own instructions (this procedure is
     discouraged), those instructions must reside in RAM.

     The mix of ROM and RAM In an application IS important to both the system designer and the programmer.
     Normally, the programmer must know the physical addresses of the RAM in the system so that data variables




                                                                                                                       1-5
Chapter 1. Assembly Lang Jage and Processors




         can be assignee within those addresses. However, the relocation feature of this assembler allows you to code a
         program witho!lt concern for the ultimate placement of data and instructions; these program elements can be
         repositioned aLer the program has been tested and after the system's memory layout IS final. The relocation
         feature is fully explained in Chapter 4 of this manual.



   Program Counter

         With the progr 1m counter, we reach the first of the 8080's Internal registers illustrated in Figure 1-3.

                                                               NOTE

                                 Except for the differences listed at the end of this chapter,
                                 the Information in this chapter applies equally to the 8080
                                 and the 8085.

         The program CJunter keeps track of the next instruction byte to be fetched from memory (which may be either
         ROM or RAM:. Each time It fetches an instruction byte from memory, the processor increments the program
         counter by on". Therefore, the program counter always indicates the next byte to be fetched. This process
         continues as Ie ng as program instructions are executed sequentially. To alter the flow of program execution as
         with a iump irstruction or a call to a subroutine, the processor overwrites the current contents of the program
         counter with t le address of the new Instruction. The next instruction fetch occurs from the new address.


                                                                                                                      8080
                                          IACCUMULATORI           FLAGS                                               8085
                                                                                           HIGH                 LOW

              INSTRUC~                             B                  C                   STACK            POINTER

                DECOD::R
                                                   D                  E                 PROGRAM            COUNTER

         IDATA BUS_ATCH I                          H                  L                  ADDRESS          BUS LATCH




                   o
                   8-bit
               bidirecti, Inal
                                                                                                     u
                                                                                                     16-bit
                                                                                                  address bus
                 data b JS
                      .--------,
                                 ROM                     RAM                  INPUT               OUTPUT
                                                                              PORTS                PORTS
                         INSTRUCTIONS              INSTRUCTIONS

                            CONSTANT                   VARIABLE
                              DATA                       DATA
                                                        STACK



                                          Figure 1-3. 8080/8085 Internal Registers


 1-6
Chapter 1. Assembly Language and Processors




Work Registers

     The 8080 provides an 8-bit accumulator and six other general purpose work registers, as shown in Figure 1-3.

     Programs reference these registers by the letters A (for the accumulator), B, C, D, E, H, and L. Thus, the
     Instruction ADD B may be interpreted as 'add the contents of the B register to the contents of the accumu-
     lator.

     Some instructions reference a pair of registers as shown in the following:

                         Symbolic Reference                Registers Referenced

                                   B                       Band C
                                   D                       D and E
                                   H                       Hand L
                                   M                       Hand L (as a memory reference)
                                 PSW                       A and condition flags (explained
                                                              later In this section)



     The symbolic reference for a single register IS often the same as for a register pair. The Instruction to be executed
     determines how the processor interprets the reference. For example, ADD B is an 8-blt operation. By contrast
     PUSH B (which pushes the contents of the Band C registers onto the stack) is a 16-blt operation.

     Notice that the letters Hand M both refer to the Hand L register pair. The choice of which to use depends on
     the instruction. Use H when an instruction acts upon the Hand L register pair as In INX H (increment the
     contents of Hand L by one). Use M when an instruction addresses memory via the Hand L registers as in ADD
     M (add the contents of the memory location specified by the Hand L registers to the contents of the accumu-
     lator).

     The general purpose registers B, C, D, E, H. and L can proVide a wide variety of functions such as storing 8-bit
     data values, storing intermediate results In arithmetic operations, and storing 16-bit address pointers. Because of
     the 8080's extensive instruction set, it is usually possible to achieve a common result with any of several
     different instructions. A Simple add to the accumulator. for example, can be accomplished by more than half a
     dozen different Instructions. When possible, it is generally desirable to select a register-to-register instruction
     such as ADD B. These instructions tYPically I'equire only one byte of program storage. Also, using data already
     present in a register eliminates a memory access and thus reduces the time required for the operation.

     The accumulator also acts as a general-purpose register, but It has some special capabilities not shared with the
     other registers. For example, the Input/output instructions IN and OUT transfer data only between the accumu-
     lator and external I/O deVices. Also, many operations involving the accumulator affect the condition flags as ex-
     plained In the next section.

     Example:

     The following figures illustrate the execution of a move instruction. The MOV M.e moves a copy of the contents
     of register C to the memory location specified by the Hand L registers. Notice that tillS location must be in
     RAM since data is to be written to memory,




                                                                                                                          1-7
Chapter 1. Assembly Lanl uage and Processors




                                                                                                                      8080
                                       IACCUMULATORI             FLAGS
                                                                                I      HIGH             LOW
                                                                                                                      8085
                  +
               INSTRU(~                I          B
                                                            I
                                                                    e
                                                                                II    STACK       !    POINTER
                                                                                                                  I
                 DECOUER
                                       I          D
                                                           I        E
                                                                                II    PROGRAM     i   COUNTER

      Y     DATA BUS LATCH
                                   I I            H
                                                            I
                                                                    L           I I   ADDRESS     I   BUS LATCH

                      f
                      L
                       l             •
                              ROM                       RAM




                                                Figure 1-4. Instruction Fetch



          The processor initiates the instruction fetch by latching the contents of the program counter on the address bus,
          and then incrEments the program counter by one to Indicate the address of the next Instruction byte. When the
          memory respc nds, the Instruction is decoded into the series of actions shown in Figure 1-5.



                                                                NOTE

                                           The following description of the execution of the
                                           MOV M,e instruction is conceptually correct, but
                                           does not account for normal bus control. For details
                                           concerning memory interface, refer to the User's
                                           Manual for your processor.




1-8
Chapter 1. Assembly Language and Processors




                                                                                                                  8080
                                                                                                                  8085
                                  IACCUMULATORI           FLAGS        I
                                  I        B        I        C         I            HIGH                LOW
        INSTRUCTION
          DECODER
                                                                             I      STACK        !    POINTER
                                                                                                                    I
                                I          D        I         E        I     I    PROGRAM        !   COUNTER        I
      DATA BUS LATCH        f.- I          H        I         L                   ADDRESS        I   BUS LATCH      I

                  +
                                               +         +
                          ROM                      RAM




                                       Figure 1-5. Execution of MOY M.C Instruction



     To execute the MOY M.C instruction. the processor latches the contents of the C register on the data bus and
     the contents of the Hand L registers on the address bus. When the memory accepts the data, the processor
     terminates execution of this instruction and initiates the next instruction fetch.



Internal Work Registers

     Certain operations are destructive. For example, a compare is actually a subtract operation; a zero result indicates
     that the opreands are equal. Since it is unacceptable to destroy either of the operands, the processor includes
     several work registers reserved for its own use. The programmer cannot access these registers. These registers are
     used for internal data transfers and for preserving operands in destructive operations.



Condition Flags

     The 8080 provides five flip flops used as condition flags. Certain arithmetic and logical instructions alter one or
     more of these flags to indicate the result of an operation. Your program can test the setting of four of these
     flags (carry, sign. zero. and parity) using one of the conditional iump. call. or return Instructions. This allows you
     to alter the flow of program execution based on the outcome of a previous operation. The fifth flag. auxiliary
     carry. is reserved for the use of the DAA instruction. as will be explained later in this section.

     It is important for the programmer to know which flags are set by a particular instruction. Assume, for example.
     that your program is to test the parity of an input byte and then execute one instruction sequence if parity is
     even. a different instruction set if parity is odd. Coding a J PE (jump if parity is even) or J PO (jump if parity is

                                                                                                                           1-9
Chapter 1. Assembly Lanfuage and Processors




         odd) instructl,m Immediately foiiowing the IN (input) Instruction produces false results since the IN instruction
         does not affect the condition flags. The jump executed by your program reflects the outcome of some previous
         operation unrdated to the IN instruction. For the operation to work correctly, you must include some instruc-
         tion that alter; the parity flag after the IN instruction, but before the lump Instruction. For example, you can
         add zero to tl e accumulator. ThiS sets the parity flag without altering the data In the accumulator.


         In other cases you wiii want to set a flag With one instruction, but then have a number of intervel1lng instruc-
         tions before    yJU   use It. In these cases, you must be certain that the Intervening instructions do not affect the
         desired flag.

         The flags set I,y each Instruction are detailed in the IndiVidual Instruction descriptions In Chapter 3 of this
         manual.

                                                                 NOTE

                                           When a flag is 'set' It IS set ON (has the value one);
                                           when a flag IS 'reset' it IS reset OFF (has the value
                                           zero).



       Carry Flag

         As ItS name it Wlies, the carry flag IS commonly used to Indicate whether an addition causes a 'carry' into the
         next higher 01 del' digit. The carry flag IS also used as a 'borrow' flag In subtractions, as explallled under 'Two's
         Complement :~epresentatlon of Data' In Chapter 2 of thiS manual. The carry flag is also affected by the logical
         AND, OR, ani exclUSive OR Instructions. These instructions set ON or OFF particular bits of the accumulator.
         See the descrJJtlons of the ANA, ANI, ORA, ORI, XRA, and XRI instructions in Chapter 3.


         The rotate In'truCtions, which move the contents of the accumulator one position to the left or right, treat the
         carry bit as trough it were a III nth bit of the accumulatol' See the deSCrIptions of the RAL, RAR, RLC, and RRC
          instructions II' Chapter 3 of thiS manual.


          Example:


          Addition of ['vo one-byte numbers can produce a carry out of the high-order bit:


                                  Bit Number:       7654 3210
                                          AE=       1010 1110
                                          +74=      0111 01 00


                                                    0010 001 0 = 22 carry flag = 1

          An addition t lat causes a carry out of the high order bit sets the carry flag to 1, an addition that does not cause
         a carry resets the flag to zero.



       Sign Flag

          As explained mder 'Two's Complement Representation of Data' In Chapter 2, bit 7 of a result in the accumulator
          can be Interpletcd as a sign. Instructlolls that affect the sign flag set the flag equal to bit 7. A zero In bit 7


1·10
Chapter 1. Assembly Language and Processors




  indicates a positive value; a one indicates a negative value. This value is duplicated in the sign flag so that
  conditional iump, call, and return instructions can test for positive and negative values.



Zero Flag

  Certain Instructions set the zero flag to one to indicate that the result in the accumulator contains all zeros.
  These instructions reset the flag to zero if the result in the accumulator is other than zero. A result that has a
  carry and a zero result also sets the zero bit as shown below:

                                         1010 0111
                                        +0101 1001

                                          0000 0000      Carry Flag = 1
                                                         Zero Flag = 1



Parity Flag

  Parity IS determined by counting the number of one bits set in the result in the accumulator. Instructions that
  affect the parity flag set the flag to one for even parity and reset the flag to zero to indicate odd parity.



Auxiliary Carry Flag

   The auxiliary carry flag indicates a carry out of bit 3 of the accumulator. You cannot test this flag directly in
   your program; it is present to enable the DAA (Decimal Adiust Accumulator) to perform its function.

  The auxiliary carry flag and the DAA instruction allow you to treat the value in the accumulator as two 4-bit
  binary coded decimal numbers. Thus, the value 0001 1001 is equivalent to 19. (If this value is interpreted as a
  binary number, it has the value 25.) Notice, however, that adding one to this value produces a non-decimal
  result:

                                          0001 1001
                                         +00000001

                                          0001 1010 = lA

   The DAA instruction converts hexadecimal values such as the A in the preceding example back into binary coded
   decimal (BCD) format. The DAA instruction requires the auxiliary carry flag since the BCD format makes it
   possible for arithmetic operations to generate a carry from the low-order 4-bit digit Into the high-order 4-bit
   digit. The DAA performs the following addition to correct the preceding example:

                                          0001 1010
                                         +00000110

                                          0001 0000
                                         +0001 0000 (auxiliary carry)

                                          0010 0000 = 20

                                                                                                                       1-11
Chapter 1. AssemblY Lan5uage and Processors




         The auxiliary carry flag is affected by all add, subtract, increment, decrement, compare, and all logical AND,
         OR, and excl Jsive OR instructions. (See the descriptions of these Instructions In Chapter 3.) There is some
         difference in the handling of the auxiliary carry flag by the logical AND instructions In the 8080 processor and
         the 8085 pro ;essor. The 8085 logical AND instructions always set the auxiliary flag ON. The 8080 logical AND
         instructions s,t the flag to reflect the logical OR of bit 3 of the values involved in the AND operation.



   Stack and Stack Po inter

         To understan j the purpose and effectiveness of the stack, it is useful to understand the concept of a subroutine.

         Assume that !our program requires a multiplication routine. (Sinoe the 8080 has no multiply instruotions, this
         oan be performed through repetitive addition. For example, 3x4 is equivalent to 3+3+3+3.) Assume further that
         your progralT needs this multiply routine several times. You can recode this routine inline each time it is needed,
         but this can lise a great deal of memory. Or, you can code a subroutine:



                        nline Coding                Subroutine




                            1
                        nline routine
                                                        1
                                                      CALL



                            I
                        nline routine
                                                        I
                                                      CALL                                      .    subroutine



                            I
                       nline routine
                                                        I
                                                      CALL



                            I                           I
         The 8080 provides instruotions that call and return from a subroutine. When the call instruction is executed, the
         address of th, next instruction (the contents of the program counter) IS pushed onto the stack. The contents of
         the program :ounter are replaced by the address of the desired subroutine. At the end of the subroutine, a
         return instruction pops that previously-stored address off the stack and puts it back into the program counter.
         Program exe( ution then continues as though the subroutine had been coded inline.

         The mechani;m that makes this possible IS, of course, the staok. The stack is simply an area of random access
         memory addi essed by the stack pointer. The stack pointer IS a hardware register maintained by the processor.
         However, YOiJr program must initialize the stack pointer. This means that your program must load the base
         address of the stack into the stack pointer. The base address of the stack is commonly assigned to the highest
         available add'ess in RAM. This is because the stack expands by decrementing the stack pointer. As items are




 1-12
Chapter 1. Assembly Language and Processors




  added to the stack. it expands into memory locations with lower addresses. As Items are removed from the
  stack. the stack pointer is incremented back toward Its base address. Nonetheless. the most recent item on the
  stack is known as the 'top of the stack.' Stack is still a most descriptive term because you can always put
  something else on top of the stack. In terms of programming, a subroutine can call a subroutine, and so on.
  The only limitation to the number of items that can be added to the stack is the amount of RAM available for
  the stack.

  The amount of RAM allocated to the stack is important to the programmer. As you write your program. you
  must be certain that the stack will not expand into areas reserved for other data. For most applications. this
  means that you must assign data that requires RAM to the lowest RAM addresses available. To be more precise.
  you must count up all instructions that add data to the stack. Ultimately, your program should remove from
  the stack any data it places on the stack. Therefore. for any IIlstruction that adds to the stack. you can sub-
  tract any intervening instruction that removes an Item from the stack. The most critical factor is the maximum
  size of the stack. Notice that you must be sure to remove data your program adds to the stack. Otherwise, any
  left-over items on the stack may cause the stack to grow into portions of RAM you intend for other data.



Stack Operations

  Stack operations transfer sixteen bits of data between memory and a pair of processor registers. The two basIc
  operations are PUSH. which adds data to the stack. and POP, which removes data from the stack.

  A call Instruction pushes the contents of the program counter (which contains the address of the next instruction)
  onto the stack and then transfers control to the desired subroutine by placing its address in the program counter.
  A return instruction pops sixteen bits off the stack and places them in the program counter. This requires the
  programmer to keep track of what is in the stack. For example. if you call a subroutine and the subroutine
  pushes data onto the stack, the subroutine must remove that data before executing a return instruction. Other-
  wise, the return IIlstructlon pops data from the stack and places It in the program counter. The results are
  unpredictable, of course. but probably not what you want.



Savll7g Program Status

  It is likely that a subroutine requires the use of one or more of the working registers. However, it IS equally
  likely that the main program has data stored in the registers that it needs when control returns to the main
  program. As general rule, a subroutine should save the contents of a register before using it and then restore
  the contents of that register before returning control to the main program. The subroutine can do this by
  pushing the contents of the registers onto the stack and then popping the data back into the registers before
  executing a return. The following instruction sequence saves and restores all the working registers. Notice that
  the POP instructions must be in the opposite order of the PUSH instructions if the data is to be restored to its
  original location.




                                                                                                                   1-13
Chapter 1. Assembly langJage and Processors




                              SUBRTN:             PUSH     PSW
                                                  PUSH     B
                                                  PUSH     o
                                                  PUSH     H

                                                  subroutine coding

                                                  POP      H
                                                  POP      0
                                                  POP      B
                                                  POP      PSW
                                                  RETURN


         The letters B, 0, and H refer to the Band C, 0 and E, and Hand L register pairs, respectively, PSW refers to
         the program s atus word. The program status wOl'd IS a 16-blt word comprising the contents of the accumulator
         and the five c,jnpitlon flags. (PUSH PSW adds three bits of filler to expand the condition flags into a full
         byte; POP PSII strrps out these filler bits.)



   Input/Output Ports


         The 256 rnpul/output ports provide communication with the outside world of perrpheral devices. The IN and
         OUT instructl<lns initiate data transfers.


         The IN rnstrw tion latches the number of the desired port onto the address bus. As 500n as a byte of data         15

         returned to the data bus latch, it is transferred into the accumulator.


         The OUT inst: uetion latches the number of the desired port onto the address bus and latches the data in the
         accumulator onto the data bus.

         The specified )ort number      15   duplicated on the address bus. Thus, the instruction IN 5 latches the bit configura-
         tion 0000 01 (1 0000 0101 onto the address bus.

         Notice that the IN and OUT instructions Simply Initiate a data transfer It is the responsibility of the peripheral
         device to   dete~t   that It has been addressed. Notice also that it is possible to dedicate any number of ports to
         the same perr, hera I device. You might use a number of ports as control signals, for example.


         Because input and output are almost totally application dependent, a discussion of design techniques IS beyond
         the scope of t liS manual.


         For additional hardware Information. refer to the 8080 or 8085 Microcomputer Systems User's Manual.


         For related prJgrammlng rnformation, see the descriptions of the IN, OUT, 01, EI, RST, and RIM and SIM
         Instructions In Chapter 3 of this manual. (The RIM and SIM instructions apply only to the 8085.)




1-14
Chapter 1. Assembly Language and Processors




Instruction Set


     The 8080 incorporates a powerful array of Instructions. This section provides a general overview of the Instruc-
     tion set. The detailed operation of each instruction is described In Chapter 3 of tillS manual.



  Addressing Modes

      Instructions can be categorized according to their method of addressing the hardware registers and/or memory.

     Implied AddresslI1g. The addressing mode of certain Instructions is implied by the instruction's function. For
     example, the STC (set carry flag) instruction deals only with the carry flag; the DAA (decimal adjust accumu-
     lator) instruction deals with the accumulator.



     Register AddresslI1g. QUite a large set of instructions call for register addressing. With these instructions, you
      must specify one of the registers A through E, H or L as well as the operation code. With these instructions,
      the accumulator IS implied as a second operand. For example, the instruction CMP E may be Interpreted as
      'compare the contents of the E register with the contents of the accumulator.'

      Most of the Instructions that use register addressing deal with 8-bit values. However, a few of these Instructions
     deal with 16-bit register pairs. For example, the PCHL Instruction exchanges the contents of the program counter
     with the contents of the Hand L registers.



     Immediate AddresslI1g. Instructions that use Immediate addressing have data assembled as a part of the instruction
     Itself. For example, the Instruction CPI 'C' may be Interpreted as 'compare the contents of the accumulator with
     the letter c.' When assembled, this instruction has the hexadecimal value FE43. Hexadecimal 43 IS the Internal
     representation for the letter C. When this instruction IS executed, the processor fetches the first instruction byte
     and determines that it must fetch one more byte. The processor fetches the next byte Into one of its internal
     registers and then performs the compare operation.


      Notice that the names of the Immediate instructions indicate that they use immediate data. Thus, the name of an
     add instruction is ADD; the name of an add Immediate Instruction is AD!.


     All but two of the Immediate instructions use the accumulator as an Implied operand, as in the CPI instruction
     shown previously The MV! (move Immediate) Instruction can move its immediate data to any of the working
     registers, including the accumulator, or to memory. Thus, the Instruction MVI D,OFFH moves the hexadecimal
     value FF to the D register.

     The LXI Instruction (load register pair immediate) is even more unusual in that ItS Immediate data IS a 16-bit
     value. This instruction is commonly used to load addresses Into a register pair. As mentioned previously, YOUl'
     program must initialize the stack pointer; LXI IS the instruction most commonly used for this purpose. For ex-
     ample, the instruction LXI SP,30FFH loads the stack pointer with the hexadecimal value 30FF



      Direct AddresslI1g. Jump Instructions include al6-bit address as part of the instruction. For example, the
      Instruction J MP 1000H causes a jump to the hexadecimal address 1000 by replacing the current contents of the
      program counter with the new value 1000.



                                                                                                                           1-15
Chapter 1. Assemblv Lang Jage and Processors




         Instructions that include a direct address require three bytes of storage: one for the Instruction code. and two
         for the 16-bit lddress.



         Register IndirEct Addressing.    Register indirect instructions reference memory via a register pair. Thus, the
         Instruction MC>V M,C moves the contents of the C register into the memory address stored in the Hand L
         register pair. 1 he instruction LDAX B loads the accumulator with the byte of data specified by the address
         In the Band C register pair.



         Combmed Ad,lressmg Modes.     Some instructions use a combination of addressing modes. A CALL instruction,
         for example, combines direct addressing and register Indirect addressing. The direct address in a CALL instruction
         specifies the address of the deSIred subroutine; the register indirect address IS the stack pointer. The CALL
         instruction pu,hes the current contents of the program counter into the memory location specified by the stack
         pointer


         Timmg Effect~ of Addressmg Modes. Addressing modes affect both the amount of time required for executing
         an Instruction and the amount of memory reqUired for ItS storage. For example, instructions that use implied or
         register addres;ing execute very qUickly since they deal directly with the processor hardware or with data already
         present in hardware I·egisters. More important, however, is that the entire instruction can be fetched with a
         single memory access. The number of memory accesses required is the single greatest factor in determining
         execution timing. More memory accesses require more execution time. A CALL instruction, for example, requires
         five memory accesses: three to access the entire Instruction, and two more to push the contents of the program
         counter onto ',he stack.


         The processor can access memory once during each processor cycle. Each cycle comprises a variable number of
         states. (The Injividual instruction descriptions in Chapter 3 specify the number of cycles and states required for
         each Instructic n.) The length of a state depends on the clock frequency specified for your system, and may
         range from 48) nanoseconds to 2 microseconds. Thus, the timing of a four state instruction may range from
         1.920 microse:onds through 8 microseconds. (The 8085 has a maximum clock frequency of 320 nanoseconds
         and therefore :an execute instructions about 50% faster than the 8080.)



       Instruction Nam/ilg Conventions


         The mnemonl<s assigned to the instructions are designed to indicate the function of the instruction. The Instruc·
         tions fall into the following functional categories:

         Data Tral1Sfer Group. The data transfer instructions move data between registers or between memory and
         registers.


                             MOV               Move
                             MVI               Move    Immediate
                            LDA                Load    Accumulator Directly from Memory
                            STA                Store   Accumulator Directly in Memory
                            LHLD               Load    Hand L Registers Directly from Memory
                            SHLD               Store   Hand L Registers Directly in Memory


 ALL MNEMONICS © 7974. 7975. 7976, 7977 INTEL CORPORA nON


1-16
Chapter 1. Assembly Language and Processors




     An 'X'   In   the name of a data transfer instruction implies that it deals with a register pair:

                          LXI               Load Register Pair with Immediate data
                          LDAX              Load Accumulator from Address in Register Pair
                          STAX              Store Accumulator in Address in Register Pair
                          XCHG              Exchange Hand L with D and E
                          XTHL              Exchange Top of Stack with Hand L



     Arithmetic Group. The arithmetic instructions add, subtract, increment, or decrement data in registers or
     memory.

                          ADD                Add to Accumulator
                          ADI                Add Immediate Data to Accumulator
                          ADC                Add to Accumulator Using Carry Flag
                          ACI                Add Immediate Data to Accumulator Using Carry Flag
                          SUB                Subtract from Accumulator
                          SUI                Subtract Immediate Data from Accumulator
                          SBB                Subtract from Accumulator Using Borrow (Carry) Flag
                          SBI                Subtract Immediate from Accumulator Using Borrow
                          INR                Increment Specified Byte by One
                          DCR                Decrement Specified Byte by One
                          INX                Increment Register Pair by One
                          DCX                Decrement Register Pair by One
                          DAD                Double Register Add:      Add Contents of Register
                                                                       Pair to Hand L Register Pair



     Logical Group. This group performs logical (Boolean) operations on data in registers and memory and on
     condition flags.

     The logical, AND, OR, and Exclusive OR instructions enable you to set specific bits in the accumulator ON or
     OFF.

                          ANA                Logical AND with Accumulator
                          ANI                Logical AND with Accumulator Using Immediate Data
                          ORA                Logical OR with Accumulator
                          ORI                Logical OR with Accumulator Using Immediate Data
                          XRA                Exclusive Logical OR with Accumulator
                          XRI                Exclusive OR Using Immediate Data

     The compare instructions compare the contents of an 8·blt value with the contents of the accumulator:

                          CMP                Compare
                          CPI                Compare Using Immediate Data




ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA nON


                                                                                                                             '-17
Chapter 1. Assembly Lang1lage and Processors



         The rotate instructions shift the contents of the accumulator one bit position to the left or right:

                            RLC                Rotate   Accumulator Left
                            RRC                Rotate   Accumulator Right
                            RAL                Rotate   Left Through Carry
                            RAR                Rotate   Right Through Carry

         Complement ald carry flag instructions:

                            CMA                Complement Accumulator
                            CMC                Complement Carry Flag
                            STC                Set Carry Flag



         Branch Group. The branching instructions alter normal sequential program flow. either unconditionally or
         conditionallY. fhe unconditional branching instructions are as follows:

                            jMP                Jump
                            CALL               Call
                            RET                Return

         Conditional bnnching Instructions examine the status of one of four condition flags to determine whether the
         specified brant h IS to be executed. The conditions that may be specified are as follows:

                             NZ                Not Zero (Z = 0)
                             Z                 Zero (Z = 1)
                             NC                No Carry (C = 0)
                             C                 Carry (C = 1)
                             PO                Parity Odd (P = 0)
                             PE                Parity Even (P = 1)
                             P                 Plus (5 = 0)
                             M                 Minus (5 1)

         Thus. the conditional branching Instructions are specified as follows:

                            Jumps              Calls          Returns

                             jC                CC             RC         (Carry)
                             jNC               CNC            RNC        (No Carry)
                             jZ                CZ             RZ         (Zero)
                             jNZ               CNZ            RNZ        (Not Zero)
                             jP                CP             RP         (Plus)
                             jM                CM             RM         (Minus)
                             jPE               CPE            RPE        (Parity Even)
                             jPO               CPO            RPO        (Parity Odd)

          Two other instructions can effect a branch by replacing the contents of the program counter:

                             PCHL              Move Hand L to Program Counter
                             RST               Special Restart Instruction Used with Interrupts
ALL MNEMONICS © 1974, 7975. 7976, 1977 INTEL CORPORA TlON

1-18
Chapter 1. Assembly Language and Processors




       Stack, //0, and Machine Contra/Instructions. The following instructions affect the stack and/or stack pOinter'

                         PUSH                 Push Two Bytes of Data onto the Stack
                         POP                  Pop Two Bytes of Data off the Stack
                         XTHL                 Exchange Top of Stack with Hand L
                         SPHL                 Move contents of Hand L to Stack Pointer

       The I/O instructions are as follows:

                         IN                   Initiate Input Operation
                         OUT                  Initiate Output Operation

       The machine control Instructions are as follows:

                         EI                   Enable Interrupt System
                         DI                   Disable Interrupt System
                         HLT                  Halt
                         NOP                  No Opel'ation



HARDWARE/INSTRUCTION SUMMARY

       The following illustrations graphically summarize the instruction set by showing the hardware acted upon by
       specific instructions, The type of operand allowed for each Instruction IS Indicated through the use of a code,
       When no code is given. the Instruction does not allow operands.

                         Code                 Meaning

                         REGM S               The opel'and may specify one of the S-bit registers A,B.C,D,E,H, or L or M
                                              (a memory reference via the 16-blt address in the Hand L registers). The
                                              MOV Instruction. which calls for two operands, can specify M for only one
                                              of its operands.
                                              Designates S-bit immediate operand.
                                              Designates a 16-bit address.
                                              Designates an S-bit port number
                                              Designates a 16-blt register pair (B&C,D&E,H&L, or SP).
                                              Designates a 16-blt immediate operand,



  Accumulator Instructions

       The following illustration shows the Instructions that can affect the accumulator, The instructions listed above
       the accumulator all act on the data in the accumulator, and all except CMA (complement accumulator) affect
       one or more of the condition flags. The instructions listed below the accumulator move data Into or out of the
       accumulator, but do not affect condition flags. The STC (set carry) and CMC (complement carry) instructions
       are also shown hel'e,



ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA TlON


                                                                                                                          1-19
Chapter 1. Assembly Lan ,uage and Processors




                                       ADD                 ADI
                                       ADC                 ACI
                                       SUB                 SUI
                                       SBB                 SBI
                                       ANA       REGM S                 D
                                                           ANI              S
                                       XRA                 XRI
                                       ORA                 ORI
                                       CMP                 CPI
                                         RLC        RAL    RRC
                                           RAR      CMA    DAA
                                                 INR}



                      ,-1
                                                          REGM
                                                 DCR             S

                                   ACCUMULATORI           FLAGS
                                                                         I   STC CMC
                                                                                            HIGH      LOW

                      I            I    B           I_ _
                                                       C
                                                                     ---lI                  STACK    POINTER


   MOV REGM S: REC Msi                  D           I      E
                                                                     J                 I   PROGRAM   COUNTER   I

         J~
                                                            L
                                                                         I
                                        HI
              LDAX}                     MEMORY
              STAX EC,DE


              LDA I
              STA}        1'16


              MVI         [J                STACK
                               S
              MOV         F.EGMS,REG
                                       S




ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA TlON


1·20
Chapter 1. Assembly Language and Processors




  Register Pair (Word) Instructions

       The following instructions all deal with 16-bit words. Except for DAD (which adds thecontents of the B&C or
       D&E register pair to H&L), none of these instructions affect the condition flags. DAD affects only the carry
       flag.




                   IACCUMULATORI          FLAGS
                                                          INX}                            HIGH           LOW
                            B               C             DCX
                                                          DAD
                                                                  REG
                                                                        16   fSPH' -I STACK         !   POINTER

             .-             D               E
                                                      I"""xcHG
                                                                             PCHL   _I PROGRAM! COUNTER I
                                                      ..",..-
                            H               L




                                          XTHL

                                  LHLD
                                  SHLD

                                      I
                                 MEMORY




                                  STACK                   PUSH }
                                                          POP    B,D,H,PSW




ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA TlON


                                                                                                                     1-21
Chapter 1. Assembly Lalguage and Processors




   Branching Instructions

         The followin~ Instructions can alter the contents of the program counter, thereby altering the normal sequential
         execution flew. Jump instructions affect only the program counter. Call and Return Instructions affect the
         program coullter, stack pointer, and stacK.




             ~CUMjLATORI              FLAGS
                                                  I                           HIGH                LOW

             ~i                          C
                                                  I                                             POINTER


             ~)                          E        I      I   PCHL                               COUNTER           RST


             ~I                          L
                                                  ~
                                                                      JMP                CALL             RET

                                                                    JC
                                                                    JZ
                                                                         JNC  1
                                                                         JNZ (> A
                                                                                  CC
                                                                                  CZ
                                                                                           CNC}
                                                                                           CNZ A
                                                                                                    RC
                                                                                                    RZ
                                                                                                            RNcl
                                                                                                            RNZ  A
                                                                    IP   1M I 16 CP        CM    16 RP      RM J> 16
                                                                    JPE JPO   J         CPE CPO         RPE RPO




                            MEMORY                                                CONTROL INSTRUCTIONS

                                                                                  RST
                                                                                  Nap
                                                                                  HLT
                                                                                  EI
                                                                                  01
                            STACK
                                                                                  SIM} 8085 only
                                                                                  RIM




 ALL    MNEMONICS'~ 7974,7975,7976,7977          INTEL CORPORATION


 1-22
Chapter 1. Assembly language and Processors




 Instruction Set Guide

      The following is a summary of the instruction set:
                                                   ADI
                         ADDl
                         ADC                       ACI
                         SUB                       SUI
                         SBB    REGM S             SBI      DS
                         ANA                       ANI
                         XRA                       XRI
                         ORA                       ORI
                         CMP                       CPI

                            RLC RAL RRC
                            RAR CMA DAA
                                INR}
                                DCR REGM S

                "ACCUMULATORI                FLAGS         ISTC CMC                     HIGH           LOW
MOY REGMS,REGM S        !       B        I     C
                                                            INX}
                                                           IDCX REG 16                 STACK      , POINT;ER

                1
     LXI REG 16 ,D 16
                        I       D        I     E           ~XCHG
                                                                                                                     RST
                                H              L

                                                                      jMP                 CALL                 RET
                                                                 jC                     CC     CNCl          RC    RNCi
                                                                     jNC1
                                                                 jZ jNZ A               CZ     CNZ A         RZ    RNZ ~ A
                                                                 jP  jM   16 J          CP     CM  J16       RP    RM   J 16
                                                                 jPE jPO                CPE    CPO           RPE   RPO

                                       LHLD}
                                       STHD A16                             OUT P
  ~                                                                                s           CONTROL
   LDAX BC DE
   STAX)   ,                                                                                   INSTRUCTIONS
                                                           INPUT            OUTPUT
                                     MEMORY
                                                           PORTS            PORTS              RST
                                                                                               NOP
                                                                                               HLT
                                                                                               EI
   MYI   DS                                                                                    DI
   MOY REGMS,REGM S
                                    --STAC"K---    ~- :~~H} B,D,H,PSW                          SIMI
                                                                                                        SOS5 ONLY
                                                                                               RIM]
       CODE                 MEANING

       REGM S               The operand may specify one of the S-bit registers A,B,C,D,E,H, or l or M (a memory
                            reference via the 16-bit address in the Hand L registers). The MOY instruction, which
                            calls for two operands, can specify M for only one of its operands.
                            Designates S-bit immediate operand.
                            Designates a 16-bit address.
                            Designates an S-bit port number.
                            Designates a '16-bit register pair (B&C,D&E,H& L,or SP).
                            Designates a 16 -bit immediate operand.

ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA nON
                                                                                                                           1-23
Chapter 1.   Assemblv Lalguage and Processors




8085 PROCESSOR DIFFERENCES

         The differences between the 8080 processor and the 8085 processor will be more obvious to the system designer
         than to the programmer. Except for two additional instructions. the 8085 i"~truction set is identical to and fully
         compatible with the 8080 instruction set. Most programs written for the 8680 should operate on the 8085 with-
         out modifica1ion. The only programs that may require changes are those with critical timing routines; the higher
         system speed of the 8085 may alter the time values of such routines.

         A partial listing of 8085 design features Includes the following:

                   •      A single 5 volt power supply.
                   •      Execution speeds approximately 50% faster than the 8080.
                   •      Incorporation in the processor of the features of the 8224 Clock Generator and Driver and the
                          8228 System Controller and Bus Driver.
                   •      A non-maskable TRAP interrupt for handling serious problems such as power failures.
                   •      Three separately maskable interrupts that generate internal RST instructions.
                   •      Input/output lines for serial data transfer



   Programming for tile 8085

         For the prog ·ammer. the new features of the 8085 are summarized In the two new Instructions SIM and RIM.
         These instructions differ from the 8080 instructions in that each has multiple functions. The SIM instruction
         sets the interrupt mask and/or writes out a bit of serial data. The programmer must place the deSIred interrupt
         mask and/or serial output In the accumulator prior to execution of the SIM instruction. The RIM Instruction
         reads a bit 0 serial data if one is present and the Interrupt mask Into the accumulator. Details of these instruc-
         tions are cov"red in Chapter 3.

         Despite the Ilew Interrupt features of the 8085. programming for interrupts is little changed. Notice, however, that
         8085 hardware interrupt RESTART addresses fall between the eXisting 8080 RESTART addresses. Therefore.
         only four bytes are available for certain RST instructions. Also, the TRAP interrupt Input is non-maskable and
         cannot be di ;abled. If your application uses this input, be certain to provide an interrupt routine for it.

         The interrup:s have the following priority:

                          TRAP                  highest
                          RSn.5
                          RST6.5
                          RST5.5
                          INTR                  lowest

         When more han one interrupt is pending, the processor always recognizes the higher priority Interrupt first.
         These priorii ies apply only to the sequence in which interrupts are recognized. Program routines that service
         interrupts h,ve no special priority. Thus. an RST5.5 interrupt can Interrupt the service routine for an RST7.5
         interrupt. If you want to protect a service routine from interruption, either disable the interrupt system (01
         instruction), or mask out other potential interrupts (SIM instruction).




1-24
Chapter 1. Assembly Language and Processors




Conditional Instructions


     Execution of conditional instructions on the 8085 differs from the 8080. The 8080 fetches all three instruction
     bytes whether or not the condition is satisfied. The 8085 evaluates the condition while it fetches the second
     instruction byte. If the specified condition is not satisfied, the 8085 skips over the third instruction byte and
     immediately fetches the next Instruction. Skipping the unnecessary byte allows for faster execution.




                                                                                                                       1-25
Intel 8080 8085 assembly language programming 1977 intel
2. ASSEMBLY LANGUAGE CONCEPTS



INTRODUCTION

      Just as the English languagc has its [-ulcs of grammar, assembly language has certalll coding rules. The source line
      [5the assembly language equivalent of a sentencc.


      Th[s assembler recognizcs three types of source lines: IIlstruct[ons, directives, and controls. This manual describes
      instructions and dircctlves. Controls are dcscribed [n the operator's manual for your version of the assembler.


      Th[s chapter dcscribes thc general rules for coding sourcc lincs. Specific instructions (see Chapter 3) and
      directives (see Chapters 4 and 5) may have specific coding rules. Even    50,   the coding of such Instructions and
      directives must conform to thc gencral rules in this chapter.



SOURCE LINE FORMAT

      Assembly language [nstructlons and asscmblcr directives may consist of up to four fields, as follows:


                    Label:)            Opcodc                Operand              ;Comment
                  { Name


      Thc fields may be separated by any numbe[- of blanks, but must be separated by at least one delimlter_ Each
      IIlstruction and directive must be entered on a single line term lila ted by a carriage return and a line fced. No
      continuation lines are possiblc, but you may havc lines conSisting enti[-ely of commcnts.



 Character Set


      The following characters are Icgal In asscmbly languagc source statements:


            •     Thc lctters of the alphabet, A through Z. Both upper- and lower-case letters are allowed. Internally,
                  the assemblc[- trcats all letters as though they wcre upper-casc, but the characters are printed exactly
                  as they were Input in the assembly listing.


            •     The digits 0 through 9.

            •     The following speCial characters:




                                                                                                                            2-1
Chapter 2. Assembly Lan luage Concepts




                                 Character                Meaning

                                    +                     Plus sign
                                                          Minus sign
                                     *                    Asterisk
                                                          Slash
                                                          Comma
                                                          Left parenthesis
                                                          Right parenthesis
                                                          Single quote
                                    &                     Ampersand
                                                          Colon
                                     $                    Dollar sign
                                    @                     Commercial 'at' sign
                                                          Question mark
                                                          Equal sign
                                    <                     Less than sign
                                    >                     Greater than sign
                                    %                     Percent sign
                                                          Exclamation point
                                   blank                  Blank or space
                                                          Semicolon
                                                          Period
                                   CR                     Carnage return
                                   FF                     Form feed
                                   HT                     Horizontal tab

               ..    In addition, any ASCII character may appear in a string enclosed   In   single quotes or in a comment.



      Delimiters

         Certain chara<:ters have special meaning to the assembler in that they function as delimiters. Delimiters define
         the end of a ,ource statement, a field, or a component of a field. The following list defines the delimiters
         recognized by the assembler, Notice that many delimiters are related to the macro feature explained In Chapter
         5. Delimiters Jsed for macros are shown here so that you will not accidentally use a delimiter improperly
         Refer to Chal,ter 5 for a description of macros.




2-2
Chapter 2. Assembly Language Concepts




                   Charaeter(s)           Meaning                    Use

                        blank          one or more          field separator or symbol terminator
                                       blanks


                                       comma                separate operands in the operands field,
                                                            including macro parameters

                                       pair of single       delimit a character string
                                       quote characters

                    (..• J              pair of paren-      delimit an expression
                                        theses

                     CR                carriage return      statement terminator

                      HT                horizontal tab      field separator or symbol terminator

                                       semicolon            comment field delimiter

                                       colon                delimiter for symbols used as labels

                        &              ampersand            delimit macro prototype text or formal
                                                            parameters for concatenation


                   <... >               pair of angle       delimit macro parameter text which
                                        brackets            contains commas or embedded blanks;
                                                            also used to delimit a parameter list

                        %               percent sign        delimit a macro parameter that is to be
                                                            evaluated prior to substitution

                                       exclamation          an escape character used to pass the
                                       point                following character as part of a macro
                                                            parameter when the character might
                                                            otherwise be interpreted as a delimiter

                                       double semi-         delimiter for comments in macro definitions
                                       colon                when the comment is to be suppressed when
                                                            the macro is expanded



Label/Name Field

     Labels are always optional. An instruction label is a symbol name whose value is the location where the instruc-
     tion is assembled. A label may contain from one to SIX alphanumeric characters, but the first character must be
     alphabetic or the special characters '7' or '@' The label name must be terminated with a colon. A symbol used
     as a label can be defined only once in your program. (See 'Symbols and Symbol Tables' later in this chapter.)



                                                                                                                     2-3
Chapter 2. Assemblv Lallguage Concepts




         Alphanumerit: characters include the letters of the alphabet, the question mark character, and the decimal
         digits 0 throl gh 9.

         A name is required for the SET. EQU, and MACRO directives. Names follow the same coding rules as labels,
         except that t ley must be terminated with a blank rather than a colon. The label/name field must be empty for
         the LOCAL ind ENDM directives.



   Opcode Field

         This required field contains the mnemonic operation code for the 8080/8085 instruction or assembler directive
         to be perforned.



   Operand Field

         The operand field identifies the data to be operated on by the specified opcode. Some instructions require no
         operands. Otners require one or two operands. As a general rule, when two operands are required (as in data
         transfer and lrithmetic operations), the first operand identifies the destination (or target) of the operation's
         result, and tlie second operand specifies the source data.

         Examples:

                   MOil    A,C                       ;MOVE CONTENTS OF REG C TO ACCUMULATOR
                   MV      A:B'                      ;MOVE B TO ACCUMULATOR



   Comment Field

         The optiona comment field may contain any information you deem useful for annotating your program. The
         only coding requirement for this field is that it be preceded by a semicolon. Because the semicolon is a delimiter,
         there IS no reed to separate the comment from the previous field with one or more spaces. However, spaces are
         commonly Lsed to improve the readability of the comment. Although comments are always optional, you should
         use them lib;rally since it is easier to debug and maintain a well documented program.



CODING      OPERAI~D      FIELD INFORMATION

         There are feur types of information (a through d in the following list) that may be requested as items in the
         operand field; the information may be specified in nine ways, each of which is described below.




 2-4
Chapter 2. Assembly language Concepts




                                    OPERAND FIELD INFORMATION

                   Information reqUIred                  Ways of specitying


                   (a)   Register                        (1)   Hexadecimal Data
                   (b)   Register Pair                   (2)   Decimal Data
                   (c)   Immediate Data                  (3)   Octal Data
                   (d)   16-bit Address                  (4)   Binary Data
                                                         (5)   Location Counter ($)
                                                         (6)   ASCII Constant
                                                         (7)   Labels assigned values
                                                         (8)   Labels of instructions or data
                                                         (9)   Expressions



Hexadecimal Data.   Each hexadecimal number must begin with a numeric digit (0 through 9) and must be
followed by the letter H.

                Label            Opcode           Operand               Comment


                HERE:            MVI               C,OBAH               ;LOAD REG C WITH HEX BA

DecImal Data.   Each decimal number may be identified by the letter D immediately after its last digit or may
stand alone. Any number not specifically identified as hexadecimal, octal, or binary is assumed to be decimal.
Thus. the following statements are equivalent:

                Label            Opcode           Operand               Comment


                ABC:             MVI              E,15                  ;LOAD E WITH 15 DECIMAL
                                 MVI              E,15D



Octal Data.    Each octal number must be followed by the letter 0 or the letter Q.

                Label            Opcode           Operand               Comment


                LABEL:           MVI              A,nQ                  ;LOAD OCTAL 72 INTO ACCUM



Binary Data.    Each binary number must be followed by the letter B.

                Label            Opcode           Operand               Comment


                NOW:             MVI              D,l1l1 011 OB         ;LOAD REGISTER D
                                                                        ;WITH OF6H




                                                                                                                      2-5
Chapter 2. Assemblv L, nguage Concepts




         Location Counter, The $ character refers to the current location counter. The location counter contains the
         address wher~ the current instruction or data statement will be assembled.

                     label          Opcode            Operand           Comment

                     co:            jMP               $+6               ;j UMP TO ADDRESS 6 BYTES BEYOND
                                                                        ;THE FIRST BYTE OF THIS
                                                                        ;INSTRUCTION



         ASCII Const1t7t. One or more ASCII characters enclosed in single quotes define an ASCII constant. Two
         successive sillgle quotes must be used to represent one slllgie quote Within an ASCII constant.

                     i.abel         Opcode            Operand           Comment

                                     MYI              E '*'             ;LOAD E REG WITH 8-BIT ASCII
                                                                        ;REPRESENTATION OF *
                     DATE:           DB               TODAY"S DATE'



         Labels Assig led Values. The SET and EQU directives can assign values to labels. In the following example,
         assume that VALUE has been assigned the value 9FH; the two statements are equivalent:

                                    Opcode            Operand           Comment

                      1.            MYI              D,9FH
                      2:            MYI              D,YALUE



         Labels of In;truction or Data. The label assigned to an IIlstructlon or a data definition has as its value the
         address of tile first byte of the instruction or data. Instructions elsewhere in the program can refer to this
         address by I:S symbolic label name.

                                    Opcode            Operand           Comments

                      -jERE:         jMP              THERE             ;jUMP TO INSTRUCTION AT THERE



                      fHERE;        MVI               D,9FH



         Expressions. All of the operand types discussed previously can be combined by operators to form an expression.
         In fact, the example given for the location counter ($+6) IS an expression that combines the location counter
         with the decimal number 6.

         Because the rules for coding expressions are rather extensive, further discussion of expressions is deferred until
         later in this chapter.




2-6
Chapter 2. Assembly Language Concepts




     Instructions as Operands. One operand type was intentionally omitted from the list of operand field infor-
     mation: Instructions enclosed in parentheses may appear in the operands field. The operand has the value of
     the left-most byte of the assembled instruction.

                              Label              Opcode         Operand

                               INS:              DB             (ADD C)

     The statement above defines a byte with the value 81 H (the object code for an ADD C instruction). Such
     coding is typically used where the object program modifies itself during execution, a technique that is strongly
     discouraged.



     Register-Type Operands. Only instructions that allow registers as operands may have register-type operands.
     Expressions containing register-type operands are flagged as errors. Thus, an instruction like

                               JMP A

     is flagged as an illegal use of a register.

     The only assembler directives that may contain register-type operands are EQU, SET, and actual parameters in
     macro calls. Registers can be assigned alternate names only by EQU or SET.



TWO'S COMPLEMENT REPRESENTATION OF DATA

     Any 8-bit byte contains one of the 256 possible combinations of zeros and ones. Any particular combination may
     be interpreted in a number of ways. For example, the code 1 FH may be interpreted as an instruction (Rotate
     Accumuiator Right Through Carry), as the hexadecimal value 1 F, the decimal value 31, or simply the bit
     pattern 00011111.

     Arithmetic instructions assume that the data bytes upon which they operate are in the 'two's complement'
     format. To understand why, let us first examine two examples of decimal arithmetic:

                                           35              35
                                          -12             +88

                                            23            123

     Notice that the results of the two examples are equal if we disregard the carry out of the high order position in
     the second example. The second example illustrates subtraction performed by adding the ten's complement of
     the subtrahend (the bottom number) to the minuend (the top number). To form the ten's complement of a
     decimal number, first subtract each digit of the subtrahend from 9 to form the nine's complement; then add one
     to the result to form the ten's complement. Thus, 99-12=87; 87+1=88, the ten's complement of 12.

     The ability to perform subtraction with a form of addition is a great advantage in a computer since fewer cir-
     cuits are required. Also, arithmetic operations within the computer are binary, which simplifies matters even more.




                                                                                                                        2-7
Chapter 2. Assembly Lalguage Concepts




        The processol forms the two's complement of a binary value simply by reversing the value of each bit and then
        adding one tc the result. Any carry out of the high order bit is ignored when the complement is formed. Thus,
        the subtractic n shown previously is performed as follows:


                                   35    = 001 0   0011                           00100011
                                  -12    = 0000    1100   = 1111     0011        +11110100

                                    23                    +                  1 0001 0111 = 23

                                                              1111 01 00

        Again, by dis 'egarding the carry out of the high order position, the subtraction IS performed through a form of
        addition. HO/ever, if this operation were performed by the 8080 or [he 8085, the carry flag would be set OFF
        at the end of the subtraction. This is because the processors complement the carry flag at the end of a subtract
         operation so :hat it can be used as a 'borrow' flag in multibyte subtractions. In the example shown, no borrow
         IS reqUired. St> the carry flag IS set OFF. By contrast, the carry flag IS set ON if we subtract 35 from 12:


                                   12 = 000011 00                                 00001100
                                  -35 = 0010 0011         = 11 01    11 00       +1101 1101

                                                          +
                                                          -----'-
                                                                                  1110 1001   = 233   or --105

                                                              1101   1101

         In this case, he absence of a carry indicates that a borrow IS reqUired from the next higher order byte, if any
         Therefore, th 0 processor sets the carry flag ON. Notice also that the result is stored In a complemented form.
         If you want 0 Interpret this result as a deCimal value, you must again form its two's complement:

                                           111 0 1001     = 0001     011 0
                                                          +              1

                                                              0001   0111 = 23

         Two's compl·'ment numbers may also be signed. When a byte IS Interpreted as a signed two's complement number,
         the high ordu bit indicates the sign. A zero In thiS bit indicates a positive number, a one a negative number. The
         seven low order bits provide the magnitude of the number. Thus, 0111 1111 equals +127

         At the beglnlling of this description of two's complement arithmetic, it was stated that any 8-blt byte may con-
         tain one of tile 256 possible combinations of zeros and ones. It must also be stated that the proper interpretation
         of data is a r r,ogramming responsibility.

         As an examp,e, consider the compare instruction. The compare logiC considers only the raw bit values of the
         Items being compared. Therefore, a negative two's complement number always compares higher than a positive
         number, bec;use the negative number's high order bit IS always ON. As a result, the meanings of the flags set by
         the compare instruction are reversed. Your program must account for this condition.




2-8
Chapter 2. Assembly Language Concepts




SYMBOLS AND SYMBOL TABLES

 Symbolic Addressing

      If you have never done symbolic programming before, the following analogy may help clarify the distinction
      between a symbolic and an absolute address.

      The locations in program memory can be compared to a cluster of post office boxes. Suppose Richard Roe
      rents box 500 for two months. He can then ask for his letters by saying 'Give me the mail in box 500: or
      'Give me the mail for Roe.' If Donald Smith later rents box 500, he too can ask for his mail by either box
      number 500 or by his name. The content of the post office box can be accessed by a fixed. absolute address
      (500) or by a symbolic. variable name. The postal clerk correlates the symbolic names and their absolute values
      In hiS log book. The assembler performs the same function. keeping track of symbols and their values in a
      symbol table. Note that you do not have to assign values to symbolic addresses. The assembler references its
      location counter during the assembly process to calculate these addresses for you. (The location counter does
      for the assembler what the program counter does for the microcomputer. It tells the assembler where the next
      instruction or operand is to be placed in memory.)



 Symbol Characteristics

      A symbol can contain one to six alphabetic (A-Z) or numeric (0-9) characters (with the first character alphabetic)
      or the special character '7' or '@'. A dollar sign can be used as a symbol to denote the value currently in the
      location counter For example, the command

                                         jMP      $+6

      forces a jump to the instruction residing six memory locations higher than the JMP instruction. Symbols of the
      form '??nnn' are generated by the assembler to uniquely name symbols local to macros.

      The assembler regards symbols as haVing the following attributes: reserved or user-defined; global or limited;
      permanent or redefinable; and absolute or relocatable.



    Reserved. User-Defined. and Assembler-Generated Symbols

      Reserved symbols are those that already have special meaning to the assembler and therefore cannot appear as
      user-defined symbols. The mnemonic names for machine instructions and the assembler directives are all reserved
      symbols.




                                                                                                                       2-9
Chapter 2. Assembly Lan;:uage Concepts




          The following instruction operand symbols are also reserved:

                           Symbol                    Meaning


                           $                         Location counter reference
                           A                         Accumulator register
                           B                         Register B or register pair Band C
                           C                         Register C
                           D                         Register D or register pair D and E
                           E                         Register E
                           H                         Register H or register pair Hand L
                           L                         Register L
                           SP                        Stack pointer register
                           PSW                       Program status word (Contents of A and status flags)
                           M                         Memory reference code using address in Hand L
                           STACK                     Special relocatability feature
                           MEMORY                    Special relocatability feature



                                                           NOTE

                                     The STACK and MEMORY symbols are fully discussed
                                     in Chapter 4.

          User-defined' ymbols are symbols you create to reference Instruction and data addresses. These symbols are
          defined when they appear in the label field of an instruction or In the name field of EQU, SET, or MACRO
          directives (see Chapters 4 and 5).

          Assembler-ger erated symbols are created by the assembler to replace user-defined symbols whose scope is limited
          to a macro d, finition.



        Global and Um/'ed Symbols


          Most symbol, are global. This means that they have meaning throughout your program. Assume, for example,
          that you assifn the symbolic name RTN to a routine. You may then code a iump or a calJ to RTN from any
          POlllt in your program. If you assign the symbolic name RTN to a second routine, an error results since you
          have given ml i1tiple definitions to the same name.

          Certain symbJls have meaning only within a macro definition or within a calJ to that macro; these symbols are
          'local' to the macro. Macros require local symbols because the same macro may be used many times in the
          program. If tile symbolic names within macros were global, each use of the macro (except the first) would cause
          multiple defililtlons for those symbolic names.

          See Chapter .; for additional information about macros.




 2·10
Chapter 2. Assembly Language Concepts




   Permanent and Redefinable Symbols

      Most symbols are permanent since their value cannot change during the assembly operation. Only symbols
      defined with the SET and MACRO assembler directives are redefinable.



   Absolute and Relocatable Symbols

      An important attribute of symbols with this assembler is that of relocatability. Relocatable programs are
      assembled relative to memory location zero. These programs are later relocated to some other set of memory
      locations. Symbols with addresses that change dUring relocation are relocatable symbols. Symbols with
      addl-esses that do not change during relocation are absolute symbols. This distinction becomes important when
      the symbols are used within expressions, as will be explained later.

      External and public symbols are special types of relocatable symbols. These symbols are required to establish
      program linkage when several relocatable program modules are bound together to form a single application
      program. External symbols are those used in the current program module, but defined In another module.
      Such symbols must appear in an EXTRN statement, or the assembler will flag them as undefined.

      Conversely, PUBLIC symbols are defined in the current program module, but may be accessed by other
      modules. The addresses for these symbols are resolved when the modules are bound together.

      Absolute and relocatable symbols may both appear in a relocatable module. References to any of the assembler-
      defined registers A through E, Hand L, PSW, SP, and M are absolute since they refer to hardware locations.
      But these references are valid in any module.



ASSEMBLY-TIME EXPRESSION EVALUATION

      An expression IS a combination of numbers, symbols, and operators. Each element of an expression is a term.

      Expressions, like symbols, may be absolute or relocatable. For the sake of readers who do not require the
      relocation feature, absolute expressions are described first. However, users of relocation should read all the
      following.



 Operators

      The assembler Includes five groups of operators which permit the following assembly-time operations: arithmetic
      operations, shift operations, logical operations, compare operations, and byte Isolation operations. It is important
      to keep in mind that these are all assembly-time operations. Once the assembler has evaluated an expression, it
      becomes a permanent part of your program. Assume, for example, that your program defines a list of ten con-
      stants starting at the label LIST; the following instruction loads the address of the seventh item in the list Into
      the Hand L registers:

                                          LXI   H,L1ST+6

      Notice that LIST addresses the first item, L1ST+l the second, and so on.




                                                                                                                       2-11
Chapter 2. Assembly Lan ~uage Concepts




       Arithmetic Open tors

         The anthmeti, operators are as follows:


                               Operator                    Meaf7/1lg


                                  +                        Unary or binary addition
                                                           Unary or blllary subtraction
                                  *                        Multiplication
                                                           Division. Any remainder is discarded (7/2=3).
                                                           Division by zero causes an error.
                                MOD                        Modulo. Result is the remainder caused by a
                                                           division operation. (7 MOD 3=1)


          Examples:


         The follOWing expressions generate the bit pattern for the ASCII character A;


                                                 5+30*2
                                                 (25/5)+30*2
                                                 5+( -30*·2)

          Notice that tLe MOD operdtor must be separdted from ItS operands by spaces:


                                                 NUMBR     MOD         8


          Assuming tha. NUMBR has the value 25, the previous expression evaluates to the value



       Shift Operators

          The shift ope'atars are as !"ollows:


                               Operator                    Meol7lf7g


                               y SHR x                     Shift operand 'y' to the nght 'x' bit posItions.


                               y SHL x                     Shift operand 'y' to the le!"t 'x' bit positions.


          The shift operators do not wraparound any bits shihed out of the byte. Bit positions vacated by the shift
          operation are zero·filled. Notice that the shift operatar must be separated from ItS operands by spaces.


          Example:


          Assume that NUMBR has the value 0101 0101, The effects of the shift operators is as follows:


                                            NUMBR        SHR                  0001 0101

                                            NUMBR        SHL                  1010 1010


2-12
Chapter 2. Assembly Language Concepts




  Notice that a shift one bit position to the left has the effect of multiplying a value by two; a shift one bit
  position to the right has the effect of dividing a value by two.



Logical Operators

  The logical operators are as follows;

                          Operator                Meaning

                            NOT                   Logical one's complement

                            AND                   Logical AND (=1 if both ANDed bits are 1)

                           OR                     Logical OR (=1 if either ORed bit is 1)

                            XOR                   Logical EXCLUSIVE OR (=1 if bits are different)

  The logical operators act only upon the least significant bit of values involved in the operation. Also, these
  operators are commonly used In conditional IF directives. These directives are fully explained in Chapter 4.

   Example:

  The following IF directive tests the least significant bit of three Items. The assembly language code that follows
  the IF is assembled only if the condition IS TRUE. This means that all three fields must have a one bit in the
  least significant bit position.

                                     IF FLDI AND FLD2 AND FLD3




Compare Operators

  The compare operators are as follows:

                          Operator                Meaning

                            EQ                    Equal
                            NE                    Not equal
                            LT                    Less than
                            LE                    Less than or equal
                            GT                    Greater than
                            GE                    Greater than or equal
                           NUL                    Special operator used to test for null (missing) macro
                                                  parameters




                                                                                                                   2-13
Chapter 2. Assembly Lan ;uage Concepts




          The compare )perators Yield a yes-no result. Thus. if the evaluation of the relation is TRUE. the value of the
          result is all ores. If false. the value of the result is all zeros. Relational operations are based strictly on magni-
          tude comparisons of bit values. Thus. a two's complement negative number (which always has a one in its high
          order bit) is g'eater than a two's complement positive number (which always has a zero in its high order bit).

          Since the NU'_ operator applies only to the macro feature, NUL is described in Chapter 5.

          The compare operators are commonly used in conditional IF directives. These directives are fully explained in
          Chapter 4.

          Notice that tl,e compare operator must be separated from its operands by spaces.

          Example:

         The following IF directive tests the values of FLDl and FLD2 for equality. If the result of the comparison is
         TRUE, the aSiembly language coding following the IF directive IS assembled. Otherwise. the code is skipped over.

                                             IF FLDl EQ FLD2




       Byte Isolation Ooerators

         The byte isolltion operators are as follows:

                                  Operator                    Meaning

                                   HIGH                       Isolate hlgh·order 8 bits of 16-bit value

                                   LOW                        Isolate low-order 8 bits of 16-blt value.


         The assemble- treats expressions as 16-blt addresses. In certain cases. you need to deal only with a part of an
         address. or Y<lU need to generate an 8-bit value. This IS the function of the HIGH and LOW operators.

         The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
         these symbol; appears in the operand expression of an Immediate instruction. It must be preceded by either the
         HIGH or LON operator to specify which byte of the address IS to be used In the evaluation of the expression.
         When neithel operator is present. the assembler assumes the LOW operator and Issues an error message.

                                                              NOTE

                                    Any program segment containing a symbol used as the
                                    argument of a HIGH operator should be located only on
                                    a page boundary. This is done using the PAGE option
                                    with the CSEG or DSEG directives described in Chapter
                                    4. Carries are not propagated from the low-order byte
                                    when the assembler object code is relocated and the
                                    carry flag will be lost. Using PAGE ensures that this
                                    flag is 0_
2-14
Chapter 2. Assembly Language Concepts




     Examples:

     Assume that ADRS is an address manipulated at assembly-time for building tables or lists of items that must all
     be below address 255 in memory. The following IF directive determines whether the high-order byte of ADRS
     is zero, thus indicating that the address is still less than 256:

                                           IF HIGH ADRS EQ 0




Permissible Range of Values

     Internally, the assembler treats each term of an expression as a two-byte, 16-bit value. Thus, the maximum
     range of values is OH through OFFFFH. All arithmetic operations are performed using unsigned two's comple-
     ment arithmetic. The assembler performs no overflow detection for two-byte values, so these values are evaluated
     modulo 64K.

     Certain Instructions require that their operands be an eight-bit value. Expressions for these instructions must
     yield values in the range -256 through +255. The assembler generates an error message if an expression for one
     of these instructions yields an out-of-range value.



                                                         NOTE

                              Only instructions that allow registers as operands may have
                              register-type operands. Expressions containing register-type
                              operands are flagged as errors. The only assembler directives
                              that may contain register-type operands are EQU, SET, and
                              actual parameters in macro calls. Registers can be assigned
                              alternate names only by EQU or SET.



Precedence of Operators

     Expressions are evaluated left to right. Operators with higher precedence are evaluated before other operators
     that immediately precede or follow them. When two operators have equal precedence, the left-most is evaluated
     first.

     Parentheses can be used to override normal rules of precedence. The part of an expression enclosed In paren-
     theses is evaluated first. If parentheses are nested, the Innermost are evaluated first.

                              15/3 + 18/9        =5+2=7
                              15/(3 + 18/9)      = 15/(3 + 2) = 15/5 = 3




                                                                                                                        2-15
Chapter 2. Assembly Lan :uage Concepts




         The following list describes the classes of operators in order of precedence:

                         •     Parenthesized expressions
                         •     NUL
                         •     HIGH, LOW
                         •     Multiplication/Division: *. /, MOD, SHL, SHR
                         •     Addition{Subtraction: +, - (unary and binary)
                               Relational Operators: EQ, LT, LE, GT, GE, NE
                         •     Logical NOT
                         •     Logical AND
                         •     Logical OR, XOR
         The relational, logical, and HIGH{LOW operators must be separated from their operands by at least one blank.



   Relocatable Express ions

         Determining t le relocatability of an expression requires that you understand the relocatability of each term used
         in the express on. This is easier than it sounds since the number of allowable operators is substantially reduced.
         But first it is lecessary to know what determines whether a symbol is absolute or relocatable.

         Absolute symJols can be defined two ways:

               •     A symbol that appears in a label field when the ASEG directive is in effect IS an absolute symbol.
               •     A symbol defined as equivalent to an absolute expression using the SET or EQU directive is an
                     absolute symbol.

         Relocatable s"mbols can be defined a number of ways:

               •     A symbol that appears in a label field when the DSEG or CSEG directive IS in effect is a relocatable
                     symbol.
               •     A symbol defined as equivalent to a relocatable expression using the SET or EQU directive is
                     reocatable.
               •     Tile special assembler symbols STACK and MEMORY are relocatable.
               •     E,ternal symbols are considered relocatable.
               •     A reference to the location counter (specified by the $ character) IS relocatable when the CSEG or
                     o ,EG directive is in effect.
         The expressions shown in the following list are the only expressions that yield a relocatable result. Assume that
         ABS IS an ab~olute symbol and RELOC IS a relocatable symbol:

                                               ABS + RELOC
                                               RELOC + ABS
                                               RELOC - ABS
                                             fHIGH'( RELOC+ABS
                                              LOW )
                                             [ HIGH ~ RELOC _ ABS
                                             ~LOW )
                                                           r
                                                          HIGH}
                                                RELOC + ~ LOW   ABS
                                                           f   HIGH '1
                                                RELOC         LOW } ABS

2-16
Chapter 2. Assemblv Language Concepts




Remember that numbers are absolute terms. Thus the expression RELOC - 100 is legal, but 100 - RELOC
is not.

When two relocatable symbols have both been defined with the same type of relocatability, they may appear In
certain expressions that yield an absolute result. Symbols have the same type of relocatability when both are
relative to the CSEG location counter, both are relative to the DSEG location counter, both are relative to
MEMORY, or both are relative to STACK. The following expressions are val id and produce absolute results:

                                    RELOCl - RELOC2
                                             EQ
                                             LT
                                RELOCl       LE              RELOC2
                                             GT
                                             GE
                                             NE

Relocatable symbols may not appear In expressions with any other operators.

The following list shows all possible combinations of operators with absolute and relocatable terms. An A in the
table indicates that the resulting address is absolute: an R indicates a relocatable address; an I Indicates an
illegal combination. Notice that only one term may appear with the last five operators in the list.



                        X absolute        X absolute       X relocatable        X relocatable
        Operator
                        Y absolute        Y relocatable    Y absolute           Y reloca table

        X +        Y          A                 R                R                    I
        X          Y          A                 I                R                    A
        X   *      y          A                 I                I                    I
        X  /       y          A                 I                I                    I
        X  MOD     y          A                 I                I                    I
        X  SHL     Y          A                 I                I                    I
        X  SHR     Y          A                 I                I                    I
        X  EQ      Y          A                 I                I                    A
        X   LT     Y          A                 I                I                    A
        X   LE     Y          A                 I                I                    A
        X  GT      Y          A                 I                I                    A
        X  GE      Y          A                 I                I                    A
        X  NE      Y          A                 I                I                    A
        X   AND    y          A                 I                I                    I
        X  OR      y          A                 I                I                    I
        X   XOR    Y          A                 I                I                    I
           NOT     X          A                 -                I
            HIGH   X          A                 -                R                    -
            LOW    X          A                 -                R                    -
         unary+    X          A                 -                R                    -
         unary-    X           A                -                I




                                                                                                               2-17
Chapter 2. Assemblv Larguage Concepts




   Chaining of Symbol Definitions

        The ISIS-II 81180/808S Macro Assembler is essentially a 2-pass assembler. All symbol table entries must be
        resolvable in ; wo passes. Therefore,

                               x       EQU   y
                               y       EQU   1

        is legal, but iii the series

                               x       EQU   y
                               y       EQU   Z
                               Z       EQU   1

        the first line s illegal as X cannot be resolved in two passes and remains undefined.




2-18
3. INSTRUCTION SET




HOW TO USE THIS CHAPTER

     This chapter is a dictionary of 8080 and 8085 Instructions. The instruction descriptions are listed alphabetically
     for quick reference. Each description is complete so that you are seldom required to look elsewhere for addition-
     al information.

     This reference format necessarily requires repetitive information. If you are reading this manual to learn about
     the 8080 or the 8085, do not try to read this chapter from ACI (add immediate with Carry) to XTHL (exchange
     top of stack with Hand L registers). Instead, read the description of the processor and instruction set in
     Chapter 1 and the programming examples in Chapter 6. When you begin to have questions about particular
     instructions, look them up in this chapter.



TIMING INFORMATION

     The instruction descriptions in this manual do not explicitly state execution timings. This is because the basic
     operating speed of your processor depends on the clock frequency used in your system.

     The 'state' IS the basic unit of time measurement for the processor. A state may range from 480 nanoseconds
     (Cl20 nanoseconds on the 8085) to 2 microseconds, depending on the clock frequency. When you know the
     length of a state In your system. you can determine an instruction's basic execution time by multiplying that
     figure by the number of states required for the instruction.

     Notice that two sets of cycle/state specifications are given for 8085 conditional call and jump instructions. This
     is because the 8085 fetches the third instruction byte only if it is actually needed; i.e., the specified condition
     is satisfied.

     This basic timing factor can be affected by the operating speed of the memory in your system. With a fast
     clock cycle and a slow memory, the processor can outrun the memory. In this case, the processor must wait
     for the memory to deliver the desired instruction or data. In applications with critical timing requirements, this
     wait can be significant. Refer to the appropriate manufacturer's literature for memory timing data.




                                                                                                                           3·1
Chapter 3. Instruction Se·




ACI                                                                                           ADD IMMEDIATE WITH CARRY

          ACI adds the :ontents of the second instruction byte and the carry bit to the contents of the accumulator and
         stores the result in the accumulator,


                                        Opcode                 Operand

                                        ACI                    data


         The operand SJecifies the actual data to be added to the accumulator except, of course, for the carry bit. Data
          may be in the form of a number, an ASCII constant, the label of a previously defined value, or an expression.
         The data may not exceed one byte.


         The assemblers relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
         these symbols appears in the operand expression of an immediate instruction, It must be preceded by either the
         HIGH or LOA operator to specify which byte of the address is to be used in the evaluation of the expression.
         When neither )perator is present, the assembler assumes the LOW operator and issues an error message.


                                                           o     0                    o
                                                                data


                                                 Cycles:                  2
                                                 States:                  7
                                                 AddreSSing:              Immediate
                                                 Flags:                   Z,S,P,CY,AC


          Example:


          Assume that the accumulator contains the value 14H and that the carry bit is set to one. The instruction ACI 66
          has the follol' ing effect:


                                                 Accumulator     =     14H     00010100
                                              Immediate data     = 42H         01000010
                                                                      Carry               1
                                                                              01010111         57H



ADC                                                                                                     ADD WITH CARRY

         The ADC inst ruction adds one byte of data plus the setting of the carry flag to the contents of the accumulator.
         The result istored in the accumulator ADC then updates the setting of the carry flag to indicate the outcome
         of the operaton.


         The ADC innuction's use of the carry bit enables the program to add multi-byte numeric strings.




 3-2
Chapter 3. Instruction Set




Add RegIster to Accumulator with Carry

                          Opccde                 Operand

                          ADC                    reg

The operand must specify one of the registers A through E, H or L. This instruction adds the contents of the
specified register and the carry bit to the accumulator and stores the result in the accumulator.


                                 ',-1_ _  _ 0_ _1 S
                                       0_0 _                       S    S   I
                                 CYcles:                       1
                                 States:                       4
                                 Addressings:                  register
                                 Flags:                        Z.s,P,CY,AC

Add Memory to Accumulator with Carry

                           Opcode                Operand

                           ADC                   M

This instruction adds the contents of the memory location addressed by the Hand L registers and the carry
bit to the accumulator and stores the result in the accumulator. M is a symbolic reference to the Hand L
registers.




                                 CYcles:                       2
                                 States:                       7
                                 AddreSSing:                   register indirect
                                 Flags:                        Z,S,P,CY,AC

Example:

Assume that register C contains 3DH, the accumulator contains 42H, and the carry bit is set to zero. The
instruction ADC C performs the addition as follows:

                                   3DH         00111101
                                   42H         01000010
                                 CARRY                     o
                                               01111111 = 7 FH


The condition flags are set as follows:

                                 Carry                 0
                                 Sign                  0
                                 Zero                  0
                                 ParitY                0
                                 Aux. Carry            0

                                                                                                               3-3
Chapter 3. Instruction Set




         If the carry !>it IS set to one, the instruction has the following results:

                                                3DH       00111101
                                                42H       01000010
                                           CARRY                      1
                                                          10000000            SOH

                                            Carry                     o
                                            Sign                      1
                                            Zero                      o
                                            ParitY                    o
                                            Aux, Carry                1


ADD                                                                                                               ADD

         The ADD In,truction adds one byte of data to the contents of the accumulatoL The result is stored in the
         accumulator Notice that the ADD instruction excludes the carry flag from the addition but sets the flag to
         indicate the Jutcome of the operation.

         Add Regtstet to Register

                                    Opcode                  Operand

                                     ADD                    reg

         The operand must specify one of the registers A through E, H or L. The instruction adds the contents of the
         specified reg ster to the contents of the accumulator and stores the result in the accumulator.


                                           11    0    0    0      0   Iss sl
                                            Cycles:                       1
                                            States:                       4
                                            Addressing:                   register
                                            Flags:                        Z,S,P,CY,AC

         Add From Memory

                                    Opcode                  Operand

                                     ADD                    M

         This InstruCilon adds the contents of the memory location addressed by the Hand L registers to the contents of
         the accumulltor and stores the result in the accumulator. M is a symbolic reference to the Hand L registers.


                                           11    0    0    0      0

                                            Cycles:                       2
                                           States:                        7
                                           Addressing:                    register Indirect
                                           Flags:                         Z,S,P,CY,AC
34
Chapter 3. Instruction Set




      Examples:

      Assume that the accumulator contains 6CH and register D contains 2EH. The Instruction ADD D performs the
      addition as follows:


                                      2EH        0010111 0
                                      6CH        011011 00

                                      9AH        10011010

      The accumulator contains the value 9AH following execution of the ADD D instruction. The contents of the D
      register remain unchanged. The condition flags are set as follows:

                                      Carry                  0
                                      Sign                   1
                                      Zero                   0
                                      Parity                 1
                                      Aux. Carry             1

      The following instruction doubles the contents of the accumulator:

                                      ADD A



ADI                                                                                               ADD IMMEDIATE

      ADI adds the contents of the second instruction byte of the contents of the accumulator and stores the result
      in the accumulator.


                                Opcode                Operand


                                ADI                   data


      The operand specifies the actual data to be added to the accumulator This data may be In the form of a number,
      an ASCII constant, the label of a previously defined value, or an expression. The data may not exceed one byte.


      The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
      these symbols appears in the operand expression of an immediate instruction, it must be preceded by either
      the HIGH or LOW operator to specify which byte of the address is to be used In the evaluation of the expression.
      When neither operator is present. the assembler assumes the LOW operator and Issues an error message.



                                       '         000


                                      lCycles:
                                                      data

                                                                 2
                                       States:                   7
                                       Addressing:               immediate
                                       Flags:                    Z.S.P.CY,AC




                                                                                                                        3-5
Chapter 3. Instruction Se




          Example:

          Assume that he accumulator contains the value 14H. The Instruction ADI 66 has the following effect:

                                                     Accumulator        14H       00010100
                                                   Immediate data       42H       01000010
                                                                                  01010110     =   56H

          Notice that ti,e assembler converts the decimal value 66 into the hexadecimal value 42.



ANA                                                                                   LOGICAL AND WITH ACCUMULATOR

          ANA perforrrs a logical AND operation using the contents of the specified byte and the accumulator, The result
          IS placed in tlie accumulator.

          SummGlY of        ~oglcal   Operations

          AN D product s a one bit In the result only when the corresponding bits In the test data and the mask data are
          ones.

          OR produces a one bit In the result when the corresponding bits in either the test data or the mask data are
          ones.

          Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are
          different; I.e. a one bit in either the test data or the mask data - but not both - produces a one bit In the
          result.

                                             AND                       OR           EXCLUSIVE OR

                                          1010 1010              1010 1010              1010       1010
                                          0000 1111              0000 1111              0000       1111
                                          0000 1010              1010 1111              1010       0101

          AND Registe, with Accumulator

                                          Opcode                 Operand

                                           ANA                   reg

          The operand must specify one of the registers A through E, H or L. ThiS instruction ANDs the contents of the
          specified regi iter with the accumulator and stores the result in the accumulator, The carry flag is reset to zero.


                                               I,-~_O            O_O_I S      S     S   I
                                                   Cycles:              1
                                                   States:              4
                                                   Addressing:          register
                                                   Flags:               Z,S,P,CY,AC



  3-6
Chapter 3. Instruction Set




      AND Memory with Accumulator

                                Opcode              Operand

                                ANA                  M

      This Instruction ANDs the contents of the specified memory location with the accumulator and stores the result
      in the accumulator. The carry flag is reset to zero.

                                          o         o 0

                                      Cycles:                2
                                      States:                7
                                      Addressing:            register Indirect
                                      Flags:                 Z,S,P,CY.AC

      Example:

      Since any bit ANDed with a zero produces a zero and any bit ANDed with a one remains unchanged, AND is
      frequently used to zero particular groups of bits. The following example ensures that the high-order four bits of
      the accumulator are zero, and the low·order four bits are unchanged. Assume that the C register contains OFH:

                                      Accumulator        1 1 1 1                 o   0   OFCH
                                      C Register         o000                    1 1     OFH
                                                         000 0                   o 0     OCH



ANI                                                                    AND IMMEDIATE WITH ACCUMULATOR

      ANI performs a logical AND operation using the contents of the second byte of the Instruction and the accumu-
      lator. The result is placed In the accumulator. AN I also resets the carry flag to zero.

                                Opcode               Operand

                                ANI                  data

      The operand must specify the data to be used In the AND operation. This data may be in the form of a number,
      an ASCII constant, the label of some previously defined value, or an expression. The data may not exceed one
      byte.

      The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
      these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the
      HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression.
      When neither operator is present, the assembler assumes the LOW operator and issues an error message.




                                                                                                                        3-7
Chapter 3. Instruction Se:




                                             '                o   0


                                            l                 data

                                                Cycles:               2
                                                States:               7
                                                Addressing:           immediate
                                                Flags:                Z.S.P.CY,AC

          Summary of     ~oglcal   Operations


          AND prodUCt s a one bit in the result only when the corresponding bits In the test data and the mask data are
          ones.

          OR produces a one bit in the result when the corresponding bits In either the test data or the mask data are
          ones.

          Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are
          different; i.e. a one bit in either the test data or the mask data - but not both - produces a one bit in the
          result.

                                                AND                   OR            EXCLUSIVE OR

                                          1010 1010               1010 1010           1010 1010
                                          0000 1111               0000 1111           0000 1111
                                          00001010                1010 1111           1010 0101

          Example:

          The followin;. instruction IS used to reset OFF bit SIX of the byte In the accumulator:

                                                ANI               1011111IB

          Since any bit ANDed with a one remains unchanged and a bit ANDed with a zero is rest to zero, the ANI
          instruction srown above sets bit six OFF and leaves the others unchanged. This technique IS useful when a
          program uses individual bits as status flags.



 CALL                                                                                                                CALL

          The CALL Irstructlon combines functions of the PUSH and I MP Instructions. CALL pushes the contents of the
          program coullter (the address of the next sequential instruction) onto the stack and then iumps to the address
          specified in t le CALL instruction.

           Each CALL Instruction or one of ItS variants implies the use of a subsequent RET (return) Instruction. When a
           call has no cllrresponding return. excess addresses are built up in the stack.




  3-8
Chapter 3. Instruction Set




                          Opcode                 Operand

                          CALL                   address

The address may be specified as a number, a label, or an expression. (The label is most common.) The assembler
inverts the high and low address bytes when it assembles the instruction.

                                 1    1    0    0     1       1    0     1

                                                low addr

                                               high addr

                                 Cycles:                  5
                                 States:                  17 (18 on 8085)
                                 Addressing:              immediate/register indirect
                                 Flags:                   none

Example:

When a given coding sequence is required several times in a program, you can usually conserve memory by coding
the sequence as a subroutine invoked by the CALL instruction or one of its variants. For example, assume that
an application drives a six-digit LED display; the display is updated as a result of an operator input or because
of two different calculations that occur in the program. The coding required to drive the display can be included
in-line at each of the three points where it is needed, or it can be coded as a subroutine. If the label DISPL Y is
assigned to the first instruction of the display driver, the following CALL instruction is used to invoke the
display subroutine:

                                 CALL               DISPLY

This CALL instruction pushes the address of the next program instruction onto the stack and then transfers
control to the DISPLY subroutine. The DISPLY subroutine must execute a return instruction or one of its
variants to resume normal program flow. The following is a graphic illustration of the effect of CALL and return
instructions:

                       CALL
                                                                             _   ~   DISPLY
                                                                       ---
                       CALL   ~      DISPL Y - - - - -
                                  ------- ---
                                                                  - --
                                                                                               RET
                       CALL          DISPL Y



Consideration for Using Subroutines

The larger the code segment to be repeated and the greater the number of repetitions, the greater the potential
memory savings of using a subroutine. Thus, if the display driver in the previous example requires one hundred




                                                                                                                       3-9
Chapter 3. Instruction Se:




          bytes, coding it In-line would require three hundred bytes. Coded as a subroutine, it requires one hundred bytes
          plus nine bytls for the three CALL instructions.

          Notice that slJbroutines require the use of the stack. This requires the application to include random access
          memory for 1 he stack. When an application has no other need for random access memory, the system designer
          might elect to) avoid the use of subroutines.



CC                                                                                                    CALL IF CARRY

          The CC instnlction combines functions of the JC and PUSH instructions. CC tests the setting of the carry flag.
          If the flag is ,et to one, CC pushes the contents of the program counter onto the stack and then jumps to the
          address sped"ied in bytes two and three of the CC instruction. If the flag is reset to zero, program execution
          continues whh the next sequential instruction.

                                    Opcode                Operand

                                    CC                     address

          Although thE use of a label is most common, the address may also be specified as a number or expression.

                                          1   1     0     1   1      1   0   0

                                                        lowaddr

                                                        high addr

                                          Cycles:                 3 or 5 (2 or 5 on 8085)
                                          States:                 11 or 17 (9 or 18 on 8085)
                                          AddreSSing:             immediate/register indirect
                                          Flags:                  none

          Example:

          For the sake of brevity, an example IS given for the CALL instruction but not for each of its closely related
          variants.



CM                                                                                                     CALL IF MINUS

          The CM inst-uction combines functions of the J M and PUSH instructions. CM tests the setting of the sign flag.
          If the flag is set to one (indicating that the contents of the accumulator are minus), CM pushes the contents
          of the progr,lm counter onto the stack and then jumps to the address specified by the CM instruction. If the
          flag is set to zero, program execution simply continues with the next sequential instruction.

                                    Opcode                Operand

                                    CM                    address




3-10
Chapter 3. Instruction Set




      Although the use of a label is most common, the address may also be specified as a number or an expression.

                                      1   1     1    1    1       1   0   0

                                                     lowaddr

                                                    high addr

                                      Cycles:                 3 or 5 (2 or 5 on 8085)
                                      States:                 11 or 17 (9 or 18 on 8085)
                                      Addressing:             immediate/register indirect
                                      Flags:                  none

      Example:

      For the sake of brevity, an example is given for the CALL instruction but not for each of ItS closely related
      variants.



CMA                                                                               COMPLEMENT ACCUMULATOR

      CMA complements each bit of the accumulator to produce the one's complement. All condition flags remain
      unchanged.

                                Opcode                Operand

                                CMA

      Operands are not permitted with the CMA instruction.


                                     10 0             o
                                      Cycles:                 1
                                      States:                 4
                                      Flags:                  none

      To produce the two's complement, add one to the contents of the accumulator after the CMA instructions has
      been executed.

      Example:

      Assume that the accumulator contains the value 51H; when complemented by CMA, it becomes OAEH:

                                      51H              01010001
                                      OAEH             10101110




                                                                                                                        3-11
Chapter 3. Instruction S, t




CMC                                                                                                    COMPLEMENT CARRY

           If the carry flag equals zero, CMC sets it to one. If the carry flag is one, CMC resets it to zero. All other flags
          remain unch,nged.


                                         Opcode                  Operand

                                         CMC


          Operands are not permitted with the CMC instruction.


                                               10 0
                                               Cycles:                 1
                                               States:                 4
                                               Flags:                  CYonly


           Example:


           Assume that a program uses bit 7 of a byte to control whether a subroutine is called. To test the bit, the pro-
          gram loads ti,e byte into the accumulator, rotates bit 7 into the carry flag, and executes a CC (Call if Carry)
          instruction. l:efore returning to the calling program, the subroutine reinitializes the flag byte using the following
          code:


                                               CMC               ;SET BIT 7 OFF
                                               RAR               ;ROTATE BIT 7 INTO ACCUMULATOR
                                               RET               ;RETURN



CMP                                                                                       COMPARE WITH ACCUMULATOR

          CMP compar,s the specified byte with the contents of the accumulator and Indicates the result by setting the
           carry and zelo flags. The values being compared remain unchanged.


          The zero flal indicates equality. No carry indicates that the accumulator is greater than the specified byte; a
           carry indicaus that the accumulator       IS   less than the byte. However, the meaning of the carry flag is reversed
           when the values have different signs or one of the values is complemented.


          The program tests the condition flags using one of the conditional Jump, Call, or Return instructions. For
           example, J Z (J ump if Zero l tests for equality


                  Functnnal Description:


                  Comparisons are performed by subtracting the specified byte from the contents of the accumulator, which
                  IS   why the zero and carry flags indicate the result. This subtraction uses the processor's internal registers
                  so that source data is preserved. Because subtraction uses two's complement addition, the CMP instruction
                  recoml'lements the carry flag generated by the sUbtraction.




  3-12
Chapter 3. Instruction Set




Compare Register with Accumulator

                         Opcode               Operand

                         CMP                  reg

The operand must name one of the registers A through E, H or L.

                                                          S   s sl
                                Cycles:               1
                                States:               4
                                Addressing:           register
                                Flags:                Z,S,P,CY,AC

Compare Memory with Accumulator

                         Opcode               Operand

                          CMP                     M

This instruction compares the contents of the memory location addressed by the Hand L registers with the
contents of the accumulator. M is a symbolic reference to the Hand L register pair.




                                Cycles:               2
                                States:               7
                                Addressing:           register indirect
                                Flags:                Z,S,P,CY,AC

Example 1:

Assume that the accumulator contains the value OAH and register E contains the value OSH. The instruction
CMP E performs the following internal subtraction (remember that subtraction is actually two's complement
addition):

                                Accumulator           00001010
                                +( -E Register)       11111011
                                                      00000101 +(-carry)

After the carry is complemented to account for the subtract operation, both the zero and carry bits are zero,
thus indicating A greater than E.

Example 2:

Assume that the accumulator contains the value -1 BH and register E contains OSH:

                                Accumulator           11100101
                                +(-E Register)        11111011
                                                      111 00000 +(-carry)
                                                                                                                3-13
Chapter 3. Instruction S ,t



           After the 01P Instruction recomplements the carry flag, both the carry flag and zero flag are zero. Normally
           this indicate, that the accumulator is greater than register E. However. the meaning of the carry flag IS reversed
           since the val Jes have different signs. The user program is responsible for proper interpretation of the carry flag.



CNC                                                                                                         CALL IF NO CARRY

           The CNC in, truction combines functions of the JNC and PUSH instructions. CNC tests the setting of the carry
           flag. If the fag is set to zero, CNC pushes the contents of the program counter onto the stack and theniumps
           to the addre;s specified by the CNC instruction. If the flag         IS   set to one, program execution simply continues
           with the ne> t sequential instruction.

                                      Opcode                     Operand


                                      CNC                        address

           Although th,: use of a label is most common, the address may also be specified as a number or an expression.


                                            1       1      0     1   0      1   0      0

                                                                low addr

                                                               high addr

                                            Cycles:                      3 or 5 (2 or 5 on 8085)
                                            States:                      11 or 17 (9 or 18 on 8085)
                                             Addressing:                 immediate/register Indirect
                                             Flags:                      none

           Example:

           For the sake of brevity, an example      IS   given for the CALL instruction but not for each of its closely related
           vanants.



 CNZ                                                                                                          CALL IF NOT ZERO

           The CNZ In, tructlon combines functions of the J NZ and PUSH Instructions. CNZ tests the setting of the zero
           flag. If the fag is off (indicating that the contents of the accumulator are other than zero), CNZ pushes the
           contents of :he program counter onto the stack and then jumps to the address specified in the Instruction's
           second and hiI'd bytes. If the flag is set to one, program execution simply continues with the next sequential
           instruction.

                                      Opcode                      Operand


                                      CNZ                         address


           Although th; use of a label is most common, the address may also be specified as a number or an expression.




  3-14
Chapter 3. Instruction Set




                                     1    1    0    0    0     1   0    0

                                                    lowaddr

                                                   high addr

                                     Cycles:                 3 or 5 (2 or 5 on 8085)
                                     States:                 1.1 or 17 (9 or 18 on 8085)
                                     Addressing:             immediate/register indirect
                                     Flags:                  none

     Example:

     For the sake of breVity, an example is given for the CALL instruction but not for each of its closely related
     variants.



CP                                                                                              CALL IF POSITIVE

     The CP instruction combines features of the J P and PUSH instructions. CP tests the setting of the sign flag. If
     the flag is set to zero (indicating that the contents of the accumulator are positive). CP pushes the contents of
     the program counter onto the stack and theniumps to the address specified by the CP Instruction. If the flag
     is set to one, program execution simply continues with the next sequential instruction.

                               Opcode                Operand

                                CP                   address

     Although the use of a label is more common, the address may also be specified as a number or an expression.

                                      1   1    1     1   0     1    0   0

                                                    low address

                                                   high addr

                                     Cycles:                 3 or 5 (2 or 5 on 8085)
                                     States:                 11 or 17 (9 or 18 on 8085)
                                     Addressing:             immediate/register indirect
                                     Flags:                  none

     Example:

     For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related
     variants.




                                                                                                                         3-15
Chapter 3. Instruction Se,




CPE                                                                                            CALL IF PARITY EVEN

          Parity is even if the byte in the accumulator has an even number of one bits. The parity flag is set to one to
          indicate this condition. The CPE and CPO instructions are useful for testing the parity of input data. However,
          the IN instruc tion does not set any of the condition flags. The flags can be set without altering the data by
          adding OOH t" the contents of the accumulator.

          The ePE instI uction combines functions of the JPE and PUSH instructions. CPE tess the setting of the parity
          flag. If the flog is set to one, CPE pushes the contents of the program counter onto the stack and then jumps
          to the addres' specified by the CPE instruction. If the flag is set to zero, program execution simply continues
          with the next sequential instruction.

                                    Opcode                Operand

                                    CPE                   address

          Although the use of a label is more common, the address may also be specified as a number or an expression.

                                          1    1    1    0   1      1   0   0

                                                        lowaddr

                                                        high addr

                                          Cycles:                3 or 5 (2 or 5 on 8085)
                                          States:                11 or 17 (9 or 18 on 8085)
                                          Addressing:            immediate/register Indirect
                                          Flags:                 none



          Example:

          For the sake )f brevity, an example is given for the CALL instruction but not for each of its closely related
          variants.



CPI                                                                                             COMPARE IMMEDIATE

          CPI compare, the contents of the second instruction byte with the contents of the accumulator and sets the zero
          and carry flap to indicate the result. The values being compared remain unchanged.

          The zero flag Indicates equality. No carry indicates that the contents of the accumulator are greater than the
          immediate da :a; a carry Indicates that the accumulator is less than the immediate data. However, the meaning
          of the carry 1lag is reversed when the values have different signs or one of the values is complemented.

                                    Opcode                Operand

                                    CPI                   data




  3·16
Chapter 3. Instruction Set




      The operand must specify the data to be compared. This data may be in the form of a number, an ASCII
      constant, the label of a previously defined value, or an expression. The data may not exceed one byte.

      The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
      these symbols appears in the operand expression of an immediate instruction, it must be preceded by either
      the HIGH or LOW operator to specify which byte of the address is to be used In the evaluation of the
      expression. When neither operator is present, the assembler assumes the LOW operator and issues an error
      message.


                                                                            o
                                                     data

                                      Cycles:                   2
                                      States:                   7
                                      Addressing:               register Indirect
                                      Flags:                    Z,S,P,CY,AC

      Example:

      The instruction CPI 'C' compares the contents of the accumulator to the letter C (43H).



CPO                                                                                         CALL IF PARITY ODD

      Parity is odd if the byte in the accumulator has an odd number of one bits. The panty flag is set to zero to
      indicate this condition. The CPO and CPE instructions are useful for testing the parity of input data. However,
      the IN instruction does not set any of the condition flags. The flags can be set without altering the data by
      adding OOH to the contents of the accumulator.

      The CPO instruction combines functions of the JPO and PUSH instructions. CPO tests the setting of the panty
      flag. If the flag is set to zero, CPO pushes the contents of the program counter onto the stack and then jumps
      to the address specified by the CPO instruction. If the flag is set to one, program execution simply continues
      with the next sequential instruction.

                                Opcode                Operand


                                CPO                   address

      Although the use of a label is more common, the address may also be specified as a number or an expression.

                                      1    1    1    0      0       1   0    0

                                                    lowaddr

                                                    high addr

                                      Cycles:         3 or 5 (2 or 5 on 8085)
                                      States:         11 or 17 (9 or 18 on 8085)
                                      Addressing:     immediate/register indirect
                                      Flags:          none
                                                                                                                        3-17
Chapter 3. Instruction Sf t




           Example:

          For the sake of brevity, an example is given for the CALL Instruction but not for each of its closely related
          vanants.

CZ                                                                                                           CALL IF ZERO

          The CZ instrJCtion combines functions of the I Z and PUSH Instructions. CZ tests the setting of the zero flag.
          If the flag IS ;et to one (indicating that the contents of the accumulator are zero), CZ pushes the contents of
          the program :ounter onto the stack and then lumps to the address specified in the CZ instruction. If the flag
          IS set to zero (indicating that the contents of the accumulator are other than zero), program execution simply
          continues wil h the next sequential Instruction.

                                          Opcode                Operand

                                          CZ                    address

           Although the use of a label is most common, the address may also be specified as a number or an expression.

                                                1    I   0     0    1     1   0    0

                                                              lowaddr

                                                              high addr

                                                Cycles:                 3 or 5 (2 or 5 on 8085)
                                                States:                 11 or 17 (9 or 18 on 8085)
                                                Addressing:             Immediate/register Indirect
                                                Flags:                  none

           Example:

           For the sake of brevity, an example IS given for the CALL instruction but not for each of its closely related
           vanants.



 DAA                                                                                    DECIMAL ADJUST ACCUMULATOR

          The DAA      lIl~truction   adjusts the eight-bit value in the accumulator to form two four-bit binary coded deCimal
          digits.

                                          Opcode                Operand

                                          DAA

           Operands are not permitted with the DAA IIlstructlon.

           DAA IS used when adding deCimal numbers. It is the only instruction whose function requires use of the auxiliary
           carry flag. In multi-byte arithmetiC operations, the DAA instruction typically is coded immediately after the arith-
           metic instruc tion so that the auxiliary carry flag is not altered unintentionally.


  3-18
Chapter 3. Instruction Set




DAA operates as follows:


      1.    If the least significant four bits of the accumulator have a value greater than nine, or if the auxiliary
            carry flag is ON, DAA adds six to the accumulator.


      2.    If the most significant four bits of the accumulator have a value greater than nine, or if the carry
            flag   IS   ON, DAA adds six to the most significant four bits of the accumulator.


                                      10 0                o   0

                                       Cycles:                    1
                                       States:                    4
                                        Addressing:               register
                                        Flags:                    Z,S,P,CY,AC

Example:


Assume that the accumulator contains the value 9BH as a result of adding 08 to 93:


                                       CY          AC
                                       0           0


                                            1001       0011
                                            0000       1000
                                            1001       1011   = 9BH


Since OBH   IS   greater than nine, the Instruction adds six to contents of the accumulator:


                                       CY          AC
                                       o           1
                                            1001       1011
                                            0000       0110
                                            1010       0001   = A1H


Now that the most significant bits have a value greater than nine, the instruction adds           SIX   to them:


                                       CY          AC
                                        1          1
                                            1010       0001
                                            0110       0000
                                            0000       0001


When the DAA has finished, the accumulator contains the value 01 in a BCD format; both the carry and auxiliary
carry flags are set ON. Since the actual result of this addition is 101, the carry flag      IS   probably significant to the
program. The program        IS   responsible for recovering and using this information. Notice that the carry flag setting is
lost as soon as the program executes any subsequent Instruction that alters the flag.




                                                                                                                               3-19
Chapter 3. Instruction S ,t




 DAD                                                                                        DOUBLE REGISTER ADD

          DAD adds ti,e 16-bit value in the specified register pair to the contents of the Hand L register pair. The result
          is stored in Hand L.

                                     Opcode              Operand



                                     DAD




           DAD may add only the contents of the B&C, D&E, H&L, or the SP (Stack Pointer) register pairs to the contents
          of H& L. No ice that the letter H must be used to specify that the H& L register pair is to be added to Itself.

          DAD sets th ~ carry flag ON if there is a carry out of the Hand L registers. DAD affects none of the condition
          flags other han carry.




                                           Cycles:             3
                                           States:             10
                                           Addressing:         register
                                           Flags:              CY

           Examples:

           The DAD in ;truction provides a means for saving the current contents of the stack pointer.

                                     LXI      H,OOH      ;CLEAR H&L TO ZEROS
                                     DAD      SP         ;GET SP INTO H&L
                                     SHLD     SAVSP       ;STORE SP IN MEMORY

          The instruct on DAD H doubles the number in the Hand L registers except when the operation causes a carry
          out of the f- register.



 DCR                                                                                                          DECREMENT

           DCR subtra'ts one from the contents of the specified byte. DCR affects all the condition flags except the carry
           flag. Becaus( DCR preserves the carry flag, it can be used within multi-byte arithmetic routines for decrementing
           character co Jnts and similar purposes.

           Decrement I ~egister

                                     Opcode              Operand

                                     DCR                 reg




  3-20
Chapter 3. Instruction Set




The operand must specify one of the registers A through E, H or L. Thp. instruction subtracts one from the
contents of the specified register.

                              ~D              D   D

                                Cycles:               1
                                States:               5 (4 on 8085)
                                Addressing:           register
                                Flags:                Z,S,P,AC

Decrement Memory


                         Opcode               Operand

                          DCR                 M

This instruction subtracts one from the contents of the memory location addressed by the Hand L registers.
M is a symbol ic reference to the Hand L registers.

                                10 0              o
                                Cycles:               3
                                States:               10
                                Addressing:           register indirect
                                Flags:                Z,S,P,AC

Example:

The DCR instruction is frequently used to control multi-byte operations such as moving a number of characters
from one area of memory to another:

                          MVI      B,5H               ;SET CONTROL COUNTER
                          LXI      H,260H             ;LOAD H&L WITH SOURCE ADDR
                          LXI      D.900H             ;LOAD D&E WITH DESTINATION ADDR
           LOOP:          MOV      A,M                ;LOAD BYTE TO BE MOVED
                          STAX     D                  ;STORE BYTE
                          DCX      D                  ;DECREMENT DESTINATION ADDRESS
                          DCX      M                  ;DECREMENT SOURCE ADDRESS
                          DCR      B                  ;DECREMENT CONTROL COUNTER
                          JNZ      LOOP               ;REPEAT LOOP UNTIL COUNTER=O

This example also illustrates an efficient programming technique. Notice that the control counter is decremented
to zero rather than incremented until the desired count is reached. This technique avoids the need for a compare
instruction and therefore conserves both memory and execution time.




                                                                                                               3-21
Chapter 3. Instruction Sct




 DCX                                                                                     DECREMENT REGISTER PAIR

          DCX decrerrents the contents of the specified register pair by one. DCX affects none of the condition flags.
          Because DC: preserves all the flags, it can be used for address modification in any instruction sequence that
          relies on the passing of the flags.

                                      Opcode              Operand



                                      DCX




          DCX may dlcrement only the B&C, D&E, H&L, or the SP (Stack Pointer) register pairs. Notice that the letter
          H must be u;ed to specify the Hand L pair.

          Exercise carl' when decrementing the stack pointer as this causes a loss of synchronization between the pointer
          and the actual contents of the stack.




                                            Cycles:              1
                                            States:              5 (6 on 8085)
                                            Addressing:          register
                                            Flags:               none

           Example:

           Assume that the Hand L registers contain the address 9800H when the instruction DCX H is executed. DCX
           considers tht: contents of the two registers to be a single 16-bit value and therefore performs a borrow from the
           H register te produce the value 97FFH.



 DI                                                                                                DISABLE INTERRUPTS

           The interruet system is disabled when the processor recognizes an interrupt or Immediately following execution
           of a DI instl uction.

           In applicaticns that use interrupts, the DI instruction is commonly     used only when a code sequence must not be
           interrupted. For example, time-dependent code sequences become          inaccurate when interrupted. You can disable
           the interrup system by including a DI instruction at the beginning      of the code sequence. Because you cannot
           predict the llccurrence of an interrupt, include an EI instruction at   the end of the time-dependent code sequence.

                                      Opcode               Operand

                                      DI

           Operands an not permitted with the DI instruction.




  3-22
Chapter 3. Instruction Set




                                        1              0       0     11
                                    1

                                        Cycles:            1
                                        States:            4
                                        Flags:             none


                                                      NOTE

                The 8085 TRAP interrupt cannot be disabled. This special interrupt is
                intended for serious problems that must be serviced regardless of the
                interrupt flag such as power failure or bus error. However. no interrupt
                including TRAP can interrupt the execution of the 01 or EI instruction.



EI                                                                                           ENABLE INTERRUPTS

     The EI instruction enables the interrupt system following execution of the next program instruction. Enabling
     the interrupt system is delayed one instruction to allow interrupt subroutines to return to the main program
     before a subsequent interrupt is acknowledged.


     In applications that use interrupts, the interrupt system is usually disabled only when the processor accepts an
     interrupt or when a code sequence must not be interrupted. You can disable the interrupt system by including
     a 01 instruction at the beginning of the code sequence. Because you cannot predict the occurrence of an
     interrupt, include an EI instruction at the end of the code sequence.

                               Opcode               Operand

                               EI

     Operands are not permitted With the EI instruction.


                                                               o
                                        Cycles:            1
                                        States:            4
                                        Flags:             none



                                                       NOTE

                The 8085 TRAP interrupt cannot be disabled. This special interrupt is
                intended for serious problems that must be serviced regardless of the
                interrupt flag such as power failure or bus failure. However, no interrupt
                including TRAP can interrupt the execution of the 01 or EI instruction.

     Example:


     The EI instruction is frequently used as part of a start-up sequence. When power is first applied. the processor
     begins operating at some indeterminate address_ Application of a RESET signal forces the program counter to


                                                                                                                        3-23
Chapter 3. Instruction 5 et




           zero. A common instruction sequence at this point is El, HLT, These instructions enable the interrupt system
           (RESET als" disables the interrupt system) and halt the processor. A subsequent manual or automatic interrupt
           then determ Ines the effective start-up address.



 HLT                                                                                                                   HALT

           The HLT in ;truction halts the processor. The program counter contains the address of the next sequential
           instruction. Jtherwise, the flags and registers remain unchanged.


                                                                    o
                                              Cycles:                   1
                                              States:                   7 (5 on 8085)
                                              Flags:                    none


           Once in the halt state, the processor can be restarted only by an external event, typically an interrupt. Therefore,
           you should Je certain that interrupts are enabled before the HLT instruction is executed. See the description of
           the EI (EnaJle Interrupt) instruction.


           If an 8080 I-lLT instruction IS executed while interrupts are disabled, the only way to restart the processor is
           by applicatim of a RESET signal. This forces the program counter to zero. The same is true of the 8085, except
           for the TR/,P Interrupt, which IS recognized even when the interrupt system is disabled.


           The proceSSJr can temporarily leave the halt state to service a direct memory access request. However, the pro-
           cessor reent~rs the halt state once the request has been serviced.


           A basic purpose for the HLT instruction is to allow the processor to pause while waiting for an interrupt from a
           peripheral d~vice. However, a halt wastes processor resources and should be used only when there is no useful
           processing t Isk available.



 IN                                                                                                    INPUT FROM PORT

           The IN inst uction reads eight bits of data from the specified port and loads it into the accumulator.



                                                                NOTE


                         fhis description IS restricted to the exact function of the IN instruction.
                        Input/output structures are described in the 8080 or 8085 Microcomputer
                        Systems User's Manual.

                                         Opcode               Operand

                                         IN                   exp


           The operand expression may be a number or any expression that yields a value in the range OOH through OFFH.




 3·24
Chapter 3. Instruction Set




                                               °               °
                                                     exp

                                      Cycles:              3
                                      States:              10
                                      Addressing:          direct
                                      Flags:               none



INR                                                                                                      INCREMENT

      INR adds one to the contents of the specified byte. INR affects all of the condition flags except the carry flag.
      Because INR preserves the carry flag, it can be used within multi-byte arithmetic routines for incrementing
      character counts and similar purposes.

      Increment Register

                                Opcode               Operand

                                INR                  reg

      The operand must specify one of the registers A through E, H or L. The Instruction adds one to the contents of
      the specified register,


                                      ~I       D     D     D   1_
                                                               _    0_01

                                      Cycles:              1
                                      States:              5 (4 on 8085)
                                      Addressing:          register
                                      Flags:               Z,S,P,AC

      Increment Memory

                                Opcode               Operand

                                INR                  M

      This instruction increments by one the contents of the memory location addressed by the Hand L registers. M
      is a symbolic reference to the Hand L registers.


                                      1° °                 °        ° °I
                                      Cycles:              3
                                      States:              10
                                      Addressing:          register indirect
                                      Flags:               Z,S,P,AC




                                                                                                                        3·25
Chapter 3. Instruction 5 ,t




           Example:

           If register C contains 99H, the instruction INR C increments the contents of the register to 9AH.



 INX                                                                                    INCREMENT REGISTER PAIR

           INX adds olle to the contents of the specified register pair. INX affects none of the condition flags. Because
           INX preserVlS all the condition flags, it can be used for address modification within multi-byte arithmetic
           routines.

                                     Opcode                Operand




                                      INX



           INX may lIl;rement only the B&C, D&E, H& L, or the SP (Stack Pointer) register pairs. Notice that the letter H
           must be usd to specify the Hand L register pair.

           Exercise caro when incrementing the stack pOlllter. Assume, for example, that INX SP IS executed after a number
           of Items ha' e been pushed onto the stack. A subsequent POP instruction accesses the high-order byte of the most
           recent stack entry and the low-order byte of the next older entry. Similarly, a PUSH Instruction adds the two
           new bytes t) the stack, but overlays the low-order byte of the most recent entry




                                            Cycles:             1
                                            States:             5 (6 on 8085)
                                            Addresslllg:        register
                                            Flags:              none

           Example:

           Assume tha. the D and E registers contalll the value 01 FFH. The instruction INX D increments the value to
           0200H. By ;ontrast, the INR E Instruction ignores the carry out of the low-order byte and produces a result of
           0100H. (Tills condition can be detected by testing the Zero condition flag.)

           If the stack pointer register contallls the value OFFFFH, the instruction INX SP increments the contents of SP
           to OOOOH. --he INX instruction sets no flags to IIldicate this condition.



 JC                                                                                                        JUMP IF CARRY

           The JC instruction tests the setting of the carry flag. If the flag is set to one, program execution resumes at the
           address spe;ified in the JC instruction. If the flag is reset to zero, execution continues with the next sequential
           instruction.




  3-26
Chapter 3. Instruction Set




                               Opcode                 Operand

                               JC                     address

     The address may be specified as a number, a label, or an expression. The assembler inverts the high and low
     address bytes when it assembles the instruction.

                                      1   1    0      1   1      0   1   0

                                                     lowaddr

                                                    high addr

                                      Cycles:                 3 (2 or 3 on 8085)
                                      States:                 10 (7 or 10 on 8085)
                                      Addressing:             immediate
                                      Flags:                  none

     Example:

     Examples of the variations of the jump instruction appear in the description of the JPO instruction.



JM                                                                                                   JUMP IF MINUS

     The JM Instruction tests the setting of the sign flag. If the contents of the accumulator are negative (sign flag = 1),
     program execution resumes at the address specified In the Jrv1 instruction. If the contents of the accumulator are
     positive (sign flag = 0), execution continues with the next sequential instruction.

                                Opcode                 Operand

                                JM                     address

     The address may be specified as a number, a label, or an expression. The assembler inverts the high and low
     address bytes when it assembles the instructions.

                                      1   1    1      1   1      0   1   0

                                                     lowaddr

                                                    high addr

                                      CYcles:                 3 (2 or 3 on 8085)
                                      States:                 10 (7 or 10 on 8085)
                                      Addressing:             immediate
                                      Flags:                  none

     Example:

     Examples of the variations of the lump instruction appear in the description of the JPO instruction.

                                                                                                                        3-27
Chapter 3. Instruction Set




JMP                                                                                                                     JUMP

          The IMP inst"uction alters the execution sequence by loading the address in its second and third bytes into the
          program courter.

                                     Opeode                Operand

                                     IMP                   address

          The address rnay be specified as a number, a label, or an expression. The assembler inverts the high and low
          address bytes when it assembles the address.

                                           1    1    0    0    0       0   1   1

                                                         lowaddr

                                                         high addr

                                           Cycles:                 3
                                           States:                 10
                                           Addressing:             immediate
                                           Flags:                  none

          Example:

          Examples of the variations of the Jump instruction appear in the description of the JPO instruction.



JNC                                                                                                   JUMP IF NO CARRY

          The INC ins;ruction tests the setting of the carry flag. If there is no carry (carry flag = 0), program execution
          resumes at ti,e address specified in the I NC instruction. If there is a carry (carry flag = 1), execution continues
          with the nex t sequential Instruction.

                                     Ooeode                Operand

                                     INC                   address

          The address nay be specified as a number, a label, or an expression. The assembler inverts the high and Jow
          address byte; when it assembles the instruction.

                                           1    1    0    1    0       0   1   0

                                                         lowaddr

                                                         high addr

                                           Cycles:                 3 (2 or 3 on 8085)
                                           States:                 10 (7 or 10 on 8085)
                                           Addressing:             immediate
                                           Flags:                  none
 3-28
Chapter 3. Instruction Set




      Example:

      Examples of the variations of the jump instruction appear in the description of the    JPO Instruction.


JNZ                                                                                              JUMP IF NOT ZERO

      The J NZ Instruction tests the setting of the zero flag. If the contents of the accumulator are not zero (zero
      flag = 0), program execution resumes at the address specified In the JNZ instruction. If the contents of the
      accumulator are zero (zero flag = 1), execution continues with the next sequential instruction.

                                 Opcode               Operand

                                 JNZ                  address

      The address may be specified as a number, a label, or an expression. The assembler inverts the high and low
      address bytes when it assembles the instruction.


                                       1    1    0   0      0      0   1   0

                                                     lowaddr

                                                     high addr

                                       Cycles:                  3 (2 or 3 on 8085)
                                       States:                  10 (7 or 10 on 8085)
                                       AddreSSing:              immediate
                                       Flags:                   none

      Example:

      Examples of the variations of the lump instruction appear In the description of the J PO instruction.



JP                                                                                                  JUMP IF POSITIVE

      The JP instruction tests the setting of the sign flag. If the contents of the accumulator are positive (sign flag   = 0),
      program execution resumes at the address specified in the JP Instruction. If the contents of the accumulator are
                       =
      minus (sign flag 1), execution continues with the next sequential instruction.

                                 Opcode               Operand

                                 JP                      address

      The address may be specified as a number, a label, or an expression. The assembler inverts the high and low order
      address bytes when it assembles the instruction.




                                                                                                                           3-29
Chapter 3.    Instruction 51 t




                                                 1    1    1     1    0     0   1   0

                                                                lowaddr

                                                                high addr

                                                 Cycles:                  3 (2 or 3 on 8085)
                                                 States:                  10 (7 or 10 on 8085)
                                                 Addressi ng:             immediate
                                                 Flags:                   none

             Example:

             Examples of the variations of the lump instruction appear in the description of the JPO instruction.



JPE                                                                                                   JUMP IF PARITY EVEN

             Parity IS evell if the byte In the accumulator has an even number of one bits. The parity flag IS set to one to
             indicate this condition.

             The J PE Instruction tests the setting of the parity flag. If the parity flag is set to one, program execution resumes
             at the addre~ s specified in the J PE instruction. If the flag IS reset to zero, execution continues with the next
             sequential in ;truction.

                                           Opcode                 Operand


                                           JPE                    address

             The address may be specified as a number, a label, or an expression. The assembler inverts the high and low
             address byte, when it assembles the instruction.

             The J PE anc J PO (jump if parity odd) instructions are especially useful for testing the parity of input data.
             However, th., IN instruction does not set any of the condition flags. The flags can be set by adding OOH to the
             contents of .he accumulator.

                                                 1    1   1      0   1      0   1   0

                                                                lowaddr

                                                                high addr

                                                 Cycles:                  3 (2 or 3 on 8085)
                                                 States:                  10 (7 or 10 on 8085)
                                                 Addressing:              Immediate
                                                 Flags:                   none

             Example:

             Examples    01   the variations of the lump instruction appear In the deSCrIption of the J PO instruction.


 3-30
Chapter 3. Instruction Set




JPO                                                                                         JUMP IF PARITY ODD

      Parity is odd if the byte in the accumulator has an odd number of one bits. The parity flag is set to zero to
      indicate this condition.

      The JPO Instruction tests the setting of the parity flag. If the parity flag is reset to zero, program execution
      resumes at the address specified in the JPO instruction. If the flag is set to one. execution continues with the
      next sequential instruction.

                                Opcode                  Operand

                                 JPO                     address

      The address may be specified as a number. a label. or an expression. The assembler Inverts the high and low
      address bytes when it assembles the instruction.

      The JPO and JPE (jump if panty even) instructions are especially useful for testing the parity of Input data.
      However. the IN instruction does not set any of the condition flags. The flags can be set by adding OOH to the
      contents of the accumulator.

                                         1   1    1     0   0      0   1   0

                                                       low addr

                                                       high addr

                                         Cycles:                3 (2 or 3 on 8085)
                                         States:                10 (7 or 10 on 8085)
                                         Addressing:            Immediate
                                         Flags:                 none

      Example:

      This example shows three different but equivalent methods for lumping 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 the C register.

                                 Label           Code           Operand

                                 ONE:            MOV            A.C
                                                 ANI            80H
                                                 JZ             PLUS
                                                 JNZ            MINUS
                                 TWO:            MOV            A.C
                                                 RLC
                                                 JNC            PLUS
                                                 JMP            MINUS
                                 THREE:          MOV            A.C
                                                 ADI            0
                                                 JM             MINUS
                                 PLUS:                          ;SIGN BIT RESET
                                 MINUS:                         ;SIGN BIT SET
                                                                                                                         3-31
Chapter 3. Instruction Set




          The AND iinmediate instruction in block ONE zeroes all bits of the data byte except the Sign bit, which re-
          mains unch lnged. If the Sign bit was zero, the Zero condition bit will be set, and the JZ instruction will cause
          program coltrol to be transferred to the Instruction at PLUS. Otherwise, the JZ instruction will merely update
          the progranl counter by three, and the JNZ instruction will be executed, causing control to be transferred to
          the instruct ion at MINUS. (The Zero bit IS unaffected by all jump instructions.)

          The RLC illstruction in block TWO causes the Carry bit to be set equal to the Sign bit of the data byte. If the
          Sign bit wai reset, the JNC instruction causes a lump to PLUS. Otherwise the JMP instruction is executed,
          unconditiollally transferring control to MINUS. (Note that, in this instance, a JC instruction could be sub-
          stituted for the unconditional jump with identical results.)

          The add irrmediate instruction In block THREE causes the condition bits to be set. If the sign bit was set, the
          J M instruction causes program control to be transferred to MINUS. Otherwise, program control flows auto-
          matically ino the PLUS routine.



JZ                                                                                                         JUMP IF ZERO

         The J Z Ins",ruction tests the setting of the zero flag. If the flag is set to one, program execution resumes at the
         address spe~ified in the JZ instruction. If the flag is reset to zero, execution continues with the next sequential
         Instruction

                                    Opcode                Operand

                                     JZ                   address

         The addresi may be specified as a number, a label, or an expression. The assembler inverts the high and low
         address by! es when it assembles the instruction.

                                          1    1    0    0    1     0   1   0

                                                        low addr

                                                        high addr

                                          Cycles:                 3 (2 or 3 on 8085)
                                          States:                 10 (7 or lOon 8085)
                                          Addressing:             Immediate
                                          Flags:                  none

          Example:

          Examples )f the variations of the jump instruction appear In the deswptlon of the JPO instruction.



LOA                                                                                     LOAD ACCUMULATOR DIRECT

          LDA load~ the accumulator with a copy of the byte at the location specified In bytes two and three of the
          LDA instr Jction.



 3-32
Chapter 3. Instruction Set




                                 Opcode                Operand


                                 LDA                   address

       The address may be stated as a number. a previously defined label. or an expression. The assembler inverts the
       high and low address bytes when it builds the instruction.

                                       0    0   1      1    1        0     1      0

                                                      lowaddr

                                                      high addr

                                       CYcles:                  4
                                       States:                  13
                                       Addressing:              direct
                                       Flags:                   none

       Examples:

       The following instructions are equivalent. When executed. each replaces the accumulator contents with the byte
       of data stored at memory location 300H.

                                        LOAD:         LDA       300H
                                                      LDA       3*{16*16)
                                                      LDA       200H+256



LDAX                                                                                     LOAD ACCUMULATOR INDIRECT

       L DAX loads the accumulator with a copy of the byte stored at the memory location addressed by register pair
       B or register pair D.

                                 Opcode                Operand


                                 LDAX


       The operand B specifies the Band C register pair: D specifies the D and E register pair. This instruction may
       specify only the B or D register pair.


                                       10   0    0
                                                      -'--------I
                                                      I~   0   0

                                                       I                 fo '" register pair B
                                                                         II '"   register pair D

                                        Cycles:                 2
                                        States:                 7
                                        Addressing:             register indirect
                                        Flags:                  none

                                                                                                                          3-33
Chapter 3. Instruction :,et




          Example:

          Assume that register D contains 93H and register E contains 8BH. The following instruction ioads the accumulator
          with the contents of memory location 938BH:

                                         LDAX     D



LHLD                                                                                       LOAD HAND L DIRECT

          LHLD loads the L register with a copy of the byte stored ilt the memory location specified in bytes two and
          three of the LHLD instruction. LHLD then loads the H register with a copy of the byte stored at the next
          higher memory location.

                                   Opcode                Operand


                                    LHLD                 address

          The address may be stated as a number, a label, or an expression.

          Certain instl uctions use the symbolic reference M to access the memory location currently specified by the Hand
          L registers. _HLD is one of the instructions provided for loading new addresses into the Hand L registers. The
          user may al:o load the current top of the stack into the Hand L registers (POP instruction). Both LHLD and
          POP replace the contents of the Hand L registers. You can also exchange the contents of Hand L with the D
          and E regist~rs (XCHG instruction) or the top of the stack (XTHL instruction) if you need to save the current
          Hand L registers for subsequent use. SHLD stores Hand L in memory.

                                         0    0    1    0      1     0      1   0

                                                        lowaddr

                                                       high addr

                                         Cycles:                   5
                                         States:                   16
                                         Addressing:               direct
                                         Flags:                    none

          Example:

          Assume that locations 3000 and 3001 H contain the address 064EH stored in the format 4E06. In the following
          sequence, tlie MaY instruction moves a copy of the byte stored at address 064E into the accumulator:

                                          LHLD         3000H          ;SET UP ADDRESS
                                          MaY          A,M            ;LOAD ACCUM FROM ADDRESS




 3·34
Chapter 3. Instruction Set




LXI                                                                                 LOAD REGISTER PAIR IMMEDIATE

      LXI is a three-byte instruction; its second and third bytes contain the source data to be loaded into a register
      pair. LXI loads a register pair by copying its second and third bytes into the specified destination register pair.

                                 Opcode                   Operand




                                 LXI



      The first operand must specify the register pair to be loaded. LXI can load the Band C register pair, the D and
      E register pair, the Hand L register pair, or the Stack Pointer.

      The second operand specifies the two bytes of data to be loaded. This data may be coded in the form of a num-
      ber, an ASCII constant, the label of some previously defined value, or an expression. The data must not exceed
      two bytes.

      LXI is the only immediate instruction that accepts a 16-bit value. All other immediate instructions require 8-bit
      values.

      Notice that the assembler inverts the two bytes of data to create the format of an address stored in memory.
      LXI loads its third byte into the first register of the pair and its second byte into the second register of the
      pair. This has the effect of reinverting the data into the format required for an address stored in registers. Thus,
      the instruction LXI S,'AZ' loads A Into register Band Z into register C.

                                       0     o   I   R    P   I0        0   0   1

                                                     low-order data

                                                 high-order data

                                       Cycles:                     3
                                       States:                     10
                                       Addressing:                 immediate
                                       Flags:                      none

      Examples:

      A common use for LXI is to establish a memory address for use in subsequent instructions. In the following
      sequence, the LXI instruction loads the address of STRNG into the Hand L registers. The MOV instruction then
      loads the data stored at that address into the accumulator.

                                       LXI       H,STRNG                ;SET ADDRESS
                                       MOV       A,M                    ;LOAD STRNG INTO ACCUMULATOR

      The following LXI instruction is used to initialize the stack pointer in a relocatable module. The LOCATE pro-
      gram provides an address for the special reserved label STACK.

                                       LXI       SP,STACK
                                                                                                                            3-35
Chapter 3. Instruction 5et




MOV                                                                                                               MOVE

         The MOV in~ tructlon moves one byte of data by copying the source field into the destination field. Source data
         remains unchanged. The instruction's operands specify whether the move is from register to register, from a
         register to m"mory, or from memory to a register.

         Move Reglsur to Register


                                    Opcode              Operand


                                    MOV                 regl,reg2

         The instructi)n copies the contents of reg2 into regl. Each operand must specify one of the registers A, B, C, D,
         E, H, or L.

         When the sal ne register is specified for both operands (as in MOV A,A), the MOV functions as a NOP (no opera-
         tion) since it has no other noticeable effect. This form of MOV requires one more machine state than NOP, and
         therefore ha~ a slightly longer execution time than NOP. Since M addresses a register pair rather than a byte of
         data, MOV H,M is not allowed.


                                       G           D D Dis              5    51
                                          Cycles:              1
                                          States:              5 (4 on 8085)
                                          Addressing:          register
                                          Flags:               none

         Move to Men'lOry


                                    Opcode              Operand


                                    MOV                 M,r

         This instruct ion copies the contents of the specified register Into the memory location addressed by the Hand L
         registers. M s a symbolic reference to the Hand L register pair. The second operand must address one of the
         registers.


                                       1,--0                  0 Is 5 51
                                          Cycles:              2
                                          States:              7
                                          Addressing:          register Indirect
                                          Flags:               none

         Move from .Vlemory


                                    Opcode              Operand


                                    MOV                 r,M



3-36
Chapter 3. Instruction Set




      This instruction copies the contents of the memory location addressed by the Hand L registers into the specified
      register. The first operand must name the destination register. The second operand must be M. M is a symbolic
      reference to the Hand L registers.


                                      CID             0      °I            01
                                      Cycles:                2
                                      States:                7
                                      Addressing:            register indirect
                                      Flags:                 none

      Examples:

                    Label          Opcode           Operands          Comment

                    LDACC:         MOV              A,M               ;LOAD ACCUM FROM MEMORY
                                   MOV              E,A               ;COPY ACCUM INTO E REG
                    NULOP:         MOV              C,C               ;NULL OPERATION



MVI                                                                                            MOVE IMMEDIATE

      MVI is a two-byte instruction; its second byte contains the source data to be moved. MVI moves one byte of
      data by copying its second byte into the destination field. The instruction's operands specify whether the move
      is to a register or to memory.

      Move Immediate to Register

                                Opcode                Operand

                                MVI                   reg,data

      The first operand must name one of the registers A through E, H or L as a destination for the move.

      The second operand specifies the actual data to be moved. This data may be in the form of a number, an ASCII
      constant, the label of some previously defined value, or an expression. The data must not exceed one byte.

      The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
      these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the
      HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression.
      When neither operator is present, the assembler assumes the LOW operator and issues an error message.




                                                      data

                                      Cycles:                2
                                      States:                7
                                      Addressing:            immediate
                                      Flags:                 none


                                                                                                                    3-37
Chapter 3. Instruction iet




          Move Immediate to Memory

                                    Opcode               Operand


                                    MVI                  M,data

          This instruc:ion copies the data stored in its second byte into the memory location addressed by Hand L. M is
          a symbolic eference to the Hand L register pair.

                                          o     0            o              o
                                                         data

                                          Cycles:                3
                                          States:                10
                                          AddreSSing:            Immediate/register indirect
                                          Flags:                 none

          Examples:

          The followilg examples show a number of methods for defining immediate data          In   the MVI instruction. All of
          the exampk s generate the bit pattern for the ASCII character A.

                                          MVI            M,01000001B
                                          MVI            M:A'
                                          MVI            M.41H
                                          MVI            M,101Q
                                          MVI            M,65
                                          MVI            M,5+30*2



NOP                                                                                                          NO OPERATION

          NOP perfor TIS no operation and affects none of the condition flags. NOP IS useful as filler in a timing loop.

                                    Opcode               Operand

                                    NOP

          Operands al e not permitted with the NOP instruction.



ORA                                                                             INCLUSIVE OR WITH ACCUMULATOR

          ORA perf01 ms an inclusive OR logical operation uSing the contents of the specified byte and the accumulator. The
          result is pla:ed in the accumulator.




 3-38
Chapter 3. Instruction Set




Summary of Logical Operations

AND produces a one bit in the result only when the corresponding bits in the test data and the mask data are
one.

OR produces a one bit in the result when the corresponding bits in either the test data or the mask data are
ones.

Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are
different; i.e., a one bit in either the test data or the mask data - but not both - produces a one bit in the
result.

                          AND                 OR                  EXCLUSIVE OR

                       1010 1010          1010 1010                  1010 1010
                       0000 1111          0000 1111                  0000 1111
                       00001010           1010 1111                  1010 0101

OR Register with Accumulator

                          Opcode               Operand

                          ORA                  reg

The operand must specify one of the registers A through E, H or L. This instruction ORs the contents of the
specified register and the accumulator and stores the result in the accumulator. The carry and auxiliary carry
flags are reset to zero.

                                     o               oIss            S   I
                                Cycles:                  1
                                States:                  4
                                Addressing:              register
                                Flags:                   Z,S,P,CY,AC

OR Memory with Accumulator

                          Opcode               Operand

                          ORA                  M

The contents of the memory location specified by the Hand L registers are inciusive-oRed with the contents of
the accumulator. The result is stored in the accumulator. The carry and auxiliary carry flags are reset to zero.

                                     o               o
                                Cycles:                  2
                                States:                  7
                                Addressing:              register indirect
                                Flags:                   Z,S,P,CY,AC

                                                                                                                  3-39
Chapter 3. Instruction Set



          Example:

          Since any tit inciusive-ORed with a one produces a one and any bit ORed with a zero remains unchanged, ORA
          is frequentl y used to set ON particular bits or groups of bits. The following example ensures that bit 3 of the
          accumulator is set ON, but the remaining bits are not disturbed. This is frequently done when individual bits
          are used as status flags in a program. Assume that register D contains the value OSH:

                                    Accumulator          01000011
                                    Register D           o 0 0 0 1 000
                                                         01001011



ORI                                                                                     INCLUSIVE OR IMMEDIATE

          ORI performs an inclusive OR logical operation using the contents of the second byte of the instruction and the
          contents 01 the accumulator, The result is placed in the accumulator. ORI also resets the carry and auxiliary
          carry flags to zero.

                                    Opcode                Operand

                                    ORI                   data

          The operar d must specify the data to be used In the inclusive OR operation. This data may be in the form of a
          number, ar ASCII constant, the label of some previously defined value, or an expression. The data may not
          exceed one byte.

          The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
          these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the
          HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression.
          When neitrer operator is present, the assembler assume the LOW operator and issues an error message.

                                                             o             o

                                                          data

                                           Cycles:               2
                                           States:               7
                                           Addressing:           immediate
                                           Flags:                Z,S,P,SY,AC

          Summary, If Logical Operations

          AND prod Jces a one bit in the result only when the corresponding bits in both the test data and the mask data
          are ones.

          OR prodU< es a one bit in the result when the corresponding bits in either the test data or the mask data are ones.

          Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are
          different; I.e., a one bit in either the test data or the mask data - but not both produces a one bit in the
          result.


  3-40
Chapter 3. Instruction Set




                                AND                     OR                 EXCLUSIVE OR

                             1010 1010                1010 1010                1010 1010
                             00001111                 00001111                 0000 1111
                             00001010                 1010 1111                10100101

      Example:

      See the description of the ORA instruction for an example of the use of the inclusive OR. The following
      examples show a number of methods for defining immediate data in the ORI instruction. All of the examples
      generate the bit pattern for the ASCII character A.

                                        ORI             01000001B
                                        ORI             'A'
                                        ORI             41H
                                        ORI             101Q
                                        ORI             65
                                        ORI             5+30*2



OUT                                                                                              OUTPUT TO PORT

      The OUT instruction places the contents of the accumulator on the eight-bit data bus and the number of the
      selected port on the sixteen-bit address bus. Since the number of ports ranges from 0 through 255, the port
      number is duplicated on the address bus.

      It is the responsibility of external logic to decode the port number and to accept the output data.



                                                             NOTE

                 Because a discussion of input/output structures is beyond the scope of
                 this manual, this description is restricted to the exact function of the
                 OUT instruction. Input/output structures are described in the 8080 or
                 8085 Microcomputer Systems User's Manual.

                                Opcode                  Operand

                                OUT                     exp

      The operand must specify the number of the desired output port. This may be in the form of a number or an
      expression in the range OOH through OFFH.

                                        1       0             0     0
                                                                           1   I
                                    I                    exp

                                        Cycles:                   3
                                        States:                   10
                                        Addressing:               direct
                                        Flags:                    none
                                                                                                                        3·41
Chapter 3. Instruction Se:




PCHL                                                                                MOVE H&L TO PROGRAM COUNTER

          PCHL loads tle contents of the Hand L registers Into the program counter register. Because the processor
          fetches the next instruction from the updated program counter address, PCHL has the effect of a iump instruc-
          tion.

                                    Opcode               Operand

                                    PCHL

          Operands are not permitted with the PCHL instruction.

          PCHL moves the contents of the H register to the high-order eight bits of the program counter and the contents
          of the L regHer to the low-order eight bits of the program counter.

          The user pro'~ram must ensure that the Hand L registers contain the address of an executable instruction when
          the PCHL In: truction is executed.

                                                         o           o      0   1   I
                                           Cycles:               1
                                           States:               5 (6 on 8085)
                                           AddreSSing:           register
                                           Flags:                none

          Example:

          One techniqlle for passing data to a subroutine IS to place the data Immediately after the subroutine call. The
          return addre, s pushed onto the stack by the CALL Instruction actually addresses the data rather than the next
          instruction ater the CALL. For tillS example, assume that two bytes of data follow the subroutine call. The
          following coding sequence performs a return to the next Instruction after the call:

                                    GO BACK:         POP     H       ;GET DATA ADDRESS
                                                     INR     L       ;ADD 2 TO FORM
                                                     INR     L       ;RETURN ADDRESS
                                                     PCHL            ;RETURN



 POP                                                                                                                   POP

          The POP ins:ruction removes two bytes of data from the stack and copies them to a register pair or copies the
           Program Stttus Word into the accumulator and the condition flags.

          POP Registe, Pair

          POP copies: he contents of the memory location addressed by the stack pointer Into the low-order register of the
          register pair POP then increments the stack pointer by one and copies the contents of the resulting address into




  3-42
Chapter 3. Instruction Set




the high-order register of the pair. POP then increments the stack pointer again so that it addresses the next
older Item on the stack.

                          Opcode               Operand



                          POP




The operand may specify the B&C, D&E, or the H&L register pairs. POP PSW is explained separately.


                                ~         R    pi   0        0   0   11
                                Cycles:                 3
                                States:                 10
                                Addressing:             register indirect
                                Flags:                  none

POP PSW

POP PSW uses the contents of the memory location specified by the stack pointer to restore the condition flags.
POP PSW increments the stack pointer by one and restores the contents of that address to the accumulator.
POP then increments the stack pointer again so that it addresses the next older item on the stack.




                                Cycles:                 3
                                States:                 10
                                Addressing:             register Indirect
                                Flags:                  Z,S,P,CY,AC

Example:

Assume that a subroutine is called because of an external interrupt. In general, such subroutines should save and
restore any registers it uses so that main program can continue normally when it regains control. The following
sequence of PUSH and POP instructions save and restore the Program Status Word and all the registers:




                                                                                                                 343
Chapter 3. Instruction :,et




                                           PUSH           PSW
                                           PUSH           B
                                           PUSH           D
                                           PUSH           H



                                           subroutine coding



                                           POP            H
                                           POP            D
                                           POP            B
                                           POP            PSW
                                           RET

          Notice that the sequence of the POP instructions is the opposite of the PUSH instruction sequence.


PUSH                                                                                                                  PUSH

          The PUSH ilstruction copies two bytes of data to the stack. This data may be the contents of a register pair or
          the Progran Status Word. as explained below:

          PUSH Regis'er Pair

          PUSH decrements the stack pointer register by one and copies the contents of the high-order register of the
          register pair to the resulting address. PUSH then decrements the pointer again and copies the low-order register
          to the resuh ing address. The source registers remain unchanged.

                                    Opcode                Operand




                                    PUSH
                                                          {U
          The operand may specify the B&C. D&E. or H&L register pairs. PUSH PSW is explained separately.




                                           Cycles:              3
                                           States:              11 (13 on 8085)
                                           Addressi ng:         register indirect
                                           Flags:               none

          Example:

          Assume tha: register B contains 2AH. the C register contains 4CH, and the stack pOinter is set at 9AAF. The
          instruction'USH B stores the B register at memory address 9AAEH and the C register at 9AADH. The stack
          pointer is st:t to 9AADH:

  344
Chapter 3. Instruction Set




                                      Stack                                  Stack
                                   Before PUSH            Address         After PUSH

           SP before               ..   xx                9AAF                 xx
                                        xx
                                        xx
                                        xx
                                                          9AAE
                                                          9AAD
                                                          9AAC
                                                                               2A
                                                                               4C
                                                                               xx
                                                                                        ..             SP after



      PUSH PSW

      PUSH PSW copies the Program Status Word onto the stack. The Program Status Word comprises the contents
      of the accumulator and the current settings of the condition flags. Because there are only five condition flags,
      PUSH PSW formats the flags Into an eight-bit byte as follows:

                                                7     6        5    4      3        2          o
                                              ~AC                          0        P        I CY I
      On the 8080, bits 3 and 5 are always zero; bit one is always set to one. These filler bits are undefined on the
      8085.

      PUSH PSW decrements the stack pointer by one and copies the contents of the accumulator to the resulting
      address. PUSH PSW again decrements the pointer and copies the formatted condition flag byte to the resulting
      address. The contents of the accumulator and the condition flags remain unchanged.

                                                           o
                                        Cycles:                3
                                        States:                11 (120n8085)
                                        Addressing:            register indirect
                                        Flags:                 none

      Example:

      When a program calls subroutines, it is frequently necessary to preserve the current program status so the calling
      program can continue normally when it regains control. Typically, the subroutine performs a PUSH PSW prior to
      execution of any instruction that might alter the contents of the accumulator or the condition flag settings.
      The subroutine then restores the pre-call system status by executing a POP PSW instruction just before returning
      control to the calling program.



RAL                                                                                     ROTATE LEFT THROUGH CARRY

      RAL rotates the contents of the accumulator and the carry flag one bit position to the left. The carry flag, which
      is treated as though it were part of the accumulator, transfers to the low-order bit of the accumulator. The high-
      order bit of the accumulator transfers into the carry flag.

                                Opcode                Operand

                                 RAL

      Operands are not permitted with the RAL instruction.
                                                                                                                              345
Chapter 3. Instruction S"t




                                         10       0   0          o
                                          Cycles:                    1
                                          States:                    4
                                          Flags:                     CYonly

          Example:

          Assume that the accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus-
          trate the eff, ct of the RAL instruction:

                Before                                          Carry

                                                                    o }--------..,
                                                              Accumulator

                                                      o         o            o       o


             After:                                             Carry


                                                                 DJ
                                                              Accumulator


                                              1
                                                  0       0              0       0   01


RAR                                                                                  ROTATE RIGHT THROUGH CARRY

          RAR rotate~ the contents of the accumulator and the carry flag one bit position to the right. The carry flag,
          which is tre2ted as though it were part of the accumulator. transfers to the high-order bit of the accumulator.
          The low-ord"r bit of the accumulator transfers into the carry flag.

                                    Opcode                    Operand


                                    RAR

          Operands an' not permitted with the RAR instruction.


                                         10       0   0

                                          Cycles:               1
                                          States:               4
                                          Flags:                CYonly




  3-46
Chapter 3. Instruction Set




     Example:

     Assume that the accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus-
     trate the effect of the RAR instruction:

           Before:                                       Carry

                                                          0

                                                     Accumulator

                                                 0         0             0           0


        After:                                           Carry


                                                         ~
                                                     Accumulator


                                         1
                                             0       0           0               0   1   I
RC                                                                                            RETURN IF CARRY

     The RC instruction tests the carry flag. If the flag is set to one to indicate a carry. the instruction pops two
     bytes off the stack and places them in the program counter. Program execution resumes at the new address in
     the program counter. If the flag is zero, program execution simply continues with the next sequential instruction.

                               Opcode                Operand

                               RC

     Operands are not permitted with the RC instruction.

                                                 o               o   0       0   I
                                     Cycles:             1 or 3
                                     States:             5 or 11 (6 or 12 on 8085)
                                     Addressing:         register indirect
                                     Flags:              none

     Example:

     For the sake of brevity. an example is given for the RET instruction but not for each of its closely related
     variants.




                                                                                                                      347
Chapter 3. Instruction Set




RET                                                                                      RETURN FROM SUBROUTINE

         The RET irstruction pops two bytes of data off the stack and places them In the program counter register.
         Program ex,:cution resumes at the new address In the program counter.

         Typically, I:ET instructions are used in conjunction with CALL instructions. (The same IS true of the variants
         of these instructions.) In this case, it IS assumed that the data the RET instruction pops off the stack is a
         return addr:ss placed there by a previous CALL. This has the effect of returning control to the next Instruction
         after the CILL. The user must be certain that the RET instruction finds the address of executable code on the
         stack. If th,' instruction finds the address of data, the processor attempts to execute the data as though it were
         code.

                                     Opcode                Operand

                                     RET

          Operands a'e not permitted with the RET Instruction.

                                                     o 0               o        0

                                           Cycles:              3
                                           States:              10
                                           Addressing:          register indirect
                                           Flags:               none

          Example:

         As mentior ed previously, subroutines can be nested. That is, a subroutine can call a subroutine that calls
         another sul,routine. The only practical limit on the number of nested calls is the amount of memory available
         for stackin:; return addresses. A nested subroutine can even call the subroutine that called it, as shown In the
         follOWing example. (Notice that the program must contain logic that eventually returns control to the main
         program. Ctherwlse, the two subroutines will call each other indefinitely.)




                         1~
                MAlt1 PROGRAM

                                                         SUBA         r--~---CALLSUBA
                                                                                  1         SUBB


                   CILL SUBA                                   CNZ S U B ~                              T
                         T                                           T              -                   RET

                                                                     RET ....



RIM (8085 PRO::ESSOR ONLY)                                                                      READ INTERRUPT MASK

          The RIM ilstruction loads eight bits of data into the accumulator. The resulting bit pattern indicates the current
          setting of . he interrupt mask, the setting of the interrupt flag, pending interrupts, and one bit of serial input data,
          if any.


 348
Chapter 3. Instruction Set




                                Opcode                       Operand

                                 RIM

      Operands are not permitted with the RIM instruction.

      The RIM instruction loads the accumulator with the following information:


                       I   7    6       5       4       3         2         1         0

                       I SID    17     16   15          IE       7.5       6.5    5.5

                       "--v-'   "---v---" V '---v----"
                                                        I                  L

                                        L
                                                                                 Interrupt Masks:          1 = masked

                                                        Llnterrupt Enable Flag:                            = enabled

                                                    Pending Interrupts:                   1    = pending
                           '----Serial Input Data Bit. if any

      The mask and pending flags refer only to the RST5.5, RST6.5, and RST7.5 hardware interrupts. The IE flag
      refers to the entire interrupt system. Thus, the IE flag is identical in function and level to the INTE pin on the
      8080. A 1 bit in this flag indicates that the entire interrupt system is enabled.

                                        0   0                0     0        0     0       01
                                       1
                                       Cycles:                         1
                                       States:                         4
                                       Flags:                          none



RLC                                                                                                  ROTATE ACCUMULATOR LEFT

      RLC sets the carry flag equal to the high-order bit of the accumulator, thus overwriting its previous setting. RLC
      then rotates the contents of the accumulator one bit position to the left with the high-order bit transferring to
      the low-order position of the accumulator.

                                Opcode                       Operand

                                 RLC

      Operands are not allowed with the RLC instruction.

                                       10   0       0        0     0

                                       Cycles:                         1
                                       States:                         4
                                       Flags:                          CYonly



                                                                                                                                              349
Chapter 3. Instruction S,t




         Example:

         Assume that tne accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus-
         trate the effect of the RLC instruction.

               Before:                                       Carry

                                                              0

                                                         Accumulator

                                                    0         0          0       0


            After:                                           Carry


                                                             Q
                                                         Accumulator


                                               1
                                                0        0           0       0   1[

RM                                                                                                   RETURN IF MINUS

         The RM instr Jction tests the sign flag. If the flag is set to one to indicate negative data in the accumulator, the
         instruction pcps two bytes off the stack and places them in the program counter, Program execution resumes at
         the new addr,'ss In the program counter. If the flag is set to zero, program execution simply continues with the
         next sequentlll instruction.

                                    Opcode               Operand


                                    RM

         Operands are not permitted with the RM instruction.


                                                                     o   0 01
                                          Cycles:              1 or 3
                                          States:              5 or 11 (6 or 12 on 8085)
                                          Addressing:          register indirect
                                          Flags:               none

         Example:

         For the sake of brevity, an example is given for the RET instruction but not for each of its closely related
         variants.




3-50
Chapter 3. Instruction Set




RNC                                                                                            RETURN IF NO CARRY

      The RNC instruction tests the carry flag. If the flag is set to zero to indicate that there has been no carry, the
      instruction pops two bytes off the stack and places them in the program counter. Program execution resumes at
      the new address in the program counter. If the flag is one, program execution simply continues with the next
      sequential instruction.

                                Opcode                   Operand

                                 RNC

      Operands are not permitted with the RNC instruction.

                                                    a        a a a 01
                                        Cycles:                1 or 3
                                        States:                5 or 11 (6 or 12 on 8085)
                                        Addressing:            register indirect
                                        Flags:                 none

      Example:

      For the sake of breVity. an example is given for the RET instruction but not for each of its closely related
      variants.



RNZ                                                                                             RETURN IF NOT ZERO

      The RNZ instruction tests the zero flag. If the flag is set to zero to indicate that the contents of the accumulator
      are other than zero. the instruction pops two bytes off the stack and places them in the program counter. Pro-
      gram execution resumes at the new address in the program counter. If the flag is set to one. program execution
      simply continues with the next sequential instruction.

                                Opcode                   Operand

                                 RNZ

      Operands are not permitted with the RNZ instruction.


                                       11           a a a a a 01
                                        Cycles:                1 or 3
                                        States:                501'11 (601' 12 on 8085)
                                        Addressing:            register indirect
                                        Flags:                 none

      Example:

      For the sake of brevity. an example    IS   given for the RET instruction but not for each of its closely related
      variants.

                                                                                                                           3-51
Chapter 3. Instruction S"t




RP                                                                                               RETURN IF POSITIVE

         The RP instnlction tests the sign flag. If the flag is reset to zero to indicate positive data in the accumulator,
         the instruction pops two bytes off the stack and places them in the program counter. Program execution
         resumes at the new address in the program counter. If the flag is set to one, program execution simply continues
         with the next sequential instruction.

                                    Opcode               Operand

                                    RP

         Operands are not permitted with the RP instruction.


                                                             o     0      0   01

                                          Cycles:                1 or 3
                                          States:                5 or 11 (6 or 12 on 8085)
                                          Addressing:            register indirect
                                          Flags:                 none

         Example:

         For the sake of brevity, an example is given for the RET instruction but not for each of its closely related
         variants.



RPE                                                                                          RETURN IF PARITY EVEN

         Parity is ever if the byte in the accumulator has an even number of one bits. The parity flag IS set to one to
         indicate this ;ondition. The RPE and RPO instructions are useful for testing the parity of input data. However,
         the IN instru;tion does not set any of the condition flags. The flags can be set without altering the data by
         adding OOH to the contents of the accumulator.

         The RPE ins', ruction tests the parity flag. If the flag is set to one to indicate even parity, the instruction pops
         two bytes of' the stack and places them in the program counter. Program execution resumes at the new address
         in the program counter. If the flag IS zero. program execution simply continues with the next sequential instruc-
         tion.

                                    Opcode               Operand

                                    RPE

         Operands are not permitted with the RPE instruction.

                                                        o          o      0 01
                                          Cycles:                1 or 3
                                          States:                5 or 11 (6 or 12 on 8085)
                                          Addressing:            register indirect
                                          Flags:                 none


3-52
Chapter 3. Instruction Set




      Example:

      For the sake of brevity, an example   IS   given for the RET instruction but not for each of its closely related
      variants.



RPO                                                                                         RETURN IF PARITY ODD

      Parity is odd if the byte in the accumulator has an odd number of one bits. The parity flag is reset to zero to
      indicate this condition. The RPO and RPE instructions are useful for testing the parity of input data. However,
      the IN instruction does not set any of the condition flags. The flags can be set without altering the data by
      adding OOH to the contents of the accumulator.

      The RPO instruction tests the parity flag. If the flag is reset to zero to indicate odd parity, the instruction pops
      two bytes off the stack and places them in the program counter. Program execution resumes at the new address
      in the program counter. If the flag is set to one, program execution simply continues with the next sequential
      instruction.

                                 Opcode                 Operand


                                 RPO

      Operands are not permitted with the RPO instruction.


                                                        o   0     0   0    01

                                       Cycles:                  1 or 3
                                       States:                  5 or 11 (6 or 12 on 8085)
                                       Addressing:              register Indirect
                                       Flags:                   none

      Example:

      For the sake of brevity, an example is given for the RET instruction but not for each of its closely related
      variants.



RRC                                                                               ROTATE ACCUMULATOR RIGHT

      RRC sets the carry flag equal to the low-order bit of the accumulator, thus overwriting its previous setting. RRC
      then rotates the contents of the accumulator one bit position to the right with the low-order bit transferring to
      the high order position of the accumulator.

                                 Opcode                  Operand


                                 RRC

      Operands are not permitted with the RRC instruction.




                                                                                                                           3-53
Chapter 3. Instruction Set




                                        10    0       0       0

                                          Cycles:
                                          States:                       4
                                          Flags:                        CYonly

          Example:

          Assume that the accumulator contains the value OAAH and the carry flag is zero. The folloving diagrams illus-
          trate the effect of the RRC instruction:

                Before:                                               Carry



                                                                      G
                                                              Accumulator

                                                          0            0          0



             After:                                                   Carry



                                                                      G
                                                              Accumulator

                                                  0               0           0       0   1
                                               1


RST                                                                                                             RESTART

          RST IS a special purpose CALL instruction designed primarily for use with interrupts. RST !,ushes the contents
          of the program counter onto the stack to provide a return address and then Jumps to one 0 eight predetermined
          addresses. A three-bit code carried in the opcode of the RST instruction specifies the Jump ,Iddress.

          The restart instruction IS unique because it seldom appears as source code 111 an applications program. More often,
          the peripheral devices seekll1g interrupt service pass this one-byte instruction to the processcr,

          When a deVice requests interrupt service and lI1terrupts are enabled, the processor acknowlecges the request and
          prepares its data lines to accept anyone-byte instruction from the deVice. RST is generally he instruction of
          chOice because its special purpose CALL establishes a return to the main program.

          The processor moves the three-bit address code from the RST instruction into bits 3, 4, ane 5 of the program
          counter. In effect, this multiplies the code by eight. Program execution resumes at the new address where eight
          bytes are available for code to service the interrupt. If eight bytes are too few, the program can either Jump to
          or call a subroutine.




3-54
Chapter 3. Instruction Set




                                                  8085 NOTE

                  The 8085 processor Includes four hardware inputs that generate internal RST
                  instructions. Rather than send a RST instruction, the interrupting device need
                  only apply a signal to the RST5.5, RST6.5, RST7.5, or TRAP input pin.
                  The processor then generates an internal RST instruction. The execution
                  depends on the input:

                                       INPUT                          RESTART
                                        NAME                          ADDRESS

                                       TRAP                               24H
                                       RST5.5                             2CH
                                       RST6.5                             34H
                                       RSn.5                              3CH

     Notice that these addresses are within the same portion of memory used by the RST instruction, and therefore
     allow only four bytes - enough for a call or jump and a return   for the interrupt service routine.

     If Included in the program code, the RST instruction has the following format:

                                Opcode                 Operand


                                 RST                   code

     The address code must be a number or expreSSion within the range 0008 through 1118.


                               11           IC
                                            ~
                                                  C      r
                                                         '"   I1                11

        Progrdm                                                                              --~

        Counter                 15     14   13    12     11    10     9         8    7   6   5      4     3      2              0

        After RST              10      0      0   0      0       0    0     0        0   0   C      C     C      0     0        01

                                Cycles:           3
                                States:           11 (12 on 8085)
                                Addressing:       register indirect
                                Flags:            none



RZ                                                                                                   RETURN IF ZERO

     The RZ instruction tests the zero flag. If the flag IS set to one to indicate that the contents of the accumulator are
     zero, the instruction pops two bytes of data off the stack and places them in the program counter. Program
     execution resumes at the new address in the program counter. If the flag is zero, program execution simply
     continues with the next sequential instruction.




                                                                                                                           3-55
Chapter 3. Instruction Se




                                    Gpcode               Operand

                                    RZ

          Operands are not permitted with the RZ instruction.

                                                   o 0                 o   0 01
                                           Cycles:                 1 or 3
                                           States:                 5 or 11 (6 or 12 on 8085)
                                           Addressing:             register indirect
                                           Flags:                  none

          Example:

          For the sake of brevity. an example is given for the RET instruction but oot for each of its closely related
          variants.



SBB                                                                                            SUBTRACT WITH BORROW

          SBB subtracts one byte of data and the setting of the carry flag from the contents of the accumulator. The
          result is stored in the accumulator. SBB then updates the setting of the carry flag to indicate the outcome of
          the operation

          SBB's use of he carry flag enables the program to subtract nulti-byte strings. SBB incorporates the carry flag by
          adding it to tile byte to be subtracted from the accumulator. It then subtracts the result from the accumulator
          by using two', complement addition. These preliminary operations occur in the processor's internal work registers
          so that the SOJrce data remains unchanged.

          Subtract Regl.'ter from Accumulator with Borrow

                                    Opcode                 Operand

                                    SBB                    reg

          The operand nust specify one of the registers A through E, H or L. This instruction subtracts the contents of
          the specified I egister and the carry flag from the accumulator and stores the result in the accumulator.


                                          11   0    0                  S   5   S   I
                                           Cycles:                 1
                                           States:                 4
                                           Addressing:             register
                                           Flags:                  Z,S,P,CY,AC




3-56
Chapter 3. Instruction Set




      Subtract Memory from Accumulator with Borrow

                                Opcode                Operand

                                SBB                   M

      This instruction subtracts the carry flag and the contents of the memory location addressed by the Hand L
      registers from the accumulator and stores the result in the accumulator.




                                      Cycles:               2
                                      States:               7
                                      Addressing:           register indirect
                                      Flags:                Z,S,P,CY,AC

      Example:

      Assume that register B contains 2, the accumulator contains 4, and the carry flag is set to 1. The instruction
      SBB B operates as follows:

                                2H + carry = 3H
                                2's complement of 3H      = 11111101

                                Accumulator    = 00000100
                                                    11111101
                                                    00000001    = 1H
      Notice that this two's complement addition produces a carry. When SBB complements the carry bit generated
      by the addition, the carry flag is reset OFF. The flag settings resulting from the SBB B instruction are as
      follows:

                                      Carry                     o
                                      Sign                      o
                                      Zero                      o
                                      Parity                    o
                                      Aux. Carry                1



SBI                                                                     SUBTRACT IMMEDIATE WITH BORROW

      SBI subtracts the contents of the second Instruction byte and the setting of the carry flag from the contents of
      the accumulator. The result is stored in the accumulator.

      SBI's use of the carry flag enables the program to subtract multi-byte strings. SBI incorporates the carry flag by
      adding it to the byte to be subtracted from the accumulator. It then subtracts the result from the accumulator
      by using two's complement addition. These preliminary operations occur In the processor's internal work registers
      so that the immediate source data remains unchanged.




                                                                                                                       3-57
Chapter 3. Instruction Se




         The assembler s relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
         these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the
         HIGH or LOlA operator to specify which byte of the address is to be used in the evaluation of the expression.
         When neither cJperator is present, the assembler assumes the LOW operator and issues an error message.

                                   Opcode               Operand

                                   5BI                  data

         The operand must specify the data to be subtracted. This data may be in the form of a number, an ASCII
         constant, the Iabel of some perviously defined value, or an expression. The data may not exceed one byte.

                                                   o                      01
                                         Cycles:               2
                                         States:               7
                                         Addressing:           immediate
                                         Flags:                Z,5,P,CY.AC

         Example:

         The following sequence of instructions enables the program to test the setting of the carry flag:

                                          XRA           A
                                          5BI           1

         The exclusive OR with the accumulator clears the accumulator to zeros but does not affect the setting of the
         carry flag. (Tfe XRA instruction is explained later in this chapter.) When the carry flag is OFF, 5BI 1 yields
         a minUS one. Nhen the flag is set ON, 5BI 1 yields a minus two.



                                                            NOTE

                                   This example is included for illustrative purposes. In most
                                   cases, the carry flag can be tested more efficiently by using
                                   the JNC instruction (jump if no carry).



SHLD                                                                                       STORE HAND L DIRECT

         5HLD stores l copy of the L register in the memory location specified in bytes two and three of the SHLD
         Instruction. 5-lLD then stores a copy of the H register in the next higher memory location.

                                   Opcode               Operand

                                   SHLD                 address

         The address may be stated as a number, a previously defined label. or an expression.




3·58
Chapter 3. Instruction Set




     SHLD is one of the instructions provided for saving the contents of the Hand L registers. Alternately, the H
     and L data can be placed in the D and E registers (XCHG instruction) or placed on the stack (PUSH and XTHL
     instructions).

                                     0   0    1     0   0       0    1     0

                                                   lowaddr

                                                   high addr

                                     Cycles:                5
                                     States:                16
                                     Addressing:            direct
                                     Flags:                 none

     Example:

     Assume that the Hand L registers contain OAEH and 29H, respectively, The following is an illustration of the
     effect of the SHLD lOAH instruction:



                                                   MEMORY ADDRESS

                                             109        lOA          lOB       10C
        Memory Before SHLD                    00         00           00        00
        Memory After SH LD                    00         29           AE        00



SIM (8085 PROCESSOR ONLY)                                                                SET INTERRUPT MASK

     SI M is a multi-purpose instruction that uses the current contents of the accumulator to perform the following
     functions: Set the interrupt mask for the 8085's RST5.5, RST6.5, and RST7.5 hardware interrupts: reset
     RST7.5's edge sensitive input; and output bit 7 of the accumulator to the Serial Output Data latch.

                               Opcode               Operand

                               SIM

     Operands are not permitted with the SIM instruction. However, you must be certain to load the desired bit
     configurations into the accumulator before executing the SIM instruction. SIM interprets the bits in the accumu-
     lator as follows:




                                                                                                                      ]-59
Chapter 3. Instruction Set




                                                                                             o = available
                                                                                           { 1 = masked



                                              ignored
                                       If 1, bit 7 is output to Serial Output Data Latch
                                Serial Output Data: ignored if bit 6 = 0


         Accumulator :,its 3 and 6 function as enable switches. If bit 3 IS set ON (set to 1), the set mask function is
         enabled. Bits   (J   through 2 then mask or leave available the corresponding RST interrupt. A 1 bit masks the
         interrupt mak ng It unavailable; a 0 bit leaves the interrupt available. If bit 3 is set OFF (reset to 0), bits 0
         through 2   hav~     no effect. Use this option when you want to send a serial output bit without affecting the
         interrupt mas!..

         Notice that the DI (Disable Interrupts) instruction overrides the SIM instruction. Whether masked or not, RST5.5,
         RST6.5, and IlST7.5 are disabled when the DI instruction IS in effect. Use the RIM (Read Interrupt Mask)
         instruction to determine the current settings of the interrupt flag and the interrupt masks.

         If bit 6 is set to 1, the serial output data function is enabled. The processor latches accumulator bit 7 into the
         SOD output v'here it can be accessed by a peripheral device. If bit 6 IS reset to 0, bit 7 IS ignored.

         A 1 in accumiJlator bit 4 resets OFF the RST7.5 input flip flop. Unlike RST5.5 and 6.5, RST7.5 IS sensed via a
         processor flip flop that is set when a peripheral device Issues a pulse with a rising edge. This edge triggered Input
         supports devices that cannot maintain an interrupt request until serviced. RST7.5 is also useful when a device
         does not requ re any explicit hardware service for each interrupt. For example, the program might increment and
         test an event ,:ounter for each interrupt rather than service the device directly.

         The RST7.5 f ip flop remains set until reset by 1) Issuing a RESET to the 8085, 2) recognizing the interrupt, or
         3) setting accLmulator bit 4 and executing a SIM instruction. The Reset RST7.5 feature of the SIM instruction
         allows the pre gram to override the interrupt.

         The RST7.5 Illput flip flop is not affected by the setting of the interrupt mask or the DI instruction and there-
         fore can be set at any time. However, the interrupt cannot be serviced when RST7.5 is masked or a DI instruction
         is in effect.


                                              0    0             0       0   0   01
                                             1

                                              Cycles:                1
                                              States:                4
                                              Flags:                 none


         Example 1:       <ssume that the accumulator contains the bit pattern 00011100. The SIM instruction resets the
         RST7.5 flip fl)p and sets the RST7.5 interrupt mask. If an RSn.5 interrupt is pending when this SIM instruction
         is executed, it is overridden without being serviced. Also, any subsequent RST7.5 Interrupt is masked and cannot
         be serviced urtil the interrupt mask is reset.

 3-60
Chapter 3. Instruction Set




       Example 2: Assume that the accumulator contains the bit pattern 11001111. The 51 M instruction masks out the
       R5T5.5, R5T6.5, and R5T7.5 level interrupts and latches a 1 bit into the SOD input. By contrast, the bit pattern
       10000111 has no effect since the enable bits 3 and 6 are not set to ones.



SPHL                                                                                                MOVE H&L TO SP

       5PHL loads the contents of the Hand L registers into the SP (Stack Pointer) register.

                                  Opcode               Operand

                                  SPHL

       Operands are not permitted with the SPHL instruction.

       SP is a special purpose 16·bit register used to address the stack; the stack must be in random access memory
       (RAM). Because different applications use different memory configurations, the user program must load the SP
       register with the stack's beginning address. The stack is usually assigned to the highest available location in RAM.
       The hardware decrements the stack pointer as items are added to the stack and increments the pointer as items
       are removed.

       The stack pointer must be initialized before any instruction attempts to access the stack. Typically, stack
       initialization occurs very early in the program. Once established, the stack pointer should be altered with
       caution. Arbitrary use of 5PHL can cause the loss of stack data.




                                         Cycles:             1
                                         States:             5 (6 on 8085)
                                         Addressing:         register
                                         Flags:              none

       Example:

       Assume that the Hand L registers contain SOH and OFFH, respectively. SPHL loads the stack pointer with the
       value 50FFH.



STA                                                                              STORE ACCUMULATOR DIRECT

       STA stores a copy of the current accumulator contents into the memory location specified in bytes two and
       three of the STA instruction.

                                  Opcode               Operand

                                  STA                  address

       The address may be stated as a number, a previously defined label, or an expression. The assembler inverts the
       high and low address bytes when it builds the instruction.



                                                                                                                         3-61
Chapter 3. Instruction Se.




                                          0   0     1       1        0       0    1   0

                                                            lowaddr

                                                           high addr

                                          Cycles:                        4
                                          States:                        13
                                          Addressing:                    direct
                                          Flags:                         none

         Example:

         The following instruction stores a copy of the contents of the accumulator at memory location SB3H:

                                   STA            SB3H

         When assembl( d. the previous instruction has the hexadecimal value 32 B3 05. Notice that the assembler inverts
         the high and I'lw order address bytes for proper storage in memory.



STAX                                                                                         STORE ACCUMULATOR INDIRECT

         The STAX ins :ruction stores a copy of the contents of the accumulator into the memory location addressed
         by register pai B or register pair D.

                                   Opcode                    Operand


                                   STAX


         The operand E specifies the Band C register pair; D specifies the D and E register pair. This instruction may
         specify only tie B or D register pair.


                                         10   0     oeJo '-...,-/
                                                                             0        01


                                                            IfII    0 = register pair B
                                                                      = register pair D


                                          CYcles:                        2
                                          States:                        7
                                          Addressing:                    register Indirect
                                          Flags:                         none

         Example:

         If register B c<.ntains 3FH and register C contains 16H. the following instruction stores a copy of the contents
         of the accumuiator at memory location 3F16H:

                                          STAX      B
3-62
Chapter 3. Instruction Set




STC                                                                                                      SET CARRY

      STC sets the carry flag to one. No other flags are affected.

                                Opcode               Operand

                                STC

      Operands are not permitted with the STC instruction.


                                       10 0                 o
                                       Cycles:                  1
                                       States:                  4
                                       Flags:                   CY

      When used in combination with the rotate accumulator through the carry flag instructions, STC allows the pro-
      gram to modify individual bits.



SUB                                                                                                        SUBTRACT

      The SUB instruction subtracts one byte of data from the contents of the accumulator. The result IS stored in the
      accumulator, SUB uses two's complement representation of data as explained in Chapter 2. Notice that the SUB
      Instruction excludes the carry flag (actually a 'borrow' flag for the purposes of subtraction) but sets the flag to
      indicate the outcome of the operation.

      Subtract Register from Accumulator

                                 Opcode              Operand

                                 SUB                  reg

      The operands must specify one of the registers A through E, H or L. The instruction subtracts the contents of
      the specified register from the contents of the accumulator using two's complement data representation. The
      result is stored in the accumulator,


                                                            oIss          S   I
                                       Cycles:                  1
                                       States:                  4
                                       Addressing:              register
                                       Flags:                   Z.S,P,CY,AC

      Subtract Memory from Accumulator

                                 Opcode               Operand

                                 SUB                  M



                                                                                                                       3-63
Chapter 3. Instruction Se




         This instruction subtracts the contents of the memory location addressed by the Hand L registers from the
         contents of th ~ accumulator and stores the result in the accumulator. M is a symbolic reference to the Hand L
         registers.

                                                              o               01
                                             Cycles:              2
                                             States:              7
                                             Addressing:          register indirect
                                             Flags:               Z,S,P,CY,AC

         Example:

         Assume that tne accumulator contains 3EH. The instruction SUB A subtracts the contents of the accumulator
         from the accumulator and produces a result of zero as follows:

                                    3EH        00111110
                                +(-3EH)        11000001       one's complement
                                                      1       add one to produce two's complement
                            carry out   =1     00000000       result = 0

         The conditior flags are set as follows:

                                             Carry                0
                                             Sign                 0
                                             Zero                 1
                                             Parity               1
                                             Aux. Carry           1

         Notice that the SUB instruction complements the carry generated by the two's complement addition to form a
         'borrow' flag. The auxiliary carry flag is set because the particular value used in this example causes a carry out
         of bit 3.



SUI                                                                                           SUBTRACT IMMEDIATE

         SU I subtracts the contents of the second instruction byte from the contents of the accumulator and stores the
         result in the •.ccumulator. Notice that the SUI instruction disregards the carry ('borrow') flag during the sub-
         traction but ,ets the flag to Indicate the outcome ofthe operation.

                                    Opcode                 Operand


                                    SUI                    data

         The operand must specify the data to be subtracted. This data may be in the form of a number, an ASCII
         constant, the label of some previously defined value, or an expression. The data must not exceed one byte.

         The assemble "s relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
         these symbol. appears in the operand expression of an immediate instruction, it must be preceded by either the



3-64
Chapter 3. Instruction Set




       HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression.
       When neither operator is present, the assembler assumes the LOW operator and issues an error message.

                                                 a        a               01
                                        Cycles:               2
                                        States:               7
                                        Addressing:           immediate
                                        Flags:                Z,S,P,CY,AC

       Example:

       Assume that the accumulator contains the value 9 when the instruction SUI 1 is executed:

                                  Accumulator                         00001001 = 9H
                                  Immediate data (2's comp)           11111111 = -1 H

                                                                      00001000   =   8H

       Notice that this two's complement addition results in a carry, The SUI instruction complements the carry
       generated by the addition to form a 'borrow' flag. The flag settings resulting from this operation are as follows:

                                  Carry                   a
                                  Sign                    a
                                  Zero                    a
                                  Parity                  a
                                  Aux. Carry              1


XCHG                                                                         EXCHANGE HAND L WITH D AND E

       XCHG exchanges the contents of the Hand L registers with the contents of the D and E registers.

                                  Opcode               Operand

                                  XCHG

       Operands are not allowed with the XCHG instruction.

       XCHG both saves the current Hand L and loads a new address into the Hand L registers. Since XCHG is a
       register-to-register instruction, it provides the quickest means of saving and/or altering the Hand L registers.

                                                      a           a
                                        Cycles:               1
                                        States:               4
                                        Addressing:           register
                                        Flags:                none




                                                                                                                          3-65
Chapter 3. Instruction Set




         Example:

         Assume that the Hand L registers contain 1234H, and the D and E registers contain OABCDH. Following
         execution of tre XCHG instruction, Hand L contain OABCDH, and D and E contain 1234H.



XRA                                                                        EXCLUSIVE OR WITH ACCUMULATOR

         XRA performs an exclusive OR logical operation using the contents of the specified byte and the accumulator,
         The result IS pi Iced in the accumulator,

         Summary of Lugical Operations

         AND produces a one bit in the result only when the corresponding bits in the test data and the mask data are
         ones.

         OR produces a one bit in the result when the corresponding bits       In   either the test data or the mask data are
         ones.

         Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are
         different; i.e., 2 one bit in either the test data or the mask data - but not both - produces a one bit in the
         resul t.

                                   AND                 OR                 EXCLUSIVE OR

                                1010 1010         1010 1010                1010 1010
                                0000 1111         0000 1111                0000 1111
                                0000 1010         10101111                 1010 0101

         XRA Register ,lith Accumulator

                                   Opcode               Operand

                                   XRA                  reg

         The operand mJst specify one of the registers A through E, H or L. This instruction performs an exclUSive OR
         using the contelts of the specified register and the accumulator and stores the result In the accumulator. The
         carry and auxil ary carry flags are reset to zero.

                                              a         a         S   S    S

                                         Cycles:              1
                                         States:              4
                                         AddreSSing:          register
                                         Flags:               Z,S,P,CY,AC




3-66
Chapter 3. Instruction Set




      XRA Memory with Accumulator

                                Opcode                Operand

                                XRA                   M

      The contents of the memory location specified by the Hand L registers is exclusive-ORed with the contents of
      the accumulator. The result is stored in the accumulator. The carry and auxiliary carry flags are reset to zero.

                                          o          o                   o,
                                      Cycles:                2
                                      States:                7
                                      Addressing:            register indirect
                                      Flags:                 Z,S,P,CY,AC

      Examples:

      Since any bit exclusive-0Red with itself produces zero, XRA is frequently used to zero the accumulator. The
      following instructions zero the accumulator and the Band C registers.

                                      XRA           A
                                      MOV           B,A
                                      MOV           C,A

      Any bit exclusive-ORed with a one bit is complemented. Thus, if the accumulator contains all ones (OFFH),
      the instruction XRA B produces the one's complement of the B register in the accumulator.



XRI                                                       EXCLUSIVE OR IMMEDIATE WITH ACCUMULATOR

      XRI performs an exclusive OR operation using the contents of the second instruction byte and the contents of
      the accumulator. The result is placed in the accumulator. XRI also resets the carry and auxiliary carry flags to
      zero.

                                Opcode                Operand

                                XRI                   data

      The operand must specify the data to be used in the OR operation. This data may be in the form of a number,
      an ASCII constant, the label of some previously defined value, or an expression. The data may not exceed one
      byte.

      The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
      these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the
      HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression.
      When neither operator IS present, the assembler assumes the LOW operator and issues an error message.




                                                                                                                      3-67
Chapter 3. Instruction Se',




                                                              o                 o
                                                              data

                                               Cycles:               2
                                               States:               7
                                               Addressing:           immediate
                                               Flags:                Z,S,P,CY,AC

         Summary of LJgica/ Operations


          AND     produce~    a one bit in the result only when the corresponding bits in the test data and the mask data are
          ones.

          OR produces, one bit in the result when the corresponding bits in either the test data or the mask data are
          ones.

          Exclusive OR Jroduces a one bit only when the corresponding bits in the test data and the mask data are
          different; i.e., a one bit in either the test data or the mask data - but not both - produces a one bit in the
          result.

                                      AND                    OR             EXCLUSIVE OR

                                   1010 1010           1010 1010                1010 1010
                                   0000 1111           0000 1111                0000 1111
                                   00001010            1010 1111                1010 0101

          Example:

          Assume that a program uses bits 7 and 6 of a byte as flags that control the calling of two subroutines. The
          program tests the bits by rotating the contents of the accumulator until the desired bit is in the carry flag; a
          CC instructior (Call if Carry) tests the flag and calls the subroutine if required.

          Assume that tle control flag byte is positioned normally In the accumulator, and the program must set OFF bit
          6 and set bit " ON. The remaining bits, which are status flags used for other purposes, must not be altered.
          Since any bit ~xclusive-ORed with a one is complemented, and any bit exclusive-oRed with a zero remains
          unchanged, th~ following Instruction is used:

                                         XRI                 110000008

          The Instruction has the follOWing results:

                                         Accumulator                 01001100
                                         Immediate data              11000000
                                                                     10001100




 3-68
Chapter 3. Instruction Set




XTHL                                                                 EXCHANGE H&L WITH TOP OF STACK

       XTHL exchanges two bytes from the top of the stack with the two bytes stored in the Hand L registers. Thus,
       XTHL both saves the current contents of the Hand L registers and loads new values into Hand L.

                                Opcode               Operand

                                XTHL

       Operands are not allowed with the XTHL instruction.

       XTHL exchanges the contents of the L register with the contents of the memory location specified by the SP
       (Stack Pointer) register. The contents of the H register are exchanged with the contents of SP+ 1.


                                                    000               1   I
                                      Cycles:             5
                                      States:             18 (16 on 8085)
                                      Addressing:         register indirect
                                      Flags:              none

       Example: •

       Assume that the stack pOinter register contains 10ADH; register H contains OBH and L contains 3CH; and
       memory locations 10ADH and 10AEH contain FOH and ODH, respectively. The following is an illustration of
       the effect of the XTHL instruction:

                                              MEMORY ADDRESS                          H        L
                                       lOAC       lOAD   10AE             lOAF

            Before XTHL                  FF         Fa         aD             FF     OB       3C
            After XTHL                   FF         3C         OB             FF     aD       Fa

       The stack pointer register remains unchanged following execution of the XTHL instruction.




                                                                                                                     3~9
Intel 8080 8085 assembly language programming 1977 intel
4. ASSEMBLER DIRECTIVES

This chapter describes the assembler directives used to control the 8080/85 assembler in its generation of object
code. This chapter excludes the macro directives, which are discussed as a separate topic in Chapter 5.

Generally, directives have the same format as instructions and can be interspersed throughout your program.
Assembler directives discussed in this chapter are grouped as follows:

GENERAL DIRECTIVES:

        •     Symbol Definition

              EQU
              SET

        •     Data Definition

              DB
               DW

        •     Memory Reservation

              DS

        •     Conditional Assembly

              IF
              ELSE
              ENDIF

         •     Assembler Termination

               END

LOCATION COUNTER CONTROL AND RELOCATION:

         •     Location Counter Control

              ASEG
              DSEG
              CSEG
              ORG

         •     Program Linkage

               PUBLIC
               EXTRN
               NAME
               STKLN
                                                                                                                4-1
Chapter 4. Assembler Oir ,ctives




         Three assembl" directives - EQU, SET, and MACRO - have a slightly different format from assembly
         language instnlctions. The EQU, SET. and MACRO directives require a name for the symbol or macro being
         defined to be present in the label field. Names differ from labels in that they must not be terminated with a
         colon (:) as laJels are. Also, the LOCAL and ENDM directives prohibit the use of the label field.

         The MACRO, ENDM, and LOCAL directives are explained in Chapter 5.



SYMBOL DEFINITION

         The assembler automatically assigns values to symbols that appear as instruction labels. This value   IS   the current
         setting of the location counter when the instruction IS assembled. (The location counters are explained under
         'Address Cont'ol and Relocation,' later in this chapter.)

          You may defile other symbols and assign them values by using the EQU and SET directives. Symbols defined
          using EQU callnot be redefined during assembly; those defined by SET can be assigned new values by subsequent
          SET directive~.

         The name req Jired in the label field of an EQU or SET directive must not be terminated with a colon.

          Symbols defined by EQU and SET have meaning throughout the remainder of the program. This may cause the
          symbol to have illegal multiple definitions when the EQU or SET directive appears in a macro definition. Use
          the LOCAL d rective (described in Chapter 5) to avoid this problem.



   EQU Directive

          EQU assigns t le value of 'expression' to the name specified in the label field.

                                           Label          Opcode            Operand

                                           name           EQU               expression

         The required lame in the label field may not be terminated with a colon. This name cannot be redefined by a
         subsequent EOU or SET directive. The EQU expression cannot contain any external symbol. (External symbols
         are explained under 'Location Counter Control and Relocation,' later in this chapter.)

          Assembly-tim! evaluation of EQU expressions always generates a modulo 64K address. Thus, the expression
          always yields 1 value in the range 0-65,536.

          Example:

          The following EQU directive enters the name ONES into the symbol table and assigns the binary value
          11111111 to t:

                                           ONES           EQU               OFFH




4-2
Chapter 4. Assembler Directives




      The value assigned by the EQU directive can be recalled in subsequent source lines by referring to its assigned
      name as in the following IF directive:


                                               IF TYPE EQ ONES




                                               ENDIF



 SET Directive


      SET assigns the value of 'expression' to the name specified in the label field.

                                       Label           Opcode           Operand

                                       name            SET              expression

      The assembler enters the value of 'expression' into the symbol table. Whenever 'name' is encountered sub-
      sequently in the assembly, the assembler substitutes its value from the symbol table. This value remains unchanged
      until altered by a subsequent SET directive.

      The function of the SET directive is identical to EQU except that 'name' can appear in multiple SET directives
      in the same program. Therefore, you can alter the value assigned to 'name' throughout the assembly.

      Assembly-time evaluation of SET expressions always generates a modulo 64K address. Thus, the expression
      always yields a value in the range 0-65,536.

      Examples:

                           Label          Opcode             Operand          Assembled Code

                           IMMED          SET                5
                                          ADI                IMMED            C605

                           IMMED          SET                lOH-6
                                          ADI                IMMED            C60A



DATA DEFINITION

      The DB (define byte) and DW (define word) directives enable you to define data to be stored in your program.
      Data can be specified in the form of 8-bit or 16-bit values, or as a string of text characters.



 DB Directive

      The DB directive stores the specified data in consecutive memory locations starting with the current setting of the
      location counter.


                                                                                                                         4-3
Chapter 4. Assembler Oi, ectives




                                              Label       Opcode            Operands

                                           optional:      DB                expresslon(s) or string(s)


         The operand 'ield of the DB directive can contain a list of expressions and/or text strings. The list can contain
         up to eight tc tal items: list items must be separated by commas. Because of limited workspace, the assembler
         may not be a Jle to handle a total of eight items when the list includes a number of complex expressions. If
         you ever haVE this problem, it is easily solved: simply use two or more directives to shorten the list.

          Expressions nlust evaluate to l-byte (8-bit) numbers in the range -256 through 255. Text strings may comprise
          a maximum of 128 ASCII characters enclosed in quotes.

         The assemble,'s relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of
         these symbol~ appears in an operand expression of the DB directive, it must be preceded by either the HIGH or
         LOW operato' to specify which byte of the address is to be used in the evaluation of the expression. When
         neither opera .or is present, the assembler assumes the LOW operator and issues an error message.

         If the option;.! label IS present, it is assigned the starting value of the location counter, and thus references
         the first byte stored by the DB directive. Therefore, the label STR in the following examples refers to the letter
         T of the stmg TIME.

          Examples:

                                   Label         Opcode         Operands          Assembled Code

                                   STR:          DB             'TIME'            54494D45

                                   HERE:         DB             OA3H              A3

                                   WORD1:        DB             -03H,5*2          FDOA



   DW Directive

         The DW direl tlve stores each 16-blt value from the expression list as an address. The values are stored starting
         at the curren setting of the location counter.

                                              Label       Opcode            Operands

                                           optional:      DW                expression list

         The least sigr ificant eight bits of the first value in the expression list are stored at the current setting of the
         location cour ter: the most significant eight bits are stored at the next higher location. This process is repeated
         for each item in the expression list.

          Expressions E valuate to 1-word (16-bit) numbers, typically addresses. If an expression evaluates to a single byte,
          it IS assumed to be the low order byte of a 16-bit word where the high order byte is all zeros.




 44
Chapter 4. Assembler Directives




      List items must be separated by commas. The list can contain up to eight total items. Because of limited work-
      space, the assembler may not be able to handle eight complex expressions. If you ever have this problem, simply
      use two or more OW directives to shorten the list.

      The reversed order for storing the high and low order bytes is the typical format for addresses stored in memory.
      Thus, the OW directive is commonly used for storing address constants.

      Strings containing one or two ASCII characters enclosed in quotation marks may also appear in the expression
      list. When using such strings in your program, remember that the characters are stored in reversed order.
      Specifying a string longer than two characters causes an error.

      If the optional label is present, it is assigned the starting address of the location counter, and thus references the
      first byte stored by the OW directive. (This is the low order byte of the first Item in the expression list.)

      Examples:

      Assume that COMP and FI LL are labels defined elsewhere in the program. COMP addresses memory location
      3B1CH. FILL addresses memory location 3EB4H.

                           Label          Opcode             Operands          Assembled Code

                           AOOR1:         OW                 COMP              lC3B

                           AOOR2:         OW                 FILL              B43E

                           STRNG:         OW                 'A','AB'          41004241

                           FOUR:          OW                 4H                0400



MEMORY RESERVATION

 OS Directive

      The OS directive can be used to define a block of storage.

                                       Label           Opcode            Operand

                                    optional:          OS                expression

      The value of 'expression' specifies the number of bytes to be reserved for data storage. In theory, this value may
      range from OOH through OFFFFH; in practice. you will reserve no more storage than will fit in your available
      memory and still leave room for the program.

      Any symbol appearing in the operand expression must be defined before the assembler reaches the OS directive.

      Unlike the OB and OW directives, OS assembles no data into your program. The contents of the reserved storage
      are unpredictable when program execution is initiated.




                                                                                                                          4-5
Chapter 4. Assembler Dir 'ctives




         If the optlona label is present, it is assigned the current value of the location counter, and thus references the
         first byte of tle reserved memory block.

         If the value 01 the operand expression is zero, no memory is reserved. However, if the optional label is present,
         it is assigned 1he current value of the location counter.

         The DS directve reserves memory by Incrementing the location counter by the value of the operand expression.

          Example:

                          TTYBUF:      DS          72       ;RESERVE 72 BYTES FOR
                                                            ;A TERMINAL OUTPUT BUFFER



   Programming Tips: Data Description and Access


      Random Access lersus Read Only Memory

         When coding data descriptions, keep in mind the mix of ROM and RAM in your application.


         Generally, the DB and DW directives define constants, Items that can be assigned to ROM. You can use these
         items In your program, but you cannot modify them. If these items are assigned to RAM, they have an initial
         value that YOL r program can modify during execution. Notice, however, that these initial values must be reloaded
         Into memory Jrior to each execution of the program.


         Variable data n memory must be assigned to RAM.



      Data Description

         Before coding your program, you must have a thorough understanding of ItS input and output data. But you'll
         probably find it more convenient to postpone coding the data descriptions until the remainder of the program is
         fairly well deeloped. This way you will have a better idea of the constants and workareas needed In your program.
         Also, the orgalization of a typical program places Instructions in lower memory, followed by the data, followed
         by the stack.



      Data Access

         Accessing dati from memory is typically a two·step process: First you tell the processor where to find the data,
         then the processor fetches the data from memory and loads it into a register, usually the accumulator. Therefore,
         the following ;ode sequences have the identical effect of loading the ASCII character A into the accumulator.

                          AAA:              DB     'A'            ALPHA:            DB       'ABC'



                                            LXI    B,AAA                            LXI      B,ALPHA
                                            LDAX   B                                LDAX     B




4-6
Chapter 4. Assembler Directives




  In the examples, the LXI instructions load the address of the desired data into the Band C registers. The LDAX
  instructions then load the accumulator with one byte of data from the address specified in the Band C registers.
  The assembler neither knows nor cares that only one character from the three-character field ALPHA has been
  accessed. The program must account for the characters at ALPHA+1 and ALPHA+2, as in the following coding
  sequence:

                ALPHA:         DB         'ABC'        ;DEFINE ALPHA

                               LXI        B,ALPHA      ;LOAD ADDRESS OF ALPHA
                               LDAX       B            ;FETCH 1ST ALPHA CHAR

                               INX        B            ;SET B TO ALPHA+l
                               LDAX       B            ;FETCH 2ND ALPHA CHAR

                               INX        B            ;SET B TO ALPHA+2
                               LDAX       B            ;FETCH 3RD ALPHA CHAR

  The coding above is acceptable for short data fields like ALPHA. For longer fields, you can conserve memory
  by setting up an instruction sequence that is executed repeatedly until the source data is exhausted.


Add Symbols for Data Access

  The following example was presented earlier as an illustration of the DS directive:

                       Label         Opcode            Operand           Comment

                  TTYBUF:            DS                72                ;RESERVE TTY BUFFER

  To access data in this buffer using only expressions such as TTYBUF+l, TTYBUF+2, ... TTYBUF+72 can be
  a laborious and confusing chore, especially when you want only selected fields from the buffer. You can simplify
  this task by subdivid.ing the buffer with the EQU directive:

                       Label         Opcode            Operand           Comment

                  TTYBUF:            DS                72                ;RESERVE TTY BUFFER

                  ID                 EQU               TTYBUF            ;RECORD IDENTIFIER

                  NAME               EQU               TTYBUF+6          ;20-CHAR NAME FIELD

                  NUMBER             EQU               TTYBUF+26         ;10-CHAR EMPLOYEE NUMBER

                  DEPT               EQU               TTYBUF+36         ;5-CHAR DEPARTMENT NUMBER

                  SSNO               EQU               TTYBUF+41         ;SOCIAL SEC. NUMBER

                  DOH                EQU               TTYBUF+50         ;DATE OF HIRE

                  DESC               EQU               TTYBUF+56         ;)OB DESCRIPTION

                                                                                                                     4-7
Chapter 4. Assembler Dir'ctives




         Subdividing d. ta as shown in the example simplifies data access and provides useful documentation throughout
         your program. Notice that these EQU directives can be inserted anywhere within the program as you need them,
         but coding tht m as shown in the example provides a more useful record description.



CONDITIONAL ASSEMBLY

         The IF. ELSE. and ENDIF directives enable you to assemble portions of your program conditionally, that is,
         only if certain conditions that you specify are satisfied.

         Conditional a~sembly is especially useful when your application requires custom programs for a number of com-
         mon options. As an example, assume that a basic control program requires customlz'ing to accept input from
         one of six dif erent sensing devices and to drive one of five different control dev,ices. Rather than code some
                                                                                            !
         thirty separat" programs to account for all the possibilities, you can code a single program. The code for the in-
         dividual senso's and drivers must be enclosed by the conditional directives. When you need to generate a custom
         program, you can insert SET directives near the beginning of the source program to select the desired sensor and
         driver routine ..


   IF, ELSE. ENDIF [irectives

         Because these directives are used in conjunction. they are described together here.

                                          Label          Opcode            Operand


                                      optional:          IF                expression

                                      optional:          ELSE

                                      optional:          ENDIF

         The assembler evaluates the expression in the operand field of the IF directive. If bit 0 of the resulting value is
         one (TRUE), til Instructions between the IF directive and the next ELSE or ENDIF directive are assembled.
         When bit 0 is zero (FALSE) these instructions are ignored. (A TRUE expression evaluates to OFFFFH and
         FALSE to OH: only bit zero need be tested.)

         All statement~ included between an IF directive and its required associated ENDIF directive are defined as an
         IF-ENDIF blo;k. The ELSE directive is optional, and only one ELSE directive may appear In an IF-ENDIF
         block. When i lcluded. ELSE is the converse of IF. When bit 0 of the expression in the IF directive IS zero, all
         statements be:ween ELSE and the next ENDIF are assembled. If bit 0 IS one. these statements are ignored.

         Operands are lOt allowed with the ELSE and ENDIF directives.

          An IF-ENDIF block may appear within another IF-ENDIF block. These blocks can be nested to eight levels.

          Macro definitions (explained in the next chapter) may appear within an IF-ENDIF block. Conversely, IF-ENDIF
          blocks may al'pear within macro definitions. In either case, you must be certain to terminate the macro definition




 4-8
Chapter 4. Assembler Directives




or IF-ENDIF block so that it can be assembled completely, For example, when a macro definition begins In an
IF block but terminates after an ELSE directive, only a portion of the macro can be assembled. Similarly, an
IF-ENDIF block begun within a macro definition must terminate within that same macro definition.

                                                NOTE

                      Caution IS required when symbols are defined in IF-ENDIF
                      blocks and referenced elsewhere within the program. These
                      symbols are undefined when the evaluation of the IF ex-
                      pression suppresses the assembly of the IF-ENDIF block.


Example 1.    Simple IF-ENDIF Block:

        CONDl       IF TYPE EQ 0

                                                ;ASSEMBLED IF 'TYPE      = 0'
                                                ;IS TRUE

                    ENDIF

Example 2.    IF-ELSE-ENDIF Block:

        COND2:      IF TYPE EQ 0
                                                ;ASSEMBLED IF 'TYPE = 0'
                                                ;IS TRUE

                    ELSE



                                                ;ASSEMBLED IF 'TYPE = 0'
                                                :IS FALSE

                    ENDIF




                                                                                                                  4-9
Chapter 4. Assembler Directives




           Example 3.     Nested IF's:

                    COt ID3:      IF TYPE EO 0

                                                               ;ASSEMBLED IF 'TYPE = 0'
                                                               ;15 TRUE

                                  IF MODE EO 1

                    LE'EL                                     ;ASSEMBLED IF 'TYPE = 0'
                      1                                        ;AND 'MODE = l' ARE BOTH
                                                               ;TRUE
                                  ENDIF
                                  ELSE

   LEVEL                                                       ;ASSEMBLED IF 'TYPE        = 0'
       2                                                       ;15 FALSE

                                  IF MODE EO 2

                                                               ;ASSEMBLED IF 'TYPE = 0'
                                                               ;15 FALSE AND 'MODE = 2'
                                                               ;15 TRUE
                    LEEL         ELSE
                      1
                                                               ;ASSEMBLED IF 'TYPE = 0'
                                                               ;AND 'MODE = 2' ARE BOTH
                                                               ;FALSE
                                  ENDIF
                                  ENDIF



ASSEMBLER TERMINATION

   END Directive

           The END   dir~ctlve   identifies the end of the source program and terminates each pass of the assembler.

                                             Label         Opcode            Operand

                                          optional:         END              expression

           Only one END statement may appear in a source program, and it must be the last source statement.

           If the optioml expression is present, its value is used as the starting address for program execution. If no ex-
           pression is gi len, the assembler assumes zero as the starting address.

           When a number of separate program modules are to be joined together, only one may specify a program starting
           address. The module with a starting address is the main module. When source files are combined using the IN-
           CLUDE cont'ol, there are no restrictions on which source file contains the END.

4-10
Chapter 4. Assembler Directives




END-OF-TAPE INDICATION

      The EOT directive allows you to specify the physical end of paper tape to simplify assembly of multiple-tape source
      programs.

   EOT Directive

                                Label              Opcode            Operand

                              optional:             EOT

      When EOT is recognized by the assembler, the message 'NEXT TAPE' is sent to the console and the assembler pauses.'
      After the next tape is loaded, a 'space bar' character received at the console signals continuation of the assembly.

      Data in the operand field causes an error.



LOCATION COUNTER CONTROL AND RELOCATION

      All the directives discussed in the remainder of this chapter relate directly to program relocation except for the
      ASEG and ORG directives. These directives are described first for the convenience of readers who do not use the
      relocation feature.



 Location Counter Control (Non-Relocatable Mode)

      When you elect not to use the relocation feature, an assembler default generates an ASEG directive for you. The
      ASEG directive specifies that the program is to be assembled in the non-relocatable mode and establishes a
      location counter for the assembly.

      The location counter performs the same function for the assembler as the program counter performs during
      execution. It tells the assembler the next memory location available for instruction or data assembly.

      Initially, the location counter is set to zero. The location counter can be altered by the ORG (origin) directive.



   ORG Directive

      The ORG directive sets the location counter to the value specified by the operand expression.

                                          Label       Opcode           Operand

                                    optional:         ORG              expression

      The location counter is set to the value of the operand expression. Assembly-time evaluation of ORG expressions
      always Yields a modulo 64K address. Thus, the expression always yields an address in the range 0 through
      65,535. Any symbol In the expression must be preViously defined. The next machine instruction or data item is
      assembled at the specified address.




                                                                                                                           4-11
Chapter 4. Assembler Oi 'ectives




          If no ORG di 'ective is included before the first instruction or data byte in your program, assembly begins at
          location zero.

          Your prograrr can include any number of ORG directives. Multiple ORG's need not specify addresses In
          ascending seq Jence, but if you fail to do so, you may instruct the assembler to write over some previously
          assembled POI tion of the program.

          If the option" label is present, it is assigned the current value of the location counter before it is updated by the
          ORG directiv".

          Example:

          Assume that the current value of the location counter is OFH (decimal 15) when the following ORG directive is
          encountered:

                                    ORG           OFFH          ;ORG ASSEMBLER TO LOCATION

                                                                ;OFFH (decimal 225)

          The symbol FAG1 is assigned the address OFH. The next instruction or data byte is assembled at location
          OFFH.



   Introduction to Reocatability

          A maior feature of this assembler is its system for creating relocatable object code modules. Support for this new
          feature includes a number of new directives for the assembler and three new programs included in ISIS-II. The
          three new pr<lgrams - LIB, LINK, and LOCATE - are described in the ISIS-II System User's Guide. The new
          assembler dir ~ctives are described later in this chapter.

          Relocatabilit, allows the programmer to code programs or sections of programs without worrying about the
          final arrangerlent of the object code in memory. This offers developers of microcomputer systems malor ad-
          vantages In t",o areas: memory management and modular program development.



        Memory ManagEment

          When developing, testing, and debugging a system on your Intellec microcomputer development system, your
          only concern with locating a program is that it doesn't overlap the resident routines of 1515·11. Because the
          Intellec syste 11 has 32K, 48K, or 64K of random access memory, the location of your future program is not a
          great concerr. However, the program you are developing will almost certainly use some mix of random access
          memory (RAM), read-only memory (ROM), andior programmable read-only memory (PROM). Therefore, the
          location of y)ur program affects both cost and performance in your application. The relocatability feature allows
          you to deveillp, test, and debug your program on the Intellec development system and then simply relocate the
          object code 10 suit your application.

          The relocatal dlity feature also has a malor advantage at assembly-time: often, large programs with many symbols
          cannot be as,embled because of limited work space for the symbol table. Such a program can be divided Into a
          number of rrodules that can be assembled separately and then linked together to form a single object program.



 4-12
Chapter 4. Assembler Directives




Modular Program Development


  Although 'relocatability' may seem to be a formidable term, what it really means is that you can subdivide a
  complex program into a number of smaller, simpler programs. This concept is best illustrated through the use of
  an example. Assume that a microcomputer program IS to control the spark advance on an automobile engine.
  This requires the program to sample the ambient air temperature, engine air intake temperature, coolant tempera-
  ture, manifold vacuum, idle sensor, and throttle sensor.

  Let us examine the approaches two different programmers might take to solve this problem. Both programmers
  want to calculate the degree of spark advance or retardation that provides the best fuel economy with the lowest
  emissions. Programmer A codes a single program that senses all inputs and calculates the correct spark advance.
  Programmer B uses a modular approach and codes separate programs for each input plus one program to calculate
  spark advance.


  Although Programmer A avoids the need to learn to use the relocatability feature, the modular approach used
  by Programmer B has a number of advantages you should consider:


          •     Simplified Program Development

                It is generally easier to code, test, and debug several simple programs than one complex program.


          •     Sharing the Programming Task

                If Programmer B finds that he is falling behind schedule, he can assign one or more of his sub-
                programs to another programmer. Because of his single program concept, Programmer A will
                probably have to complete the program himself.


          •     Ease of Testing

                Programmer B can test and debug most of his modules as soon as they are assembled; Programmer
                A must test his program as a whole. Notice that Programmer B has an extra advantage if the
                sensors are being developed at the same time as the program. If one of the sensors is behind
                schedule, Programmer B can continue developing and testing programs for the sensors that are
                ready, Because Programmer A cannot test h is program until all the sensors are developed, his
                testing schedule IS dependent on events beyond his control.

          •     Programming Changes

                Given the nature of automotive design, it IS reasonable to expect some changes during system
                development. If a change to one of the sensors requires a programming change, Programmer A
                must search through his entire program to find and alter the coding for that sensor. Then he must
                retest the entire program to be certain that those changes do not affect any of the other sensors.
                By contrast, Programmer B need be concerned only with the module for that one sensor. This
                advantage continues throughout the life of the program.




                                                                                                                  4-13
Chapter 4. Assembler Directives




DIRECTIVES USED FOR RELOCATION

          Several direc Ives have been added to the assembler to support the relocation feature. These fall into the general
          categories of location counter control and program linkage.



   Location Counter :ontrol (Relocatable Programs)

          Relocatable Jrograms or program modules may use three location counters. The ASEG, DSEG, and CSEG
          directives sp"cify which location counter is to be used.

          The ASEG c irective specifies an absolute code segment. Even in a relocatable program module, you may want
          to assign cer:ain code segments to specific addresses. For example, restart routines invoked by the RST instruc-
          tion require specific addresses.

          The CSEG c Ifective specifies a relocatable code segment. In general, the CSEG location counter is used for por-
          tions of the program that are to be in some form of read-only memory, such as machine instructions and pro-
          gram consta ltS.

          The DSEG ocation counter specifies a relocatable data segment. This location counter is used for program
          elements th It must be located In random access memory.

          These direc ives allow you to control program segmentation at assembly time. The LOCATE program, described
          In the ISIS-II System User's GUide, gives you control over program segment location. Therefore, the guidelines

          given above are only general since they can be overridden by the LOCATE program.

          Regardless 'If how many times the ASEG, CSEG, and DSEG directives appear in your program, the assembler
          produces a ;ingle, contiguous module. This module comprISes four segments: code, data, stack and memory.
          The LINK Ind LOCATE programs are used to combine segments from individual modules and relocate them in
          memory. T lese programs are explained in the ISIS-II System User's Guide.



        ASEG Directh'e

          ASEG dire,;ts the assembler to use the location counter for the absolute program segment.

                                           Label         Opcode            Operand


                                       optional:          ASEG

          Operands ere not permitted with the ASEG directive.

          All instrucions and data following the ASEG directive are assembled In the absolute mode. The ASEG directive
          remains in effect until a CSEG or DSEG directive is encountered.

          The ASEG location counter has an initial value of zero. The ORG directive can be used to assign a new value to
          the ASEG location counter.




 4-14
Chapter 4. Assembler Directives




  When assembly begins. the assembler assumes the ASEG directive to be in effect. Therefore. a CSEG or DSEG
  must precede the first instruction or data definition in a relocatable module. If neither of these directives
  appears in the program. the entire program is assembled in absolute mode and can be executed immediately
  after assembly without using the LINK or LOCATE programs.



CSEG Directive

  CSEG directs the assembler to assemble subsequent instructions and data    In   the relocatable mode uSing the code
  segment location counter.

                                  Labe!         Opcode           Operand


                                                                 blank  }
                              optional:         CSEG             PAGE
                                                               { INPAGE


   When a program contains multiple CSEG directives. all CSEG directives throughout the program must specify
   the same operand. The operand of a CSEG directive has no effect on the current assembly. but is stored with
  ·the object code to be passed to the LINK and LOCATE programs. (These programs are described in the ISIS-II
   System User's Guide.) The LOCATE program uses this information to determine relocation boundaries when it
   joins this code segment to code segments from other programs. The meaning of the operand is as follows:

           •     blank - This code segment may be relocated to the next available byte boundary.

           •     PAGE - This code segment must begin on a page boundary when relocated. Page boundaries
                 occur in multiples of 256 bytes beginning with zero (0. 256. 512. etc.).

           •     INPAGE     This code segment must fit within a single page when relocated.

  The CSEG directive remains in effect until an ASEG or DSEG directive is encountered.

  The code segment location counter has an initial value of zero. The ORG directive can be used to assign a new
  value to the CSEG location counter.



DSEG Directive

   DSEG directs the assembler to assemble subsequent instructions and data   In   the relocatable mode using the data
   segment location counter.

                                  Labe!         Opcode            Operand



                              optional:         DSEG
                                                               roo'
                                                                  PAGE
                                                                  INPAGE)
                                                                             i>
   When multiple DSEG directives appear in a program. they must all specify the same operand throughout the
   program. The operands for the DSEG directive have the same meaning as for the CSEG directive except that
   they apply to the data segment.

                                                                                                                    4-15
Chapter 4. Assembler Dil ectives




          There IS no ir teraction between the operands specified for the DSEG and CSEG directives. Thus. a code segment
          can be byte r'locatable while the data segment is page relocatable.

          The DSEG diective remains in effect until an ASEG or CSEG directive is encountered.

          The data segr,lent location counter has an initial value of zero. The ORG directive can be used to assign a new
          value to the [)SEG location counter.



        ORG Directive ('?elocatable Mode)

          The ORG dirxtive can be used to alter the value of the location counter presently in use.

                                            Label          Opcode            Operand

                                        optional:          ORG               expression

          There are thr~e location counters. but only one location counter is in use at any given point in the program.
          Which one dEpends on whether the ASEG. CSEG, or DSEG directive is in effect.

          Any symboilised in the operand expression must have been previously defined. An exception causes phase
          errors for all abels that follow the ORG and a label error if the undefined error is defined later.

          When the O~ G directive appears in a relocatable program segment, the value of its operand expression must be
          either absolu'e or relocatable within the current segment. Thus, if the ORG directive appears within a data seg-
          ment, the val Je of its expression must be relocatable within the data segment. An error occurs if the expression
          evaluates to , n address in the code segment.

          If the option 11 label is present, It is assigned the current value of the location counter presently in use before
          the ORG din ctive is executed.



   Program Linkage [irectives

          Modular pro! ramming and the relocation feature enable you to assemble and test a number of separate programs
          that are to b; iOlned together and executed as a single program. Eventually, it becomes necessary for these
          separate programs to communicate Information among themselves. Establishing such communication is the
          function of the program linkage directives.

          A program n,ay share its data addresses and instruction addresses with other programs. Only Items having an
          entry in the iymbol table can be shared with other programs; therefore. the item must be assigned a name or a
          label when it IS defined in the program. Items to be shared with other programs must be declared in a PUBLIC
          directive.

          Your prograln can directly access data or instructions defined In another program if you know the actual
          address of tre item, but this is unlikely when both programs use relocation. Your program can also gain access
          to data or Instructions declared as PUBLIC in other programs. Notice, however, that the assembler normally




 4-16
Chapter 4. Assembler Directives




  flags as an error any reference to a name or label that has not been defined in your program. To avoid this,
  you must provide the assembler with a list of items used in your program but defined in some other program.
  These items must be declared in an EXTRN directive.


  The two remaining program linkage directives, NAME and STKLN, are individually explained later in this chapter.



PUBLIC Directive

  The PUBLIC directive makes each of the symbols listed in the operand field available for access by other programs.

                                    Label          Opcode            Operands

                                optional:          PUBLIC             name-list

  Each item in the operand name-list must be the name or label assigned to data or an instruction elsewhere in
  this program. When multiple names appear in the list. they must be separated by commas. Each name may be
  declared PUBLIC only once in a program module. Reserved words and external symbols (see the EXTRN
  directive below) cannot be declared to be PUBLIC symbols.

  PUBLIC directives may appear anywhere within a program module.

  If an item in the operand name-list has no corresponding entry in· the symbol table (implying that it i5 unde-
  fined), it is flagged as an error.

  Example:

                       PUBLIC          SIN,COS,TAN,SQRT



EXTRN Directive

  The EXTRN directive provides the assembler with a list of symbols referenced in th is program but defined in a
  different program. Because of this, the assembler establishes linkage to the other program and does not flag the
  undefi ned references as errors.

                                    Label          Opcode            Operands

                                optional:          EXTRN             name-list

  Each item in the name-list identifies a symbol that may be referenced in this program butis defined in another
  program. When multiple items appear in the list, they must be separated by commas.

  If a symbol in the operand name-list is also defined in this program by the user, or is a reserved symbol. the effect
  is the same as defining the same symbol more than once in a program. The assembler flags this error.

  EXTRN directives may appear anywhere within a program module.

  A symbol may be declared to be external only once in a program module. Symbols declared to be PUBLIC cannot
  also be declared to be EXTRN symbols.

                                                                                                                      4·17
Chapter 4. Assembler Oi, ectives




          If you omit a symbol from the name-list but reference it 111 the program, the symbol is undefined. The assembler
          flags this erro', You may include symbols in the operand name-list that are not referenced in the program with-
          out causing ail error.

          Example:

                                   EXTRN         ENTRY,ADDRTN,BEGIN



       NAME Directive

         The NAME directive assigns a name to the object module generated by this assemblY,

                                              Label      Opcode         Operand

                                           optional:     NAME           module-name

         The NAME directive requires the presence of a module-name in the operand field. This name must conform to
         the rules for jefining symbols.

         Module names are necessary so that you can refer to a module and specify the proper sequence of modules
         when a numr er of modules are to be bound together.

         The NAME directive must precede the first data or instruction coding in the source program, but may follow
         comments anj control lines.

         If the NAME directive is missing from the program, the assembler supplies a default NAME directive with the
         module-name MODULE. This will cause an error if you attempt to bind together several object program
         modules and more than one has the name MODULE. Also, if you make an error coding the NAME directive,
         the default nime MODULE is assigned.

         The module···name assigned by the NAME directive appears as part of the page heading in the assembly listing.

          Example:

                                              NAME       MAIN



       STKLN Directile

          Regardless 01 the number of object program modules you may bind together, only one stack is generated. The
          STKLN dire' tive allows you to specify the number of bytes to be reserved for the stack for each module.

                                              Label      Opcode         Operand

                                           optional:     STKLN          expression

         The operand expression must evaluate to a number which will be used as the maximum size of the stack.




4-18
Chapter 4. Assembler Directives




     When the STKLN directive is omitted, the assembler provides a default STKLN of zero. This is useful when
     multiple programs are bound together; only one stack will be generated, so only one program module need
     specify the stack size. However, you should provide a STKLN if your module is to be tested separately and
     uses the stack.

     If your program includes more than one STKLN directive, only the last value assigned is retained.

     Example:

                                     STKLN          100



STACK and MEMORY Reserved Words

     The reserved words STACK and MEMORY are not directives but are of interest to programmers using the
     relocation feature. These reserved words are external references whose addresses are supplied by the LOCATE
     program.

     STACK is the symbolic reference to the stack origin address. You need this address to initialize the stack
     pointer register. Also, you can base data structures on this address using svmbolic references such as STACK+1,
     STACK+2, etc.

     MEMORY is the symbolic reference to the first byte of unused memory past the end of your program. Again,
     you can base data structures on this address using symbolic references such as MEMORY, MEMORY+l, etc.



Programming Tips: Testing Relocatable Modules

     The ability to test individual program modules is a maior advantage of modular programming. However, many
     program modules are not logically self-sufficient and require some modification before they can be tested. The
     following is a discussion of some of the more common modifications that may be required.



  Initialization Routines

     In most complete programs, a number of housekeeping or initialization procedures are performed when execution
     first begins. If the program module you are testing relies on initialization procedures aSSigned to a different
     module, you must duplicate those procedures in the module to be tested. (Notice, however, that you can link
     any number of modules together for testing.)

     One of the most important initialization procedures is to set the stack pointer. The LOCATE program determines
     the origin of the stack.

     Your program should include the following instruction to initialize the stack pointer:

                                  LXI      SP,STACK




                                                                                                                     4-19
Chapter 4. Assembler [irectives




    Input/Output

       When testing ,rogram modules, it is likely that some input or output procedures appear in other modules. Your
       program must simulate any of these procedures it needs to operate. Since your Intellec development system
       probably has considerably more random access memory than you need to test a program module, you may be
       able to simula:e Input and output data right in memory, The LOCATE program supplies an address for the
       reserved word MEMORY; this is the address of the first byte of unused memory past the end of your program.
       You can acces, this memory using the symbolic reference MEMORY, MEMORY+l, and so on. This memory
       can be used fer storing test data or even for a program that generates test data.



    Remove Coding Used for Testing

       After testing ~our program, be certain to remove any code you inserted for testing. In particular, make certain
       that only one module in the complete program initializes the stack pointer.




4-20
5. MACROS


INTRODUCTION TO MACROS

 Why Use Macros?

      A macro is essentially a facility for replacing one set of parameters with another. In developing your program,
      you will frequently find that many Instruction sequences are repeated several times with only certain parameters
      changed.

      As an example, suppose that you code a routine that moves five bytes of data from one memory location to
      another. A little later, you find yourself coding another routine to move four bytes from a different source
      field to a different destination field. If the two routines use the same coding techniques, you will find that
      they are identical except for three parameters: the character count, the source field starting address, and the
      d:",tiiCatltl:' field starting address. Certainly It would be handy if there were some way to regenerate that original
      'outine substituting the new parameters rather than rewrite that code yourself. The macro facility provides this
      capability and offers several other advantages over writing code repetitiously'

               e     The tedium of frequent rewrite (and the probability of error) is reduced.

               e     Symbols used in macros can be restricted so that they have meaning only within the macro itself.
                     Therefore, as you code your program, you need not worry that you will accidentally duplicate a
                     symbol used in a macro. Also, a macro can be used any number of times in the same program
                     without duplicating any of its own symbols.

               e     An error detected In a macro need be corrected only once regardless of how many times the macro
                     appears in the program. This reduces debugging time.

               e     Duplication of effort between programmers can be reduced. Useful functions can be collected In a
                     library to allow macros to be copied into different programs.

      In addition, macros can be used to improve program readability and to create structured programs. USing macros
      to segment code blocks provides clear program notation and simplifies tracing the flow of the program.



 What Is A Macro?

      A macro can be described as a routine defined in a formal sequence of prototype instructions that, when called
      within a program, results in the replacement of each such call with a code expansion consisting of the actual
      instructions represented.




                                                                                                                           5-'
Chapter 5. Macros




        The concepts c f macro definition, call, and expansion can be illustrated by a tYPical business form letter, where
        the prototypenstructions conSISt of preset text. For example, we could define a macro CNFIRM with the text

                    Air FI ght welcomes you as a passenger.
                    Your 'Iight number FNO leaves at DTIME and arrives in DEsT at ATIME.

        This macro ha, four dummy parameters to be replaced, when the macro is called, by the actual flight number,
        departure time destination, and arrival time. Thus the macro call might look like

                    CNFII~M         123, '10:45', 'Ontario', '11 :52'

         A second macro, CAR, could be called if the passenger has requested that a rental car be reserved at the desti-
         nation airport. This macro might have the text

                    Your lutomobile reservation has been confirmed with MAKE rent-a-car agency.

         Finally, a macro GREET could be defined to specify the passenger name.

                    Dear~AME:


        The entire tex of the business letter (source file) would then look like

                    GREET 'Ms. scannel'
                    CNFl~M 123, '10:45', 'Ontario', '11:52'
                    CAR 'Blotz'
                    We tr Jst you will enioy your flight.

                    Since ely,

        When this sou,ce file is passed through a macro processor, the macro calls are expanded to produce the following
        letter.

                    Dear 'v1s. scannel:

                    Air Fight welcomes you as a passenger. Your flight number 123 leaves at 10:45 and arrives
                    in Ortario at 11 :52. Your automobile reservation has been confirmed with Blotz rent-a-car
                    agency.

                    We trust you will enjoy your flight.

                    Since'ely,

        While this exallple illustrates the substitution of parameters in a macro, it overlooks the relationship of the macro
        processor and the assembler. The purpose of the macro processor is to generate source code which is then
        assembled.




5-2
Chapter 5. Macros




 Macros Vs. Subroutines

      At this point, you may be wondering how macros differ from subroutines Invoked by the CALL instruction.
      Both aid program structuring and reduce the coding of frequently executed routines.

      One distinction between the two IS that subroutines necessarily branch to another part of your program while
      macros generate in-line code. Thus, a program contains only one version of a given subroutine, but contains as
      many versions of a given macro as there are calls for that macro.

      Notice the emphasis on 'versions' in the prevIous sentence, for this is a malor difference between macros and
      subroutines. A macro does not necessarily generate the same source code each time it is called. By changing the
      parameters In a macro call, you can change the source code the macro generates. In addition, macro parameters
      can be tested at assembly-time by the conditional assembly directives. These two tools enable a general-purpose
      macro definition to generate customized source code for a particular programming situation. Notice that macro
      expansion and any code customization occur at assembly-time and at the source code level. By contrast, a
      generalized subroutine resides in your program and requires execution time.

      It IS usually possible to obtain similar results using either a macro or a subroutine. Determining which of these
      facilities to use is not always an obvious decision. In some cases, uSing a single subroutine rather than multiple
      In-line macros can reduce the overall program size. In situations involving a large number of parameters, the use
      of macros may be more efficient. Also, notice that macros can call subroutines, and subroutines can contain
      macros.



USING MACROS

      The assembler recognizes the following macro operations:

               ..    MACRO directive
               CI    ENDM directive
               ..    LOCAL directive
               CI    REPT directive
               ..    IRP directive
               ..    IRPC directive
               CI    EXITM directive
               ..    Macro call

      All of the directives listed above are related to macro definition. The macro call initiates the parameter sub-
      stitution (macro expansion) process.



 Macro Definition

      Macros must be defined in your program before they can be used. A macro definition is Initiated by the MACRO
      assembler directive, which lists the name by which the macro can later be called, and the dummy parameters to
      be replaced during macro expansion. The macro definition is terminated by the ENDM directive. The prototype
      instructions bounded by the MACRO and ENDM directives are called the macro body.




                                                                                                                        5·3
Chapter 5. Macros




         When label sy mbols used in a macro body have 'global' scope, multiply-defined symbol errors result if the macro
         is called more than once. A label can be given limited scope using the LOCAL directive. This directive assigns a
         unique value :0 the symbol each time the macro is called and expanded. Dummy parameters also have limited
         scope.

         Occasionally "ou may wish to duplicate a block of code several times, either within a macro or in line with
         other source ':ode. This can be accomplished with minimal coding effort using the REPT (repeat block), IRP
         (indefinite repeat), and IRPC (indefinite repeat character) directives. Like the MACRO directive, these directives
         are terminated by ENDM.

         The EXITM c irective provides an alternate exit from a macro. When encountered, it terminates the current macro
         just as if EN['M had been encountered.



      Macro Definitior, Directives

         MACRO Dire:tive

                                         Label          Opcode            Operand

                                         name           MACRO             optional dummy parameter(s)

         The name in :he label field specifies the name of the macro body being defined. Any valid user-defined symbol
         name can be Jsed as a macro name. Note that this name must be present and must not be terminated by a colon.

         A dummy panmeter can be any valid user-defined symbol name or can be null. When multiple parameters are listed,
         they must be ,eparated by commas. The scope of a dummy parameter is limited to its specific macro definition. If a
         reserved symt 01 is used as a dummy parameter, its reserved value is not recognized. For example, if you code
         A,B,C as a dLmmy parameter list, substitutions will occur properly. However, you cannot use the accumulator
         or the Band::: registers within the macro. Because of the limited scope of dummy parameters, the use of these
         registers is not affected outside the macro definition.

         Dummy paralneters in a comment are not recognized. No substitution occurs for such parameters.

         Dummy paralneters may appear in a character string. However, the dummy parameter must be adjacent to an
         ampersand chlracter (&) as explained later In this chapter.

         Any machine Instruction or applicable assembler directive can be included in the macro body. The distinguishing
         feature of ma;ro prototype text is that parts of it can be made variable by placing substitutable dummy param-
         eters in instrLction fields. These dummy parameters are the same as the symbols in the operand field of the
         MACRO dire'tive.

         Example:

         Define macro MACl with dummy parameters Gl, G2, and G3.




5-4
Chapter 5. Macros




                                                NOTE

                    The following macro definition contains a potential error
                    that IS clarified in the description of the LOCAL directive
                    later in this chapter.

                    MACl        MACRO         Gl,G2,G3       ;MACRO DIRECTIVE
                    MOVES:      LHLD          Gl             ;MACRO BODY
                                MOV           A,M
                                LHLD          G2
                                MOV           B,M
                                LHLD          G3
                                MOV           C,M
                                ENDM                         ;ENDM DIRECTIVE


ENDM Directive

                                Label         Opcode            Operand

                                              ENDM

The ENDM directive is required to terminate a macro definition and follows the last prototype instruction. It is
also required to terminate code repetition blocks defined by the REPT, IRP, and IRPC directives.

Any data appearing in the label or operand fields of an ENDM directive causes an error.

                                                 NOTE

                    Because nested macro calls are not expanded during macro
                    definition, the ENDM directive to close an outer macro can-
                    not be contained in the expansion of an inner, 'nested'
                    macro call. (See 'Nested Macro Definitions' later in this
                    chapter.)



LOCA L Directive

                                Label         Opcode            Operand

                                               LOCAL            label name(s)

The specified label names are defined to have meaning only within the current macro expansion. Each time the
macro is called and expanded, the assembler assigns each local symbol a unique symbol in the form 77nnnn.

The assembler assigns ?7OOO1 to the first local symbol, 770002 to the second, and so on. The most recent symbol
name generated always indicates the total number of symbols created for all macro expansions. The assembler
never duplicates these symbols. The user should avoid coding symbols in the form ??nnnn so that there will not
be a conflict with these assembler-generated symbols.


                                                                                                               5-5
Chapter 5. Macros




         Dummy parameters included in a macro call cannot be operands of a LOCAL directive. The ~ cope of a dummy
         parameter is always local to its own macro definition.

         Local symbols can be defined only within a macro definition. Any number of LOCAL directves may appear in
         a macro definition, but they must all follow the macro call and must precede the first line 01 prototype code.

         A LOCAL directive appearing outside a macro definition causes an error. Also, a name appea-ing in the label
         field of a LOCAL directive causes an error.

         Example:

         The definition of MACl (used as an example in the description of the MACRO directive) cOlltains a potential
         error because the symbol MOVES has not been declared local. This is a potential error since no error occurs if
         MACl IS called only once in the program, and the program itself does not use MOVES as a ~ymbol. However,
         if MACl is called more than once, or if the program uses the symbol MOVES, MOVES is a multiply-defined
         symbol. This potential error is avoided by naming MOVES in th'eoperand field of a LOCAL directive:

                                         MACl        MACRO          Gl,G2,G3
                                                     LOCAL          MOVES
                                         MOVES:      LHLD           Gl
                                                     MOV            A,M
                                                     LHLD           G2
                                                     MaY            B,M
                                                     LHLD           G3
                                                     MaY            C,M
                                                     ENDM

         Assume that MACl is the only macro in the program and that it is called twice. The first tirle MACl is expanded,
         MOVES IS replaced with the symbol 7?OOOl; the second time, MOVES is replaced with 7?0002. Because the
         assembler encounters only these special replacement symbols, the program may contain the 'ymbol MOVES
         without causing a multiple definition.



         REPT Directive

                                         Label          Opcode            Operand

                                      optional:         REPT              expression

         The REPT directive causes a sequence of source code lines to be repeated 'expression' times. All lines appeanng
         between the REPT directive and a subsequent ENDM directive constitute the block to be repeated.

         When 'expression' contains symbolic names, the assembler must encounter the definition of he symbol prior to
         encountering the expression.

         The insertion of repeat blocks is performed in-line when the assembler encounters the REPl directive. No
         explicit call is required to cause the code insertion since the definition is an implied call for expansion.




 5-6
Chapter 5. Macros




Example 1:

Rotate accumulator right six times.

                                 ROTR6:         REPT       6
                                                RRC
                                                ENDM

Example 2:

The following REPT directive generates the source code for a routine that fills a five-byte field with the character
stored in the accumulator:

                       PROGRAM CODE                  GENERA TED CODING

                       LHLD        CNTR1             LHLD         CNTR1
                       REPT        5                 MOV          M,A
                       MOV         M,A               INX          H
                       INX         H                 MOV          M,A
                       ENDM                          INX          H
                                                     MOV          M,A
                                                     INX          H
                                                     MOV          M,A
                                                     INX          H
                                                     MOV          M,A
                                                     INX          H

Example 3:

The following example illustrates the use of REPT to generate a multiplication routine. The multiplication is
accomplished through a series of shifts. If this technique is unfamiliar, refer to the example of multiplication
in Chapter 6. The example in Chapter 6 uses a program loop for the multiplication. This example replaces the
loop with seven repetitions of the four instructions enclosed by the REPT-ENDM directives.

Notice that the expansion specified by this REPT directive causes the label SKIPAD to be generated seven times.
Therefore, SKIPAD must be declared local to this macro.

         FSTMUL:           MVI            D,D           ;FAST MULTIPLY ROUTINE
                           LXI            H,D           ;MULTIPLY E*A - 16-BIT RESULT
                                                        ;IN H&L
                           REPT           7
                           LOCAL          SKIPAD
                           RLC                          ;;GET NEXT MULTIPLIER BIT
                           jNC            SKIPAD        ;;DON'T ADD IF BIT = D
                           DAD            D             ;;ADD MULTIPLICAND INTO ANSWER
         SKIPAD:           DAD            H
                           ENDM
                           RLC
                           RNC
                           DAD            D
                           RET
                                                                                                                   5-7
Chapter 5. Macros




        This example ilustrates a classic programming trade-off: speed versus memory Although this example executes
        more qUickly tlan the example in Chapter 6, it requires more memory.



         IRP Directive

                                         Label          Opcode            Operand

                                      optional:         IRP               dummy param, <list>

         The operand field for the IRP (indefinite repeat) directive must contain one macro dummy parameter followed
         by a list of actual parameters enclosed In angle brackets. IRP expands its associated macro prototype code sub-
         stituting the fi 'st actual parameter for each occurrence of the dummy parameter. IRP then expands the proto-
         type code agai 1 substituting the second actual parameter from the list. This process continues until the list is
         exhausted.

         The list of actJal parameters to be substituted for the dummy parameter must be enclosed In angle brackets
         « ». Individu, I items in the list must be separated by commas. The number of actual parameters in the list
         controls the nilmber of times the macro body is repeated; a list of n Items causes n repetitions. An empty list
         (one with no Jarameters coded) specifies a null operand list. IRP generates one copy of the macro body sub-
         stituting a nul' for each occurrence of the dummy parameter. Also, two commas with no intervening character
         create a null parameter within the list. (See 'Special Operators' later in this chapter for a description of null
         operands.)

         Example:

         The following code sequence gathers bytes of data from different areas of memory and then stores them in
         consecutive b~ tes beginning at the address of STORIT

                             PROGRAM CODE                              GENERA TED CODING

                             LXI      H,STORIT                         LXI          H,STORIT
                             IRP      X,<FL01,3E20H,FLD3>              LOA          FLOl
                             LOA      X                                MOV          M,A
                             MOV      M,A                              INX          H
                             INX      H                                LDA          3E20H
                             ENOM                                      MOV          M,A
                                                                       INX          H
                                                                       LOA          FL03
                                                                       MOV        M,A
                                                                       INX        H


         IRPC Directhe

                                          Label         Opcode            Operand

                                      optional:          IRPC             dummy param,text




 5-8
Chapter 5. Macros




The IRPC (indefinite repeat character) directive causes a sequence of macro prototype instructions to be repeated
for each text character of the actual parameter specified. If the text string is enclosed in optional angle brackets,
any delimiters appearing in the text string are treated simply as text to be substituted into the prototype code.
The assembler generates one iteration of the prototype code for each character in the text string. For each
Iteration, the assembler substitutes the next character from the string for each occurrence of the dummy param-
eter. A list of n text characters generates n repetitions of the IRPC macro body. An empty string specifies a
null actual operand. IRPC generates one copy of the macro body substituting a null for each occurrence of the
dummy parameter.

Example:

                           PROGRAM CODE                  GENERA TED CODING

                           LHLD     DATE-l               LHLD        DATE-l
         MVDATE:           IRPC     X,1977               INX         H
                           INX      H                    MVI         M,l
                           MVI      M,X                  INX         H
                           ENDM                          MVI         M,9
                                                         INX         H
                                                         MVI         M,7
                                                         INX         H
                                                         MVI         M,7

IRPC provides the capability to treat each character of a string individually; concatenation (described later in this
chapter) provides the capability for building text strings from Individual characters.



EXITM Directive

                                 Label          Opcode            Operand

                             optional:          EXITM

EXITM provides an alternate method for terminating a macro expansion or the repetition of a REPT, IRP, or
IRPC code sequence. When EX!TM is encountered, the assembler ignores all macro prototype instructions
located between the EXITM and ENDM directive for this macro. Notice that EXITM may be used in addition
to ENDM, but not in place of ENDM.

When used in nested macros, EXITM causes an exit to the previous level of macro expansion. An EXITM within
a REPT, IRP. or IRPC terminates not only the current expansion, but all subsequent iterations as well.

Any data appearing in the operand field of an EXITM directive causes an error.

Example:

EXITM is typically used to suppress unwanted macro expansion. In the following example, macro expansion is
terminated when the EX1TM directive is assembled because the condition X EQ 0 is true.




                                                                                                                  5-9
Chapter 5. Macros




                                          MAC3        MACRO       X,Y




                                                      IF X EQ 0
                                                      EXITM




                                                      ENDM



        Special Macro Op?rators

          In certain specal cases, the normal rules for dealing with macros do not work. Assume. for example, that you
          want to specif" three actual parameters. and the second parameter happens to be the comma character. To the
          assembler, the list PARM1,,,PARM3 appears to be a list of four parameters where the second and third param-
          eters are missirg. The list can be passed correctly by enclosing the comma in angle brackets: PARM1,<,>,PARM3.
          These special ( perators instruct the assembler to accept the enclosed character (the comma) as an actual param-
          eter rather tha'l a del im iter.

          The assembler recognizes a number of operators that allow special operations:

                    &         Ampersand. Used to concatenate (link) text and dummy parameters. See the further
                              discussion of ampersands below.


                    <>        Angle brackets. Used to delimit text, such as lists, that contain other delimiters.
                              Notice that blanks are usually treated as delimiters. Therefore, when an actual
                              parameter contains blanks (passing the instruction MOV A,M, for example) the
                              parameter must be enclosed in angle brackets. This is also true for any other de-
                              limiter that is to be passed as part of an actual parameter. To pass such text to
                              nested macro calls, use one set of angle brackets for each level of nesting. (See
                              'Nested Macro Definitions,' below.)

                              Double semicolon. Used before a comment in a macro definition to prevent
                              inclusion of the comment in expansions of the macro and reduce storage
                              requirements. The comment still appears in the listing of the definition.

                              Exclamation point (escape character). Placed before a character (usually a
                              delimiter) to be passed as literalized text in an actual parameter. Used primarily
                              to pass angle brackets as part of an actual parameter. To pass a literalized
                              exclamation point, issue!!. Carriage returns cannot be passed as actual parameters.

                              The 'I' is always preserved while building an actual parameter. It is not
                              echoed when an actual parameter is substituted for a dummy parameter,
                              except when the substitution is being used to build another actual parameter.




 5-10
Chapter 5. Macros




          NUL      In certain cases it is not necessary to pass a parameter to a macro. It is
                   necessary, however, to indicate the omission of the parameter. The omitted
                   (or null) parameter can be represented by two consecutive delimiters as in
                   the list PARMl "PARM3. A null parameter can also be represented by two
                   consecutive single quotes: ",PARM2,PARM3. Notice that a null is quite
                   different from a blank: a blank is an ASCII character with the hexadecimal
                   representation 20H; a null has no character representation. In the assembly
                   listing a null looks the same as a blank, but that is only because no substi-
                   tution has taken place. The programmer must decide the meaning of a null
                   parameter. Although the mechanism is somewhat different, the defaults taken
                   for assembler controls provide a good example of what a null parameter can
                   mean. For example. coding MOD85 as an assembler control specifies that
                   the assembler is to generate obiect code for the 8085. The absence of this
                   control (which In effect is a null parameter) specifies that the assembler
                   is to generate only 8080 object code.

                    Assembler controls are explained in the 1515-11 8080/8085 Macro Assembler
                   Operator's Manual, 9800292.

                    Example:

                    In a macro with the dummy parameters W,X,Y,Z it is acceptable for either
                    the X or Y parameter to be null, but not both. The following IF directive
                   tests for the error condition:


                                        IF NUL X&Y
                                           EXITM

When a macro IS expanded, any ampersand preceding or following a dummy parameter in a macro definition is
removed and the substitution of the actual parameter occurs at that point. When it is not adjacent to a dummy
parameter, the ampersand is not removed and is passed as part of the macro expansion text.

                                                    NOTE

                   The ampersand must be immediately adjacent to the text being
                   concatenated; Intervening blanks are not allowed.

If nested macro definitions (described below) contain ampersands, the only ampersands removed are those adjacent
to dummy parameters belonging to the macro definition currently being expanded. All ampersands must be reo
moved by the time the expansion of the encompassing macro body is performed. Exceptions force illegal character
errors.

Ampersands placed inside strings are recognized as concatenation delimiters when adjacent to dummy parameters;
similarly, dummy parameters within character strings are recognized only when they are adjacent to ampersands.
Ampersands are not recognized as operators in comments.




                                                                                                               5-11
Chapter 5. Macros




     Nested Macro Del initions

         A macro definition can be contained completely within the body of another macro definition (that is, macro
         definitions can be nested). The body of a macro consists of all text (including nested macro definitions)
         bounded by mltching MACRO and ENDM directives. The assembler allows any number of macro definitions to
         be nested.

         When a higher-evel macro is called for expansion, the next lower-level macro is defined and eligible to be called
         for expansion. A lower-level macro cannot be called unless all higher-level macro definitions have already been
         called and exp;.nded.

         A new macro I nay be defined or an existing macro redefined by a nested macro definition depending on whether
         the name of the nested macro is a new label or has previously been established as a dummy parameter in a
         higher-level ma:ro definition. Therefore, each time a higher-level macro is called, a lower-level definition can be
         defined differe ltly if the two contain common dummy parameters. Such redefinition can be costly, however, in
         terms of assem oler execution speed.

         Since IRP, IRFC, and REPT blocks constitute macro definitions, they also can be nested within another definition
         created by IRF, IRPC, REPT, or MACRO directives. In addition, an element in an IRP or IRPC actual parameter
         list (enclosed 1,1 angle brackets) may itself be a list of bracketed parameters; that is, lists of parameters can contain
         elements that ,.re also lists.

         Example:

                                       LISTS        MACRO          PARAM1,PARAM2




                                                    ENDM




                                                    LISTS <A, <B,C»



MACRO CALLS

         Once 'a macro las been defined, it can be called any number of times in the program. The call consists of the
         macro name alid any actual parameters that are to replace dummy parameters during macro expansion_ During
         assembly, each macro call is replaced by the macro definition code; dummy parameters are replaced by actual
         parameters.



   Macro Call Format
                                           Label          Opcode            Operand

                                       optional:       macro name           optional actual
                                                                            parameter(s)




 5-12
Chapter 5. Macros




The assembler must encounter the macro definition before the first call for that macro. Otherwise. the macro
call is assumed to be an illegal opcode. The assembler inserts the macro body identified by the macro name
each time it encounters a call to a previously defined macro in your program.

The positioning of actual parameters in a macro call is critical since the substitution of parameters is based
solely on position. The first-listed actual parameter replaces each occurrence of the first-listed dummy param-
eter; the second actual parameter replaces the second dummy parameter, and so on. When coding a macro call,
you must be certain to list actual parameters in the appropriate sequence for the macro.

Notice that blanks are usually treated as delimiters. Therefore, when an actual parameter contains blanks
(passing the instruction MOV A,M, for example) the parameter must be enclosed in angle brackets. This is also
true for any other delimiter that is to be passed as part of an actual parameter. Carriage returns cannot be passed
as actual parameters,


If a macro call specifies more actual parameters than are listed in the macro definition, the extra parameters
are ignored. If fewer parameters appear in the call than in the definition, a null replaces each missing parameter.

Example:

The following example shows two calls for the macro LOAD. LOAD is defined as follows:

                                 LOAD           MACRO             Gl,G2,G3
                                                LOCAL             MOVES
                                 MOVES:         LHLD              Gl
                                                MOV               A,M
                                                LHLD              G2
                                                MOV               B,M
                                                LHLD              G3
                                                MOV               C,M
                                                ENDM

LOAD simply loads the accumulator with a byte of data from the location specified by the first actual parameter,
the B register with a byte from the second parameter, and the C register with a byte from the third parameter.

The first time LOAD is called, It is used as part of a routine that inverts the order of three bytes in memory.
The second time LOAD is called, it is part of a routine that adds the contents of the B register to the accumu·
lator and then compares the result with the contents of the C register.




                                                                                                                      5-13
Chapter 5. Macros



                    MAIN PROGRAM                                          SUBSTITUTION

                    JNZ nEXT                                               JNZ      NEXT
                    LOA[ FLD,FLD+1,FLD+2                     ??0001 .      LHLD     FLD
                    MOY    M,A   ;INYERT BYTES                             MOY      A,M
                    DCX    H                                               LHLD     FLD+1
                    MOY    M,B                                             MOY      B.M
                    DCX    H                                               LHLD     FLD+2
                    MOY    M,C                                             MOY      C,M
                    LOM' 3EOH,BYTE,CHECK                                   MOY      M,A   ;INYERT BYTES
                    ADD    B     ;CHECK DIGIT                              DCX      H
                    CMP    C                                               MOY      M,B
                    CNZ    DGTBAD                                          DCX      H
                                                                           MOY      M,C
                                                             7?0002:       LHLD     3EOH
                                                                           MOY      A,M
                                                                           LHLD     BYTE
                                                                           MOY      B,M
                                                                           LHLD     CHECK
                                                                           MOY      C,M
                                                                           ADD      B     ;CHECK DIGIT
                                                                           CMP      C
                                                                           CNZ      DGTBAD

   Nested Macro Calls

         Macro calls (in:luding any combination of nested IRP, IRPC, and REPT constructs) can be nested within macro
         definitions up to eight levels. The macro being called need not be defined when the enclosing macro is defined;
         however, it ml st be defined before the enclosing macro is called.

         A macro defin tlon can also contain nested calls to itself (recursIVe macro calls) up to eight levels, as long as the
         recursive macr" expansions can be terminated eventually, This operation can be controlled using the conditional
         assembly direc:lves described in Chapter 4 (IF, ELSE, ENDIF).

         Example:

         Have a macro :all itself five times after it is called from elsewhere in the program.

                              PARAM1         SET         5
                              RECALL         MACRO




                                             IF          PARAM1 NE 0
                              PARAM1         SET         PARAM1-1
                                             RECALL                         ;RECURSIYE CALL
                                             ENDIF




                                             ENDM

5-14
Chapter 5. Macros




Macro Expansion

     When a macro is called, the actual parameters to be substituted into the prototype code can be passed in one of
     two modes. Normally, the substitution of actual parameters for dummy parameters is simply a text substitution.
     The parameters are not evaluated until the macro is expanded.

     If a percent sign (%) precedes the actual parameter in the macro call, however, the parameter is evaluated
     immediately, before expansion occurs, and is passed as a decimal number representing the value of the param-
     eter. In the case of IRPC, a '%' preceding the actual parameter causes the entire text string to be treated as a
     single parameter. One IRPC iteration occurs for each digit in the decimal string passed as the result of immediate
     evaluation of the text string.

     The normal mechanism for passing actual parameters is adequate for most applications. Using the percent sign
     to pre-evaluate parameters is necessary only when the value of the parameter is different within the local con-
     text of the macro definition as compared to its global value outside the macro definition.

     Example:

     The macro shown in this example generates a number of rotate instructions. The parameters passed in the macro
     call determine the number of positions the accumulator is to be rotated and whether rotate right or rotate left
     instructions are to be generated. Some typical calls for this macro are as follows:

                                        SHIFTR         'R',3
                                        SHIFTR         L,%COUNT-l

     The second call shows an expression used as a parameter. This expression is to be evaluated immediately rather
     than passed simply as text.

     The definition of the SHIFTR macro is shown below. This macro uses the conditional IF directive to test the
     validity of the first parameter. Also, the REPT macro directive is nested within the SHIFTR macro.

                                  SHIFTR      MACRO            X,Y
                                              IF X EQ 'R'
                                                 REPT Y
                                                   RAR
                                                 ENDM
                                              ENDIF
                                              IFXNE'L'
                                                EXITM
                                              ELSE
                                                REPT Y
                                                   RAL
                                                ENDM
                                              ENDIF
                                              ENDM

     The indentation shown in the definition of the SHIFTR macro graphically illustrates the relationships of the IF,
     ELSE, ENDIF directives and the REPT. ENDM directives. Such indentation is not required in your program, but
     may be desirable as documentation.


                                                                                                                   5-15
Chapter 5. Macros




         The SHI FTRllacro generates nothing if the first parameter is neither R nor L. Therefore, the following calls
         produce no c(,de. The result in the object program is as though the SHIFTR macro does not appear in the
         source program.

                                           SHIFTR         5
                                           SHIFTR         'B',2

        The following call to the SHIFTR macro generates three RAR instructions:

                                           SHIFTR         'R',3

         Assume that, SET directive elsewhere in the source program has given COUNT the value 6. The following call
         generates five RAL instructions:

                                           SHIFTR         'L ',%COUNT -1

        The following is a redefinition of the SHIFTR macro. In this definition, notice that concatenation is used to
        form the RAf: or RAL operation code. If a call to the SHIFTR macro specifies a character other than R or L,
        illegal operati,m codes are generated. The assembler flags all illegal operation codes as errors.

                                           SHIFTR         MACRO          X,y
                                                          REPT           Y
                                                          RA&X
                                                          ENDM
                                                          ENDM



NULL MACROS

         A macro may legally comprise only the MACRO and ENDM directives. Thus, the following is a legal macro
         definition:

                                            NADA          MACRO          P1,P2,P3,P4
                                                          ENDM

         A call to thiS macro produces no source code and therefore has no effect on the program.

         Although thel e is no reason to write such a macro, the null (or empty) macro body has a practical application.
         For example, all the macro prototype instructions might be enclosed With IF-ENDIF conditional directives.
         When none 0', the specified conditions IS satisfied. all that remainS of the macro is the MACRO directive and
         the ENDM di ·ective.



SAMPLE MACR05

         The followin! sample macros further demonstrate the use of macro directives and operators.




 5-16
Chapter 5. Macros




Example 1: Nested IRPC

The following macro definition contains a nested IRPC directive. Notice that the third operand of the outer
macro becomes the character string for the IRPC:

                                MOVE       MACRO            X,Y,l
                                           IRPC             PARAM,l
                                           LHLD             X&&PARAM
                                           SHLD             Y&&PARAM
                                           ENDM
                                           ENDM

Assume that the program contains the call MOVE SRC,DST,123. The third parameter of this call IS passed to
the IRPC. This has the same effect as coding IRPC PARAM,123. When expanded, the MOVE macro generates
the following source code:

                                           LHLD     SRCl
                                           SHLD     DSTl
                                           LHLD     SRC2
                                           SHLD     DST2
                                           LHLD     SRC3
                                           SHLD     DSn

Notice the use of concatenation to form labels in this example.


Example 2: Nested Macros Used to Generate DB Directives

This example generates a number of DB 0 directives, each With ItS own label. Two macros are used for this
purpose: INC and BLOCK. The INC macro is defined as follows:

                     INC             MACRO              Fl,F2
                 $ SAVE GEN
                     Fl&F2:          DB                 0         ;GENERATE LABELS & DB's
                   RESTORE
                                     ENDM

The BLOCK macro, which accepts the number of DB's to be generated (NUMB) and a label prefix (PREFIX), is
defi ned as follows:

                       BLOCK    MACRO               NUMB,PREFIX
                 $     SAVE NOGEN
                       COUNT    SET                 o
                                REPT                NUMB
                       COUNT    SET                 COUNT+l
                                INC                 PREFIX,%COUNT ;NESTED MACRO CALL
                                ENDM
                 $     RESTORE
                                ENDM



                                                                                                              5-17
Chapter 5. Macros




        The macro ca I BLOCK 3.LAB generates the following source code:

                                                    BLOCK       3.LAB
                                     LABl:          DB          o
                                     LAB2:          DB          o
                                     LAB3:          DB          o

        The assemblet controls specified in these two macros (the lines beginning with $) are used to clean up the
        assembly Iistit,g for easier reading. The source code shown for the call BLOCK 3.LAB is what appears in the
        assembly listillg when the controls are used. Without the controls. the assembly listing appears as follows:

                                                    BLOCK       3.LAB
                                     COUNT          SET         0
                                                    REPT        3
                                     COUNT          SET         COUNT+l
                                                    INC         LAB.%COUNT
                                                    ENDM
                                     COUNT          SET         COUNT+1
                                                    INC         LAB.%COUNT
                                     LAB1:          DB          0
                                     COUNT          SET         COUNT+l
                                                    INC         LAB.%COUNT
                                     LAB2:          DB          0
                                     COUNT          SET         COUNT+l
                                                    INC         LAB.%COUNT
                                     LAB3:          DB          0

         Example 3:   " Macro that Converts Itself into a Subroutine

        In some case5. the in-line coding substituted for each macro call imposes an unacceptable memory requirement.
        The next thrEe examples show three different methods for converting a macro call into a subroutine call. The
        first time the SBMAC macro is called. it generates a full in-line substitution which defines the SUBR subroutine.
        Each subsequ;nt call to the SBMAC macro generates only a CALL instruction to the SUBR subroutine.

        Within the fo.lowing examples. notice that the label SUBR must be global so that it can be called from outside
        the first expa 1sion. This IS possible only when that part of the macro definition containing the global label is
        called only Ollce in the entire program.

         Method #1:   i~ested   Macro Definitions

        Macros can b" redefined during the course of a program. In the following example. the definition of SBMAC
        contains its own redefinition as a nested macro. The first time SBMAC is called, it is full expanded. and the
        redefinition of SBMAC replaces the original definition. The second time SBMAC IS called. only its redefinition
        (a CALL inst"uction) is expanded.




5-18
Chapter 5. Macros




                      SBMAC      MACRO
                      SBMAC      MACRO
                                 CALL           SUBR       ;;REDEFINITION OF SBMAC
                                 ENDM
                                 CALL           SUBR
                      LINK:      jMP            DUN
                      SUBR:



                                 RET
                      DUN:
                                 ENDM

Notice that both versions of SBMAC contain CALL SUBR instructions. This is necessary to provide a return
address at the end of the SUBR routine. The jump instruction labelled LINK is required to prevent the SUBR
subroutine from executing a return to itself. Notice that the return address for the second CALL SUBR
instruction would be SUBR if the jump instruction were omitted. The j MP DUN instruction simply transfers
control past the end of the subroutine.

                                               NOTE

                        The assembler allows the use of a source line consisting
                        only of a label. Such a label IS assigned to the next source
                        line for which code or data is generated. Notice that
                        neither code nor data is generated for an ENDM directive,
                        so the label DUN is assigned to whatever instruction follows
                        the ENDM directive. This construct is required because the
                        ENDM directive itself may not be given a label.


Method #2: Conditional Assembly

The second method for altering the expansion of the SBMAC macro uses conditional assembly. In this example,
a switch (FI RST) is set TRUE just before the first call for SBMAC. SBMAC is defined as follows:

                      TRUE        EQU           OFFH
                      FALSE       EQU           0
                      FIRST       SET           TRUE
                      SBMAC       MACRO
                                  CALL SUBR
                                  IF            FIRST
                       FIRST      SET           FALSE
                       LINK:      jMP           DUN
                       SUBR:




                                  RET
                       DUN:
                                  ENDIF
                                  ENDM

                                                                                                             5-19
Chapter 5. Macros




         The first call   0   SBMAC expands the full definition, including the call to and definition of SUBR:

                                                   SBMAC
                                                   CALL          SUBR
                                                   IF            FIRST
                                    LINK:          JMP           DUN
                                    SUBR:




                                                   RET
                                    DUN:
                                                   ENDIF

        Because FI RS r is TRUE when encountered during the first expansion of SBMAC, all the statements between
        IF and ENDI!' are assembled into the program. In subsequent calls, the conditionally-assembled code is skipped
        so that the sUJroutine is not regenerated. Only the following expansion is produced:

                                                  SBMAC
                                                  CALL           SUBR
                                                  IF             FIRST

         Method #3:       :onditlonal Assembly with EXITM

        The third met hod for altering the expansion of SBMAC also uses conditional assembly. but uses the EXIT M
        directive to Sl ppress unwanted macro expansion after the first call. EXITM is effective when FIRST is FALSE,
        which it is aft er the first call to SBMAC.

                                    TRUE           EQU           OFFH
                                    FALSE          EQU           0
                                    FIRST          SET           TRUE
                                    SBMAC          MACRO
                                                   CALL          SUBR
                                                   IF            NOT FIRST
                                                   EXITM
                                                   ENDIF
                                    FIRST          SET           FALSE
                                                   JMP           DUN
                                    SUBR:




                                                   RET
                                    DUN:
                                                   ENDM




5-20
Chapter 5. Macros




Example 4: Computed GOTO Macro

This sample macro presents an implementation of a computed GOTO for the 8080 or 8085. The computed
GOTO, a common feature of many high level languages, allows the program to jump to one of a number of
different locations depending on the value of a variable. For example, if the variable has the value zero, the
program jumps to the first item In the list; if the variable has the value 3, the program jumps to the fourth
address In the list.

In this example, the variable IS placed in the accumulator. The list of addresses is defined as a series of DW
directives starting at the symbolic address TABLE. This macro (T JUMP) also modifies itself with a nested
definition. Therefore, only the first call to the TJ UMP macro generates the calculated GOTO routine. Subse-
quent calls produce only the jump instruction JMP TJCODE.

              TJUMP                MACRO                      ;JUMP TO A-TH ADDR IN TABLE
              TJCODE:              ADD            A           ;MULTIPLY A BY 2
                                   MVI            D,O         ;CLEAR DREG
                                   MOV            E,A         ;GET TABLE OFFSET INTO D&E
                                   DAD            D           ;ADD OFFSET TO TABLE ADDR IN H&L
                                   MOV            E,M         ;GET 1ST ADDRESS BYTE
                                   INX            H
                                   MOV            D,M         ;GET 2ND ADDRESS BYTE
                                   XCHG
                                   PCHL                       ;J UMP TO ADDRESS
              TJUMP                MACRO                      ;REDEFINE TJUMP TO SAVE CODE
                                   JMP            TJCODE      ;NEXT CALL JUMPS TO ABOVE CODE
                                   ENDM
                                   ENDM

Notice that the definition of the TJ UMP macro does not account for loading the address of the address table
into the Hand L registers; the user must load this address just before calling the TJ UMP macro. The following
shows the coding for the address table (TABLE) and a typical call sequence for the TJ UMP macro:

                                   MVI            A,2
                                   LXI            H,TABLE
                                   TJUMP




              TABLE:               DW             LOCO
                                   DW             LOC1
                                   DW             LOC2

The call sequence shown above causes a lump to LOC2.




                                                                                                                 5-21
Chapter 5. Macros




         Example 5: Using IRP to Define the Jump Table

        The TJ UMP macro becomes even more useful when a second macro (GOTOl IS used to define the jump table,
        load the addr"ss of the table Into the Hand L registers, and then call TJ UMP, The GOTO macro is defined as
        follows:

                      GOTO                 MACRO         INDEX,L1ST
                                           LOCAL         JTABLE
                                           LDA           INDEX             ;LOAD ACCUM WITH INDEX
                                           LXI           H,JTABLE          ;LOAD H&L WITH TABLE ADDRESS
                                           TJUMP                           ;CALL TJUMP MACRO
                       )TABLE:             IRP            FORMAL,(L1ST>
                                           DW             FORMAL        ;SET UP TABLE
                                           ENDM
                                           ENDM

         A typical call to the GOTO macro would be as follows:

                                  GOTO              CASE,(COUNT,TIMER,DATE,PTDRVR>

        This call to He GOTO macro builds a table of DW directives for the labels COUNT, TIMER, DATE, and
        PTDRVR. It hen loads the base address of the table into the Hand L registers and calls the Tj UMP macro.
        If the value o' the variable CASE is 2 when the GOTO macro is called, the GOTO and TJ UMP macros
        together causl a jump to the address of the DATE routine.

        Notice that allY number of addresses may be specified in the list for the GOTO routine as long as they all fit
        on a single so Jrce line. Also, the GOTO macro may be called any number of times, but only one copy of the
        coding for thl TjUMP is generated since the TJUMP macro redefines itself to generate only a jMP TjCODE
        instruction.




5-22
6. PROGRAMMING TECHNIQUES


     This chapter describes some techniques that may be of help to the programmer.



BRANCH TABLES PSEUDO-SUBROUTINE

     Suppose a program consists of several separate routines. any of which may be executed depending upon some
     initial condition (such as a number passed In a register). One way to code this would be to check each condition
     sequentially and branch to the routines accordingly as follows:

                                   CONDITION = CONDITION ]I
                                   IF YES BRANCH TO ROUTINE 1
                                   CONDITION = CONDITION 2?
                                   IF YES BRANCH TO ROUTINE 2




                                   BRANCH TO ROUTINE N

     A sequence as above is inefficient. and can be improved by using a branch table.

     The logic at the beginning of the branch table program loads the starting address of the branch table into the H
     and L registers. The branch table itself consists of a list of starting addresses for the routines to be branched to.
     Using the Hand L registers as a pointer. the branch table program loads the selected routine's starting address
     into the program counter. thus effecting a jump to the desired routine. For example. consider a program that
     executes one of eight routines depending on which bit of the accumulator is set:

                    Jump to routine 1 if the accumulator holds    00000001
                                    2 ..                   ..     00000010
                                    3 ....                 ..     00000100
                                    4" If                  ..     00001000
                                    5   II   lJ
                                                           ..     00010000
                                    6 II "                 ..     00100000
                                    7" "                   ..     01000000
                                    8 II II                ..     10000000

     A program that provides such logic follows. The program is termed a 'pseudo-subroutine' because it IS treated as a
     subroutine by the programmer (i.e .• it appears just once in memory), but is entered via a regular JUMP instruction
     rather than via a CALL Instruction.




                                                                                                                         6-1
Chapter 6. Programming Techniques




             Main Pre gram                        Branch Table    Jump
                                                   Program       Routines

                   I




                       normal subroutine return
                       sequence not followed by
                       branch table program




6-2
Chapter 6. Programming Techniques




                   Label          Code           Operand


                   START:         LXI            H.BTBL         ;REGISTERS HAND L WILL
                                                                ;POINT TO BRANCH TABLE
                   GTBIT:         RAR
                                  jC             GETAD
                                  INX            H              ;(H.L)=(H,L)+2 TO
                                  INX            H              ;POINT TO NEXT ADDRESS
                                                                ;IN BRANCH TABLE
                                  JMP            GTBIT
                   GETAD:         MOV            E,M            ;BIT FOUND
                                  INX            H              ;LOAD JUMP ADDRESS
                                                                ;INTO D AND E REGISTERS
                                  MOV            D.M
                                  XCHG                          ;EXCHANGE D AND E
                                                                ;WITH HAND L
                                  PCHL                          ;JUMP TO ROUTINE
                                                                ;ADDRESS




                   BTBL:          DW             ROUTl          ;BRANCH TABLE. EACH
                                  DW             ROUT2          :ENTRY IS A TWO-BYTE
                                  DW             ROUTJ          ;ADDRESS
                                  DW             ROUT4          ;HELD LEAST SIGNIFICANT
                                  DW             ROUTS          ;BYTE FIRST
                                  DW             ROUT6
                                  DW             ROUT7
                                  DW             ROUT8

     The control routine at START uses the Hand L registers as a pointer into the branch table (BTBL) corresponding
     to the bit of the accumulator that is set. The rdutine at GETAD then transfers the address held In the corres-
     ponding branch table entry to the Hand L registers via the D and E registers. and then uses a PCH L Instruction.
     thus transferring control to the selected routine.



TRANSFERRING DATA TO SUBROUTINES

     A subroutine typically requires data to perform its operations. In the simplest case. this data may be transferred
     In one or more registers.

     Sometimes it is more convenient and economical to let the subroutine load its own registers. One way to do this
     is to place a list of the required data (called a parameter list) in some data area of memory. and pass the address
     of this list to the subroutine in the Hand L registers.




                                                                                                                          6-3
Chapter 6.   Programming Techniques




         For example, the subroutine ADSUB expects the address of a three-byte parameter list in the Hand L registers.
         It adds the fiJ st and second bytes of the list, and stores the result in the third byte of the list:

                         Label        Code         Operand       Comment

                                      LXI          H.PLlST       ;LOAD HAND L WITH
                                                                 ;ADDRESSES OF THE PARAM-
                                                                 ;ETER LIST
                                      CALL         ADSUB         ;CALL THE SUBROUTINE
                        RET1:

                        'LIST         DB           6              ;FIRST,NUMBER TO BE ADDED
                                      DB           8              ;SECOND NUMBER TO BE
                                                                  ;ADDED
                                      DS           1              ;RESULT WILL BE STORED HERE
                                      LXI          H.L1ST2        ;LOAD HAND L REGISTERS
                                      CALL         ADSUB          ;FOR ANOTHER CALL TO ADSUB
                        RET2:

                       L1ST2:         DB           10
                                      DB           35
                                      DS           1



                      PDSUB:          MOV          A,M            ;GET FIRST PARAMETER
                                      INX          H              ;INCREMENT MEMORY
                                                                  ;ADDRESS
                                      MOV          B.M            ;GET SECOND PARAMETER
                                      ADD          B              ;ADD FIRST TO SECOND
                                      INX          H              ;INCREMENT MEMORY
                                                                  ;ADDRESS
                                      MOV          M,A            ;STORE RESU LTAT TH IRD
                                                                  ;PARAMETER STORE
                                      RET                         ;RETURN UNCONDITIONALLY

         The first time ADSUB is called, it loads the A and B registers from PLiST and PLlST+1 respectively, adds them,
         and stores tr e result in PLiST+2. Return is then made to the instruction at RET1.




 6-4
Chapter 6. Programming Techniques




First call to ADSUB:




                                                        06          PLIST

                                                        08          PLlST+l

                                                        OEH         PLlST+2

The second time ADSUB IS called, the Hand L registers POint to the parameter list L1ST2. The A and B
registers are loaded with 10 and 35 respectively, and the sum is stored at L1ST2+2. Return is then made to
the Instruction at RET2.

Note that the parameter lists PLIST and L1ST2 could appear anywhere in memory without altering the results
produced by ADSUB.

This approach does have its limitations, however. As coded, ADSUB must receive a list of two and only two
numbers to be added, and they must be contiguous in memory. Suppose we wanted a subroutine (GENAD)
which would add an arbitrary number of bytes, located anywhere in memory. and leave the sum in the accumu-
lator.

This can be done by passing the subroutine a parameter list which is a list of addresses of parameters, rather
than the parameters themselves. and signifying the end of the parameter list be a number whose first byte is
FFH (assuming that no parameters will be stored above address FFOOH).

Call to GENAD:

                                H        L




           D
GENAD:

                                                                 PARMl

                                         ADRl                    PARM4
                                         ADR2
                                         ADR3                    PARM3
                                         ADR4
                                         FFFF                    PARM2


As implemented below, GENAD saves the current sum (beginning with zero) in the C register. It then loads the
address of the first parameter into the D and E registers. If this address is greater than or equal to FFOOH, it
reloads the accumulator with the sum held in the C register and returns to the calling routine. Otherwise, it


                                                                                                                 6-5
Chapter 6. Programming Techniques




         loads the panmeter into the accumulator and adds the sum in the C register to the accumulator. The routine
         then loops b:,ck to pick up the remaining parameters.

                        Label        Code          Operand       Comment

                                     LXI           H,PLlST       ;LOAD ADDRESS OF
                                     CALL          GENAD         ;PARAMETER ADDRESS LIST



                                     HALT
                      PLlST:         DW            PARM1         ;L1ST OF PARAMETER ADDRESSES
                                     DW            PARM2
                                     DW            PARM3
                                     DW            PARM4
                                     DW            OFFFFH        ;TERMINATOR



                    PA.RM1 :         DB            6
                    PARM4:           DB            16


                    FARM3:           DB            13




                    FARM2:           DB            82



                    GENAD:           XRA           A             ;CLEAR ACCUMULATOR
                     LOOP:           MOV           C,A           ;SAVE CURRENT TOTAL IN C
                                     MOV           E,M           ;GET LOW ORDER ADDRESS BYTE
                                                                 ;OF FIRST PARAMETER
                                     INX           H
                                     MOV           A,M           ;GET HIGH ORDER ADDRESS BYTE
                                                                 ;OF FIRST PARAMETER
                                     CPI           OFFH          ;COMPARE TO FFH
                                     jZ            BACK          ;IF EQUAL, ROUTINE IS COMPLETE
                                     MOV           D,A           ;D AND E NOW ADDRESS PARAMETER
                                     LDAX          D             ;LOAD ACCUMULATOR WITH PARAMETER
                                     ADD           C             ;ADD PREVIOUS TOTAL
                                     INX           H             ;INCREMENT HAND L TO POINT
                                                                 ;TO NEXT PARAMETER ADDRESS
                                     JMP           LOOP          ;GET NEXT PARAMETER
                      BACK:          MOV           A,C           ;ROUTINE DONE - RESTORE TOTAL
                                     RET                         ;RETURN TO CALLING ROUTINE
                                     END




 6-6
Chapter 6. Programmmg Techniques




     Note that GENAD could add any combination of the parameters with no change to the parameters themselves.

     The sequence:
                                   LXI              H,PLlST
                                   CALL            GENAD




                     PUST:          DW             PARM4
                                    DW             PARMl
                                    DW             OFFFFH

     would cause PARMl and PARM4 to be added, no matter where in memory they might be located (excluding
     addresses above FFOOH).

     Many variations of parameter passing are possible. For example, if it IS necessary to allow parameters to be
     stored at any address, a calling program can pass the total number of parameters as the first parameter; the
     subroutine then loads this first parameter into a register and uses It as a counter to determine when all param-
     eters had been accepted.



SOFTWARE MULTIPLY AND DIVIDE

     The multiplication of two unsigned 8-bit data bytes may be accomplished by one of two techniques: repetitive
     addition, or use of a register shifting operation.


     Repetitive addition provides the simplest, but slowest, form of multiplication. For example, 2AH*74H may be
     generated by adding 74H to the (initially zeroed) accumulator 2AH times.

     Shift operations provide faster multiplication. Shifting a byte left one bit is equivalent to multiplying by 2, and
     shifting a byte right one bit IS equivalent to dividing by 2. The following process will produce the correct 2-byte
     result of multiplying a one byte multiplicand by a one byte multiplier:

                     A.   Test the least significant bit of multiplier. If zero, go to step b. If one, add the
                          multiplicand to the most significant byte of the result.

                     B.   Shift the entire two-byte result right one bit position.

                     C.    Repeat steps a and b until all 8 bits of the multiplier have been tested.

                           For example, consider the multiplication: 2AH*3CH=9D8H

                     Step 1:    Test multiplier O-bit; it is 0, so shift 16-bit result right one bit.


                     Step 2:    Test multiplier l-bit; it is 0, so shift 16-bit result right one bit.


                     Step 3:     Test multiplier 2-blt; it is 1, so add 2AH to high-order byte of result and shift 16-bit
                                 result right one bit.




                                                                                                                            6-7
Chapter 6. Programming Techniques




                         Step 4:    Test multiplier 3-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit
                                    result right one bit.

                         Step 5:    Test multiplier 4-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit
                                    result right one bit.

                         Step 6:    Test multiplier 5-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit
                                    result right one bit.

                         Step 7:    Test multiplier 6-bit; it is 0, so shift 16-bit result right one bit.

                         Step 8:    Test multiplier 7-bit; it is 0, so shift 16-bit result right one bit.

                                    The result produced is 09D8.



                                                                                   HIGH-ORDER BYTE   LOW-0RDER BYTE
                         MULTIPLIER         MULTIPLICAND                              OF RESULT        OF RESULT
           Start         00111100(3C)       00101010(2A)                              00000000          00000000
           Step 1 a
                  b                                                                   00000000         00000000
           Step 2 a
                  b                                                                   00000000         00000000
           Step 3 a .                    '>.,., ..•. , ,                              00101010         00000000
                  b                                                                   00010101         00000000
           Step 4 a .                 . . . , ...                                     00111111         00000000
                  b                                                                   00011111         10000000
           Step 5 a                 ".,."      . " . ' ..         ""       ,          01001001         10000000
                  b                                                                   00100100         11000000
           Step 6 a ..                                   """"              ..         01001110         11000000
                  b                                                                   00100111         01100000
           Step 7 a .                               '"   0 .•   ' · · ·   ••   ,




                  b                                                                   00010011         10110000
           Step 8 a .                                    ..0 . . .
                   b                                                                  00001001         11 011 000(9D8)




         Since the mliitiplication routine described above uses a number of important programming techniques, a sample
         program IS g ven with comments.

         The prograrr uses the B register to hold the most significant byte of the result. and the C register to hold the
         least signific,Lnt byte of the result. The 16-bit right shift of the result is performed in the accumulator by two
         rotate-right-! hrough -carry instructions.




6-8
Chapter 6. Programming Techniques




Zero carry and then rotate B:

                   B                                                                 C



        I  ~~0
       [_ _ _I                                                              D
Then rotate C to complete the shift:
                   B                                                                 C




             D                                                           'I~b
Register D holds the multiplicand. and register C originally holds the multiplier.

               MULT:          MVI            B.O             ;INITIALIZE MOST SIGNIFICANT BYTE
                                                             ;OF RESULT
                              MVI            E,9             ;BIT COUNTER
             MULTO:           MOV            A,C             ;ROTATE LEAST SIGNIFICANT BIT OF
                              RAR                            ;MULTIPLIER TO CARRY AND SHIFT
                              MOV            C,A             ;LOW-ORDER BYTE OF RESULT
                              DCR            E
                              JZ             DONE            ;EXIT IF COMPLETE
                              MOV            A.B
                              JNC            MULT1
                              ADD            D               ;ADD MULTIPLICAND TO HIGH-
                                                             ;ORDER BYTE OF RESULT IF BIT
                                                             ;WAS A ONE
             MULT1:             RAR                          ;CARRY=O HERE SHIFT HIGH-
                                                             ;ORDER BYTE OF RESULT
                              MOV            BA
                              JMP            MULTO
               DONE:



An analogous procedure is used to divide an unsigned 16-bit number by an unsigned 16-bit number. Here, the
process involves subtraction rather than addition, and rotate-left instructions instead of rotate-right instructions.




                                                                                                                     6-9
Chapter 6. Programming Techniques




        The followin: reentrant program uses the Band C registers to hold the dividend and quotient, and the D and E
        register to held the divisor and remainder. The Hand L registers are used to store data temporarily.

                        DIV:        MOV           A,D           :NEGATE THE DIVISOR
                                    CMA
                                    MOV           D,A
                                    MOV           A,E
                                    CMA
                                    MOV           E,A
                                    INX           D             :FOR TWO'S COMPLEMENT
                                    LXI           H,O           ;IN ITIAL VALUE FOR REMAINDER
                                    MVI           A,17          ;INITIALIZE LOOP COUNTER
                        DVO:        PUSH          H             ;SAVE REMAINDER
                                    DAD           D             ;SUBTRACT DIVISOR (ADD NEGATIVE)
                                    JNC           DVl           :UNDER FLOW, RESTORE HL
                                    XTHL
                        DV1:        POP           H
                                    PUSH          PSW           :SAVE LOOP COUNTER (A)
                                    MOV           A,C           ;4 REGISTER LEFT SHIFT
                                    RAL                         ;WITH CARRY
                                    MOV           C,A           ;CY->C->B->L->H
                                    MOV           A,B
                                    RAL
                                    MOV           BA
                                    MOV           A,L
                                    RAL
                                    MOV           L,A
                                    MOV           A,H
                                    RAL
                                    MOV           H,A
                                    POP           PSW           :RESTORE LOOP COUNTER (A)
                                    DCR           A             ;DECREMENT IT
                                    JNZ           DVO           :KEEP LOOPING

                        ;POST·DIVIDE CLEAN UP
                        :SHIFT REMAINDER RIGHT AND RETURN IN DE

                                    ORA           A
                                    MOV           A.H
                                    RAR
                                    MOV           D,A
                                    MOV           A,L
                                    RAR
                                    MOV           E,A
                                    RET
                                    END




 6·10
Chapter 6. Programming Techniques




MULTI BYTE ADDITION AND SUBTRACTION

     The carry flag and the ADC (add with carry) instructions may be used to add unsigned data quantities of
     arbitrary length. Consider the following addition of two three-byte unsigned hexadecimal numbers:

                                                    32AF8A
                                                   +84BA90
                                                   B76A1A

     To perform this addition, add to the low-order byte uSing an ADD instruction. ADD sets the carry flag for use
     in subsequent instructions, but does not Include the carry flag in the addition. Then use ADC to add to all
     higher order bytes.




                      3n
                                                   ~
                                                                                  8A
                      84                           BA                             90

                      B7                  I        6A
                                                                          i
                                                                                  1A

                            carry = 1 ...J                   carry = 1 . J

     The following routine will perform this multibyte addition, making these assumptions:

     The E register holds the length of each number to be added (in this case, 3).

     The numbers to be added are stored from low-order byte to high-order byte beginning at memory locations
     FI RST and SECND, respectively.

     The result will be stored from low-order byte to high-order byte beginning at memory location FIRST, replacing
     the original contents of these locations.

                            MEMORY
                            LOCATION       before                                 after

                            FIRST             8A    --+                      ,.    lA     ~   carry

                            FIRST+l

                            FIRSTt2
                                            AF

                                            32
                                                    --t          +--
                                                                       +-liI>-
                                                                                   6A

                                                                                   B7
                                                                                          ~ carry




                            SECND           90                                     90

                            SECND+l         BA                                     BA

                            SECND+2         84                                     84




                                                                                                                              6-11
Chapter 6. Programming Techniques




        The followin: routine uses an ADC instruction to add the low-order bytes of the operands. This could cause
        the result to be high by one if the carry flag were left set by some previous instruction. This routine avoids
        the problem Jy clearing the carry flag with the XRA instruction just before LOOP.

                        Label        Code           Operand        Comment

                     I~ADD:          LXI            B,FIRST        ;B AND C ADDRESS FIRST
                                     LXI            H,SECND        ;H AND L ADDRESS SECND
                                     XRA            A              ;CLEAR CARRY FLAG
                      LOOP:          LDAX           B              ;LOAD BYTE OF FIRST
                                     ADC            M              ;ADD BYTE OF SECND
                                                                   ;WITH CARRY
                                     STAX           B              ;STORE RESULT AT FIRST
                                     DCR            E              ;DONE IF E = 0
                                     JZ             DONE
                                     INX            B              ;POINT TO NEXT BYTE OF
                                                                   ;FIRST
                                     INX            H              ;POINT TO NEXT BYTE OF
                                                                   ;SECND
                                     JMP            LOOP           ;ADD NEXT TWO BYTES
                      DONE:

                      FIRST          DB             90H
                                     DB             OBAH
                                     DB             84H
                    ~ECND:           DB             8AH
                                     DB             OAFH
                                     DB             32H

        Since none cf the instructions in the program loop affect the carry flag except ADC, the addition with carry will
        proceed cornctly.

        When locaticn DONE is reached. bytes FIRST through FIRST+2 will contain 1A6AB7, which is the sum shown
        at the beginldng of this section arranged from low-order to high-order byte.

        In order to (reate a multibyte subtraction routine, it is necessary only to duplicate the multibyte addition routine
        of this sectic n, changing the ADC instruction to an SBB instruction. The program will then subtract the number
        beginning at SECND from the number beginning at FIRST, placing the result at FIRST.


DECIMAL ADDIlION

        Any 4-bit d, ta quantity may be treated as a decimal number as long as it represents one of the decimal digits
        from 0 throllgh 9, and does not contain any of the bit patterns representing the hexadecimal digits A through F.
        In order to preserve this decimal interpretation when performing addition, the value 6 must be added to the
        4-bit quantily whenever the addition produces a result between 10 and 15. This is because each 4-bit data
        quantity car hold 6 more combinations of bits than there are decimal digits.




6-12
Chapter 6. Programming Techniques




Decimal addition is performed by letting each 8-bit byte represent two 4-bit decimal digits. The bytes are
summed In the accumulator in standard fashion, and the DAA (decimal adiust accumulator) instruction is then
used to convert the 8-bit binary result to the correct representation of 2 decimal digits. For multibyte strings,
you must perform the decimal adiust before adding the next higher-order bytes. This is because you need the
carry flag setting from the DAA instruction for adding the higher-order bytes.

To perform the decimal addition:

                                              2985
                                             +4936
                                              7921

the process works as follows:

            1.    Clear the Carry and add the two lowest-order digits of each number (remember that each 2
                  decimal digits are represented by one byte).

                                              85 = 10000101 B
                                              36 = 00110110B
                                     carry                0
                                                Q]10111011B

                        Carry = 0   ~                   ~   Auxiliary Carry = 0

                  The accumulator now contains OBBH.

            2.    Perform a DAA operation. Since the rightmost four bits are greater than 9, a 6 is added to the
                  accumulator.

                                    Accumulator = 10111011 B
                                              6 =     0110B
                                                     11000001 B

                  Since the leftmost bits are greater than 9. a 6 is added to these bits, thus setting the carry flag_

                                    Accumulator = 11000001 B
                                              6=0110       B

                                         /]00100001B

                        Carry flag = 1

                  The accumulator now contains 21 H. Store these two digits.




                                                                                                                    6-13
Chapter 6. Programming Techniques




                     3,    Add the next group of two digits:

                                                         29 = 001 01 001 B
                                                         49 = 01001001B

                                                 carry

                                                           .Q] 0111 0011 B
                                    Carry = 0   ~                  ~AuXiliary       Carry = 1

                           The accumulator now contains 73H.

                           Perform a DAA operation. Since the auxiliary carry flag is set. 6 is added to the accumulator.

                                                Accumulator = 01110011 B
                                                          6 =     0110B

                                                     /QlOl111001B

                                    Carry flag = 0

                           Since the leftmost 4 bits are less than 10 and the carry flag is reset, no further action occurs.

                          Thus, the correct decimal result 7921      IS   generated in two bytes.

         A routine wlich adds decimal numbers, then, IS exactly analogous to the multibyte addition routine MADD of
         the last sect on, and may be produced by Inserting the instruction DAA after the ADC M instruction of that
         example.

         Each iteration of the program loop will add two decimal digits (one byte) of the numbers.



DECIMAL SUBTltACTION

         DeCimal subtraction is considerably more complicated than decimal addition. In general, the process consists of
         generating tle tens complement of the subtrahend digit, and then adding the result to the minuend digit. For
         example, to subtract 34 from 56, form the tens complement of 34 (99-34=65+1=66), Then, 56+66=122. By
         truncating eff the carry out of the high order digit, we get 22, the correct result.

         The problerl of handling borrows arises in multibyte deCimal subtractions. When no borrow occurs from a sub-
         tract, you v'ant to use the tens complement of the subtrahend for the next operation. If a borrow does occur,
         you want t,. use the nines complement of the subtrahend.

         Notice that the meaning of the carry flag IS Inverted because you are dealing with complemented data. Thus, a
         one bit in tle carry flag Indicates no borrow: a zero bit In the carry flag indicates a borrow. This inverted carry
         flag setting :an be used in an add operation to form either the nines or tens complement of the subtrahend.




  6-14
Chapter 6. Programming Techniques




The detailed procedure for subtracting multi-digit decimal numbers is as follows:

            1.   Set the carry flag = 1 to indicate no borrow.

           2.    Load the accumulator with 99H, representing the number 99 decimal.

            3.   Add zero to the accumulator with carry, producing either 99H or 9AH, and resetting the
                 carry flag.

            4.   Subtract the subtrahend digits from the accumulator. producing either the nines or tens
                 complement.

            5.    Add the minuend digits to the accumulator.

            6.   Use the DAA instruction to make sure the result In the accumulator is In decimal format, and
                 to indicate a borrow in the carry flag if one occurred.

            7.    If there are more digits to subtract, go to step 2. Otherwise. stop.

                  Example:

                  Perform the decimal subtraction:

                                     43580
                                    -13620

                                     29960

            1.    Set carry = 1 .

            2.    Load accumulator with 99H.

            3.    Add zero with carry to the accumulator, producing 9AH.

                                    Accumulator = 100110018
                                                = 000000008
                                     Carry

                                                   100110108     = 9AH
            4.    Subtract the subtrahend digits 62 from the accumulator.

                                    Accumulator   = 100110108
                                            62    = 1001111 08
                                                  ] 001110008




                                                                                                                    6-15
Chapter 6.   Programming -rechniques




                       5.    Add the minuend digits 58 to the accumulator.

                                               Accumulator = 00111 OOOB
                                                        58 = 01011 OOOB

                                                           Q] 1001 OOOOB   = 90H
                                   Carry = 0   ~                  'AUXiliarY Carry = 1

                       6.    DAA converts accumulator to 96 (since Auxiliary Carry     = 1)     and leaves carry flag   =0
                             Indicating that a borrow occurred.

                       7     Load accumulator with 99H.

                       8.    Add zero with carry to accumulator. leaving accumulator = 99H.

                       9.    Subtract the subtrahend digits 13 from the accumulator.

                                               Accumulator = 10011 001 B
                                                       13= 11101101B
                                                           1] 10000110B

                      10.    Add the minuend digits 43 to the accumulator.

                                               Accumulator = 1000011 OB
                                                       43 = 01000011 B

                                               ~~ 11001001B = C9H

                                   Carry = 0                      'AUXiliary Carry = 0

                      11     DAA converts accumulator to 29 and sets the carry flag = 1. indicating no borrow occurred.

                             Therefore, the result of subtracting 1362 from 4358 is 2996.

         The followinl. subroutine will subtract one 16-digit decimal number from another using the following assumptions:

         The minuend IS stored least significant (2) digits first beginning at location MINU.

         The subtrahe ld IS stored least significant (2) digits first beginning at location SBTRA.

         The result will be stored least significant (2) digits first, replacing the minuend.




 6-16
Chapter 6. Programming Techniques




Label   Code   Operand   Comment

DSUB:   LXI    D,MINU    ;D AND E ADDRESS MINUEND
        LXI    H,SBTRA   ;H AND L ADDRESS SUBTRA-
                         ;HEND
        MVI    C,8       ;EACH LOOP SUBTRACTS 2
                         ;DIGITS (ONE BYTE),
                         ;THEREFORE PROGRAM WILL
                         ;SUBTRACT 16 DIGITS.
        STC              ;SET CARRY INDICATING
                         ;NO BORROW
LOOP:   MVI    A,99H     ;LOAD ACCUMULATOR
                         ;WITH 99H.
        ACI    0         ;ADD ZERO WITH CARRY
        SUB    M         ;PRODUCE COMPLEMENT
                         ;OF SUBTRAHEND
        XCHG             ;SWITCH D AND E WITH
                         ;H AND L
        ADD    M         ;ADD MINUEND
        DAA              ;DECIMAL ADJUST
                         ;ACCUMULATOR
        MOV    M,A       ;STORE RESULT
        XCHG             ;RESWITCH D AND E
                         ;WITH HAND L
        DCR    C         ;DONE IF C = 0
        JZ     DONE
        INX    D         ;ADDRESS NEXT BYTE
                         ;OF MINUEND
        INX    H         ;ADDRESS NEXT BYTE
                         ;OF SUBTRAHEND
        JMP    LOOP      ;GET NEXT 2 DECIMAL DIGiTS
DONE:   NOP




                                                                        6-17
Intel 8080 8085 assembly language programming 1977 intel
7. INTERRUPTS




INTERRUPT CONCEPTS

     The following is a general description of interrupt handling and applies to both the 8080 and 8085 processors.
     However, the 8085 processor has some additional hardware features for interrupt handling. For more infor-
     mation on these features, see the description of the 8085 processor in Chapter 1 and the descriptions of the
     RIM, SIM, and RST instructions in Chapter 3.

     Often, events occur external to the central processing unit which require immediate action by the CPU. For
     example, suppose a device is sending a string of 80 characters to the CPU, one at a time, at fixed intervals.
     There are two ways to handle such a situation:

             A.    A program could be written which accepts the first character, waits until the next character is
                   ready (e.g., executes a timeout by incrementing a sufficiently large counter), then accepts the
                   next character, and proceeds in this fashion until the entire 80 character string has been received.

                   This method is referred to as programmed Input/Output.

              B.   The device controller could interrupt the CPU when a character is ready to be input, forcing a
                   branch from the executing program to a special interrupt service routine.

                   The interrupt sequence may be illustrated as follows:

                                                       INTERRUPT




                    Normal                                                                     Program
                    Program                                                                    Execution
                    Execution                                                                  Continues




                                                Interrupt Service
                                                     Routine


                                                                                                                          7-1
Chapter 7. Interrupts




         The 8080 cor tains a bit named INTE which may be set or reset by the instructions EI and DI described in
         Chapter 3. Wilenever INTE is equal to 0, the entire interrupt handling system is disabled, and no interrupts
         will be accepl ed.

         When the 8010 recognizes an interrupt request from an external device, the following actions occur:

                   1.    The instruction currently being executed is completed.

                   2.    The interrupt enable bit. INTE, is reset = O.

                   3.    The interrupting device supplies. via hardware. one instruction which the CPU executes. This
                         instruction does not appear anywhere in memory, and the programmer has no control over it,
                         since it is a function of the interrupting device's controller design. The program counter is not
                         incremented before this instruction.

         The Instruction supplied by the interrupting device is normally an RST instruction (see Chapter 3), since this
         is an efficienl one byte call to one of 8 eight-byte subroutines located in the first 64 words of memory. For
         instance, the jevice may supply the instruction:

                                                            RST OH

         with each in, ut interrupt. Then the subroutine which processes data transmitted from the deVice to the CPU
         will be called into execution via an eight-byte instruction sequence at memory locations OOOOH to 0007H.

         A digital inplt device may supply the instruction:

                                                            RST 1H

         Then the sub'outine that processes the digital input signals will be called via a sequence of instructions
         occupying m"mory locations 0008H to OOOFH.




                         d
                                         Transfers

                :epvpi~i::a~ST OH                           .~ 0000
                                                                             Beginning of
                                         c_o_n_t_ro_l_t_o                    subroutine for
                                                                 0007    }   device 'a'




                Device   "
                         d               T_ra_n_s_fe_r_s
                                         control to         .-
                                                            •    0008
                                                                         I   Beginning of
                                                                             subroutine for
                supplie, RST 1 H                                 OOOF
                                                                         J   device 'b'




 7-2
Chapter 7. Interrupts




                                 Transfers


                                                                            }
                                                                                   Beginning of
            Device 'x'           control to                  0038
                                                                                   subroutine for
            supplies RST 7H                                  003F
                                                                                   device 'x'


Note that any of these 8-byte subroutines may in turn call longer subroutines to process the interrupt, if
necessary.

Any device may supply an RST instruction (and indeed may supply anyone-byte 8080 instruction).

The following is an example of an Interrupt sequence:


 ARBITRARY
MEMOR Y ADDRESS                  INSTRUCTION


~3COC
         3COB
                                    ~~~ ~'1~{,o",,"p<f,om D,,'ce ,                                            A

I
                                                                     Device 1 supplies
                                                                        RST OH
                                                                     Program Counter =


                                                                 I   3COC pushed onto
                                                                     the stack.
                                                                     Control transferred to
                                                                                                              B



                                                                .j   to 0000




         0000                       '0"'",';00 , /
                                    Instruction 2
                                    RET                                        t
                                                                     Stack popped into
                                                                                                             C
                                                                     program counter




Device 1 signals an interrupt as the CPU is executing the instruction at 3COB. This instruction is completed.
The program counter remains set to 3COC. and the instruction RST OH supplied by device 1 is executed.
Since this is a call to location zero. 3COC is pushed onto the stack and program control is transferred to
location OOOOH. (This subroutine may perform jumps, calls, or any other operation.) When the RETURN is
executed, address 3COC is popped off the stack and replaces the contents of the program counter, causing
execution to continue at this point.




                                                                                                                        7-3
Chapter 7. Interrupts




WRITING INTERRJPT SUBROUTINES

         In general, anI registers or condition bits changed by an Interrupt subroutine must be restored before returning
         to the interrurted program, or errors will occur.

         For example, . uppose a program is interrupted lust prior to the instruction:

                                                         JC LOC

         and the carry Jlt equals 1, If the interrupt subroutine happens to reset the carry bit before returning to the
         Interrupted pngram, the jump to LOC which should have occurred will not, causing the interrupted program
         to produce err Jneous results.

         Like any othe subroutine then, any interrupt subroutine should save at least the condition bits and restore them
         before perfornling a RETURN operation. (The obVIOUS and most convenient way to do this IS to save the data
         In the stack, u,lng PUSH and POP operations.)

         Further, the II terrupt enable system is automatically disabled whenever an Interrupt is acknowledged. Except in
         special cases, 1herefore, an interrupt subroutine should include an EI instruction somewhere to permit detection
         and handling (of future interrupts. One instruction after an EI is executed, the interrupt subroutine may itself be
         Interrupted. T lis process may continue to any level, but as long as all pertinent data are saved and restored,
         correct progra n execution will continue automatically,

         A typical intel rupt subroutine, then, could appear as follows:

                        Code           Operand           Comment

                        PUSH           PSW               ;SAVE CONDITION BITS AND ACCUMULATOR
                        EI                               ;RE-ENABLE INTERRUPTS

                                                         ;PERFORM NECESSARY ACTIONS TO SERVICE
                                                         ;THE INTERRUPT



                        POP            PSW               ;RESTORE MACHINE STATUS
                        RET                              ;RETURN TO INTERRUPTED PROGRAM




 74
APPENDIX A.              INSTRUCTION SUMMARY
This appendix summarizes the bit patterns and number of time states associated with every 8080 CPU
instruction. The instructions are listed in both mnemonic (alphabetical) and operation code (numerical)
sequence.

When USing this summary, note the following symbology

DDD represents a destination register. SSS represents a source register. Both DDD and SSS are interpreted
as follows:

                     DDD or SSS                    Interpretation

                         000                       Register   B
                         001                       Register   C
                         010                       Register   D
                         011                       Register   E
                         100                       Register   H
                         101                       Register   L
                         110                       A memory register or stack pointer or PSW
                                                   (flags + accumulator)
                         111                       The accumulator


Instruction execution time equals number of time periods multiplied by the duration of a time period.

A time period may vary from 480 nanoseconds to 2 microseconds on the 8080 or 320 nanoseconds to 2
microseconds on the 8085. Where two numbers of time periods are shown (eq.5/11), it means that the
smaller number of time periods is required if a condition is not met, and the larger number of time periods
is required if the condition IS met.



                                                                                         NUMBER OF TIME PERIODS
   MNEMONIC          D7        D6      D5      D4         D3        D2     D1      DO
                                                                                               8080           8085



   CALL              1         1      0        0         1          1     0        1            17             18      I
                                                                                                                       !
   CC                1         1      0        1         1          1     0        0           11/17          9/18
                 I
   CNC               1         I      0        1         0          1     0        0           11/17          9/18
   CZ                1         1      0        0         1          1     0        0           11/17          9/18
   CNZ               1         1      0        0         0          1     0        0           11/17          9/18
   CP                1         1      1        1         0          1     0        0           11/17          9/18
   CM                1         1      1        1         1          1     0        0           11/17          9/18
   CPE               1         1       1       0         1          1     0        0           11/17          9/17
   CPO               1         1       1       0         0          1     0        0           11/17          9/18
    RET              1         1       0       0         1          0     0        1            10             10
    RC               1         1       0       1         1          0     0        0           5/11           6/12
    RNC              1         1       0       1         0          0     0        0           5/11           6/12
    RZ               1         1      0        0          1         0     0        0           5/11           6/12


   ALL MNEMONICS©7974, 7975, 7976, 7977 INTEL CORPORATION


                                                                                                                     A-l
Appendix A. Instruction 5ummary




                                                                                NUMBER OF TIME PERIODS
MNEMONIC         D7       D6      D5   D4       D3       D2   D1       DO           8080    8085



RNZ              1        1       0    0        0        0    0        0            5/11    6/12
RP               1        1       1    1        0        0    0        0            5/11    6/12
RM               1        1       1    1        1        0    0        0
                                                                            I       5/11    6/12
RPE              1        1       1    0        1        0    0        0            5/11    6/12
RPO              1        1       1    0        0        0    0        0            5/11    6/12
RST              1        1       A    A        A        1    1        1             11      12
IN               1        1       0    1        1        0    1        1            10       10
OUT              1        1       0    1        0        0    1        1            10       10
LXI B            0        0       0    0        0        0    0        1            10       10
LXI D            0        0       0    1        0        0    0        1            10       10
LXI H            0        0       1    0        0        0    0        1            10       10
LXI SP           0        0       1    1        0        0    0        1            10       10
PUSH B           1        1       0    0        0        1    0        1            11       12
PUSH D
PUSH H
                 1
                 1
                          1
                          1
                                  0
                                  1
                                       1
                                       0
                                                0
                                                0
                                                     I   1
                                                         1
                                                              0
                                                              0
                                                                       1
                                                                       1
                                                                                    11
                                                                                    11
                                                                                             12
                                                                                             12
PUSH PSW         1        1       1    1        0        1    0        1            11       12
POP B            1        1       0    0        0        0    0        1            10       10
POP D            1        1       0    1        0        0    0        1            10       10
POP H            1        1       1    0        0        0    0        1            10       10
POP PSW          1        1       1    1        0        0    0        1            10       10
STA              0        0       1    1        0        0    1        0            13       13
LDA              0        0       1    1
                                            I   1        0    1        0            13       13
XCHG             1        1       1    0        1        0    1        1             4       4
XTHL             1        1       1    0        0        0    1        1            18       16
SPHL             1        1       1    1        1        0    0        1             5       6
PCHL             1        1       1    0        1        0    0        1             5        6
DAD B            0        0       0    0        1        0    0        1            10       10
DAD D            0        0       0    1        1        0    0        1            10       10
DAD H            0        0       1    0        1        0    0        1            10       10
DAD SP           0        0       I    1        1        0    0        1            10       10
STAX B           0        0       0    0        0        0    1        0             7        7
STAX D           0        0       0    1        0        0    1        0             7       7
LDAX B           0        0       0    0        1        0    1        0             7       7
LDAX D           0        0       0    1        1        0    1        0             7       7
INX B            0        0       0    0        0        0    1        1             5       6
INX D            0        0       0    1        0        0    1        1             5       6
INX H            0        0       1    0        0        0    1        1             5       6
INX SP           0        0       1    1        0        0    1        1             5       6
MOV r1/2         0        1       D    D        D        S    S        S             5       4
MOV M,r          0        1       1    1        0        S    S        S             7       7
MOV r,M          0        1       D    D        D        1    1        0             7       7
HLT              0        1       1    1        0        1    1        0             7       5
MVI r            0        0       D    D        D        1    1        0             7       7
MVI M            0        0       1    1        0        1    1        0            10       10
INR              0        0       D    D        D        1    0        0             5       4
DCR              0        0       D    D        D
ALL MNEMON/CS© 1974,7975,7976, 7977/NTEL CORPORATION
                                                         1    0    I   1             5       4


A-2
Appendix A. Instruction Summary




                                                                  NUMBER OF TIME PERIODS
MNEMONIC      D7    D        D5   D4    D3     D2       D1   DO
                         6
                                                                      8080       8085



 INR A        0     0        1    1     1      1        0    0         5           4
 DCR A        0     0        1    1     1      1        0    1          5          4
 INR M        0     0        1    1     0      1        0    0         10         10
 DCR M        0     0        1    1     0      1        0    1         10         10
 ADD r        1     0        0    0     0      5        5    5         4           4
 ADC r        1     0        0    0     1      5        5    5         4           4
 SUB r        1     0        0    1     0      5        5    5         4           4
 SBB r        1     0        0    1     1      5        5    5         4           4
,AND r        1     0        1    0     0      5        5    5         4           4
 XRA r        1     0        1    0     1      5    i   5    5         4           4
                                                    I
ORA r         1     0        1    1     0      5        5    5         4           4
CMPr          1     0        1    1     1      5        5    5         4           4
 ADD M        1     0        0    0     0      1        1    0         7           7
 ADC M        1     0        0    0     1      1        1    0         7           7
SUB M         1     0        0    1     0      1    I   1    0         7           7
5BB M         1     0        0    1     1      1        1    0         7           7
AND M         1     0        1    0     0      1        1    0         7           7
XRA M         1     0        1    0     1      1        1    0         7           7
ORA M         1     0        1    1     0      1        1    0         7           7
CMP M         1     0        1    1     1      1        1    0         7           7
 ADI          1     1        0    0     0      1        1    0         7           7
 ACI          1     1        0    0     1      1        1    0         7           7
SUI           1     1        0    1     0      1        1    0         7           7
5BI           1     1        0    1     1      1        1    0         7           7
ANI           1     1        1    0     0      1        1    0         7           7
XRI           1     1        1    0     1      1        1    0         7           7
ORI           1     1        1    1     0      1        1    0         7           7
CPI           1     1        1    1     1      1        1    0         7           7
 RLC          0     0        0    0     0      1        1    1         4           4
 RRC          0     0        0    0     1      1        1    1         4           4
 RAL          0     0        0    1     0      1        1    1          4          4
 RAR          0     0        0    1     1      1        1    1          4           4
JMP           1     1        0    0     0      0        1    1         10          10
 JC           1     1        0    1     1      0        1    0         10         7{10
 JNC          1     1        0    1     0      0        1    0         10         7{10
 JZ           1     1        0    0     1      0        1    0         10         7{10
 JNZ          1     1        0    0     0      0        1    0         10         7{10
 JP           1     1        1    1     0      0        1    0         10         7/10
 JM           1     1        1    1     1      0        1    0         10         7/10
 JPE          1      1       1    0     1      0        1    0         10         7/10
 JPO          1      1       1    0     0      0        1    0         10         7{10
 DCX B        0     0        0    0     1      0        1    1          5          6
 DCX D        0     0        0    1     1      0        1    1          5          6
 DCX H        0     0        1    0     1      0        1    1          5          6
 DCX 5P       0     0        1    1     1      0        1    1          5          6


 ALL MNEMONICS©7974, 7975, 7976, 7977 INTEL CORPORATION                                        A-3
Appendix A. Instruction S!lmmary




                                                                          NUMBER OF TIME PERIODS
MNEMONIC          D7       D       D       D       D
                               6       s       4       3   °2   °1   DO
                                                                             8080     8085


CMA               0        0       1       0       1       1    1    1         4       4
STC           I   0        0       1       1       0       1    1    1         4       4
CMC               0        0       1       1       1       1    1    1         4       4
OAA               0        0       1       0       0       1    1    1         4       4
SHLD              0        0       1       0       0       0    1    0        16      16
LHLD              0        0       1       0       1       0    1    0        16      16
RIM               0        0       1       0       0       0    0    0         -      4
SIM               0        0       1       1       0       0    0    0         -       4
EI                1        1       1       1       1       0    1    1         4       4
DI                1        1       1       1       0       0    1    1         4       4
NOP               0        0       0       0       0       0    0    0         4       4




ALL MNEMONICS ©7~ 74, 7975, 7976. 7977 INTEL CORPORA nON


A4
Appendix A. Instruction Summary




                                          The following is a summary of the instruction set:
                            8080/85 CPU INSTRUCTIONS IN OPERATION CODE SEQUENCE
  OP                         OP            OP                         OP            OP            OP
 CODE MNEMONIC              CODE MNEMONIC CODE MNEMONIC              CODE MNEMONIC CODE MNEMONIC CODE MNEMONIC
  00        NOP              2B      DCX    H       56   MOY   D,M    81   ADD   C      AC     XRA      H     D7   RST 2
  01        LXI    B.D16     2C      INR    L       57   MOY   D,A    82   ADD   D      AD     XRA      L     D8   RC
  02        STAX   B         2D      DCR     L      58   MOY   E.B    83   ADD   E      AE     XRA      M     D9   -
  03        INX    B         2E      MYI     L,D8   59   MOY   E.C    84   ADD   H      AF     XRA      A     DA   JC     Adr
  04        INR    B         2F      CMA            SA   MOY   E,D    85   ADD   L      BO     ORA      B     DB   IN     D8
  05        DCR    B         30      SIM            5B   MOY   E,E    86   ADD   M      B1     ORA      C     DC   CC     Adr
  06        MYI    B,D8      31      LXI    SPD16   5C   MOY   E,H    87   ADD   A      B2     ORA      D     DD
  07        RLC              32      STA    Adr     5D   MOY   E.L    88   ADC   B      B3     ORA      E     DE   SBI D8
  08        -                33      INX    SP      5E   MOY   E,M    89   ADC   C      B4     ORA      H     DF   RST 3
  09        DAD B            34      INR    M       SF   MOY   E,A    8A   ADC   D      B5     ORA      L     EO   RPO
  OA        LDAXB             35     DCR    M       60   MOY   H,B    8B   ADC   E      B6     ORA      M     E1   POP H
  OB        DCX B            36      MVI    M,D8    61   MOV   H,C    8C   ADC   H      B7     ORA      A     E2   jPO Adr
  OC        INR C             37     STC            62   MOV   H,D    8D   ADC   L      B8     CMP      B     E3   XTHL
  OD        DCR C            38      --             63   MOV   H,E    8E   ADC   M      B9     CMP      C     E4   CPO Adr
  OE        MYI C.08         39     DAD SP          64   MOY   H,H    8F   ADC   A      BA     CMP      D     E5   PUSH H
  OF        RRC              3A     LDA Adr         65   MOY   H,L    8G   SUB   B      BB     CMP      E     E6   ANI D8
  10        --               3B     DCX SP          66   MOY   H,M    91   SUB   C      BC     CMP      H     E7   RST 4
  11        LXI    D,D16     3C     INR A           67   MOV   H,A    92   SUB   D      BD     CMP      L     E8   RPE
  12        STAX   D         3D     DCR A           68   MOV   L,B    93   SUB   E      BE     CMP      M     E9   PCHL
  13        INX    D         3E     MYI A,D8        69   MOY   L.C    94   SUB   H      BF     CMP      A     EA   IPE Adr
  14        INR    D         3F     CMC             6A   MOY   L,D    95   SUB   L      CO     RNZ            EB   XCHG
  15        DCR    D         40     MOY B.B         6B   MOY   L,E    96   SUB   M      C1     POP      B     EC   CPE Adr
  16        MYI    D,D8      41     MOV B,C         6C   MOY   L,H    97   SUB   A      C2     jNZ      Adr   ED   --
  17        RAL              42     MOY B.D         6D   MOV   L,L    98   SBB   B      C3     IMP      Adr   EE   XRI    D8
  18        --               43     MOV B,E         6E   MOV   L,M    99   SBB   C      C4     CNZ      Adr   EF   RST    5
  19        DAD D            44     MOV B.H         6F   MOV   L,A    9A   SBB   D      C5     PUSH     B     FO   RP
  1A        LDAXD            45     MOV B,L         70   MOV   M.B    9B   SBB   E      C6     ADI      D8    F1   POP    PSW
  1B        DCX D            46     MOY B,M         71   MOV   M,C    9C   SBB   H      C7     RST      0     F2   JP     Adr
  1C        INR E            47     MOY B,A         72   MOY   M,D    9D   SBB   L      C8     RZ             F3   DI
  10        DRC E            48     MOY C,B         73   MOV   M.E    9E   SBB   M      C9     RET      Adr   F4   CP     Adr
  1E        MYI E.D8         49     MOY C,C         74   MOV   M.H    9F   SBB   A      CA     jZ             F5   PUSH   PSW
  1F        RAR              4A     MOY C.D         75   MOV   M.L    AO   ANA   B      CB      --            F6   ORI    D8
  20        RIM              4B     MOY C,E         76   HLT          A1   ANA   C      CC     CZ   Adr       F7   RST    6
  21        LXI H.D16        4C     MOV C,H         77   MOY   M,A    A2   ANA   D      CD     CALL Adr       F8   RM
  22        SHLD Adr         4D     MOY C.L         78   MOV   A,B    A3   ANA   E      CE     ACI D8         F9   SPHL
  23        INX H            4E     MOV C,M         79   MOY   A.C    A4   ANA   H      CF     RST 1          FA   jM     Adr
  24        INR H            4F     MOV C.A         7A   MOY   A.D    A5   ANA   L      DO     RNC            FB   EI
  25        DCR H            50     MOV D.B         7B   MOV   A.E    A6   ANA   M      D1     POP D          FC   CM     Adr
  26        MYI H,D8         51     MOV D.C         7C   MOV   A,H    A7   ANA   A      D2     INC Adr        FD   --
  27        DAA              52     MOY D,D         7D   MOV   A.L    A8   XRA   B      D3     OUT D8         FE   CPI D8
  28        --               53     MOY D.E         7E   MOY   A.M    A9   XRA   C      D4     CNC Adr        FF   RST 7
  29        DAD H            54     MOY D,H         7F   MOY   A,A    AA   XRA   D      D5     PUSH D
  2A        LHLD Adr         55     MOY D.L         80   ADD   B      AB   XRA   E      D6     SUI D8
  08 = constant. or logical/arithmetic expressIOn that evaluates     016   constant. or logical/arithmetic expression that evaluates
             to an 8 bit data quantity.                                     to a 16 bit data quantity
  Adr   ~   16-bit address

ALL MNEMONICS © 1974, 7975, 1976, 7977 INTEL CORPORA TfON
                                                                                                                                  A-5
Appendix A. Instruction :;ummary




 Instruction Sct Guidc

        Thc following IS    I   slIl11l11dry of thc IIlstrllclion sct:
                         ,ADD                                  ADI
                         ,A DC                                 ACI
                         SUB                                   SUI
                         S3B             REGM S                SBI        DS
                         ,ANA                                  ANI
                         >RA                                   XRI
                         eRA                                   ORI
                         CMP                                   CPI

                                   RLC RAL RRC
                                   RAR CMA DAA
                                       INR}
                                       DCR REGM 8

                    rlCCUMULATORI                      FLAGS             ISTC CMC                           HIGH           LOW
                                                                          INXi
MOV REGM 8 ,REGM S[                  B            I       C              1DCXJ REG 16                       STACK     I   POINTER
                    I   [            DIE                                 ~XCHG
                                                                                                                                          RST
      LXI REG 16 ,D 16 [             H  L
                                                                                          ,--------
                                                                                         jMP                  CALL                  RET
                                                                                    IC    jNCi               CC    CNCl          RC    RNCl
                                                                                                I
                                                                                    jZ
                                                                                    jP
                                                                                          jNZ
                                                                                          jM
                                                                                    JPE jPO
                                                                                                J       A
                                                                                                             CZ
                                                                                                          16 CP
                                                                                                             CPE
                                                                                                                   CNZ

                                                                                                                   CPO
                                                                                                                        A
                                                                                                                   CM > 16
                                                                                                                          J
                                                                                                                                 RZ
                                                                                                                                 RP
                                                                                                                                 RPE
                                                                                                                                       RNZ
                                                                                                                                       RM
                                                                                                                                       RPO
                                                                                                                                            J
                                             LHLDi                                                  I
  ~-"                                        STHDj A16                                         OUT P8
                                                                                                                    CONTROL
   LDAX BC DE
   STAX)   ,                                                              INPUT                                     INSTRUCTIONS
                                           MEMORY                                              OUTPUT
                                                                          PORTS                PORTS               RST
      LDA~                                                                                                         NOP
   STA)        A16                                                                                                 HLT
                                                                                                                   EI
      MVI      D8                                                                                                  DI
      MOV    REGM8,REGI~8                ---------                       PUSH   I                                  SIMI
                                           STACK              I-E-'--    POP    j    B,D,H,PSW                                8085 ONLY
                                                                                                                   RIM]
        CODE                      MEANING

        REGM 8                    The operand l11ay specify one of the 8-bit registers A,B,C,D,E,H, or L or M (a l11el11ol-y
                                  reference via the 16-bit address 111 the Hand L registers). The MOV instruction, which
                                  calls for two operands, can specify M for only one of Its operands_
                                  Designates 8·bit Il11mediatc operand.
                                  Designates a 16·bit address.
                                  Designates an 8·bit port number.
                                  Designates a -16·bit register pair (B&C,D&E,H&L,or SP).
                                  Designates a 16 -bit immediate operand.

ALL MNEMONICS © 1:174, 1975, 7976, 1977 INTEL CORPORA nON


A-6
APPENDIX B. ASSEMBLER DIRECTIVE SUMMARY

      Assembler directives are summarIZed alphabetically   In   this appendix. The following terms are used to describe
      the contents of directive fields.



NOTATION

                          Term                                        Interpretation

                 Expression                       Numerical expression evaluated during assembly: must evaluate
                                                  to 8 or 16 bits depending on directive issued.

                  List                            Series of symbolic values or expreSSions, separated by commas.

                 Name                             Symbol name terminated by a space.

                  Null                             Field must be empty or an error results.

                 Oplab                            Optional label; must be terminated by a colon.

                  Parameter                        Dummy parameters are symbols holding the place of actual
                                                   parameters (symbolic values or expressIOns) specified elsewhere
                                                   in the program.


                 String                            Series of any ASCII characters, surrounded by single quote marks.
                                                   Single quote within string is shown as two consecutive single quotes.

                 Text                              Series of ASCII characters.

      Macro definitions and calls allow the use of the special characters listed below.

                 Character                                             Function

                     &                             Ampersand. Used to concatenate symbols.

                                                   Angle brackets. Used to delimit text, such as lists, that contain
                                                   other delimiters.

                                                   Double semicolon. Used before a comment in a macro definition
                                                   to prevent inclusion of the comment in each macro expansion.

                                                   Exclamation point (escape character). Placed before a delimiter
                                                   to be passed as a literal in an actual parameter. To pass a literal
                                                   exclamation point, issue'!!.'


                     %                             Percent sign. Precedes actual parameters to be evaluated immediately
                                                   when the macro is called.

ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA nON

                                                                                                                           8-1
Appendix B. Assembler 0 :rective Summary




SUMMARY OF          DI~.ECTIVES


                             FORMAT                                           FUNCTION

         Label          Jpcode         Operand(s)

        oplab:          )8             exp(sl or string(sl   Define 8-bit data byte(s). Expressions must evaluate
                                                             to one byte.

         oplab:         )S             expression            Reserve data storage area of specified length.

         oplab:         )W             exp(sl or string(s)   Define 16·blt data word(s). Strings limited to 1-2
                                                             characters.

         oplab:         "LSE           null                  Conditional assembly. Code between ELSE and
                                                             ENDIF directives is assembled if expression in IF
                                                             clause is FALSE. (See IF.)

         oplab:         "ND            expression            Terminate assembler pass. Must be last statement of
                                                             program. Program execution starts at 'exp,' if present;
                                                             otherWise, at location O.

         oplab:         "NDIF          null                  Terminate conditional assembly block.


         name           "QU            expression            Define symbol 'name' with value 'exp.' Symbol is not
                                                             redefi nab Ie.


         oplab:         iF             expression            Assemble code between IF and following ELSE or
                                                             ENDIF directive if 'exp' is true.


         oplab:         )RG            expression            Set location counter to 'expression.'


         name           ;ET            expression            Define symbol 'name' with value 'expression.'
                                                             Symbol can be redefined.


MACRO DIRECTIV::S

                             FORMAT                                           FUNCTION

        Label          Opcode         Operand(s)

        null           I:NDM           null                  Terminate macro definition.

        oplab:         l:XITM         null                   Alternate terminator of macro definition. (See ENDM.)

        oplab:         IRP            dummy param,<lisO      Repeat instruction sequence, substituting one character
                                                             form 'list' for 'dummy param' in each iteration.


ALL MNEMONICS©7974, 7975, 7976, 7977 INTEL CORPORATION


8-2
Appendix B. Assembler Directive Summary




                    FORMAT                                       FUNCTION

      Label      Opcode      Operand(s)

      oplab:      IRPC       dummy param,text         Repeat instruction sequence, substituting one
                                                      character from 'text' for 'dummy param' in each
                                                      iteration.

      null        LOCAL      label name(s)            Specify label(s) in macro definition to have local
                                                      scope.

      name        MACRO      dummy param(s)           Define macro 'name' and dummy parameter(s) to be
                                                      used in macro definition.

      oplab:      REPT       expression               Repeat REPT block 'expression' times.



RELOCATION DIRECTIVES


                    FORMAT                                        FUNCTION

      Label      Opcode      Operand(s)

      oplab:      ASEG       null                     Assemble subsequent instructions and data in the
                                                      absol ute mode.

      oplab:     CSEG        boundary specification   Assemble subsequent instructions and data In the
                                                      relocatable mode using the code location counter.

      oplab:      DSEG       boundary specification   Assemble subsequent instructions and data in the
                                                      relocatable mode using the data location counter.

      oplab:      EXTRN      name(s)                  Identify symbols used in this program module but
                                                      defined in a different module.

      oplab:      NAME       module-name              ASSigns a name to the program module.

      oplab:      PUBLIC     name(s)                  Identify symbols defined in this module that are to
                                                      be available to other modules.

      oplab:      STKLN      expression               Specify the number of bytes to be reserved for the
                                                      stack for this module.




ALL MNEMONICS©7974, 7975, 7976, 7977 INTEL CORPORA TlON


                                                                                                              B-3
Intel 8080 8085 assembly language programming 1977 intel
APPENDIX           C. ASCII CHARACTER SET


                                              ASCII CODES
                The 8080 and 8085 usc the seven-bit ASCII code, with the high-order eighth bit
                (parity bitl always reset.

, GRAPHIC OR        ASCII               GRAPHIC OR           ASCII                 GRAPHIC OR          ASCII
   CONTROL      (HEXADECIMAL)            CONTROL         (HEXADECIMAL)              CONTROL        (HEXADECIMAL)
  NUL                 00                  +                     2B                  V                   56
  SOH                 01                                        2C                  W                   57
  STX                 02                                        2D                  X                   58
  ETX                 03                                        2E                  Y                   59
  EaT                 04                  I                     2F                  Z                   5A
  ENQ                 05                  0                     30                  [                   5B
  ACK                 06                  1                     31                                     5C
  BEL                 07                  2                     32                  1                   5D
  BS                  08                  3                     33                  i (t)              5E
  HT                  09                  4                     34                      (+-)            5F
  LF                  OA                  5                     35                  ,                   60
  VT                  OB                  6                     36                  a                   61
  FF                  OC                  7                     37                  b                   62
  CR                  OD                  8                     38                  c                   63
  SO                  OE                  9                     39                  d                   64
  SI                  OF                                        3A                  e                   65
  DLE                 10                                        3B                  f                   66
  DCl (X-ON)          11                  <                     3C                  9                   67
  DC2 (TAPE)          12                                        3D                  h                   68
  DC3 (X-OFF)         13                  >                     3E                  I                   69
  DC4 (+Afl8          14                                        3F                  J                   6A          I
  NAK                 15                  @                     40                  k                   6B
  SYN                 16                  A                     41                  I                   6C
  ETB                 17                  B                     42                  m                   6D
  CAN                 18                  C                     43                  n                   6E
  EM                  19                  D                     44                  0                   6F
  SUB                 lA                  E                     45                  P                   70
  ESC                 lB                  F                     46                  q                   71
  FS                  lC                  G                     47                  r                   72
  GS                  10                  H                     48                  s                   73
  RS                  lE                  I                     49                  t                   74
  US                  IF                  J                     4A                  u                   75
  SP                  20                  K                     4B                  v                   76
                      21                  L                     4C                  w                   77
                      22                  M                     4D                  x                   78
  #                   23                  N                     4E                  v                   79
  $                   24                  a                     4F                  z                   7A
                                                                                    I
  %                   25                  P                     50                                     7B
                      26                  Q                     51                  I                   7C
  &
                      27                  R                     52
                                                                                    , (ALT MODE)
                                                                                    I                   7D
                      28                  S                     53                  ~
                                                                                                        7E
                      29                  T                     54                  DEL (RUB OUT)       7F
                      2A                  U                     55




                                                                                                              C-1
Intel 8080 8085 assembly language programming 1977 intel
APPENDIX   D.

BINARY -DECIMAL-HEXADECIMAL CONVERSION TABLES.




                                                 D-l
Appendix D. BinarVMDecinal-Hexadecimal Conversion Tables




                               P<)WERS OF TWO
                                        n         ·n
                                    2        n   2
                                    1       o 1.0
                                    2       1 0.5
                                    4       2 0.25
                                    8       3 0.125
                                    16      4    0.062   5
                                    32      5    0.031   25
                                    64      6    0.015   625
                                   128      7    0.007   812 5
                                 256 8           0.003   906    25
                                 512 9           0.001   953    125
                               1 024 10          0.000   976    562 5
                               2 Cl48 11         0.000   488    281 25
                               4   096      12   0.000   244    140   625
                               8   192      13   0.000   122    070   312 5
                              16   384      14   0.000   061    035   156 25
                              32   768      15   0.000   030    517   578 125
                              65   536      16   0.000   015    258   789    062    5
                             131   072      17   0.000   007    629   394    531    25
                             262   144      18   0.000   003    814   697    265    625
                             524   288      19   0.000   001    907   348    632    812 5
                        1    048   576      20   0.000   000    953   674    316    406    25
                        2    097   152      21   0.000   000    476   837    158    203    125
                        4    194   304      22   0.000   000    238   418    579    101    5625
                        8    388   308      23   0.000   000    119   209    289    550    781 25

                        16   7?7 216 24 0.000 000               059   6Cl4   644    77 5   390   625
                        33   554 ~32 25 0.000 000               029   802    322    387    695   312 5
                        67   108 364 26 0000 000                014   901    161    193    847   656 25
                       134   217 728 27 0.000 000               007   450    580    596    923   828 125
                     268 435 ~56 28 0.000                000    003   725    290    298    461   914   062   5
                     536 870 :l12 29 0.000               000    001   862    645    149    230   957   031   25
                   1 073 741 324 30 0.000                000    000   931    322    574    615   478   515   625
                   2 147 483 548 31 0.000                000    000   465    661    287    307   739   257   812 5
                   4   294   967   296      32   0000    000    000   232    830    643    653   869   628   906   25
                   8   589   934   592      33   0000    000    000   116    415    321    826   934   814   453   125
                  17   179   869   184      34   0000    000    000   058    207    660    913   467   407   226   562 5
                  34   359   738   368      35   0.000   000    000   029    103    830    456   733   703   613   281 25
                  68   719   476 736 36 0.000 000               000   014    551    915    228   366   851   806   640   625
                 137   438   953 ~72 37 0.000 000               000   007    275    957    614   183   425   903   320   312 5
                 274   877   906 :l44 38 0.000 000              000   003    637    978    807   091   712   951   660   156 25
                 549   755   813 388 39 0.000 000               000   001    818    989    403   545   856   475   830   078 125
            1    099   511   627   776 40        0.000   000    000   000    909    494    701   772   928   237 915     039 062     5
            2    199   023   255   55241         0.000   00.0   000   000    4,,4   747    350   886   464   118957      519531      25
            4    398   046   511   104 42        0.000   000    000   000    227    373    675   443   232   059 478     759 765     625
            8    796   093   022   208 43        0.000   000    000   000    113    686    837   721   616   029 739     379 882     812 5
            17   592   186   044   41644         0.000   000    000   000    056    843 418      860 808     014   869   689   941 406      25
            35   184   372   088   332 45        0.000   000    000   000    028    421 709      430 404     007   434   844   970 703      125
            70   368   744   177   56446         0.000   000    000   000    014    210 854      715202      003   717   422   485 351      5625
           140   737   488   355   328 47        0.000   000    000   000    007    105427       357 601     001   858   711   242675       781 25
         281 474 976 710 556                48   0.000   000    000   000    003    552    713 678     800   500   929   355   621   337    890   625
         562 949 953 421 312                49   0.000   000    000   000    001    776    356 839     400   250   464   677   810   668    945   312 5
       1 125899906842 524                   50   0.000   000    000   000    000    888    178419      700   125   232   338   905   3Cl4   472   656 25
       2 251 799 813 685 248                51   0.000   000    000   000    000    444    089 209     850   062   616   169   452   667    236   328 125
       4   503   599   627   370   496 52        0.000   000    000   000    000    222 044      604   925   031 308     084   726   333 618      164   062 5
       9   007   199   254   740   992 53        0.000   000    000   000    000    111 022      302   462   515 654     042   363   166 809      082   031 25
      18   014   398   509   481   98454         0.000   000    000   000    000    055511       151   231   257827      021   181   583404       541   015625
      36   028   797   018   963   968 55        0.000   000    000   000    000    027 755      575   615   628 913     510   590   791 702      270   507 812 5
     72    057   594   037   927   936      56   0.000   000    000   000    000    013    877   787   807   814   456   755   295   395    851   135   253   906   25
    144    115   188   075   855   872      57   0.000   000    000   000    000    006    938   893   903   907   228   377   647   697    925   567   676   950   125
    288    230   376   151   711   744      58   0.000   000    000   000    000    003    469   446   951   953   614   188   823   848    962   783   813   476   562 5
    576    460   752   303   423   488      59   0.000   000    000   000    000    001    734   723   475   976   807   094   411   924    481   391   906   738   281 25
1   152    921   504   606   846   976      60   0000    000    000   000    000    000    867   361   737   988   403   547   205   962    240   695   953   369   140   625
2   305    843   009   213   693   952      61   0.000   000    000   000    000    000    433   680   868   994   201   773   602   981    120   347   976   684   570   312 5
4   611    686   018   427   387   904      62   0.000   000    000   000    000    000    216   840   434   497   100   886   801   490    560   173   988   342   285   156 25
9   223    372   036   854   775   808      63   0.000   000    000   000    000    000    108   420   217   248   550   443   400   745    280   086   994   171   142   578 125




D-2
Appendix D.   Binary~Decimal-Hexadecimal    Conversion Tables


                                          POWERS OF 16 (IN BASE 10)
                                    16"                                    16'"
                                      1      0   0.10000    00000    00000    00000      X     10
                                     16      1   0.62500    00000    00000    00000      X     10- 1
                                    256      2   0.39062    50000    00000    00000      X     10- 2
                              4     096      3   0.24414    06250    00000    00000      X     10- 3
                             65     536      4   0.15258    78906    25000    00000      X     10-4
                        1   048     576      5   0.95367    43164    06250    00000      X     10-6
                       16   777     216      6   0.59604    64477    53906    25000      X     10- 7
                      268   435     456      7   0.37252    90298    46191    40625      X     10-8
                  4   294   967     296      8   0.23283    06436    53869    62891      x     10-9
                 68   719   476     736      9   0.14551    91522    83668    51807      x     10- 10
         1      099   511   627     776     10   0.90949    47017    72928    23792      X     10- 12
        17      592   186   044     416     11   0.56843    41886    08080    14.870     X     10- 13
       281      474   976   710     656     12   0.35527    13678    80050    09294      X     10- 14
     4 503      599   627   370     496     13   0.22204    46049    25031    30808      X     10- 15
    72 057      594   037   927     936     14   0.13877    78780    78144    56755      X     10- 16
   152 921      504   606   846     976     15   0.86736    17379    88403    54721      X     10- 18




                                          POWERS OF 10 (IN BASE 16)

                             10"                           10'"
                                1     0     1.0000   0000     0000     0000
                                A     1     0.1999   9999     9999     999A
                               64     2     0.28F5   C28F     5C28     F5C3       x 16- 1
                              3E8     3     0.4189   374B     e6A7     EF9E       x 16 -2
                             2710     4     0.68oB   8BAC     710C     B296       x 16- 3
                     1      86AO      5     0.A7C5   AC47     lB47     8423       x 16- 4
                     F      4240      6     0.10C6   F7AO     B5EO     8037       x 16-4
                    98      9680      7     0.lA07   F29A     BCAF     4858       X   16- 5
                   5F5      El00      8     0.2AF3   lOC4     6118     73BF       x   16-6
                 3B9A       CAOO      9     0.44BB   2FAO     9B5A     52CC       x   16- 7
            2     540B      E400     10     0.6oF3   7F67     SEF6     EAoF       x   16-8
           17     4876      E800     11     O.AFEB   FFOB     CB24     AAFF       x   16- 9
           E8    o4A5        1000    12     0.1197   9981     20EA     1119       x   16-9
          918    4E72       AOOO     13     0.lC25   C268     4976     81C2       X   16- 10
        5AF3     107A       4000     14     0.2009   3700     4257     3604       x   16- 11
    3   807E     A4C6        8000    15     0.480E   BE7B     9058     5660       X   16- 12
   23    8652    6FCl        0000    16     0.734A   CA5F     6226     FOAE       x   16- 13
  163    4578    508A        0000    17     0.B877   AA32     36A4     B449       x   16- 14
 oEO    B6B3     A764        0000    18     0.1272   5001     0243     ABAl       X   16- 14
8AC7     2304    89E8        0000    19     0.1083   C94F     B602     AC35       X   16- 15



                                                                                                                        D-3
Appendix D. Binary-Declllal-Hexadecimal ConversIon Tables


                                HEXADECIMAL-DECIMAL INTEGER CONVERSION

The table below provide! for direct conversions between hexadecimal Integers In the range O-FFF and decimal integers In the
range 0-4095. For conVHSlon of larger Integers, the table values may be added to the following figures:

                                     Hexadecimal        Decimal       Hexadecimal         Decimal
                                       01000              4096           20000           131072
                                       02000              8192           30000           196608
                                       03000             12288           40000           262144
                                       04000             16384           50000           327 680
                                       05000             20480           60000           393216
                                       06000             24576           70000           458752
                                       07000             28672           80000           524288
                                       08000             32768           90000           589824
                                       09000             36864           AO 000          655360
                                       OA 000            40960           80000           720896
                                       OB 000            45056           CO 000          786432
                                       oe 000            49152           DO 000          851 968
                                       OD 000            53248           EO 000          917504
                                       OE 000            57344           FO 000          983040
                                       OF 000            61440          100000         1048576
                                       10000             65536          200000         2097152
                                        11 000           69632          300000         3 145728
                                       12000             73728          400000         4194304
                                        13000            77 824         500000         5242880
                                        14000            81920          600000         6291456
                                        15000            86016          700000         7340032
                                        16000            90112          800000         8388608
                                        17000            94208          900000         9437184
                                        18000            98304          AOO 000       10485760
                                        19000           102400          BOO 000       11 534336
                                       lAOOO            106496          COO 000       12 582912
                                       lB 000           110592          DOO 000       13631488
                                       leOOO            114688          EOO 000       14680064
                                       10 000           118784          FOO 000       15728640
                                        lE 000          122 880        1000000        16777216
                                       1F 000           126976         2000000        33554432

         0       1       2      3        4         5     6        7      8      9     A       B       e      D       E        F

 000   0000    0001   0002    0003      0004     0005   0006   0007    OOOB   0009   0010    0011    0012   0013   0014   0015
 010   0016    0017   0018    0019      0020     0021   0022   0023    0024   0025   0026    0027    0028   0029   0030   0031
 020   0032    0033   0034    0035      0036     0037   0038   0039    0040   0041   0042    0043    0044   0045   0046   0047
 030   0048    0049   0050    0051      0052     0053   0054   0055    0056   0057   0058    0059    0060   0061   0062   0063

 040   0064    0065   0066    0067      0068     0069   0070   0071    0072   0073   0074    0075   0076    0077   0078   0079
 050   0080    0081   0082    0083      0084     0085   00B6   0087    0088   0089   0090    0091   0092    0093   0094   0095
 060   0096    0097   0098    0099      0100     0101   0102   0103    0104   0105   0106    0107   0108    0109   0110   0111
 070   0112    0113   o 14    0115      0116     0117   0118   0119    0120   0121   0122    0123   0124    0125   0126   0127

 080   0128    0129   030     0131      0132     0133   0134   0135    0136   0137   0138    0139   0140    0141   0142   0143
 090   0144    0145   046     0147      0148     0149   0150   0151    0152   0153   0154    0155   0156    0157   0158   0159
 OAO   0160    0161   062     0163      0164     0165   0166   0167    0168   0169   0170    0171   0172    0173   0174   0175
 OBO   0176    0177   078     0179      0180     0181   0182   0183    0184   0185   0186    0187   0188    0189   0190   0191

 oeo   0192    0193   094     0195      0196     0197   0198   0199    0200   0201   0202    0203   0204    0205   0206   0207
 ODO   0208    0209   0:!10   0211      0212     0213   0214   0215    0216   0217   0218    0219   0220    0221   0222   0223
 OEO   0224    0225   0:!26   0227      0228     0229   0230   0231    0232   0233   0234    0235   0236    0237   0238   0239
 OFO   0240    0241   0:!42   0243      0244     0245   0246   0247    0248   0249   0250    0251   0252    0253   0254   0255


D-4
Appendix D. Binary-Decimal-Hexadecimal Conversion Tables

                           HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cant'dl
           0    1    2    3             4        5      6     7       8      9     A       B        C       D      E       F
100      0256 0257 0258 0259          0260     0261   0262   0263   0264   0265   0266    0267     0268   0269    0270   0271
110      0272 0273 0274 0275          0276     0277   0278   0279   0280   0281   0282    0283     0284   0285    0286   0287
120      0288 0289 0290 0291          0292     0293   0294   0295   0296   0297   0298    0299     0300   0301    0302   0303
130      0304 0305 0306 0307          0308     0309   0310   0311   0312   0313   0314    0315     0316   0317    0318   0319
 140    I 0320   0321   0322   0323   0324     0325   0326   0327   0328   0329   0330 0331        0331   0333    0334   0335
 150     0336    0337   0338   0339   0340     0341   0342   0343   0344   0345   0346 0347        0348   0349    0350   0351
 160     0352    0353   0354   0355   0356     0357   0358   0359   0360   0361   0362 0363        0364   0365    0366   0367
 170     0368    0369   0370   0371   0372     0373   0374   0375   0376   0377   0378 0379        0380   0381    0382   0383
 180     0384 0385 0386        0387   038l:l   0389   0390   0391   0392   0393   0394   0395     0396    0397    0398   0399
 190     0400 0401 0402        0403   0404     0405   0406   0407   0408   0409   0410   0411     0412    0413    0414   0415
 lAO     0416 0417 0418        0419   0420     0421   0422   0423   0424   0425   0426   0427     0428    0429    0430   0431
 lBO     0432 0433 0434        0435   0436     0437   0438   0439   0440   0441   0442   0443     0444    0445    0446   0447

 lCO
 lDO
        I 0448
          0464
                 0449
                 0465
                        0450 0451
                        0466 0467
                                      0452
                                      0468
                                               0453
                                               0469
                                                      0454
                                                      0470
                                                             0455
                                                             0471
                                                                    0456
                                                                    0472
                                                                           0457
                                                                           0473
                                                                                  0458
                                                                                  0474
                                                                                         0459
                                                                                         0475
                                                                                                  0460
                                                                                                  0476
                                                                                                          0461
                                                                                                          0477
                                                                                                                 0462
                                                                                                                 0478
                                                                                                                         0463
                                                                                                                         0479
 lEO     0480    0481   0482 0483     0484     0485   0486   0487   0488   0489   0490   0491     0492    0493   0494    0495
 lFO     0496    0497   0498 0499     0500     0501   0502   0503   0504   0505   0506   050"/    0508    0509   0510    0511

 200     0512 0513      0514 0515     0516     0517   0518   0519   0520   0521   0522   0523     0524    0525   0526    0527
 210    I 05280529      0530 0531     0532     0533   0534   0535   0536   0537   0538   0539     0540    0541   0542    0543
 220     0544 0545      0546 0547     0548     0549   0550   0551   0552   0553   0554   0555     0556    0557   0558    0559
 230     0560 0561      0562 0563     0564     0565   0566   0567   0568   0569   0570   0571     0572    0573   0574    0575
 240     0576    0577   0578 0579     0580     0581   0582   0583   0584   0585   0586   0587     0588    0589   0590    0591
 250     0592    0593   0594 0595     0596     0597   0598   0599   0600   0601   0602   0603     0604    0605   0606    0607
 260     0608    0609   0610 0611     0612     0613   0614   0615   0616   0617   0618   0619     0620    0621   0622    0623
 270     0624    0625   0626 0627     0628     0629   0630   0631   0632   0633   0634   0635     0636    0637   0638    0639
 280     0640 0641 0642        0643   0644     0645   0646   0647   0648   0649   0650   0651     0652    0653   0654    0655
 290     0656 0657 0658        0659   0660     0661   0662   0663   0664   0665   0666   0667     0668    0669   0670    0671
 2AO     0672 0673 0674        0675   0676     0677   0678   0679   0680   0681   0682   0683     0684    0685   0686    0687
 2BO     0688 0689 0690        0691   0692     0693   0694   0695   0696   0697   0698   0699     0700    0701   0702    0703
 2CO     0704 0705 0706        0707   0708     0709   0710   0711   0712   0713   0714   0715     0716    0717   0718    0719
 2DO     0720 0721 0722        0723   0724     0725   0726   0727   0728   0729   0730   0731     0732    0733   0734    0735
 2EO     0736 0737 0738        0739   0740     0741   0742   0743   0744   0745   0746   0747     0748    0749   0750    0751
 2FO     0752 0753 0754        0755   0756     0757   0758   0759   0760   0761   0762   0763     0764    0765   0766    0767

 300     0768 0769 0770        0771   0772     0773   0774   0775   0776   0777   0778   0779     0780    0781   0782    0783
 310     0784 0785 0786        0787   0788     0789   0790   0791   0792   0793   0794   0795     0796    0797   0798    0799
 320     0800 0301 0802        0803   0804     0805   0806   0807   0808   0809   0810   0811     0812    0813   0814    0815
 330     0816 0817 0818        0819   0820     0821   0822   0823   0824   0825   0826   0827     0828    0829   0830    0831
 340     0832    0833   0834   0835   0836     0837   0838   0839   0840   0841   0842   0843     0844    0845   0846    0847
 350     0848    0849   0850   0851   0852     0853   0854   0855   0856   0857   0858   0859     0860    0861   0862    0863
 360     0864    0865   0866   0867   0868     0869   0870   0871   0872   0873   0874   0875     0876    0877   0878    0879
 370     0880    0881   0882   0883   0884     0885   0886   0887   0888   0889   0890   0891     0892    0893   0894    0895
 380     0896    0897   0898   0899   0900     0901 0902 0903       0904   0905   0906   0907     0908    0909   0910    0911
 390     0212    0913   0914   0915   0916     0917 0918 0919       0920   0921   0922   0923     0924    0925   0926    0927
 3AO     0928    0929   0930   0931   0932     0933 0934 0935       0936   0937   0938   0939     0940    0941   0942    0943
 3BO     0944    0945   0946   0947   0948     0949 0950 0951       0952   0953   0954   0955     0956    0957   0958    0959
j3CO     0960 0961 0962 0963          0964     0965   0966   0967   0968 0969 0970 0971            0972   0973 0974 0975
  3DO    0976 0977 0978 0979          0980     0981   0982   0983   0984 0985 0986 0987            0988   0989 0990 0991
  3EO    0992 0993 0994 0995          0996     0997   0998   0999   1000 1001 1002 1003            1004   1005 1006 1007
1
i 3FO    1008 1009 1010 1011          1012     1013   1014   1015   1016 1017 1018 1019            1020   1021 1022 1023

                                                                                                                               D-5
Appendix O. Binarv-Oet   Imal~HexadecimaJ   Conversion Tables

                             HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cont'd)
       I
             0      1       2      3           4      5       6     7       8      9     A       B      C      0      E      F
 400       1024   1025    1026   1027        1028   1029    1030   1031   1032   1033   1034    1035   1036   1037   1038   1039
 410       1040   1041    1042   1043        1044   1045    1046   1047   1048   1049   1050    1051   1052   1053   1054   1055
 420       1056   1057    1058   1059        1060   1061    1062   1063   1064   1065   1066    1067   1068   1069   1070   1071
 430       1072   1073    1074   1075        1076   1077    1078   1079   1080   1081   1082    1083   1084   1085   1086   1087
 440       1088   1089    1090   1091        1092   1093    1094   1095   1096   1097   1098    1099   1100   1101   1102   1103
 450       1104   1105    1106   1107        1108   1109    1110   1111   1112   1113   1114    1115   1116   1117   1118   1119
 460       1120   1121    1122   1123        1124   1125    1126   1127   1128   1129   1130    1131   1132   1133   1134   1135
 470       1136   1137    1138   1139        1140   1141    1142   1143   1144   1145   1146    1147   1148   1149   1150   1151
 480       1152   1153    1154   1155        1156   1157    1158   1159   1160   1161   1162    1163   1164   1165   1166   1167
 490       1168   1169    1170   1171        1172   1173    1174   1175   1176   1177   1178    1179   1180   1181   1182   1183
 4AO       1184   1185    1186   1187        1188   1189    1190   1191   1192   1193   1194    1195   1196   1197   1198   1199
 4BO       1200   1201    1202   1203        1204   1205    1206   1207   1208   1209   1210    1211   1212   1213   1214   1215
 4CO       1216   1217    1218   1219        1220   1221    1222   1223   1224   1225   1226    1227   1228   1229   1230   1231
 400       1232   1233    1234   1235        1236   1237    1238   1239   1240   1241   1242    1243   1244   1245   1246   1247
 4EO       1248   1249    1250   1251        1252   1253    1254   1255   1256   1257   1258    1259   1260   1261   1262   1263
 4FO       1264   1265    1266   1267        1268   1269    1270   1271   1272   1273   1274    1275   1276   1277   1278   1279

 500       1280   1281    1282   1283        1284   1285    1286   1287   1288   1289   1290    1291   1292   1293   1294   1295
 510       1296   1297    1298   1299        1300   1301    1302   1303   1304   1305   1'306   1307   1308   1309   1310   1311
 520       1312   1313    1314   1315        1316   1317    1318   1319   1320   1321   1322    1323   1324   1325   1326   1327
 530       1328   1329    1330   1331        1332   1333    1334   1335   1336   1337   1338    1339   1340   1341   1342   1343
 540       1344   1345    1346   1347        1348   1349    1350   1351   1352   1353   1354    1355   1356   1357   1358   1359
 550       1360   1361    1362   1363        1364   1365    1366   1367   1368   1369   1370    1371   1372   1373   1374   1375
 560       1376   1377    1378   1379        1380   1381    1382   1383   1384   1385   1386    1387   1388   1389   1390   1391
 570       1392   1393    1394   1395        1396   1397    1398   1399   1400   1401   1402    1403   1404   1405   1406   1407
 580       1408   1409    1410   1411        1412   1413    1414   1415   1416   1417   1418    1419   1420   1421   1422   1423
 590       1424   1425    1426   1427        1428   1429    1430   1431   1432   1433   1434    1435   1436   1437   1438   1439
 5AO       1440   1441    1442   1443        1444   1445    1446   1447   1448   1449   1450    1451   1452   1453   1454   1455
 5BO       1456   1457    1458   1459        1460   1461    1462   1463   1464   1465   1466    1467   1468   1469   1470   1471
 5CO       1472   1473    1474   1475        1476   1477    1478   1479   1480   1481   1482    1483   1484   1485   1486   1487
 500       1488   1489    1490   1491        1492   1493    1494   1495   1496   1497   1498    1499   1500   1501   1502   1503
 5EO       1504   1505    1506   1507        1508   1509    1510   1511   1512   1513   1514    1515   1516   1517   1518   1519
 5FO       1520   1521    1522   1523        1524   1525    1526   1527   1528   1529   1530    1531   1532   1533   1534   1535
 600       1536   1537    1538   1539        1540   1541    154~ 1543     1544   1545   1546    1547   1548   1549   1550   1551
 610       1552   1553    1554   1555        1556   1557    1558 1559     1560   1561   1562    1563   1564   1565   1566   1567
 620       1568   1569    1570   1571        1572   1573    1574 1575     1576   1577   1578    1579   1580   1581   1582   1583
 630       1584   1585    1586   1587        1588   1589    1590 1591     1592   1593   1594    1595   1596   1597   1598   1599
 640       1600   1601    1602   1603        1604   1605    1606   1607   1608   1609   1610    1611   1612   1613   1614   1615
 650       1616   1617    1618   1619        1620   1621    1622   1623   1624   1625   1626    1627   1628   1629   1630   1631
 660       1632   1633    1634   1635        1636   1637    1638   1639   1640   1641   1642    1643   1644   1645   1646   1647
 670       1648   1649    1650   1651        1652   1653    1654   1655   1656   1657   1658    1659   1660   1661   1662   1663
 680       1664   1665    1666   1667        1668   1669    1670   1671   1672   1673   1674    1675   1676   1677   1678   1679
 690       1680   1681    1682   1683        1684   1685    1686   1687   1688   1689   1690    1691   1692   1693   1694   1695
 6AO       1696   1697    1698   1699        1700   1701    1702   1703   1704   1705   1706    1707   1708   1709   1710   1711
 680       1712   1713    1714   1715        1716   1717    1718   1719   1720   1721   1722    1723   1724   1725   1726   1727
 6CO       1728   1729    1730   1731        1732   1733    1734   1735   1736   1737 1738      1739   1740   1741   1742   1743
 600       1744   1745    1746   1747        1748   1749    1750   1751   1752   1753 1754      1755   1756   1757   1758   1759
 6EO       1760   1761    1762   1763        1764   1765    1766   1767   1768   1769 1770      1771   1772   1773   1774   1775
 6FO       1776   1777    1778   1779        1780   1781    1782   1783   1784   1785 1786      1787   1788   1789   1790   1791
D-6
Appendix D. Binarv-Decimal-Hexadecimal Conversion Tables

                          HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cont'd)
           0      1      2      3      4       5      6      7        8       9      A       B       C       0       E        F
    700   1792   1793   1794   1795   1796   1797   1798   1799     1800    1801   1802    1803     1804    1805   1806      1807
    710   1808   1809   1810   1811   1812   1813   1814   1815     1816    1817   1818    1819     1820    1821   1822      1823
    720   1824   1825   1826   1827   1828   1829   1830   1831     1832    1833   1834    1835     1836    1837   1838      1839
!   730   1840   1841   1842   1843   1844   1845   1846   1847     1848    1849   1850    1851     1852    1853   1854      1855
I
    740   1856   1857   1858   1859   1860   1861   1862   1863     1864    1865   1866    1867     1868    1869   1870      1871
    750   1872   1873   1874   1875   1876   1877   1878   1879     1880    1881   1882    1883     1884    1885   1886      1887
    760   1888   1889   1890   1891   1892   1893   1894   1895     1896    1897   1898    1899     1900    1901   1902      1903
    770   1904   1905   1906   1907   1908   1909   1910   1911     1912    1913   1914    1915     1911j   1917   1918      1919
    780   1920   1921   1922   1923   1924   1925   1926   1927     1928    1929   1930    1931     1932    1933   1934      1935
    790   1936   1937   1938   1939   1940   1941   1942   1943     1944    1945   1946    1947     1948    1949   1950      1951 1
    7AO   1952   1953   1954   1955   1956   1957   1958   1959     1960    1961   1962    1963     1964    1965   1966      1967
    7BO   1968   1969   1970   1971   1972   1973   1974   1975     1976    1977   1978    1979     1980    1981   1982      1983
    7CO   1984   1985   1986   1987   1988   1989   1990   1991     1992    1993   1994    1995     1996    1997   1998      1999
    700   2000   2001   2002   2003   2004   2005   2006   2007     2008    2009   2010    2011     2012    2013   2014      2015
    7EO   2016   2017   2018   2019   2020   2021   2022   2023     2024    2025   2026    2027     2028    2029   2030      2031
    7FO   2032   2033   2034   2035   2036   2037   2038   2039     2040    2041   2042    2043     2044    2045   2046      2047

    800   2048   2049   2050   2051   2052   2053   2054   2055     2056    2057   2058    2059     2060    2061   2062      2063
    810   2064   2065   2066   2067   2068   2069   2070   2071     2072    2073   2074    2075     2076    2077   2078      2079
    820   2080   2081   2082   2083   2084   2085   2086   2087     2088    2089   2090    2091     2092    2093   2094      2095
    830   2096   2097   2098   2099   2100   2101   2102   2103     2104    2105   2106    2107     2108    2109   2110      2111
  840     2112   2113   2114   2115   2116   2117   2118   2119     2120    2121   2122    2123     2124    2125   2126      2127
.850      2128   2129   2130   2131   2132   2133   2134   2135     2136    2137   2138    2139     2140    2141   2142      2143
  860     2144   2145   2146   2147   2148   2149   2150   2151     2152    2153   2154    2155     2156    2157   2158      2159
  870     2160   2161   2162   2163   2164   2165   2166   2167     2168    2169   2170    2171     2172    2173   2174      2175
    880   2176   2177   2178   2179   2180   2181   2182   2183     2184    2185   2186    2187     2188    2189   2190      2191
    890   2192   2193   2194   2195   2196   2197   2198   2199     2200    2201   2202    2203     2204    2205   2206      2207
    8AO   2208   2209   2210   2211   2212   2213   2214   2215     2216    2217   2218    2219     2220    2221   2222      2223
    8BO   2224   2225   2226   2227   2228   2229   2230   2231     2232    2233   2234    2235     2236    2237   2238      2239
    8CO   2240   2241   2242   2243   2244   2245   2246   2247     2248    2249   2250    2251     2252    2253   2254      2255
    800   2256   2257   2258   2259   2260   2261   2262   2263     2264    2265   2266    2267     2268    2269   2270      2271
    8EO   2272   2273   2274   2275   2276   2277   2278   2279     2280    2281   2282    2283     2284    2285   2286      2287
    8FO   2288   2289   2290   2291   2292   2293   2294   2295     2296    2297   2298    2299     2300    2301   2302      2303

    900   2304   2305   2306   2307   2308   2309   2310   2311     2312    2313   2314    2315     2316    2317   2318      2319
    910 2320     2321   2322   2323   2324   2325   2326   2327     2328    2329   2330    2331     2332    2333   2334      2335
    920 2336     2337   2338   2339   2340   2341   2342   2343     2344    2345   2346    2347     2348    2349   2350      2351
    930 I 2352   2353   2354   2355   2356   2357   2358   2359     2360    2361   2362    2363     2364    2365   2366      2367
1
    940   2368   2369   2370   2371   2372   2373   2374   2375     2376    2377   2378    2379     2380    2381   2382      2383
    950   2384   2385   2386   2387   2388   2389   2390   2391     2392    2393   2394    2395     2396    2397   2398      2399
    960   2400   2401   2402   2403   2404   2405   2406   2407     2408    2409   2410    2411     2412    2413   2414      2415
    970   2416   2417   2418   2419   2420   2421   2422   2423     2424    2425   2426    2427     2428    2429   2430      2431

    980   2432   2433   2434   2435   2436   2437   2438   2439     2440    2441   2442    2443    2444     2445   2446      2447
    990   2448   2449   2450   2451   2452   2453   2454   2455     2456    2457   2458    2459    2460     2461   2462      2463
    9AO   2464   2465   2466   2467   2468   2469   2470   2471     2472    2473   2474    2475    2476     2477   2478      2479
    980   2480   2481   2482   2483   2484   2485   2486   2487     2488    2489   2490    2491    2492     2493   2494      2495

    9CO   2496   2497   2498   2499   2500   2501   2502   2503     2504    2505   2506    2507    2508     2509   2510      2511
    900   2512   2513   2514   2515   2516   2517   2518   2519     2520    2521   2522    2523    2524     2525   2526      2527
    9EO   2528   2529   2530   2531   2532   2533   2534   2535     2536    2537   2538    2539    2540     2541   2542      2543
    9FO   2544   2545   2546   2547   2548   2549   2550   2551     2552    2553   2554    2555    2556     2557   2558      2559
                                                                                                                               0-7
Appendix D. Binary-Declmal-Hexadeclmal Conversion Tables

                             HEXADECIMAL·DECIMAL INTEGER CONVERSION (Cont'dl
         0        1      2       3       4       5      6    7            8      9      A       8     C      D      E      F
 Aoo    2560    2561    2562   2563    2564     2565   2566 2567         2568   2569   2570   2571   2572   2573   2574   2575
 Al0    2576    2577    2578   2579    2580     2581   2582 2583         2584   2585   2586   2587   2588   2589   2590   2591
 A20    2592    2593    2594   2595    2596     2597   2598 2599         2600   2601   2602   2603   2604   2605   2606   2607
 A30    2608    2609    2610   2611    2612     2613   2614 2615         2616   2617   2618   2619   2620   2621   2622   2623
 A40    2624    2625    2626   2627     2628    2629   2630       2631   2632   2633 2634 2635       2636   2637   2638   2639
 A50    2640    2641    2642   2643     2644    2645   2646       2647   2648   2649 2650 2651       2652   2653   2654   2655
 A60    2656    2657    2658   2659     2660    2661   2662       2663   2664   2665 2666 2667       2668   2669   2670   2671
 A70    2672    2673    2674   2675     2676    2677   2678       2679   2680   2681 2682 2683       2684   2685   2686   2687
 A80    2688    2689    2690   2691     2692    2693   2694 2695         2696   2697   2698   2699   2700   2701   2702   2703
 A90    2704    2705    2706   2707     2708    2709   2710 2711         2712   2713   2714   2715   2716   2717   2718   2719
 AAO    2720    2721    2722   2723     2724    2725   2726 2727         2728   2729   2730   2731   2732   2733   2734   2735
 ABO    2736    2737    2738   2739     2740    2741   2742 2743         2744   2745   2746   2747   2748   2749   2750   2751

 ACO 12752      2753    2754   2755     2756    2757   2758       2759   2760   4761   2762   2763   2764   2765   2766   2767
 ADO I 2768     2769    2770   2771     2772    2773   2774       2775   2776   2777   2778   2779   2780   2781   2782   2783
 AEO 2784       2785    2786   2787     2788    2789   2790       2791   2792   2793   2794   2795   2796   2797   2798   2799
 AFO 2800       2801    2802   2803     2804    2805   2806       2807   2808   2809   2810   2811   2812   2813   2814   2815

 BOO    2816    2817    2818   2819     2820    2821   2822       2823   2824   2825   2826   2827   2828   2829   2830   2831
 Bl0    2832    2833    2834   2835     2836    2837   2838       2839   2840   2841   2842   2843   2844   2845   2846   2847
 B20    2848    2849    2850   3851     2852    2853   2854       2855   2856   2857   2858   2859   2860   2861   2862   2863
 B30    2864    2865    2866   2867     2868    2869   2870       2871   2872   2873   2874   2875   2876   2877   2878   2879
 B40    2880    2881    2882   2883     2884    2885   2866 2887         2888   2889   2890   2891   2892   2893   2894   2895
 B50    2896    2897    2898   2899     2900    2901   2902 2903         2904   2905   2906   2907   2908   2909   2910   2911
 B60    2912    2913    2914   2915     2916    2917   2918 2919         2920   2921   2922   2923   2924   2925   2926   2927
 B70    2928    2929    2930   2931     2932    2933   2934 2935         2936   2937   2938   2939   2940   2941   2942   2943
 B80     2944   2945    2946   2947     2948    2949   2950       2951   2952   2953 2954 2955       2956   2957   2958   2959
 B90     2960   2961    2962   2963     2964    2965   2966       2967   2968   2969 2970 2971       2972   2973   2974   2975
 BAO     2976   2977    2978   2979     2980    2981   2982       2983   2984   2985 2986 2987       2988   2989   2990   2991
 BBO     2992   2993    2994   2995     2996    2997   2998       2999   3000   3001 3002 3003       3004   3005   3006   3007
 BCO     3008   3009    3010   3011     3012    3013   3014       3015   3016   3017   3018   3019   3020   3021   3022   3023
 BDO     3024   3025    3026   3027     3028    3029   3030       3031   3032   3033   3034   3035   3036   3037   3038   3039
 BEO     3040   3041    3042   3043     3044    3045   3046       3047   3048   3049   3050   3051   3052   3053   3054   3055
 BFO     3056   3057    3058   3059     3060    3061   3062       3063   3064   3065   3066   3067   3068   3069   3070   3071
                        ---
 COO     3072   3073    3074   3075     3076    3077   3078       3079   3080   3081   3082   3083   3084   3085   3086   3087
 Cl0     3088   3089    3090   3091     3092    3093   3094       3095   3096   3097   3098   3099   3100   3101   3102   3103
 C20     3104   3105    3106   3107     3108    3109   3110       3111   3112   3113   3114   3115   3116   3117   3118   3119
 C30     3120   3121    3122   3123     3124    3125   3126       3127   3128   3129   3130   3131   3132   3133   3134   3135
 C40     3136   3137    3138   3139     3140    3141   3142       3143   3144   3145   3146   3147   3148   3149   3150   3151
 C50     3152   3153    3154   3155     3156    3157   3158       3159   3160   3161   3162   3163   3164   3165   3166   3167
 C60     3168   3169    3170   3171     3172    3173   3174       3175   3176   3177   3178   3179   3180   3181   3182   3183
 C70     3184   3185    3186   3187     3188    3189   3190       3191   3192   3193   3194   3195   3196   3197   3198   3199
 C80     3200 3201      3202    3203    3204    3205   3206       3207   3208   3209 3210 3211       3212   3213   3214   3215
 C90     3216 3217      3218    3219    3220    3221   3222       3223   3224   3225 3226 3227       3228   3229   3230   3231
 CAO     3232 3233      3234    3235    3236    3237   3238       3239   3240   3241 3242 3243       3244   3245   3246   3247
 CBO     3248 3249      3250    3251    3252    3253   3254       3255   3256   3257 3258 3259       3260   3261   3262   3263
  CCO    3264    3265   3266    3267     3268   3269       3270   3271   3272   3273   3274   3275   3276   3277   3278   3279
  CDO    3280    3281   3282    3283     3284   3285       3286   3287   3288   3289   3290   3291   3292   3293   3294   3295
  CEO    3296    3297   3298    3299     3300   3301       3302   3303   3304   3305   3306   3307   3308   3309   3310   3311
  CFO    3312    3313   3314    3315     3316   3317       3318   3319   3320   3321   3322   3323   3324   3325   3326   3327

D-8
Appendix D. Binary-Declmal-Hexadecimal ConverSion Tables

                       HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cont'd)

       0     1       2    3        4      5      6      7      8       9      A       B        C      0       E      F
000   3328 3329     3330 3331     3332   3333   3334   3335   3336    3337   3338   3339     3340    3341   3342   3343
010   3344 3345     3346 3347     3348   3349   3350   3351   3352    3353   3354   3355     3356    3357   3358   3359
020   3360 3361     3362 3363     3364   3365   3366   3367   3368    3369   3370   3371     3372    3373   3374   3375
030   3376 3377     3378 3379     3380   3381   3382   3383   3384    3385   3386   3387     3388    3389   3390   3391
040   3392 3393 3394       3395   3396   3397 3398 3399       3400 3401      3402 3403       3404    3405 3406 3407
050   3408 3409 3410       3411   3412   3413 3414 3415       3416 3417      3418 3419       3420    3421 3422 3423
060   3424 3425 3426       3427   3428   3429 3430 3431       3432 3433      3434 3435       3436    3437 3438 3439
070   3440 3441 3442       3443   3444   3445 3446 3447       3448 3449      3450 3451       3452    3453 3454 3455
080   3456   3457   3458   3459   3460   3461   3462   3463   3464    3465   3466   3467     3468    3469   3470   3471
090   3472   3473   3474   3475   3476   3477   3478   3479   3480    3481   3482   3483     3484    3485   3486   3487
OAO   3488   3489   3490   3491   3492   3493   3494   3495   3496    3497   3498   3499     3500    3501   3502   3503
OBO   3504   3505   3506   3507   3508   3509   3510   3511   3512    3513   3514   3515     3516    3517   3518   3519
OCO   3520 3521 3522 3523         3524   3525   3526   3527   3528    3529   3530   3531     3532    3533   3534   3535
000   3536 3537 3538 3539         3540   3541   3542   3543   3544    3545   3546   3547     3548    3549   3550   3551
OEO   3552 3553 3554 3555         3556   3557   3558   3559   3560    3561   3562   3563     3564    3565   3566   3567
OFO   3568 3569 3570 3571         3572   3573   3574   3575   3576    3577   3578   3579     3580    3581   3582   3583
EOO   3584 3585 3586 3587         3588   3589   3590   3591   3592    3593   3594   3595     3596    3597 3598     3599
El0   3600 3601 3602 3603         3604   3605   3606   3607   3608    3609   3610   3611     3612    3613 3614     3615
E20   3616 3617 3618 3619         3620   3621   3622   3623   3624    3625   3626   3627     3E528   3629 3630     3631
E30   3632 3633 3634 3635         3636   3637   3638   3639   3640    3641   3642   3643     3644    3645 3646     3647
E40   3648   3649   3650 3651     3652   3653   3654   3655   3656    3657   3658 3659       3660    3661   3662   3663
E50   3664   3665   3666 3667     3668   3669   3670   3671   3672    3673   3674 3675       3676    3677   3678   3679
E60   3680   3681   3682 3683     3684   3685   3686   3687   3688    3689   3690 3691       3692    3693   3694   3695
E70   3696   3697   3698 3699     3700   3701   3702   3703   3704    3705   3706 3707       3708    3709   3710   3711
E80   3712   3713   3714   3715   3716   3717 3718 3719       3720    3721   3722   3723     3724    3725   3726   3727
E90   3728   3729   3730   3731   3732   3733 3734 3735       3736    3737   3738   3739     3740    3741   3742   3743
EAO   3744   3745   3746   3747   3748   3749 3750 3751       3752    3753   3754   3755     3756    3757   3758   3759
EBO   3760   3761   3762   3763   3764   3765 3766 3767       3768    3769   3770   3771     3772    3773   3774   3775
ECO   3776 3777 3778       3779   3780   3781 3782 3783       3784 3785 3786        3787     3788    3789   3790   3791
EOO   3792 3793 3794       3795   3796   3797 3798 3799       3800 3801 3802        3803     3804    3805   3806   3807
EEO   3808 3809 3810       3811   3812   3813 3814 3815       3816 3817 3818        3819     3820    3821   3822   3823
EFO   3824 3825 3826       3827   3828   3829 3830 3831       3832 3833 3834        3835     3836    3837   3838   3839
FOO   3840   3841   3842 3843     3844   3845 3846 3847       3848    3849   3850   3851     3852    3853   3854   3855
FlO   3856   3857   3858 3859     3860   3861 3862 3863       3864    3865   3866   3867     3868    3869   3870   3871
F20   3872   3873   3874 3875     3876   3877 3878 3879       3880    3881   3882   3883     3884    3885   3886   3887
F30   3888   3889   3890 3891     3892   3893 3894 3895       3896    3897   3898   3899     3900    3901   3902   3903
F40   3904   3905   3906   3907   3908   3909 3910 3911       3912    3913   3914   3915     3916    3917   3918   3919
F50   3920   3921   3922   3923   3924   3925 3926 3927       3928    3929   3930   3931     3932    3933   3934   3935
F60   3936   3937   3938   3939   3940   3941 3942 3943       3944    3945   3946   3947     3948    3949   3950   3951
F70   3952   3953   3954   3955   3956   3957 3958 3959       3960    3961   3962   3963     3964    3965   3966   3967
F80   3968 3969 3970 3971         3972   3973 3974 3975       3976 3977 3978 3979            3980    3981 3982 3983
F90   3984 3985 3986 3987         3988   3989 3990 3991       3992 3993 3994 3995            3996    3997 3998 3999
FAO   4000 4001 4002 4003         4004   4005 4006 4007       4008 4009 4010 4011            4012    4013 4014 4015
FBO   4016 4017 4018 4019         4020   4021 4022 4023       4024 4025 4026 4027            4028    4029 4030 4031
FCO   4032 4033 4034 4035         4036   4037   4038   4039   .4040   4041   4042 4043       4044    4045 4046 4047
FOO   4048 4049 4050 4051         4052   4053   4054   4055    4056   4057   4058 4059       4060    4061 4062 4063
FEO   4064 4065 4066 4067         4068   4069   4070   4071    4072   4073   4074 4075       4076    4077 4078 4079
FFO   4080 4081 4082 4083         4084   4085   4086   4087    4088   4089   4090 4091       4092    4093 4094 4095
                                                                                                                      0-9
Intel 8080 8085 assembly language programming 1977 intel
INDEX


Absolute symbols                                                 2-11. 2-16
Accumulator                                                        1-6. 1-7
Accumulator Instructions                                             _/-79
ACI Instruction                                                         3-2
ADC Instruction                                                         3-2
ADD Instruction                                                         3-4
ADI Instruction                                                        3-5
Addressing Modes                                                     .7-75
Addressing Registers                                                   1-7
ANA (AND) Instruction                                                · 3-6
AND Operator                                                         .2-73
ANI (AND Immediate) Instruction                                      · 3-7
Arithmetic Expression Operators                                      .2-12
Arithmetic Instructions                                              .7-77
ASCII Constant                                                          2-6
ASEG (Absolute Segment) Directive                                     ,4-74
Assembler. Need for                                                      1-3
Assembler Character Set                                                  2-1
Assembler Compared with PL/M                                             1-3
Assembler Function .                                                     1-1
Assembler Termination                                                 .4-70
Assembly-Time Expression Evaluation                                   .2-11
Auxiliary Carry Flag                                                  ,7-77
Auxiliary Carry Flag Setting - 8080/8085 Differences                 ./-72

Binary Data (Coding Rules)                                            · 2-6
blank (character)                                                     · 2-3
Branching Instructions                                           7-78. 7-22
Branch Table                                                          · 6-1
Byte Isolation Operations                                             .2-74

CALL Instruction                                                        3-8
Carry Flag .                                                          ./-/0
CC (Call if Carry) Instruction                                        .3-70
CM (Call if Minus) Instruction                                        .3-70
CMA (Complement Accumulator) Instruction                              ,3-ll
CMC (Complement Carry) Instruction                                    ,3-72
CMP (Compare) Instruction                                             .3-72
CNC (Call if no carry) Instruction                                    ,3-/4
CNZ (Call if not Zero) Instruction                                    .3-74
Combined Addressing Modes                                             .7-/6
Comment Field                                                         · 2-4
Compare Operators                                                     .2-/3
Comparing Complemented Data                                             2-8
Comparisons in Expressions                                            .2-13
Complement Used for Subtraction                                       · 2-7
Complemented Data                                                     · 2-8
Concatenation                                          5-10.5-11.5-15.5-16


                                                                               1-1
Condition Fla 5S                                             1-9
      Conditional /J ssembly                                       4-8
      CP (Call if I'ositlve) Instruction                          3-75
      CPE (Call if Parity Even) Instruction                       3-76
      CPI (Compan Immediate) Instruction                          3-76
      CPO (Call if Parity Odd) Instruction                        3-77
      CSEG (Code Segment) Directive                               4-75
      CZ (Call if ,~ero) Instruction .                            3-78

      DAA (Decim; I Adjust Accumulator) Instruction               3-78
      DAD (DoublE Register Add) Instruction                       3-20
      Data Access Example                                          4-7
      Data Definiti<n                                              4-3
      Data Descrtpt on Example                                     4-6
      Data for Subroutines                                          6-3
      Data Label                                                    2-5
      Data Transfer Instructions                                   7-76
      DB (Define Iiyte) Directive                                 .4-3
      DCR (DecrelT ent) Instruction                               3-20
      DCX (DecrelT ent Register Pair)                             3-22
      Decimal AddiCion Routine                                    6-12
      Decimal Data (Coding Rules)                                  2-5
      Decimal Subt 'action Routine                                6-14
      Delimiters                                                   2-2
      DI (Disable Interrupts) Instruction                   .3-22,3-60
      Direct Addre~ sing                                          7-75
      Divide (Soft', are Example)                                 6-9
      Division in Expressions                                     2-12
      DS (Define ~ torage) Directive                                4-5
      DSEG (Data Segment) Directive                               4-75
      Dummy Paralneters                                            5-4
      DW (Define Nord) Directive                                    4-4

      EI (Enable I:1terrupts) Instruction                         3-23
      ELSE Directi'e .                                              4-8
      END Directlv ~                                              4-70
      ENDIF Direclve                                                4-8
      ENDM (End Macro) Directive                      5-5,5-6,5-7,5-12
      EOT Directive                                                4-77
      EPROM                                                          1-5
      EQ Operator                                                  2-73
      EQU Directlv ~                                                4-2
      EXITM (Exit Macro) DireClive                                  5-9
      Expression E' aluatton                                       2-11
      Expression O,erators                                         2-11
      Expressions                                                   2-6
      Expressions. I'recedence of Operators                        2-75
      Expressions, ~ange of Values                                 2-75
      EXTRN Dire, tive . . .                                       4-77



1-2
GE Operator                                                    2-73
General Purpose Registers                                       7-7
GT Operator                                                    2-73

Hardware Overview                                                 1-5
Hexadecimal Data (Coding Rules)                                   2-5
HIGH Operator                                2-74, 3-2, 3-5, 3-7, 404
HLT (Halt) Instruction                           . . . . . . 3-24

IF Directive                                                     4-8
Immediate Addressing                                            7-75
Implied Addressing                                              7-75
IN (Input) Instruction                                  . 7-74, 3-24
INPAGE Reserved Word                                    ·4-74,4-75
Input/Output Ports                                              7-74
IN R (I ncrement) Instruction                                   3-25
Instruction Addressing Modes                                    7-75
Instruction Execution                                            1-9
Instruction Fetch                                                1-8
Instructlon Label                                                2-6
Instruction Naming Conventions                                  1-16
Instruction Set GUide                                           7-23
Instruction Summary                                      .1-19,7-23
Instruction Timing                                               3-7
Instructions as Operands                                         2-7
INTE Pin                                                        3-49
Internal Registers                                               1-6
Interrupt Subroutines                                            7-4
Interrupts                                                       7-1
Interrupts (8085)                                                1-24
INX (Increment Register Pair) Instructions                      3-26
IRP (Indefinite Repeat) Directive                   .5-8, 5-12,5-22
IRPC (Indefinite Repeat Character)                  .5-8,5-12,5-17

)C (J ump if Carry) Instruction                                3-26
JM (J ump if Minus) Instruction                                3-27
JMP (J ump) Instruction                                        3-28
JNC (Jump if no carry) Instruction                             3-28
JNZ (J ump if not zero) Instruction                            3-29
JP (Jump if Positive) Instruction                              3-29
JPE (Jump if parity Even)                                       3-30
JPO (J ump if parity Odd)                                       3-37
j Z (J ump if Zero) Instruction                                 3-32

Label Field                                                      2-3
Labels                                                           2-6
LDA (Load Accumulator Direct) Instruction                       3-32
LDAX (Load Accumulator Indirect)                                3-33




                                                                        1-3
LE OperatOl                                                    2-13
      LIB Prograrr                                                   4-12
      LHLD (Load L Direct) Instruction                               3-34
      LINK Progr; m                                       4-12,4-14,4-15
      Linkage                                                       4-16
      List File                                                       1-1
      LOCAL Dip-ctive                                                 5-5
      LOCAL Syrlbols                                                 5-6
      LOCATE Pr Jgram                               4-12,4-13,4-14,4-19
      Location Counter (Coding Rules)                                2-6
      Location Counter Control (Absolute Mode)                       4-77
      Location Counter Control (Relocatable Mode)                    4-74
      Logical Instr uctions                                          7-17
      Logical Instl uctions, Summary                                  3-6
      Logical Ope-a tors                                             2-13
      LOW Opera:or                                  2-74, 3-2, 3-5,3-7,4-4
      LT Operato                                                      2-13
      LXI (Load Register Pair Immediate)                             3-35

      Macros                                                           5-1
      Macro Calls                                                    5-12
      Macro Defir Ition                                                5-4
      MACRO Dir ective                                                5-4
      Macro Expa lSlon                                               5-15
      Macro Parar leters                                              5-5
      Macros verslls Subroutines                                       5-3
      Manual ProFamming                                                1-3
      Memory                                                           1-5
      Memory Management with Relocation                              4-72
      Memory REservation                                              4-5
      MEMORY I:eserved Word                                          4-19
      MOD Opera tor                                                  2-12
      Modular Pr<gramming                                            4-72
      MODULE [efault Name                                             4-17
      MOV (MovE) Instruction                                         3-36
      Multibyte P ddition Routines                                   6-11
      Multibyte S Jbtraction Routine                                 6-11
      Multiplicatiol in Expressions                                  2-12
      Multiply (Software Example)                                     6-7
      MVI (Move Immediate)                                           3-37


      NAME Dire;tive                                                 4-78
      NE Operatcr                                                    2-13
      Nested Maco Calls                                              5-14
      Nested Mac'o Definitions                                       5-12
      Nested Sub-outines                                             3-48
      Nine's Com~lement                                               2-7
      NOP (No Operation) Instruction                                 3-38




1-4
NOP    via MOV                                     . , , 3-36
NOT    Operator                                      . , 2-73
NUL    Operator                                    ,2-13.5-77
Null   Macros                                             5-16
Null   Parameter                                          5-11

Object Code                                                  7-2
Object File                                                  1-1
Octal Data (Coding Rules)                                    2-5
One's Complement                                            2-7
Opcode                                                       1-1
Opcode Field                                                 2-4
Operand Field                                                2-4
Operand Field (Coding Rules)                                 2-4
Operands                                                     2-5
Operators, Expression                                      2-11
OR Operator                                                2-73
ORG (Origin) Directive (Absolute Mode)                     4-77
ORG (Origin) Directive (Relocatable Mode)                4-76
ORA (Inclusive OR) Instruction                           3-38
OR! (Inclusive OR Immediate)                             3-40
OUT Instruction                                     1-14.3-47


PAGE Reserved Word                                 . 4 c74, 4-75
Parity Flag                                                 7-77
PCHL (Move H & L to Program Counter) Instruction          3-42
Permanent Symbols                                          2-11
PL/M                                                        1-3
PL/M Compared with Assembler                                1-3
POP Instruction                                           3-42
POP PSW instruction                                       3-43
Precedence of Expression Operators                        2-75
Processor Registers                                         1-9
Program Counter                                             1-6
Program linkage Directives                                4-76
Program listing                                             1-2
Program Status                                             1-13
Program Status Word (PSW)                                  7-74
Programming the 8085                                      1-24
PROM                                                       1-5
PSW                                                .7-74, 3-45
PUBLIC Directive                                          4-77
PUSH Instruction                                          3-44
PUSH PSW Instruction                                      3-45


RAM                                                         1-5
RAM versus ROM                                             4-6
RAL (Rotate Left through Carry) Instruction                3-45



                                                                   1-5
RAR (Rotte Right through Carry) Instruction                                  3-46
      RC (Retum if Carry) Instruction                                              3-47
      Redefinable Symbols                                                           2-11
      Register AddreSSing                                                           7-75
      Register Injirect Addressing                                                  7-76
      Register Pc ir Instructions                                                   7-27
      Register Pc irs                                                                1-7
      Relocatabili ty Defined                                                      4-72
      Relocatable Expressions                                               .2-76,2-79
      Relocatable Symbols                                                           2-11
      Relocation Feature                                                             1-2
      Reserved 5ymbols                                                               2-9
      RESET Si f nal                                                                3-24
      RET (Retl rn) Instruction                                                    3-48
      REPT DirE ctive                                    5-6,5-12,5-15,5-16,5-17,5-18
      RIM (Read Interrupt Mask) 8085 Instruction                                    3-48
      RLC (Rot, te Accumulator Left) Instruction                                    3-49
      RM (RetUi n if Minus) Instruction                                             3-50
      RNC (Retllrn if no Carry) Instruction                                         3-57
      RNZ (Retllrn if not Zero) Instruction                                         3-57
      ROM                                                                            1-5
      RP (Retur 1 if Positive) Instruction                                          3-52
      RPE (Retun if Parity Even) Instruction                                        3-52
      RPO (RetiTn if Parity Odd) Instruction                                        3-53
      RRC (Rot Ite Accumulator Right) Instruction                                   3-53
      RST (Restlrt) Instruction                                                     3-54
      RST5.5                                                     . 3-49, 3-55, 3-59, 3-60
      RST6.5                                                     . 3-49, 3-55, 3-59, 3-60
      RST7.5                                                       3-49, 3-55, 3-59, 3-60
      RZ (Return if Zero) Instruction                                                3-55

      Savings Program Status                                                        7-73
      SBB (Subtract with Borrow) Instruction                                        3-56
      SBI (Subtlact Immediate with Borrow) Instruction                              3-57
      Scope of Symbols                                                              2-10
      SET Direc:ive                                                                  4-3
      Shift Expression Operators                                                    2-12
      Shift Opel ations in Expressions                                              2-12
      SHL Oper.ltor                                                                 2-72
      SHLD (St"re H & L Direct) Instruction                                         3-58
      SHR Operltor                                                                  2-72
      Sign Flag                                                                     7-70
      SIM (Set Interrupt Mask) 8085 Instruction                                     3-59
      Software Divide Routine                                                        6-7
      Software I~ultiply Routine                                                     6-7
      Source Coje Format                                                             2-1
      Source Lilie Fields                                                            2-1
      Source Program File                                                            1-1
      SPHL (Mcve H & L to Stack Pointer) Instruction                                3-67




1-6
SP (Stack Pointer Register)                           3-35
STA (Store Accumulator Direct) Instruction            3-67
Stack                                                 7-7 2
Stack and Machine Control Instructions                1-19
Stack Operations                                      1-13
Stack Pointer                                         1-72
STACK Reserved Word                             4-79, 3-35
Start Execution Address                                4-10
STAX (Store Accumulator Indirect) Instruction          3-62
STC (Set Carry) Instruction                            3-63
STKLN Directive                                        4-18
SUB (Subtract) Instruction                             3-63
Subroutine Data                                         6-3
Subroutines                                     , 1;72, 3-9
Subroutines versus Macros                                5-3
Subtraction for Comparison                             3-12
SUI (Subtract Immediate) Instruction                   3-64
Symbol-Cross-Reference File                        1-1,1-3
Symbol Definition                                       4-2
Symbol Table                                             2-9
Symbol ic Addressing                                     2-9
Symbols                                                  2-9
Symbols, Absolute                                      2-11
Symbols (Coding Rules)                                   2-9
Symbols, Global                                        2-10
Symbols,   limited                                     2·10
Symbols,   Permanent                                   2·11
Symbols,   Redefinable                                 2-11
Symbols,   Relocatable                                 2-11
Symbols,   Reserved                                     2·9


TRAP Interrupt                                         3-54
Ten's Complement                                        2-7
Testing Relocatable Modules                            4-19
Timing Effects of Addressing Modes                     1·16
TRAP (8085)                                            3-23
Two's Complement Data                                   2-7


Use of Macros                                           5-1
Using Symbols for Data Access                           4-7


Val ue of ExpreSSions                                  2-15

What   is a Macro?                                       5·2
Word    Instructions                                   7·27
Word   Storage in Memory                                 4-4
Work    Registers                                        1-7




                                                               .7
XCHG (Excllange H & L with D & E) Instruction         3-65
        XOR Operator                                          2-73
        XRA (Exclu ;Ive OR) Instruction                       3-66
        XRI (Exclus ve OR Immediate) Instruction              3-67
        XTHL (Exciange H & L with Top of Stack) Instruction   3-69

        Zero Flag                                             7-77

        &    (ampepand)                                       5-10
        <> (angle brackets)                                   5-10
        CR (carriag = return character)                        2-2
             (colon)                                           2-2
             (comm.)                                           2-2
             (doubk semicolon)                                5-10
             (divlslo 1) Operator                             2-12
             (excian ation pOint)                             5-10
         HT (horizo ltal tab character)                        2-2
             (minus) Operator                                 2-12
        * (multiplication) Operator                           2-12
         ( ) (parent 1eses)                                    2-2
        +    (plus) Operator                                  2-12
      ??nnnn Svmbo s                                           5-5
             (semic( Ion)                                      2-2
             (single quote)                                    2-2
      space  (charac .er)                                      2-2

        8080/8085 !)ifferences                                7-24
        8085 Featul es                                        1-24
        8085 Proces ;or                                       7-24
        8085 Programming                                      1-24




1-8
NOTES
Intel 8080 8085 assembly language programming 1977 intel
NOTES
Intel 8080 8085 assembly language programming 1977 intel

More Related Content

PPTX
Risc cisc Difference
PPTX
Instruction codes
PPTX
Microprogrammed Control Unit
PPTX
2. block diagram and components of embedded system
PPT
STLD-Combinational logic design
PPTX
RISC Vs CISC Computer architecture and design
PPTX
Micro operation control of processor
PPTX
Lecture 4 process cpu scheduling
Risc cisc Difference
Instruction codes
Microprogrammed Control Unit
2. block diagram and components of embedded system
STLD-Combinational logic design
RISC Vs CISC Computer architecture and design
Micro operation control of processor
Lecture 4 process cpu scheduling

What's hot (20)

PPTX
Arithmetic micro operations
PPTX
Root file system
PPTX
Nested queries in database
PPTX
Instruction set of 8086
PPTX
Register presentation
PPTX
8. transactions
PPTX
memory Interleaving and low order interleaving and high interleaving
PPTX
Bcd arithmetic instructions
PPTX
OS disk structure (1).pptx
PPTX
instruction format and addressing modes
DOCX
Bus stucture
PPT
Normalisation - 2nd normal form
PPTX
Floating point arithmetic operations (1)
PPTX
Unit 3 CO.pptx
PPTX
Database abstraction
PDF
Unit 2
PDF
8086 Microprocessor
PPTX
Computer arithmetic
PPTX
Operating System-Memory Management
Arithmetic micro operations
Root file system
Nested queries in database
Instruction set of 8086
Register presentation
8. transactions
memory Interleaving and low order interleaving and high interleaving
Bcd arithmetic instructions
OS disk structure (1).pptx
instruction format and addressing modes
Bus stucture
Normalisation - 2nd normal form
Floating point arithmetic operations (1)
Unit 3 CO.pptx
Database abstraction
Unit 2
8086 Microprocessor
Computer arithmetic
Operating System-Memory Management
Ad

Viewers also liked (16)

PDF
207867767 fernando-orozco-d-analisis-quimico-cuantitativo
PDF
PPTX
Analysis optimization and monitoring system
PDF
Fogler elements of chemical reaction engineering 3rd
PDF
The book of the art of Cennino Cennini
PDF
Hot Typography SMPS Pacific Regional Conference
PDF
Compu pro 8085 8088 cpu
PDF
Handbook of mechanical engineering calculations
PDF
Oxford dictionary earth science
PDF
Gestion estrategica planificada
PDF
Total english -_elementary
PDF
Differential equations
PDF
13986149 c-pgming-for-embedded-systems
PDF
Standard embedded c
PDF
Curso microcontroladores pic no mp lab 8
207867767 fernando-orozco-d-analisis-quimico-cuantitativo
Analysis optimization and monitoring system
Fogler elements of chemical reaction engineering 3rd
The book of the art of Cennino Cennini
Hot Typography SMPS Pacific Regional Conference
Compu pro 8085 8088 cpu
Handbook of mechanical engineering calculations
Oxford dictionary earth science
Gestion estrategica planificada
Total english -_elementary
Differential equations
13986149 c-pgming-for-embedded-systems
Standard embedded c
Curso microcontroladores pic no mp lab 8
Ad

Similar to Intel 8080 8085 assembly language programming 1977 intel (20)

PDF
9800301 04 8080-8085_assembly_language_programming_manual_may81
PDF
8080 8085 assembly language_programming manual programando
PDF
8085 intel alp_manual_may81
PDF
PDF
20838382 microprocessor-8085-notes
PDF
Download
PPT
A microprocessor is the main component of a microcomputer system and is also ...
PDF
Modul PLC Programming.pdf
PDF
Micro overview
PDF
Siemens s7 300-400-standard software for s7-300 and s7-400 standard functions...
PDF
20838382 microprocessor-8085-notes
PDF
DB2 Systems Programming Tools of the Trade NA07B03
DOCX
c++
DOCX
EE6502 Microprocessor and Microcontroller
PDF
full 8085-microprocessor-question-bank.pdf
DOCX
PDF
Instruction set of intel 8085 microprocessor
9800301 04 8080-8085_assembly_language_programming_manual_may81
8080 8085 assembly language_programming manual programando
8085 intel alp_manual_may81
20838382 microprocessor-8085-notes
Download
A microprocessor is the main component of a microcomputer system and is also ...
Modul PLC Programming.pdf
Micro overview
Siemens s7 300-400-standard software for s7-300 and s7-400 standard functions...
20838382 microprocessor-8085-notes
DB2 Systems Programming Tools of the Trade NA07B03
c++
EE6502 Microprocessor and Microcontroller
full 8085-microprocessor-question-bank.pdf
Instruction set of intel 8085 microprocessor

Recently uploaded (20)

PDF
RMMM.pdf make it easy to upload and study
PDF
VCE English Exam - Section C Student Revision Booklet
PPTX
202450812 BayCHI UCSC-SV 20250812 v17.pptx
PPTX
GDM (1) (1).pptx small presentation for students
PPTX
Presentation on HIE in infants and its manifestations
PDF
01-Introduction-to-Information-Management.pdf
PPTX
Pharmacology of Heart Failure /Pharmacotherapy of CHF
PDF
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
PDF
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
PPTX
master seminar digital applications in india
PDF
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
PPTX
PPT- ENG7_QUARTER1_LESSON1_WEEK1. IMAGERY -DESCRIPTIONS pptx.pptx
PDF
Abdominal Access Techniques with Prof. Dr. R K Mishra
PDF
Chinmaya Tiranga quiz Grand Finale.pdf
PDF
FourierSeries-QuestionsWithAnswers(Part-A).pdf
PDF
Classroom Observation Tools for Teachers
PPTX
Introduction-to-Literarature-and-Literary-Studies-week-Prelim-coverage.pptx
PPTX
Lesson notes of climatology university.
PDF
O7-L3 Supply Chain Operations - ICLT Program
PDF
2.FourierTransform-ShortQuestionswithAnswers.pdf
RMMM.pdf make it easy to upload and study
VCE English Exam - Section C Student Revision Booklet
202450812 BayCHI UCSC-SV 20250812 v17.pptx
GDM (1) (1).pptx small presentation for students
Presentation on HIE in infants and its manifestations
01-Introduction-to-Information-Management.pdf
Pharmacology of Heart Failure /Pharmacotherapy of CHF
Black Hat USA 2025 - Micro ICS Summit - ICS/OT Threat Landscape
OBE - B.A.(HON'S) IN INTERIOR ARCHITECTURE -Ar.MOHIUDDIN.pdf
master seminar digital applications in india
Saundersa Comprehensive Review for the NCLEX-RN Examination.pdf
PPT- ENG7_QUARTER1_LESSON1_WEEK1. IMAGERY -DESCRIPTIONS pptx.pptx
Abdominal Access Techniques with Prof. Dr. R K Mishra
Chinmaya Tiranga quiz Grand Finale.pdf
FourierSeries-QuestionsWithAnswers(Part-A).pdf
Classroom Observation Tools for Teachers
Introduction-to-Literarature-and-Literary-Studies-week-Prelim-coverage.pptx
Lesson notes of climatology university.
O7-L3 Supply Chain Operations - ICLT Program
2.FourierTransform-ShortQuestionswithAnswers.pdf

Intel 8080 8085 assembly language programming 1977 intel

  • 2. The inforrm.tion in this document is subje<;t to ~nge without notK:e. Intel Corpor<ltion rm.kes no wuunty of <lny kind with reprd to this rm.teri.lJ, includi,., but not limited to, the implMld varnnttes of merch<lnubility <lnd fitness for <l ~rticul .... purpose. Intel Corpor<ltion HSUrnes no responsibWity for <lny errors that ma.y <lppur in this doc::ument. Intel Corpor<ltion rNkes no c.ornmitment to upd<t.te nor to keep current the inforrm.tion conuined in this document. The softwMe described in this document is furnished under <l Ik.ense ';lOd rNy be u~ or copied only in iGCOrcRnu with the terms of such lK:enst. Intel Cofporiltion <lSsurnes no responsibility for the use or reli<lbility of its softw<lre on equipment tNt is not suppUed by Intel. No p<lrt of this doc::ument rm.y be copied or reproduud in any form or by ilny muns without the prklr written consent of Intel Corpoutt<m. The f~lowing <lre trademMks of Intel Corpoution <lnd rm.y be used only to desc.ribe Intel products: ICE-30 LIBRARY MANAGER ICE-48 MCS ICE-SO MEGACHASSIS ICE-8S MICROMAP INSITE MUlTIBUS INTEL PROMPT INTEllEC UPI
  • 3. I ---------------,1 r-I 8080/8085 ASSEMBLY LANGUAGE PROGRAMMING MANUAL Copyright © 1977,1978 Intel Corporation Intel Corporation, 3065 Bowers Avenue, Santa Clara, California 95051
  • 5. PREFACE This manual describes programming with Intel's assembly language. It will not teach you how to program a computer. Although this manual is designed primarily for reference, It also contains some instructional matenal to help the beginning programmer. The manual is organized as follows: Chapter 1. ASSEMBLY LANGUAGE AND PROCESSORS Description of the assembler Overview of 8080 hardware and instruction set Description of 8080(8085 differences Chapter 2. ASSEMBLY LANGUAGE CONCEPTS General assembly language coding rules Chapter 3. INSTRUCTION SET Descriptions of each instruction (these are listed alphabetically for quick reference) Chapter 4. ASSEMBLER DIRECTIVES Data definition Conditional assembly Relocation Chapter 5. MACROS Macro directives Macro examples Chapter 6. PROGRAMMING TECHNIQUES Programming examples Chapter 7, INTERRUPTS Description of the Interrupt system. Chapters 3 and 4 will fill most of the experienced programmer's reference requirements. Use the table of contents or the index to locate information quickly, The beginning programmer should read Chapters 1 and 2 and then skip to the examples in Chapter 6. As these examples raise questions, refer to the appropriate information in Chapter 3 or 4. Before writing a program, you will need to read Chapter 4. The 'Programming Tips' in Chapter 4 are intended especially for the beginning programmer. iii
  • 6. RELATED PUBLICATIONS To use your Intellec development system effectively, you should be familiar with the following Intel publications: ISIS-II 8080/8085 IAACRO ASSEMBLER OPERATOR'S MANUAL, 9800292 When you activate the assembler, you have the option of specifying a number of controls. The operator's manual descriJes the activation sequence for the assembler. The manual also describes the debugging tools and the error messages supplied by the assembler. ISIS-II SYSTEM U~;ER'S GUIDE, 9800306 User program; are commonly stored on diskette files. The ISIS-II User's GUide describes the use of the text editor for entering and maintaining programs. The manual also describes the procedures for linking and locating reloc Itable program modules. Hardware Referenc~s For addition21 information about processors and their related components, refer to the appropriate User's Manual: 8080 MICROCOMPUTER SYSTEMS USER'S MANU,A,L, 9800153 8085 MICROCOMPUTER SYSTEMS USER'S MANUAL, 9800366 iv
  • 7. TABLE OF CONTENTS Chapter 1. ASSEMBLY LANGUAGE AND PROCESSORS 1-1 Introduction 1-1 What Is An Assembler? 1-1 What the Assembler Does 1-1 Oblect Code 1-2 Program Listing 1-2 Symbol-Cross-Reference Listing 1-3 Do You Need the Assembler? 1-3 Overview of 8080/8085 Hardware 1-5 Memory 1-5 ROM 1-5 RAM 1-5 Program Counter 1-6 Work Registers 1-7 Internal Work Registers 1-9 Condition Flags 1-9 Carry Flag 1-10 Sign Flag 1-10 Zero Flag 1-11 Parity Flag 1-11 Auxiliary Carry Flag 1-11 Stack and Stack Pointer 1-12 Stack Operations 1-13 Saving Program Status 1-13 Input/Output Ports . 1-14 Instruction Set 1-15 Addressing Modes 1-15 Implied Addressing 1-15 Register Addressll1g 1-15 Immediate Addressll1g 1-15 Direct Addressll1g 1-15 Register Indirect Addressing 1-16 Combined Addressing Modes 1-16 Ti mll1g Effects of Addressll1g Modes 1-16 Instruction Namll1g Conventions 1-16 Data Transfer Group 1-16 Arithmetic Group 1-17 Logical Group 1-17 Branch Group 1-18 Stack, I/O, and Machine Control Instructions 1-19 Hardware/Instruction Summary 1-19 Accumulator Instructions 1-19 Register Pair (Word) Instructions 1-21 Branching Instructions 1-22 Instruction Set Guide 1-23 v
  • 8. 8085 Proc ~ssor Differences 1-24 Pr )gramming for the 8085 1-24 Cc nditional Instructions 1-25 Chapter 2. ASSEMIIL Y LANGUAGE CONCEPTS 2-1 Introdu( tion 2-1 Source Line Format 2-1 Garacter Set 2-1 Delimiters 2-2 Label/Name Field 2-3 Ol'code Field 2-4 Or'erand Field 2-4 Cc mment Field 2-4 Coding Operand Field Information 2-4 He xadecimal Data 2-5 Decimal Data 2-5 O( tal Data 2-5 Bilary Data 2-5 Lc cation Counter 2-6 A~,CII Constant 2-6 Labels Assigned Values 2-6 Labels of Instruction or Data 2-6 E> pressions 2-6 In ;tructions as Operands 2-7 R( gister-Type Operands 2-7 Two's Complement Representation of Data 2-7 Symbol~ and Symbol Tables 2-9 Sy mbol ic Addressing 2-9 Sy mbolic Characteristics 2-9 Reserved, User-Defined, and Assembler-Generated Symbols 2-9 Global and Limited Symbols 2-10 Permanent and Redefinable Symbols 2-11 Absolute and Relocatable Symbols 2-11 Assembl I-Time Expression Evaluation 2-11 Or erators 2-11 Arithmetic Operators 2-12 Shift Operators 2-12 Logical Operators 2-13 Compare Operators 2-13 Byte Isolation Operators 2-14 Pe 'missible Range of Values 2-15 Pr"cedence of Operators 2-15 Rdocatable Expressions . 2-16 Cllaining of Symbol Definitions 2-18 Chapter 3. INSTRlCTION SET 3-1 How tc Use this Chapter 3-1 Timing Information 3-1 In ;tructions are listed in alphabetical order vi
  • 9. Oupter 4. ASSEMBLER DIRECTIVES 4-1 Symbol Definition 4-2 EQU Directive 4-2 SET Directive 4·3 Data Definition 4-3 DB Directive 4·3 OW Directive 44 Memory Reservuion 4-5 OS Directive 4-5 Programming Til»; D.Ha Description and Access 4-6 R.mdom Acee..s Versus ReAd Only Memory 4-6 Dua Desuiption 4-6 O.. ta Access 4-6 Add Symbols for DaLli Access 4-7 Conditional Assembly 4-8 IF, ELSE, ENDIF Directives 4-8 Assembler Termination 4-10 END Directive 4-10 Location Counter Control and Relocation 4-11 location Counter Control (Non·Rcloc.aubic Mode) 4-11 ORG Directive 4-11 Introduction to Rdocatability 4-12 Memory Management 4-12 Modular ProgrOlm Development 4-12 Directives Used for Relocation 4-14 location Counter Conlrol (Reloc<l.table Programs) 4-14 ASEG Directive 4-14 CSEG Directive 4-15 OSEG Directi"e 4-15 ORG Directive (Relocatable Mode) 4-16 Program linkage Directives 4-16 PUBLIC Directive 4-17 EXTRN Directive 4-17 NAME Directive 4-18 STKLN Directive 4-18 STACK and MEMORY Reserved Words 4-19 Programming Tips: Testing Relocatable Modules 4-19 Init~1ilation Routines 4-19 Input/Output 4-20 Remove Coding Used for Testing 4-20 Chapter S. MACROS 5·1 Introduction to Macros 5·1 Why Us.e Macros? 5-1 Wha t Is A Macro! 5-1 Macros Vs. Subroutines 5-3 vii
  • 10. Lking M.cros 5-3 MUfo Definition S·) M.cro Ddinition Directi~s S4 MACRO Directj~ S4 ENOM Oirectiw: S-5 LOCAL Oirel.livc S·S REPT Dircllive S~ IRP Directive S·8 IRPC Directive S-8 EXITM Directive S·9 Sp«i~1 M~CfO (Jpft.ators S·IO Nested "bero Definitions S·12 MOlCr~ DU 5·12 Muro DII fOflTWt S·12 Nested M~uo ulls S·I' M.u..ru E).p4n,iun S·IS Null M.cros S·16 s.ample Macros .1·16 Ch.tptt'r 6. PRCXiRAMMING TECHNIQUES 6· Brlinch T.. oles P~udo·Subroutine 6- lr.. mlt'rrinl DOll. [0 Subroutine . 6·) Soflw.;ue Multiply lind Di"i~ .6·7 Multibyte Addition .nd SublrliCiion 6-11 DecirTldl Addition 6·2 Oecimal SubU,t..:tlon 6-14 Ch .. pter 7.INTERRUPTS 7· Interrupt ConcepH 7· Writing Interrupt Subroutint's 7·4 Ap~ndix A INSTRUCTIO SUMMARY A· Appcndi). 8 ASSEMBLER DIRECTIVE SUMMARY B·I Appendix C ASCII CHARACTE R SET C.I Appendi). 0 BINARY·DECIMAL·HEXADECIMAL CONVERSION TABLES· 0·1 viii
  • 11. LIST OF ILLUSTRATIONS Figure 1-1 ASSEMBLER OUTPUTS 1-2 1-2 COMPARISON OF ASSEMBLY LANGUAGE WITH PL/M 1-4 1-3 8080{8085 INTERNAL REGISTERS 1-6 1-4 INSTRUCTION FETCH 1-8 1-5 EXECUTION OF MOV M,C INSTRUCTION 1-9 ix
  • 13. 1. ASSEMBLY LANGUAGE AND PROCESSORS INTRODUCTION Almost every line of source coding in an assembly language source program translates directly into a machine instruction for a particular processor. Therefore, the assembly language programmer must be familiar with both the assembly language and the processor for which he is programming. ' The first part of this chapter describes the assembler. The second part describes the features of the 8080 micro- processor from a programmer's point of view. Programming diffel'ences between the 8080 and the 8085 micro- processors are relatively minor. These differences are described in a short section at the end of this chapter. WHAT IS AN ASSEMBLER? An assembler IS a software tool - a program - deSigned to simplify the task of Writing computer programs. If you have ever written a computer program directly in a machine-recognizable form such as binary or hexadecimal code, you will appreciate the advantages of programming in a symbolic assembly language, Assembly language operation codes (opcodes) are easily remembered (MOY for move instructions, JMP for jump). You can also symbolically express addresses and values referenced in the operand field of instructions. Since you assign these names, you can make them as meaningful as the mnemonics for the instructions. For example, if your program nust manipulate a date as data, you can assign it the symbolic name DATE. If your program contains a set of instructions used as a timing loop (a set of instructions executed repeatedly until a specific amount of time has passed), you can name the instruction group TIMER. What the Assembler Does To use the assembler, you first need a source program. The source program consists of programmer-written assembly language instructions. These instructions are written using mnemonic opcodes and labels as described previously. Assembly language source programs must be in a machine-readable form when passed to the assembler. The Intellec development system includes a text editor that will help you maintain source programs as paper tape files or diskette files. You can then pass the resulting source program fife to the assembler. (The text editor is described in the ISIS-II System User's GUide.) The assembler program performs the clerical task of translating symbolic code into ob/ect code which can be executed by the 8080 and 8085 microprocessors. Assembler output consists of three possible files: the object fife containing your program translated into object code; the list file printout of your source code, the assembler- generated object code, and the symbol table; and the symbol-crass-reference file, a listing of the symbol-cross- reference records. 1-1
  • 14. Chapter 1. Assembly Lan)~uage and Processors OBJECT FILE SOU<.CE ASSEMBLER PROGRAM PROGRAM FIl.E PROGRAM ~ LISTING ~ CROSS REFERENCE LISTING Figure 1-1. Assembler Outputs Oblect Code For most mlcrxomputer applications, you probably will eventually load the oblect program into some form of read only men ory, However, do not forget that the Intellec development system IS an 8080 microcomputer system with raldom access memory, In most cases you can load and execute your oblCct program on the development s"stem for teSlJng and debugging, TIllS allows you to test your program before your prototype application sys:em IS fully developed, A special featu,'e of this assembler IS that it allows you to request oblect code In a relocatable format. This frees the programm( r from worrYing about the eventual mix of read only and random access memory In the application system; indivicual porlJons of the program can be relocated as needed when the application design is final. Also, a lal'ge progranl can be broken Into a number of separately assembled modules, Such modules are both easier to code and to te;t, See Chapter 4 of this manual for a more thorough description of the advantages of the relocation feature, Program Listing The program liitlng prOVides a permanent record of both the source program and the object code, The assembler also provides diagnostic messages for common programming errors in the program listing. For example, if you specify al6-bl value for an InstruclJon that can use only an 8-blt value, the assembler tells you that the value exceeds the pe'missible range. 1-2
  • 15. Chapter 1. Assembly Language and Processors Symbol-Crass-Reference Listing The symbol-crass-reference listing is another of the diagnostic tools provided by the assembler. Assume, for example, that your program manipulates a data field named DATE, and that testing reveals a program logic error In the handling of this data. The symbol-crass-reference listing simplifies debugging this error because it POints you to each instruction that I"eferences the symbol DATE. Do You Need the Assembler? The assembler IS but one of several tools available for developing microprocessor programs. Typically, choosing the most suitable tool IS based on cost restraints versus the required level of performance. You or your company must determine cost restraints; the reqUired level of performance depends on a number of variables: • The number of programs to be written: The greater the number of programs to be written, the more you need development support. Also, It must be pOinted out that there can be penalties for not wl"lting programs. When your application has access to the power of a microprocessor, you may be able to provide customers with custom features through program changes. Also, you may be able to add features through programming. o The time allowed for programming: As the time allowed for programmll1g decreases, the need for programmll1g support II1creases. • The level of support for eXisting programs: Sometimes programming errors are not discovered until the program has been 111 use for quite a while. Your need for programming support II1creases if you agree to correct such errors for YOUI" customers. The number of supported programs In use can multiply this requirement. Also, program support 15 frequently subrect to stringent time constraints. If none of the factors described above apply to your Situation, you may be able to get along without the assembler. Intel's PROMPT-80, for example, allows you to enter programs directly Into programmable read only memory. You enter the program manually as a string of hexadeCimal digits. Such manual programming IS relatively slow and more prone to human error than computer-assisted programmll1g. However, manual systems are one of the least expensive tools available for mlcmprocessor programming. Manual systems may be SUitable for limited applications, hobbyists, and those who want to explol"e possible applications for microprocessors. If most of the factors listed preViously apply to you, you should explore the advantages of PL(M. PL/M IS Intel's high-level language for program development. A high-level language is directed more to problem solVing than to a particular microprocessor. TIllS allows you to write programs much more qUickly than a hardware· oriented language such as assembly language. As an example, assume that a program must move five characters from one location 111 memory to anothcr. Thc following cxample illustratcs the coding differences between assembly language and PL/M. Since II1structions have not yet been described, the asscmbly language instructions arc rcprescn ted by a flowchart. 1-3
  • 16. Chapter 1. Assembly Lan 5uage and Processors ASSEI ~BL Y LANGUAGE CODING PL/MCODING I LOAD ,<EGISTER WITH NUMBER OF CHARACTERS TO BE MOVED I I LOAD ,<EGISTER PAIR B WITH ADDRE SS OF SOURCE (FLD1) I LOAD I~EGISTER PAIR D WITH ADDRESS OF DESTINATION (FLD2) I LOAD ,CCUMULATOR WITH 1 BYTE FROM SOURCE FIELD I MOVE :HARACTER FROM ACCUIV ULATOR TO DESTINA- TION FIELD I CALL MOVE(S,FLD2,FLD1); ~ I INCREMENT SOURCE ADDRESS I INCRHIENT DESTINATION ADDRESS I I DECRE .ENT CHARACTER COUNT IS NO CHARACTER COUNT =O? YES ( CONTINUE Figure 1-2. Comparison of Assembly Language with PL/M 1-4
  • 17. Chapter 1. Assembly Language and Processors OVERVIEW OF 8080/8085 HARDWARE To the programmer, the computer comprises the following parts: • Memory • The program cou nter • Work registers • Condition flags • The stack and stack pointer • Input/output ports • The instruction set Of the components listed above, memory is not part of the processor, but is of interest to the programmer. Memory Since the program required to drive a microprocessor resides'in memory, all microprocessor applications require some memory. There are two general types of memory: read only memory (ROM) and random access memory (RAM). ROM As the name Implies, the processor can only read instructions and data from ROM; it cannot alter the contents of ROM. By contrast, the processor can both read from and write to RAM. Instructions and unchanging data are permanently fixed into ROM and remain intact whether or not power is applied to the system. For this reason, ROM is typically used for program storage in single-purpose microprocessor applications. With ROM you can be certain that the program is ready for execution when power is applied to the system. With RAM a program must be loaded into memory each time power is applied to the processor. Notice, however. that storing programs in RAM allows a multi-purpose system since different programs can be loaded to serve different needs. Two special types of ROM PROM (Programmable Read Only Memory) and EPROM (Eraseable Programmable Read Only Memory) are frequently used during program development. These memories are useful during program development since they can be altered by a special PROM programmer. In high-volume commercial applications. these special memories are usually replaced by less expensive ROM's. RAM Even if your program resides entirely in ROM. your application is likely to require some random access memory. Any time your program attempts to write any data to memory, that memory must be RAM. Also, if your pro- gram uses the stack. you need RAM. If your program modifies any of its own instructions (this procedure is discouraged), those instructions must reside in RAM. The mix of ROM and RAM In an application IS important to both the system designer and the programmer. Normally, the programmer must know the physical addresses of the RAM in the system so that data variables 1-5
  • 18. Chapter 1. Assembly Lang Jage and Processors can be assignee within those addresses. However, the relocation feature of this assembler allows you to code a program witho!lt concern for the ultimate placement of data and instructions; these program elements can be repositioned aLer the program has been tested and after the system's memory layout IS final. The relocation feature is fully explained in Chapter 4 of this manual. Program Counter With the progr 1m counter, we reach the first of the 8080's Internal registers illustrated in Figure 1-3. NOTE Except for the differences listed at the end of this chapter, the Information in this chapter applies equally to the 8080 and the 8085. The program CJunter keeps track of the next instruction byte to be fetched from memory (which may be either ROM or RAM:. Each time It fetches an instruction byte from memory, the processor increments the program counter by on". Therefore, the program counter always indicates the next byte to be fetched. This process continues as Ie ng as program instructions are executed sequentially. To alter the flow of program execution as with a iump irstruction or a call to a subroutine, the processor overwrites the current contents of the program counter with t le address of the new Instruction. The next instruction fetch occurs from the new address. 8080 IACCUMULATORI FLAGS 8085 HIGH LOW INSTRUC~ B C STACK POINTER DECOD::R D E PROGRAM COUNTER IDATA BUS_ATCH I H L ADDRESS BUS LATCH o 8-bit bidirecti, Inal u 16-bit address bus data b JS .--------, ROM RAM INPUT OUTPUT PORTS PORTS INSTRUCTIONS INSTRUCTIONS CONSTANT VARIABLE DATA DATA STACK Figure 1-3. 8080/8085 Internal Registers 1-6
  • 19. Chapter 1. Assembly Language and Processors Work Registers The 8080 provides an 8-bit accumulator and six other general purpose work registers, as shown in Figure 1-3. Programs reference these registers by the letters A (for the accumulator), B, C, D, E, H, and L. Thus, the Instruction ADD B may be interpreted as 'add the contents of the B register to the contents of the accumu- lator. Some instructions reference a pair of registers as shown in the following: Symbolic Reference Registers Referenced B Band C D D and E H Hand L M Hand L (as a memory reference) PSW A and condition flags (explained later In this section) The symbolic reference for a single register IS often the same as for a register pair. The Instruction to be executed determines how the processor interprets the reference. For example, ADD B is an 8-blt operation. By contrast PUSH B (which pushes the contents of the Band C registers onto the stack) is a 16-blt operation. Notice that the letters Hand M both refer to the Hand L register pair. The choice of which to use depends on the instruction. Use H when an instruction acts upon the Hand L register pair as In INX H (increment the contents of Hand L by one). Use M when an instruction addresses memory via the Hand L registers as in ADD M (add the contents of the memory location specified by the Hand L registers to the contents of the accumu- lator). The general purpose registers B, C, D, E, H. and L can proVide a wide variety of functions such as storing 8-bit data values, storing intermediate results In arithmetic operations, and storing 16-bit address pointers. Because of the 8080's extensive instruction set, it is usually possible to achieve a common result with any of several different instructions. A Simple add to the accumulator. for example, can be accomplished by more than half a dozen different Instructions. When possible, it is generally desirable to select a register-to-register instruction such as ADD B. These instructions tYPically I'equire only one byte of program storage. Also, using data already present in a register eliminates a memory access and thus reduces the time required for the operation. The accumulator also acts as a general-purpose register, but It has some special capabilities not shared with the other registers. For example, the Input/output instructions IN and OUT transfer data only between the accumu- lator and external I/O deVices. Also, many operations involving the accumulator affect the condition flags as ex- plained In the next section. Example: The following figures illustrate the execution of a move instruction. The MOV M.e moves a copy of the contents of register C to the memory location specified by the Hand L registers. Notice that tillS location must be in RAM since data is to be written to memory, 1-7
  • 20. Chapter 1. Assembly Lanl uage and Processors 8080 IACCUMULATORI FLAGS I HIGH LOW 8085 + INSTRU(~ I B I e II STACK ! POINTER I DECOUER I D I E II PROGRAM i COUNTER Y DATA BUS LATCH I I H I L I I ADDRESS I BUS LATCH f L l • ROM RAM Figure 1-4. Instruction Fetch The processor initiates the instruction fetch by latching the contents of the program counter on the address bus, and then incrEments the program counter by one to Indicate the address of the next Instruction byte. When the memory respc nds, the Instruction is decoded into the series of actions shown in Figure 1-5. NOTE The following description of the execution of the MOV M,e instruction is conceptually correct, but does not account for normal bus control. For details concerning memory interface, refer to the User's Manual for your processor. 1-8
  • 21. Chapter 1. Assembly Language and Processors 8080 8085 IACCUMULATORI FLAGS I I B I C I HIGH LOW INSTRUCTION DECODER I STACK ! POINTER I I D I E I I PROGRAM ! COUNTER I DATA BUS LATCH f.- I H I L ADDRESS I BUS LATCH I + + + ROM RAM Figure 1-5. Execution of MOY M.C Instruction To execute the MOY M.C instruction. the processor latches the contents of the C register on the data bus and the contents of the Hand L registers on the address bus. When the memory accepts the data, the processor terminates execution of this instruction and initiates the next instruction fetch. Internal Work Registers Certain operations are destructive. For example, a compare is actually a subtract operation; a zero result indicates that the opreands are equal. Since it is unacceptable to destroy either of the operands, the processor includes several work registers reserved for its own use. The programmer cannot access these registers. These registers are used for internal data transfers and for preserving operands in destructive operations. Condition Flags The 8080 provides five flip flops used as condition flags. Certain arithmetic and logical instructions alter one or more of these flags to indicate the result of an operation. Your program can test the setting of four of these flags (carry, sign. zero. and parity) using one of the conditional iump. call. or return Instructions. This allows you to alter the flow of program execution based on the outcome of a previous operation. The fifth flag. auxiliary carry. is reserved for the use of the DAA instruction. as will be explained later in this section. It is important for the programmer to know which flags are set by a particular instruction. Assume, for example. that your program is to test the parity of an input byte and then execute one instruction sequence if parity is even. a different instruction set if parity is odd. Coding a J PE (jump if parity is even) or J PO (jump if parity is 1-9
  • 22. Chapter 1. Assembly Lanfuage and Processors odd) instructl,m Immediately foiiowing the IN (input) Instruction produces false results since the IN instruction does not affect the condition flags. The jump executed by your program reflects the outcome of some previous operation unrdated to the IN instruction. For the operation to work correctly, you must include some instruc- tion that alter; the parity flag after the IN instruction, but before the lump Instruction. For example, you can add zero to tl e accumulator. ThiS sets the parity flag without altering the data In the accumulator. In other cases you wiii want to set a flag With one instruction, but then have a number of intervel1lng instruc- tions before yJU use It. In these cases, you must be certain that the Intervening instructions do not affect the desired flag. The flags set I,y each Instruction are detailed in the IndiVidual Instruction descriptions In Chapter 3 of this manual. NOTE When a flag is 'set' It IS set ON (has the value one); when a flag IS 'reset' it IS reset OFF (has the value zero). Carry Flag As ItS name it Wlies, the carry flag IS commonly used to Indicate whether an addition causes a 'carry' into the next higher 01 del' digit. The carry flag IS also used as a 'borrow' flag In subtractions, as explallled under 'Two's Complement :~epresentatlon of Data' In Chapter 2 of thiS manual. The carry flag is also affected by the logical AND, OR, ani exclUSive OR Instructions. These instructions set ON or OFF particular bits of the accumulator. See the descrJJtlons of the ANA, ANI, ORA, ORI, XRA, and XRI instructions in Chapter 3. The rotate In'truCtions, which move the contents of the accumulator one position to the left or right, treat the carry bit as trough it were a III nth bit of the accumulatol' See the deSCrIptions of the RAL, RAR, RLC, and RRC instructions II' Chapter 3 of thiS manual. Example: Addition of ['vo one-byte numbers can produce a carry out of the high-order bit: Bit Number: 7654 3210 AE= 1010 1110 +74= 0111 01 00 0010 001 0 = 22 carry flag = 1 An addition t lat causes a carry out of the high order bit sets the carry flag to 1, an addition that does not cause a carry resets the flag to zero. Sign Flag As explained mder 'Two's Complement Representation of Data' In Chapter 2, bit 7 of a result in the accumulator can be Interpletcd as a sign. Instructlolls that affect the sign flag set the flag equal to bit 7. A zero In bit 7 1·10
  • 23. Chapter 1. Assembly Language and Processors indicates a positive value; a one indicates a negative value. This value is duplicated in the sign flag so that conditional iump, call, and return instructions can test for positive and negative values. Zero Flag Certain Instructions set the zero flag to one to indicate that the result in the accumulator contains all zeros. These instructions reset the flag to zero if the result in the accumulator is other than zero. A result that has a carry and a zero result also sets the zero bit as shown below: 1010 0111 +0101 1001 0000 0000 Carry Flag = 1 Zero Flag = 1 Parity Flag Parity IS determined by counting the number of one bits set in the result in the accumulator. Instructions that affect the parity flag set the flag to one for even parity and reset the flag to zero to indicate odd parity. Auxiliary Carry Flag The auxiliary carry flag indicates a carry out of bit 3 of the accumulator. You cannot test this flag directly in your program; it is present to enable the DAA (Decimal Adiust Accumulator) to perform its function. The auxiliary carry flag and the DAA instruction allow you to treat the value in the accumulator as two 4-bit binary coded decimal numbers. Thus, the value 0001 1001 is equivalent to 19. (If this value is interpreted as a binary number, it has the value 25.) Notice, however, that adding one to this value produces a non-decimal result: 0001 1001 +00000001 0001 1010 = lA The DAA instruction converts hexadecimal values such as the A in the preceding example back into binary coded decimal (BCD) format. The DAA instruction requires the auxiliary carry flag since the BCD format makes it possible for arithmetic operations to generate a carry from the low-order 4-bit digit Into the high-order 4-bit digit. The DAA performs the following addition to correct the preceding example: 0001 1010 +00000110 0001 0000 +0001 0000 (auxiliary carry) 0010 0000 = 20 1-11
  • 24. Chapter 1. AssemblY Lan5uage and Processors The auxiliary carry flag is affected by all add, subtract, increment, decrement, compare, and all logical AND, OR, and excl Jsive OR instructions. (See the descriptions of these Instructions In Chapter 3.) There is some difference in the handling of the auxiliary carry flag by the logical AND instructions In the 8080 processor and the 8085 pro ;essor. The 8085 logical AND instructions always set the auxiliary flag ON. The 8080 logical AND instructions s,t the flag to reflect the logical OR of bit 3 of the values involved in the AND operation. Stack and Stack Po inter To understan j the purpose and effectiveness of the stack, it is useful to understand the concept of a subroutine. Assume that !our program requires a multiplication routine. (Sinoe the 8080 has no multiply instruotions, this oan be performed through repetitive addition. For example, 3x4 is equivalent to 3+3+3+3.) Assume further that your progralT needs this multiply routine several times. You can recode this routine inline each time it is needed, but this can lise a great deal of memory. Or, you can code a subroutine: nline Coding Subroutine 1 nline routine 1 CALL I nline routine I CALL . subroutine I nline routine I CALL I I The 8080 provides instruotions that call and return from a subroutine. When the call instruction is executed, the address of th, next instruction (the contents of the program counter) IS pushed onto the stack. The contents of the program :ounter are replaced by the address of the desired subroutine. At the end of the subroutine, a return instruction pops that previously-stored address off the stack and puts it back into the program counter. Program exe( ution then continues as though the subroutine had been coded inline. The mechani;m that makes this possible IS, of course, the staok. The stack is simply an area of random access memory addi essed by the stack pointer. The stack pointer IS a hardware register maintained by the processor. However, YOiJr program must initialize the stack pointer. This means that your program must load the base address of the stack into the stack pointer. The base address of the stack is commonly assigned to the highest available add'ess in RAM. This is because the stack expands by decrementing the stack pointer. As items are 1-12
  • 25. Chapter 1. Assembly Language and Processors added to the stack. it expands into memory locations with lower addresses. As Items are removed from the stack. the stack pointer is incremented back toward Its base address. Nonetheless. the most recent item on the stack is known as the 'top of the stack.' Stack is still a most descriptive term because you can always put something else on top of the stack. In terms of programming, a subroutine can call a subroutine, and so on. The only limitation to the number of items that can be added to the stack is the amount of RAM available for the stack. The amount of RAM allocated to the stack is important to the programmer. As you write your program. you must be certain that the stack will not expand into areas reserved for other data. For most applications. this means that you must assign data that requires RAM to the lowest RAM addresses available. To be more precise. you must count up all instructions that add data to the stack. Ultimately, your program should remove from the stack any data it places on the stack. Therefore. for any IIlstruction that adds to the stack. you can sub- tract any intervening instruction that removes an Item from the stack. The most critical factor is the maximum size of the stack. Notice that you must be sure to remove data your program adds to the stack. Otherwise, any left-over items on the stack may cause the stack to grow into portions of RAM you intend for other data. Stack Operations Stack operations transfer sixteen bits of data between memory and a pair of processor registers. The two basIc operations are PUSH. which adds data to the stack. and POP, which removes data from the stack. A call Instruction pushes the contents of the program counter (which contains the address of the next instruction) onto the stack and then transfers control to the desired subroutine by placing its address in the program counter. A return instruction pops sixteen bits off the stack and places them in the program counter. This requires the programmer to keep track of what is in the stack. For example. if you call a subroutine and the subroutine pushes data onto the stack, the subroutine must remove that data before executing a return instruction. Other- wise, the return IIlstructlon pops data from the stack and places It in the program counter. The results are unpredictable, of course. but probably not what you want. Savll7g Program Status It is likely that a subroutine requires the use of one or more of the working registers. However, it IS equally likely that the main program has data stored in the registers that it needs when control returns to the main program. As general rule, a subroutine should save the contents of a register before using it and then restore the contents of that register before returning control to the main program. The subroutine can do this by pushing the contents of the registers onto the stack and then popping the data back into the registers before executing a return. The following instruction sequence saves and restores all the working registers. Notice that the POP instructions must be in the opposite order of the PUSH instructions if the data is to be restored to its original location. 1-13
  • 26. Chapter 1. Assembly langJage and Processors SUBRTN: PUSH PSW PUSH B PUSH o PUSH H subroutine coding POP H POP 0 POP B POP PSW RETURN The letters B, 0, and H refer to the Band C, 0 and E, and Hand L register pairs, respectively, PSW refers to the program s atus word. The program status wOl'd IS a 16-blt word comprising the contents of the accumulator and the five c,jnpitlon flags. (PUSH PSW adds three bits of filler to expand the condition flags into a full byte; POP PSII strrps out these filler bits.) Input/Output Ports The 256 rnpul/output ports provide communication with the outside world of perrpheral devices. The IN and OUT instructl<lns initiate data transfers. The IN rnstrw tion latches the number of the desired port onto the address bus. As 500n as a byte of data 15 returned to the data bus latch, it is transferred into the accumulator. The OUT inst: uetion latches the number of the desired port onto the address bus and latches the data in the accumulator onto the data bus. The specified )ort number 15 duplicated on the address bus. Thus, the instruction IN 5 latches the bit configura- tion 0000 01 (1 0000 0101 onto the address bus. Notice that the IN and OUT instructions Simply Initiate a data transfer It is the responsibility of the peripheral device to dete~t that It has been addressed. Notice also that it is possible to dedicate any number of ports to the same perr, hera I device. You might use a number of ports as control signals, for example. Because input and output are almost totally application dependent, a discussion of design techniques IS beyond the scope of t liS manual. For additional hardware Information. refer to the 8080 or 8085 Microcomputer Systems User's Manual. For related prJgrammlng rnformation, see the descriptions of the IN, OUT, 01, EI, RST, and RIM and SIM Instructions In Chapter 3 of this manual. (The RIM and SIM instructions apply only to the 8085.) 1-14
  • 27. Chapter 1. Assembly Language and Processors Instruction Set The 8080 incorporates a powerful array of Instructions. This section provides a general overview of the Instruc- tion set. The detailed operation of each instruction is described In Chapter 3 of tillS manual. Addressing Modes Instructions can be categorized according to their method of addressing the hardware registers and/or memory. Implied AddresslI1g. The addressing mode of certain Instructions is implied by the instruction's function. For example, the STC (set carry flag) instruction deals only with the carry flag; the DAA (decimal adjust accumu- lator) instruction deals with the accumulator. Register AddresslI1g. QUite a large set of instructions call for register addressing. With these instructions, you must specify one of the registers A through E, H or L as well as the operation code. With these instructions, the accumulator IS implied as a second operand. For example, the instruction CMP E may be Interpreted as 'compare the contents of the E register with the contents of the accumulator.' Most of the Instructions that use register addressing deal with 8-bit values. However, a few of these Instructions deal with 16-bit register pairs. For example, the PCHL Instruction exchanges the contents of the program counter with the contents of the Hand L registers. Immediate AddresslI1g. Instructions that use Immediate addressing have data assembled as a part of the instruction Itself. For example, the Instruction CPI 'C' may be Interpreted as 'compare the contents of the accumulator with the letter c.' When assembled, this instruction has the hexadecimal value FE43. Hexadecimal 43 IS the Internal representation for the letter C. When this instruction IS executed, the processor fetches the first instruction byte and determines that it must fetch one more byte. The processor fetches the next byte Into one of its internal registers and then performs the compare operation. Notice that the names of the Immediate instructions indicate that they use immediate data. Thus, the name of an add instruction is ADD; the name of an add Immediate Instruction is AD!. All but two of the Immediate instructions use the accumulator as an Implied operand, as in the CPI instruction shown previously The MV! (move Immediate) Instruction can move its immediate data to any of the working registers, including the accumulator, or to memory. Thus, the Instruction MVI D,OFFH moves the hexadecimal value FF to the D register. The LXI Instruction (load register pair immediate) is even more unusual in that ItS Immediate data IS a 16-bit value. This instruction is commonly used to load addresses Into a register pair. As mentioned previously, YOUl' program must initialize the stack pointer; LXI IS the instruction most commonly used for this purpose. For ex- ample, the instruction LXI SP,30FFH loads the stack pointer with the hexadecimal value 30FF Direct AddresslI1g. Jump Instructions include al6-bit address as part of the instruction. For example, the Instruction J MP 1000H causes a jump to the hexadecimal address 1000 by replacing the current contents of the program counter with the new value 1000. 1-15
  • 28. Chapter 1. Assemblv Lang Jage and Processors Instructions that include a direct address require three bytes of storage: one for the Instruction code. and two for the 16-bit lddress. Register IndirEct Addressing. Register indirect instructions reference memory via a register pair. Thus, the Instruction MC>V M,C moves the contents of the C register into the memory address stored in the Hand L register pair. 1 he instruction LDAX B loads the accumulator with the byte of data specified by the address In the Band C register pair. Combmed Ad,lressmg Modes. Some instructions use a combination of addressing modes. A CALL instruction, for example, combines direct addressing and register Indirect addressing. The direct address in a CALL instruction specifies the address of the deSIred subroutine; the register indirect address IS the stack pointer. The CALL instruction pu,hes the current contents of the program counter into the memory location specified by the stack pointer Timmg Effect~ of Addressmg Modes. Addressing modes affect both the amount of time required for executing an Instruction and the amount of memory reqUired for ItS storage. For example, instructions that use implied or register addres;ing execute very qUickly since they deal directly with the processor hardware or with data already present in hardware I·egisters. More important, however, is that the entire instruction can be fetched with a single memory access. The number of memory accesses required is the single greatest factor in determining execution timing. More memory accesses require more execution time. A CALL instruction, for example, requires five memory accesses: three to access the entire Instruction, and two more to push the contents of the program counter onto ',he stack. The processor can access memory once during each processor cycle. Each cycle comprises a variable number of states. (The Injividual instruction descriptions in Chapter 3 specify the number of cycles and states required for each Instructic n.) The length of a state depends on the clock frequency specified for your system, and may range from 48) nanoseconds to 2 microseconds. Thus, the timing of a four state instruction may range from 1.920 microse:onds through 8 microseconds. (The 8085 has a maximum clock frequency of 320 nanoseconds and therefore :an execute instructions about 50% faster than the 8080.) Instruction Nam/ilg Conventions The mnemonl<s assigned to the instructions are designed to indicate the function of the instruction. The Instruc· tions fall into the following functional categories: Data Tral1Sfer Group. The data transfer instructions move data between registers or between memory and registers. MOV Move MVI Move Immediate LDA Load Accumulator Directly from Memory STA Store Accumulator Directly in Memory LHLD Load Hand L Registers Directly from Memory SHLD Store Hand L Registers Directly in Memory ALL MNEMONICS © 7974. 7975. 7976, 7977 INTEL CORPORA nON 1-16
  • 29. Chapter 1. Assembly Language and Processors An 'X' In the name of a data transfer instruction implies that it deals with a register pair: LXI Load Register Pair with Immediate data LDAX Load Accumulator from Address in Register Pair STAX Store Accumulator in Address in Register Pair XCHG Exchange Hand L with D and E XTHL Exchange Top of Stack with Hand L Arithmetic Group. The arithmetic instructions add, subtract, increment, or decrement data in registers or memory. ADD Add to Accumulator ADI Add Immediate Data to Accumulator ADC Add to Accumulator Using Carry Flag ACI Add Immediate Data to Accumulator Using Carry Flag SUB Subtract from Accumulator SUI Subtract Immediate Data from Accumulator SBB Subtract from Accumulator Using Borrow (Carry) Flag SBI Subtract Immediate from Accumulator Using Borrow INR Increment Specified Byte by One DCR Decrement Specified Byte by One INX Increment Register Pair by One DCX Decrement Register Pair by One DAD Double Register Add: Add Contents of Register Pair to Hand L Register Pair Logical Group. This group performs logical (Boolean) operations on data in registers and memory and on condition flags. The logical, AND, OR, and Exclusive OR instructions enable you to set specific bits in the accumulator ON or OFF. ANA Logical AND with Accumulator ANI Logical AND with Accumulator Using Immediate Data ORA Logical OR with Accumulator ORI Logical OR with Accumulator Using Immediate Data XRA Exclusive Logical OR with Accumulator XRI Exclusive OR Using Immediate Data The compare instructions compare the contents of an 8·blt value with the contents of the accumulator: CMP Compare CPI Compare Using Immediate Data ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA nON '-17
  • 30. Chapter 1. Assembly Lang1lage and Processors The rotate instructions shift the contents of the accumulator one bit position to the left or right: RLC Rotate Accumulator Left RRC Rotate Accumulator Right RAL Rotate Left Through Carry RAR Rotate Right Through Carry Complement ald carry flag instructions: CMA Complement Accumulator CMC Complement Carry Flag STC Set Carry Flag Branch Group. The branching instructions alter normal sequential program flow. either unconditionally or conditionallY. fhe unconditional branching instructions are as follows: jMP Jump CALL Call RET Return Conditional bnnching Instructions examine the status of one of four condition flags to determine whether the specified brant h IS to be executed. The conditions that may be specified are as follows: NZ Not Zero (Z = 0) Z Zero (Z = 1) NC No Carry (C = 0) C Carry (C = 1) PO Parity Odd (P = 0) PE Parity Even (P = 1) P Plus (5 = 0) M Minus (5 1) Thus. the conditional branching Instructions are specified as follows: Jumps Calls Returns jC CC RC (Carry) jNC CNC RNC (No Carry) jZ CZ RZ (Zero) jNZ CNZ RNZ (Not Zero) jP CP RP (Plus) jM CM RM (Minus) jPE CPE RPE (Parity Even) jPO CPO RPO (Parity Odd) Two other instructions can effect a branch by replacing the contents of the program counter: PCHL Move Hand L to Program Counter RST Special Restart Instruction Used with Interrupts ALL MNEMONICS © 1974, 7975. 7976, 1977 INTEL CORPORA TlON 1-18
  • 31. Chapter 1. Assembly Language and Processors Stack, //0, and Machine Contra/Instructions. The following instructions affect the stack and/or stack pOinter' PUSH Push Two Bytes of Data onto the Stack POP Pop Two Bytes of Data off the Stack XTHL Exchange Top of Stack with Hand L SPHL Move contents of Hand L to Stack Pointer The I/O instructions are as follows: IN Initiate Input Operation OUT Initiate Output Operation The machine control Instructions are as follows: EI Enable Interrupt System DI Disable Interrupt System HLT Halt NOP No Opel'ation HARDWARE/INSTRUCTION SUMMARY The following illustrations graphically summarize the instruction set by showing the hardware acted upon by specific instructions, The type of operand allowed for each Instruction IS Indicated through the use of a code, When no code is given. the Instruction does not allow operands. Code Meaning REGM S The opel'and may specify one of the S-bit registers A,B.C,D,E,H, or L or M (a memory reference via the 16-blt address in the Hand L registers). The MOV Instruction. which calls for two operands, can specify M for only one of its operands. Designates S-bit immediate operand. Designates a 16-bit address. Designates an S-bit port number Designates a 16-blt register pair (B&C,D&E,H&L, or SP). Designates a 16-blt immediate operand, Accumulator Instructions The following illustration shows the Instructions that can affect the accumulator, The instructions listed above the accumulator all act on the data in the accumulator, and all except CMA (complement accumulator) affect one or more of the condition flags. The instructions listed below the accumulator move data Into or out of the accumulator, but do not affect condition flags. The STC (set carry) and CMC (complement carry) instructions are also shown hel'e, ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA TlON 1-19
  • 32. Chapter 1. Assembly Lan ,uage and Processors ADD ADI ADC ACI SUB SUI SBB SBI ANA REGM S D ANI S XRA XRI ORA ORI CMP CPI RLC RAL RRC RAR CMA DAA INR} ,-1 REGM DCR S ACCUMULATORI FLAGS I STC CMC HIGH LOW I I B I_ _ C ---lI STACK POINTER MOV REGM S: REC Msi D I E J I PROGRAM COUNTER I J~ L I HI LDAX} MEMORY STAX EC,DE LDA I STA} 1'16 MVI [J STACK S MOV F.EGMS,REG S ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA TlON 1·20
  • 33. Chapter 1. Assembly Language and Processors Register Pair (Word) Instructions The following instructions all deal with 16-bit words. Except for DAD (which adds thecontents of the B&C or D&E register pair to H&L), none of these instructions affect the condition flags. DAD affects only the carry flag. IACCUMULATORI FLAGS INX} HIGH LOW B C DCX DAD REG 16 fSPH' -I STACK ! POINTER .- D E I"""xcHG PCHL _I PROGRAM! COUNTER I ..",..- H L XTHL LHLD SHLD I MEMORY STACK PUSH } POP B,D,H,PSW ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA TlON 1-21
  • 34. Chapter 1. Assembly Lalguage and Processors Branching Instructions The followin~ Instructions can alter the contents of the program counter, thereby altering the normal sequential execution flew. Jump instructions affect only the program counter. Call and Return Instructions affect the program coullter, stack pointer, and stacK. ~CUMjLATORI FLAGS I HIGH LOW ~i C I POINTER ~) E I I PCHL COUNTER RST ~I L ~ JMP CALL RET JC JZ JNC 1 JNZ (> A CC CZ CNC} CNZ A RC RZ RNcl RNZ A IP 1M I 16 CP CM 16 RP RM J> 16 JPE JPO J CPE CPO RPE RPO MEMORY CONTROL INSTRUCTIONS RST Nap HLT EI 01 STACK SIM} 8085 only RIM ALL MNEMONICS'~ 7974,7975,7976,7977 INTEL CORPORATION 1-22
  • 35. Chapter 1. Assembly language and Processors Instruction Set Guide The following is a summary of the instruction set: ADI ADDl ADC ACI SUB SUI SBB REGM S SBI DS ANA ANI XRA XRI ORA ORI CMP CPI RLC RAL RRC RAR CMA DAA INR} DCR REGM S "ACCUMULATORI FLAGS ISTC CMC HIGH LOW MOY REGMS,REGM S ! B I C INX} IDCX REG 16 STACK , POINT;ER 1 LXI REG 16 ,D 16 I D I E ~XCHG RST H L jMP CALL RET jC CC CNCl RC RNCi jNC1 jZ jNZ A CZ CNZ A RZ RNZ ~ A jP jM 16 J CP CM J16 RP RM J 16 jPE jPO CPE CPO RPE RPO LHLD} STHD A16 OUT P ~ s CONTROL LDAX BC DE STAX) , INSTRUCTIONS INPUT OUTPUT MEMORY PORTS PORTS RST NOP HLT EI MYI DS DI MOY REGMS,REGM S --STAC"K--- ~- :~~H} B,D,H,PSW SIMI SOS5 ONLY RIM] CODE MEANING REGM S The operand may specify one of the S-bit registers A,B,C,D,E,H, or l or M (a memory reference via the 16-bit address in the Hand L registers). The MOY instruction, which calls for two operands, can specify M for only one of its operands. Designates S-bit immediate operand. Designates a 16-bit address. Designates an S-bit port number. Designates a '16-bit register pair (B&C,D&E,H& L,or SP). Designates a 16 -bit immediate operand. ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA nON 1-23
  • 36. Chapter 1. Assemblv Lalguage and Processors 8085 PROCESSOR DIFFERENCES The differences between the 8080 processor and the 8085 processor will be more obvious to the system designer than to the programmer. Except for two additional instructions. the 8085 i"~truction set is identical to and fully compatible with the 8080 instruction set. Most programs written for the 8680 should operate on the 8085 with- out modifica1ion. The only programs that may require changes are those with critical timing routines; the higher system speed of the 8085 may alter the time values of such routines. A partial listing of 8085 design features Includes the following: • A single 5 volt power supply. • Execution speeds approximately 50% faster than the 8080. • Incorporation in the processor of the features of the 8224 Clock Generator and Driver and the 8228 System Controller and Bus Driver. • A non-maskable TRAP interrupt for handling serious problems such as power failures. • Three separately maskable interrupts that generate internal RST instructions. • Input/output lines for serial data transfer Programming for tile 8085 For the prog ·ammer. the new features of the 8085 are summarized In the two new Instructions SIM and RIM. These instructions differ from the 8080 instructions in that each has multiple functions. The SIM instruction sets the interrupt mask and/or writes out a bit of serial data. The programmer must place the deSIred interrupt mask and/or serial output In the accumulator prior to execution of the SIM instruction. The RIM Instruction reads a bit 0 serial data if one is present and the Interrupt mask Into the accumulator. Details of these instruc- tions are cov"red in Chapter 3. Despite the Ilew Interrupt features of the 8085. programming for interrupts is little changed. Notice, however, that 8085 hardware interrupt RESTART addresses fall between the eXisting 8080 RESTART addresses. Therefore. only four bytes are available for certain RST instructions. Also, the TRAP interrupt Input is non-maskable and cannot be di ;abled. If your application uses this input, be certain to provide an interrupt routine for it. The interrup:s have the following priority: TRAP highest RSn.5 RST6.5 RST5.5 INTR lowest When more han one interrupt is pending, the processor always recognizes the higher priority Interrupt first. These priorii ies apply only to the sequence in which interrupts are recognized. Program routines that service interrupts h,ve no special priority. Thus. an RST5.5 interrupt can Interrupt the service routine for an RST7.5 interrupt. If you want to protect a service routine from interruption, either disable the interrupt system (01 instruction), or mask out other potential interrupts (SIM instruction). 1-24
  • 37. Chapter 1. Assembly Language and Processors Conditional Instructions Execution of conditional instructions on the 8085 differs from the 8080. The 8080 fetches all three instruction bytes whether or not the condition is satisfied. The 8085 evaluates the condition while it fetches the second instruction byte. If the specified condition is not satisfied, the 8085 skips over the third instruction byte and immediately fetches the next Instruction. Skipping the unnecessary byte allows for faster execution. 1-25
  • 39. 2. ASSEMBLY LANGUAGE CONCEPTS INTRODUCTION Just as the English languagc has its [-ulcs of grammar, assembly language has certalll coding rules. The source line [5the assembly language equivalent of a sentencc. Th[s assembler recognizcs three types of source lines: IIlstruct[ons, directives, and controls. This manual describes instructions and dircctlves. Controls are dcscribed [n the operator's manual for your version of the assembler. Th[s chapter dcscribes thc general rules for coding sourcc lincs. Specific instructions (see Chapter 3) and directives (see Chapters 4 and 5) may have specific coding rules. Even 50, the coding of such Instructions and directives must conform to thc gencral rules in this chapter. SOURCE LINE FORMAT Assembly language [nstructlons and asscmblcr directives may consist of up to four fields, as follows: Label:) Opcodc Operand ;Comment { Name Thc fields may be separated by any numbe[- of blanks, but must be separated by at least one delimlter_ Each IIlstruction and directive must be entered on a single line term lila ted by a carriage return and a line fced. No continuation lines are possiblc, but you may havc lines conSisting enti[-ely of commcnts. Character Set The following characters are Icgal In asscmbly languagc source statements: • Thc lctters of the alphabet, A through Z. Both upper- and lower-case letters are allowed. Internally, the assemblc[- trcats all letters as though they wcre upper-casc, but the characters are printed exactly as they were Input in the assembly listing. • The digits 0 through 9. • The following speCial characters: 2-1
  • 40. Chapter 2. Assembly Lan luage Concepts Character Meaning + Plus sign Minus sign * Asterisk Slash Comma Left parenthesis Right parenthesis Single quote & Ampersand Colon $ Dollar sign @ Commercial 'at' sign Question mark Equal sign < Less than sign > Greater than sign % Percent sign Exclamation point blank Blank or space Semicolon Period CR Carnage return FF Form feed HT Horizontal tab .. In addition, any ASCII character may appear in a string enclosed In single quotes or in a comment. Delimiters Certain chara<:ters have special meaning to the assembler in that they function as delimiters. Delimiters define the end of a ,ource statement, a field, or a component of a field. The following list defines the delimiters recognized by the assembler, Notice that many delimiters are related to the macro feature explained In Chapter 5. Delimiters Jsed for macros are shown here so that you will not accidentally use a delimiter improperly Refer to Chal,ter 5 for a description of macros. 2-2
  • 41. Chapter 2. Assembly Language Concepts Charaeter(s) Meaning Use blank one or more field separator or symbol terminator blanks comma separate operands in the operands field, including macro parameters pair of single delimit a character string quote characters (..• J pair of paren- delimit an expression theses CR carriage return statement terminator HT horizontal tab field separator or symbol terminator semicolon comment field delimiter colon delimiter for symbols used as labels & ampersand delimit macro prototype text or formal parameters for concatenation <... > pair of angle delimit macro parameter text which brackets contains commas or embedded blanks; also used to delimit a parameter list % percent sign delimit a macro parameter that is to be evaluated prior to substitution exclamation an escape character used to pass the point following character as part of a macro parameter when the character might otherwise be interpreted as a delimiter double semi- delimiter for comments in macro definitions colon when the comment is to be suppressed when the macro is expanded Label/Name Field Labels are always optional. An instruction label is a symbol name whose value is the location where the instruc- tion is assembled. A label may contain from one to SIX alphanumeric characters, but the first character must be alphabetic or the special characters '7' or '@' The label name must be terminated with a colon. A symbol used as a label can be defined only once in your program. (See 'Symbols and Symbol Tables' later in this chapter.) 2-3
  • 42. Chapter 2. Assemblv Lallguage Concepts Alphanumerit: characters include the letters of the alphabet, the question mark character, and the decimal digits 0 throl gh 9. A name is required for the SET. EQU, and MACRO directives. Names follow the same coding rules as labels, except that t ley must be terminated with a blank rather than a colon. The label/name field must be empty for the LOCAL ind ENDM directives. Opcode Field This required field contains the mnemonic operation code for the 8080/8085 instruction or assembler directive to be perforned. Operand Field The operand field identifies the data to be operated on by the specified opcode. Some instructions require no operands. Otners require one or two operands. As a general rule, when two operands are required (as in data transfer and lrithmetic operations), the first operand identifies the destination (or target) of the operation's result, and tlie second operand specifies the source data. Examples: MOil A,C ;MOVE CONTENTS OF REG C TO ACCUMULATOR MV A:B' ;MOVE B TO ACCUMULATOR Comment Field The optiona comment field may contain any information you deem useful for annotating your program. The only coding requirement for this field is that it be preceded by a semicolon. Because the semicolon is a delimiter, there IS no reed to separate the comment from the previous field with one or more spaces. However, spaces are commonly Lsed to improve the readability of the comment. Although comments are always optional, you should use them lib;rally since it is easier to debug and maintain a well documented program. CODING OPERAI~D FIELD INFORMATION There are feur types of information (a through d in the following list) that may be requested as items in the operand field; the information may be specified in nine ways, each of which is described below. 2-4
  • 43. Chapter 2. Assembly language Concepts OPERAND FIELD INFORMATION Information reqUIred Ways of specitying (a) Register (1) Hexadecimal Data (b) Register Pair (2) Decimal Data (c) Immediate Data (3) Octal Data (d) 16-bit Address (4) Binary Data (5) Location Counter ($) (6) ASCII Constant (7) Labels assigned values (8) Labels of instructions or data (9) Expressions Hexadecimal Data. Each hexadecimal number must begin with a numeric digit (0 through 9) and must be followed by the letter H. Label Opcode Operand Comment HERE: MVI C,OBAH ;LOAD REG C WITH HEX BA DecImal Data. Each decimal number may be identified by the letter D immediately after its last digit or may stand alone. Any number not specifically identified as hexadecimal, octal, or binary is assumed to be decimal. Thus. the following statements are equivalent: Label Opcode Operand Comment ABC: MVI E,15 ;LOAD E WITH 15 DECIMAL MVI E,15D Octal Data. Each octal number must be followed by the letter 0 or the letter Q. Label Opcode Operand Comment LABEL: MVI A,nQ ;LOAD OCTAL 72 INTO ACCUM Binary Data. Each binary number must be followed by the letter B. Label Opcode Operand Comment NOW: MVI D,l1l1 011 OB ;LOAD REGISTER D ;WITH OF6H 2-5
  • 44. Chapter 2. Assemblv L, nguage Concepts Location Counter, The $ character refers to the current location counter. The location counter contains the address wher~ the current instruction or data statement will be assembled. label Opcode Operand Comment co: jMP $+6 ;j UMP TO ADDRESS 6 BYTES BEYOND ;THE FIRST BYTE OF THIS ;INSTRUCTION ASCII Const1t7t. One or more ASCII characters enclosed in single quotes define an ASCII constant. Two successive sillgle quotes must be used to represent one slllgie quote Within an ASCII constant. i.abel Opcode Operand Comment MYI E '*' ;LOAD E REG WITH 8-BIT ASCII ;REPRESENTATION OF * DATE: DB TODAY"S DATE' Labels Assig led Values. The SET and EQU directives can assign values to labels. In the following example, assume that VALUE has been assigned the value 9FH; the two statements are equivalent: Opcode Operand Comment 1. MYI D,9FH 2: MYI D,YALUE Labels of In;truction or Data. The label assigned to an IIlstructlon or a data definition has as its value the address of tile first byte of the instruction or data. Instructions elsewhere in the program can refer to this address by I:S symbolic label name. Opcode Operand Comments -jERE: jMP THERE ;jUMP TO INSTRUCTION AT THERE fHERE; MVI D,9FH Expressions. All of the operand types discussed previously can be combined by operators to form an expression. In fact, the example given for the location counter ($+6) IS an expression that combines the location counter with the decimal number 6. Because the rules for coding expressions are rather extensive, further discussion of expressions is deferred until later in this chapter. 2-6
  • 45. Chapter 2. Assembly Language Concepts Instructions as Operands. One operand type was intentionally omitted from the list of operand field infor- mation: Instructions enclosed in parentheses may appear in the operands field. The operand has the value of the left-most byte of the assembled instruction. Label Opcode Operand INS: DB (ADD C) The statement above defines a byte with the value 81 H (the object code for an ADD C instruction). Such coding is typically used where the object program modifies itself during execution, a technique that is strongly discouraged. Register-Type Operands. Only instructions that allow registers as operands may have register-type operands. Expressions containing register-type operands are flagged as errors. Thus, an instruction like JMP A is flagged as an illegal use of a register. The only assembler directives that may contain register-type operands are EQU, SET, and actual parameters in macro calls. Registers can be assigned alternate names only by EQU or SET. TWO'S COMPLEMENT REPRESENTATION OF DATA Any 8-bit byte contains one of the 256 possible combinations of zeros and ones. Any particular combination may be interpreted in a number of ways. For example, the code 1 FH may be interpreted as an instruction (Rotate Accumuiator Right Through Carry), as the hexadecimal value 1 F, the decimal value 31, or simply the bit pattern 00011111. Arithmetic instructions assume that the data bytes upon which they operate are in the 'two's complement' format. To understand why, let us first examine two examples of decimal arithmetic: 35 35 -12 +88 23 123 Notice that the results of the two examples are equal if we disregard the carry out of the high order position in the second example. The second example illustrates subtraction performed by adding the ten's complement of the subtrahend (the bottom number) to the minuend (the top number). To form the ten's complement of a decimal number, first subtract each digit of the subtrahend from 9 to form the nine's complement; then add one to the result to form the ten's complement. Thus, 99-12=87; 87+1=88, the ten's complement of 12. The ability to perform subtraction with a form of addition is a great advantage in a computer since fewer cir- cuits are required. Also, arithmetic operations within the computer are binary, which simplifies matters even more. 2-7
  • 46. Chapter 2. Assembly Lalguage Concepts The processol forms the two's complement of a binary value simply by reversing the value of each bit and then adding one tc the result. Any carry out of the high order bit is ignored when the complement is formed. Thus, the subtractic n shown previously is performed as follows: 35 = 001 0 0011 00100011 -12 = 0000 1100 = 1111 0011 +11110100 23 + 1 0001 0111 = 23 1111 01 00 Again, by dis 'egarding the carry out of the high order position, the subtraction IS performed through a form of addition. HO/ever, if this operation were performed by the 8080 or [he 8085, the carry flag would be set OFF at the end of the subtraction. This is because the processors complement the carry flag at the end of a subtract operation so :hat it can be used as a 'borrow' flag in multibyte subtractions. In the example shown, no borrow IS reqUired. St> the carry flag IS set OFF. By contrast, the carry flag IS set ON if we subtract 35 from 12: 12 = 000011 00 00001100 -35 = 0010 0011 = 11 01 11 00 +1101 1101 + -----'- 1110 1001 = 233 or --105 1101 1101 In this case, he absence of a carry indicates that a borrow IS reqUired from the next higher order byte, if any Therefore, th 0 processor sets the carry flag ON. Notice also that the result is stored In a complemented form. If you want 0 Interpret this result as a deCimal value, you must again form its two's complement: 111 0 1001 = 0001 011 0 + 1 0001 0111 = 23 Two's compl·'ment numbers may also be signed. When a byte IS Interpreted as a signed two's complement number, the high ordu bit indicates the sign. A zero In thiS bit indicates a positive number, a one a negative number. The seven low order bits provide the magnitude of the number. Thus, 0111 1111 equals +127 At the beglnlling of this description of two's complement arithmetic, it was stated that any 8-blt byte may con- tain one of tile 256 possible combinations of zeros and ones. It must also be stated that the proper interpretation of data is a r r,ogramming responsibility. As an examp,e, consider the compare instruction. The compare logiC considers only the raw bit values of the Items being compared. Therefore, a negative two's complement number always compares higher than a positive number, bec;use the negative number's high order bit IS always ON. As a result, the meanings of the flags set by the compare instruction are reversed. Your program must account for this condition. 2-8
  • 47. Chapter 2. Assembly Language Concepts SYMBOLS AND SYMBOL TABLES Symbolic Addressing If you have never done symbolic programming before, the following analogy may help clarify the distinction between a symbolic and an absolute address. The locations in program memory can be compared to a cluster of post office boxes. Suppose Richard Roe rents box 500 for two months. He can then ask for his letters by saying 'Give me the mail in box 500: or 'Give me the mail for Roe.' If Donald Smith later rents box 500, he too can ask for his mail by either box number 500 or by his name. The content of the post office box can be accessed by a fixed. absolute address (500) or by a symbolic. variable name. The postal clerk correlates the symbolic names and their absolute values In hiS log book. The assembler performs the same function. keeping track of symbols and their values in a symbol table. Note that you do not have to assign values to symbolic addresses. The assembler references its location counter during the assembly process to calculate these addresses for you. (The location counter does for the assembler what the program counter does for the microcomputer. It tells the assembler where the next instruction or operand is to be placed in memory.) Symbol Characteristics A symbol can contain one to six alphabetic (A-Z) or numeric (0-9) characters (with the first character alphabetic) or the special character '7' or '@'. A dollar sign can be used as a symbol to denote the value currently in the location counter For example, the command jMP $+6 forces a jump to the instruction residing six memory locations higher than the JMP instruction. Symbols of the form '??nnn' are generated by the assembler to uniquely name symbols local to macros. The assembler regards symbols as haVing the following attributes: reserved or user-defined; global or limited; permanent or redefinable; and absolute or relocatable. Reserved. User-Defined. and Assembler-Generated Symbols Reserved symbols are those that already have special meaning to the assembler and therefore cannot appear as user-defined symbols. The mnemonic names for machine instructions and the assembler directives are all reserved symbols. 2-9
  • 48. Chapter 2. Assembly Lan;:uage Concepts The following instruction operand symbols are also reserved: Symbol Meaning $ Location counter reference A Accumulator register B Register B or register pair Band C C Register C D Register D or register pair D and E E Register E H Register H or register pair Hand L L Register L SP Stack pointer register PSW Program status word (Contents of A and status flags) M Memory reference code using address in Hand L STACK Special relocatability feature MEMORY Special relocatability feature NOTE The STACK and MEMORY symbols are fully discussed in Chapter 4. User-defined' ymbols are symbols you create to reference Instruction and data addresses. These symbols are defined when they appear in the label field of an instruction or In the name field of EQU, SET, or MACRO directives (see Chapters 4 and 5). Assembler-ger erated symbols are created by the assembler to replace user-defined symbols whose scope is limited to a macro d, finition. Global and Um/'ed Symbols Most symbol, are global. This means that they have meaning throughout your program. Assume, for example, that you assifn the symbolic name RTN to a routine. You may then code a iump or a calJ to RTN from any POlllt in your program. If you assign the symbolic name RTN to a second routine, an error results since you have given ml i1tiple definitions to the same name. Certain symbJls have meaning only within a macro definition or within a calJ to that macro; these symbols are 'local' to the macro. Macros require local symbols because the same macro may be used many times in the program. If tile symbolic names within macros were global, each use of the macro (except the first) would cause multiple defililtlons for those symbolic names. See Chapter .; for additional information about macros. 2·10
  • 49. Chapter 2. Assembly Language Concepts Permanent and Redefinable Symbols Most symbols are permanent since their value cannot change during the assembly operation. Only symbols defined with the SET and MACRO assembler directives are redefinable. Absolute and Relocatable Symbols An important attribute of symbols with this assembler is that of relocatability. Relocatable programs are assembled relative to memory location zero. These programs are later relocated to some other set of memory locations. Symbols with addresses that change dUring relocation are relocatable symbols. Symbols with addl-esses that do not change during relocation are absolute symbols. This distinction becomes important when the symbols are used within expressions, as will be explained later. External and public symbols are special types of relocatable symbols. These symbols are required to establish program linkage when several relocatable program modules are bound together to form a single application program. External symbols are those used in the current program module, but defined In another module. Such symbols must appear in an EXTRN statement, or the assembler will flag them as undefined. Conversely, PUBLIC symbols are defined in the current program module, but may be accessed by other modules. The addresses for these symbols are resolved when the modules are bound together. Absolute and relocatable symbols may both appear in a relocatable module. References to any of the assembler- defined registers A through E, Hand L, PSW, SP, and M are absolute since they refer to hardware locations. But these references are valid in any module. ASSEMBLY-TIME EXPRESSION EVALUATION An expression IS a combination of numbers, symbols, and operators. Each element of an expression is a term. Expressions, like symbols, may be absolute or relocatable. For the sake of readers who do not require the relocation feature, absolute expressions are described first. However, users of relocation should read all the following. Operators The assembler Includes five groups of operators which permit the following assembly-time operations: arithmetic operations, shift operations, logical operations, compare operations, and byte Isolation operations. It is important to keep in mind that these are all assembly-time operations. Once the assembler has evaluated an expression, it becomes a permanent part of your program. Assume, for example, that your program defines a list of ten con- stants starting at the label LIST; the following instruction loads the address of the seventh item in the list Into the Hand L registers: LXI H,L1ST+6 Notice that LIST addresses the first item, L1ST+l the second, and so on. 2-11
  • 50. Chapter 2. Assembly Lan ~uage Concepts Arithmetic Open tors The anthmeti, operators are as follows: Operator Meaf7/1lg + Unary or binary addition Unary or blllary subtraction * Multiplication Division. Any remainder is discarded (7/2=3). Division by zero causes an error. MOD Modulo. Result is the remainder caused by a division operation. (7 MOD 3=1) Examples: The follOWing expressions generate the bit pattern for the ASCII character A; 5+30*2 (25/5)+30*2 5+( -30*·2) Notice that tLe MOD operdtor must be separdted from ItS operands by spaces: NUMBR MOD 8 Assuming tha. NUMBR has the value 25, the previous expression evaluates to the value Shift Operators The shift ope'atars are as !"ollows: Operator Meol7lf7g y SHR x Shift operand 'y' to the nght 'x' bit posItions. y SHL x Shift operand 'y' to the le!"t 'x' bit positions. The shift operators do not wraparound any bits shihed out of the byte. Bit positions vacated by the shift operation are zero·filled. Notice that the shift operatar must be separated from ItS operands by spaces. Example: Assume that NUMBR has the value 0101 0101, The effects of the shift operators is as follows: NUMBR SHR 0001 0101 NUMBR SHL 1010 1010 2-12
  • 51. Chapter 2. Assembly Language Concepts Notice that a shift one bit position to the left has the effect of multiplying a value by two; a shift one bit position to the right has the effect of dividing a value by two. Logical Operators The logical operators are as follows; Operator Meaning NOT Logical one's complement AND Logical AND (=1 if both ANDed bits are 1) OR Logical OR (=1 if either ORed bit is 1) XOR Logical EXCLUSIVE OR (=1 if bits are different) The logical operators act only upon the least significant bit of values involved in the operation. Also, these operators are commonly used In conditional IF directives. These directives are fully explained in Chapter 4. Example: The following IF directive tests the least significant bit of three Items. The assembly language code that follows the IF is assembled only if the condition IS TRUE. This means that all three fields must have a one bit in the least significant bit position. IF FLDI AND FLD2 AND FLD3 Compare Operators The compare operators are as follows: Operator Meaning EQ Equal NE Not equal LT Less than LE Less than or equal GT Greater than GE Greater than or equal NUL Special operator used to test for null (missing) macro parameters 2-13
  • 52. Chapter 2. Assembly Lan ;uage Concepts The compare )perators Yield a yes-no result. Thus. if the evaluation of the relation is TRUE. the value of the result is all ores. If false. the value of the result is all zeros. Relational operations are based strictly on magni- tude comparisons of bit values. Thus. a two's complement negative number (which always has a one in its high order bit) is g'eater than a two's complement positive number (which always has a zero in its high order bit). Since the NU'_ operator applies only to the macro feature, NUL is described in Chapter 5. The compare operators are commonly used in conditional IF directives. These directives are fully explained in Chapter 4. Notice that tl,e compare operator must be separated from its operands by spaces. Example: The following IF directive tests the values of FLDl and FLD2 for equality. If the result of the comparison is TRUE, the aSiembly language coding following the IF directive IS assembled. Otherwise. the code is skipped over. IF FLDl EQ FLD2 Byte Isolation Ooerators The byte isolltion operators are as follows: Operator Meaning HIGH Isolate hlgh·order 8 bits of 16-bit value LOW Isolate low-order 8 bits of 16-blt value. The assemble- treats expressions as 16-blt addresses. In certain cases. you need to deal only with a part of an address. or Y<lU need to generate an 8-bit value. This IS the function of the HIGH and LOW operators. The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbol; appears in the operand expression of an Immediate instruction. It must be preceded by either the HIGH or LON operator to specify which byte of the address IS to be used In the evaluation of the expression. When neithel operator is present. the assembler assumes the LOW operator and Issues an error message. NOTE Any program segment containing a symbol used as the argument of a HIGH operator should be located only on a page boundary. This is done using the PAGE option with the CSEG or DSEG directives described in Chapter 4. Carries are not propagated from the low-order byte when the assembler object code is relocated and the carry flag will be lost. Using PAGE ensures that this flag is 0_ 2-14
  • 53. Chapter 2. Assembly Language Concepts Examples: Assume that ADRS is an address manipulated at assembly-time for building tables or lists of items that must all be below address 255 in memory. The following IF directive determines whether the high-order byte of ADRS is zero, thus indicating that the address is still less than 256: IF HIGH ADRS EQ 0 Permissible Range of Values Internally, the assembler treats each term of an expression as a two-byte, 16-bit value. Thus, the maximum range of values is OH through OFFFFH. All arithmetic operations are performed using unsigned two's comple- ment arithmetic. The assembler performs no overflow detection for two-byte values, so these values are evaluated modulo 64K. Certain Instructions require that their operands be an eight-bit value. Expressions for these instructions must yield values in the range -256 through +255. The assembler generates an error message if an expression for one of these instructions yields an out-of-range value. NOTE Only instructions that allow registers as operands may have register-type operands. Expressions containing register-type operands are flagged as errors. The only assembler directives that may contain register-type operands are EQU, SET, and actual parameters in macro calls. Registers can be assigned alternate names only by EQU or SET. Precedence of Operators Expressions are evaluated left to right. Operators with higher precedence are evaluated before other operators that immediately precede or follow them. When two operators have equal precedence, the left-most is evaluated first. Parentheses can be used to override normal rules of precedence. The part of an expression enclosed In paren- theses is evaluated first. If parentheses are nested, the Innermost are evaluated first. 15/3 + 18/9 =5+2=7 15/(3 + 18/9) = 15/(3 + 2) = 15/5 = 3 2-15
  • 54. Chapter 2. Assembly Lan :uage Concepts The following list describes the classes of operators in order of precedence: • Parenthesized expressions • NUL • HIGH, LOW • Multiplication/Division: *. /, MOD, SHL, SHR • Addition{Subtraction: +, - (unary and binary) Relational Operators: EQ, LT, LE, GT, GE, NE • Logical NOT • Logical AND • Logical OR, XOR The relational, logical, and HIGH{LOW operators must be separated from their operands by at least one blank. Relocatable Express ions Determining t le relocatability of an expression requires that you understand the relocatability of each term used in the express on. This is easier than it sounds since the number of allowable operators is substantially reduced. But first it is lecessary to know what determines whether a symbol is absolute or relocatable. Absolute symJols can be defined two ways: • A symbol that appears in a label field when the ASEG directive is in effect IS an absolute symbol. • A symbol defined as equivalent to an absolute expression using the SET or EQU directive is an absolute symbol. Relocatable s"mbols can be defined a number of ways: • A symbol that appears in a label field when the DSEG or CSEG directive IS in effect is a relocatable symbol. • A symbol defined as equivalent to a relocatable expression using the SET or EQU directive is reocatable. • Tile special assembler symbols STACK and MEMORY are relocatable. • E,ternal symbols are considered relocatable. • A reference to the location counter (specified by the $ character) IS relocatable when the CSEG or o ,EG directive is in effect. The expressions shown in the following list are the only expressions that yield a relocatable result. Assume that ABS IS an ab~olute symbol and RELOC IS a relocatable symbol: ABS + RELOC RELOC + ABS RELOC - ABS fHIGH'( RELOC+ABS LOW ) [ HIGH ~ RELOC _ ABS ~LOW ) r HIGH} RELOC + ~ LOW ABS f HIGH '1 RELOC LOW } ABS 2-16
  • 55. Chapter 2. Assemblv Language Concepts Remember that numbers are absolute terms. Thus the expression RELOC - 100 is legal, but 100 - RELOC is not. When two relocatable symbols have both been defined with the same type of relocatability, they may appear In certain expressions that yield an absolute result. Symbols have the same type of relocatability when both are relative to the CSEG location counter, both are relative to the DSEG location counter, both are relative to MEMORY, or both are relative to STACK. The following expressions are val id and produce absolute results: RELOCl - RELOC2 EQ LT RELOCl LE RELOC2 GT GE NE Relocatable symbols may not appear In expressions with any other operators. The following list shows all possible combinations of operators with absolute and relocatable terms. An A in the table indicates that the resulting address is absolute: an R indicates a relocatable address; an I Indicates an illegal combination. Notice that only one term may appear with the last five operators in the list. X absolute X absolute X relocatable X relocatable Operator Y absolute Y relocatable Y absolute Y reloca table X + Y A R R I X Y A I R A X * y A I I I X / y A I I I X MOD y A I I I X SHL Y A I I I X SHR Y A I I I X EQ Y A I I A X LT Y A I I A X LE Y A I I A X GT Y A I I A X GE Y A I I A X NE Y A I I A X AND y A I I I X OR y A I I I X XOR Y A I I I NOT X A - I HIGH X A - R - LOW X A - R - unary+ X A - R - unary- X A - I 2-17
  • 56. Chapter 2. Assemblv Larguage Concepts Chaining of Symbol Definitions The ISIS-II 81180/808S Macro Assembler is essentially a 2-pass assembler. All symbol table entries must be resolvable in ; wo passes. Therefore, x EQU y y EQU 1 is legal, but iii the series x EQU y y EQU Z Z EQU 1 the first line s illegal as X cannot be resolved in two passes and remains undefined. 2-18
  • 57. 3. INSTRUCTION SET HOW TO USE THIS CHAPTER This chapter is a dictionary of 8080 and 8085 Instructions. The instruction descriptions are listed alphabetically for quick reference. Each description is complete so that you are seldom required to look elsewhere for addition- al information. This reference format necessarily requires repetitive information. If you are reading this manual to learn about the 8080 or the 8085, do not try to read this chapter from ACI (add immediate with Carry) to XTHL (exchange top of stack with Hand L registers). Instead, read the description of the processor and instruction set in Chapter 1 and the programming examples in Chapter 6. When you begin to have questions about particular instructions, look them up in this chapter. TIMING INFORMATION The instruction descriptions in this manual do not explicitly state execution timings. This is because the basic operating speed of your processor depends on the clock frequency used in your system. The 'state' IS the basic unit of time measurement for the processor. A state may range from 480 nanoseconds (Cl20 nanoseconds on the 8085) to 2 microseconds, depending on the clock frequency. When you know the length of a state In your system. you can determine an instruction's basic execution time by multiplying that figure by the number of states required for the instruction. Notice that two sets of cycle/state specifications are given for 8085 conditional call and jump instructions. This is because the 8085 fetches the third instruction byte only if it is actually needed; i.e., the specified condition is satisfied. This basic timing factor can be affected by the operating speed of the memory in your system. With a fast clock cycle and a slow memory, the processor can outrun the memory. In this case, the processor must wait for the memory to deliver the desired instruction or data. In applications with critical timing requirements, this wait can be significant. Refer to the appropriate manufacturer's literature for memory timing data. 3·1
  • 58. Chapter 3. Instruction Se· ACI ADD IMMEDIATE WITH CARRY ACI adds the :ontents of the second instruction byte and the carry bit to the contents of the accumulator and stores the result in the accumulator, Opcode Operand ACI data The operand SJecifies the actual data to be added to the accumulator except, of course, for the carry bit. Data may be in the form of a number, an ASCII constant, the label of a previously defined value, or an expression. The data may not exceed one byte. The assemblers relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbols appears in the operand expression of an immediate instruction, It must be preceded by either the HIGH or LOA operator to specify which byte of the address is to be used in the evaluation of the expression. When neither )perator is present, the assembler assumes the LOW operator and issues an error message. o 0 o data Cycles: 2 States: 7 AddreSSing: Immediate Flags: Z,S,P,CY,AC Example: Assume that the accumulator contains the value 14H and that the carry bit is set to one. The instruction ACI 66 has the follol' ing effect: Accumulator = 14H 00010100 Immediate data = 42H 01000010 Carry 1 01010111 57H ADC ADD WITH CARRY The ADC inst ruction adds one byte of data plus the setting of the carry flag to the contents of the accumulator. The result istored in the accumulator ADC then updates the setting of the carry flag to indicate the outcome of the operaton. The ADC innuction's use of the carry bit enables the program to add multi-byte numeric strings. 3-2
  • 59. Chapter 3. Instruction Set Add RegIster to Accumulator with Carry Opccde Operand ADC reg The operand must specify one of the registers A through E, H or L. This instruction adds the contents of the specified register and the carry bit to the accumulator and stores the result in the accumulator. ',-1_ _ _ 0_ _1 S 0_0 _ S S I CYcles: 1 States: 4 Addressings: register Flags: Z.s,P,CY,AC Add Memory to Accumulator with Carry Opcode Operand ADC M This instruction adds the contents of the memory location addressed by the Hand L registers and the carry bit to the accumulator and stores the result in the accumulator. M is a symbolic reference to the Hand L registers. CYcles: 2 States: 7 AddreSSing: register indirect Flags: Z,S,P,CY,AC Example: Assume that register C contains 3DH, the accumulator contains 42H, and the carry bit is set to zero. The instruction ADC C performs the addition as follows: 3DH 00111101 42H 01000010 CARRY o 01111111 = 7 FH The condition flags are set as follows: Carry 0 Sign 0 Zero 0 ParitY 0 Aux. Carry 0 3-3
  • 60. Chapter 3. Instruction Set If the carry !>it IS set to one, the instruction has the following results: 3DH 00111101 42H 01000010 CARRY 1 10000000 SOH Carry o Sign 1 Zero o ParitY o Aux, Carry 1 ADD ADD The ADD In,truction adds one byte of data to the contents of the accumulatoL The result is stored in the accumulator Notice that the ADD instruction excludes the carry flag from the addition but sets the flag to indicate the Jutcome of the operation. Add Regtstet to Register Opcode Operand ADD reg The operand must specify one of the registers A through E, H or L. The instruction adds the contents of the specified reg ster to the contents of the accumulator and stores the result in the accumulator. 11 0 0 0 0 Iss sl Cycles: 1 States: 4 Addressing: register Flags: Z,S,P,CY,AC Add From Memory Opcode Operand ADD M This InstruCilon adds the contents of the memory location addressed by the Hand L registers to the contents of the accumulltor and stores the result in the accumulator. M is a symbolic reference to the Hand L registers. 11 0 0 0 0 Cycles: 2 States: 7 Addressing: register Indirect Flags: Z,S,P,CY,AC 34
  • 61. Chapter 3. Instruction Set Examples: Assume that the accumulator contains 6CH and register D contains 2EH. The Instruction ADD D performs the addition as follows: 2EH 0010111 0 6CH 011011 00 9AH 10011010 The accumulator contains the value 9AH following execution of the ADD D instruction. The contents of the D register remain unchanged. The condition flags are set as follows: Carry 0 Sign 1 Zero 0 Parity 1 Aux. Carry 1 The following instruction doubles the contents of the accumulator: ADD A ADI ADD IMMEDIATE ADI adds the contents of the second instruction byte of the contents of the accumulator and stores the result in the accumulator. Opcode Operand ADI data The operand specifies the actual data to be added to the accumulator This data may be In the form of a number, an ASCII constant, the label of a previously defined value, or an expression. The data may not exceed one byte. The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the HIGH or LOW operator to specify which byte of the address is to be used In the evaluation of the expression. When neither operator is present. the assembler assumes the LOW operator and Issues an error message. ' 000 lCycles: data 2 States: 7 Addressing: immediate Flags: Z.S.P.CY,AC 3-5
  • 62. Chapter 3. Instruction Se Example: Assume that he accumulator contains the value 14H. The Instruction ADI 66 has the following effect: Accumulator 14H 00010100 Immediate data 42H 01000010 01010110 = 56H Notice that ti,e assembler converts the decimal value 66 into the hexadecimal value 42. ANA LOGICAL AND WITH ACCUMULATOR ANA perforrrs a logical AND operation using the contents of the specified byte and the accumulator, The result IS placed in tlie accumulator. SummGlY of ~oglcal Operations AN D product s a one bit In the result only when the corresponding bits In the test data and the mask data are ones. OR produces a one bit In the result when the corresponding bits in either the test data or the mask data are ones. Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are different; I.e. a one bit in either the test data or the mask data - but not both - produces a one bit In the result. AND OR EXCLUSIVE OR 1010 1010 1010 1010 1010 1010 0000 1111 0000 1111 0000 1111 0000 1010 1010 1111 1010 0101 AND Registe, with Accumulator Opcode Operand ANA reg The operand must specify one of the registers A through E, H or L. ThiS instruction ANDs the contents of the specified regi iter with the accumulator and stores the result in the accumulator, The carry flag is reset to zero. I,-~_O O_O_I S S S I Cycles: 1 States: 4 Addressing: register Flags: Z,S,P,CY,AC 3-6
  • 63. Chapter 3. Instruction Set AND Memory with Accumulator Opcode Operand ANA M This Instruction ANDs the contents of the specified memory location with the accumulator and stores the result in the accumulator. The carry flag is reset to zero. o o 0 Cycles: 2 States: 7 Addressing: register Indirect Flags: Z,S,P,CY.AC Example: Since any bit ANDed with a zero produces a zero and any bit ANDed with a one remains unchanged, AND is frequently used to zero particular groups of bits. The following example ensures that the high-order four bits of the accumulator are zero, and the low·order four bits are unchanged. Assume that the C register contains OFH: Accumulator 1 1 1 1 o 0 OFCH C Register o000 1 1 OFH 000 0 o 0 OCH ANI AND IMMEDIATE WITH ACCUMULATOR ANI performs a logical AND operation using the contents of the second byte of the Instruction and the accumu- lator. The result is placed In the accumulator. AN I also resets the carry flag to zero. Opcode Operand ANI data The operand must specify the data to be used In the AND operation. This data may be in the form of a number, an ASCII constant, the label of some previously defined value, or an expression. The data may not exceed one byte. The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. When neither operator is present, the assembler assumes the LOW operator and issues an error message. 3-7
  • 64. Chapter 3. Instruction Se: ' o 0 l data Cycles: 2 States: 7 Addressing: immediate Flags: Z.S.P.CY,AC Summary of ~oglcal Operations AND prodUCt s a one bit in the result only when the corresponding bits In the test data and the mask data are ones. OR produces a one bit in the result when the corresponding bits In either the test data or the mask data are ones. Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are different; i.e. a one bit in either the test data or the mask data - but not both - produces a one bit in the result. AND OR EXCLUSIVE OR 1010 1010 1010 1010 1010 1010 0000 1111 0000 1111 0000 1111 00001010 1010 1111 1010 0101 Example: The followin;. instruction IS used to reset OFF bit SIX of the byte In the accumulator: ANI 1011111IB Since any bit ANDed with a one remains unchanged and a bit ANDed with a zero is rest to zero, the ANI instruction srown above sets bit six OFF and leaves the others unchanged. This technique IS useful when a program uses individual bits as status flags. CALL CALL The CALL Irstructlon combines functions of the PUSH and I MP Instructions. CALL pushes the contents of the program coullter (the address of the next sequential instruction) onto the stack and then iumps to the address specified in t le CALL instruction. Each CALL Instruction or one of ItS variants implies the use of a subsequent RET (return) Instruction. When a call has no cllrresponding return. excess addresses are built up in the stack. 3-8
  • 65. Chapter 3. Instruction Set Opcode Operand CALL address The address may be specified as a number, a label, or an expression. (The label is most common.) The assembler inverts the high and low address bytes when it assembles the instruction. 1 1 0 0 1 1 0 1 low addr high addr Cycles: 5 States: 17 (18 on 8085) Addressing: immediate/register indirect Flags: none Example: When a given coding sequence is required several times in a program, you can usually conserve memory by coding the sequence as a subroutine invoked by the CALL instruction or one of its variants. For example, assume that an application drives a six-digit LED display; the display is updated as a result of an operator input or because of two different calculations that occur in the program. The coding required to drive the display can be included in-line at each of the three points where it is needed, or it can be coded as a subroutine. If the label DISPL Y is assigned to the first instruction of the display driver, the following CALL instruction is used to invoke the display subroutine: CALL DISPLY This CALL instruction pushes the address of the next program instruction onto the stack and then transfers control to the DISPLY subroutine. The DISPLY subroutine must execute a return instruction or one of its variants to resume normal program flow. The following is a graphic illustration of the effect of CALL and return instructions: CALL _ ~ DISPLY --- CALL ~ DISPL Y - - - - - ------- --- - -- RET CALL DISPL Y Consideration for Using Subroutines The larger the code segment to be repeated and the greater the number of repetitions, the greater the potential memory savings of using a subroutine. Thus, if the display driver in the previous example requires one hundred 3-9
  • 66. Chapter 3. Instruction Se: bytes, coding it In-line would require three hundred bytes. Coded as a subroutine, it requires one hundred bytes plus nine bytls for the three CALL instructions. Notice that slJbroutines require the use of the stack. This requires the application to include random access memory for 1 he stack. When an application has no other need for random access memory, the system designer might elect to) avoid the use of subroutines. CC CALL IF CARRY The CC instnlction combines functions of the JC and PUSH instructions. CC tests the setting of the carry flag. If the flag is ,et to one, CC pushes the contents of the program counter onto the stack and then jumps to the address sped"ied in bytes two and three of the CC instruction. If the flag is reset to zero, program execution continues whh the next sequential instruction. Opcode Operand CC address Although thE use of a label is most common, the address may also be specified as a number or expression. 1 1 0 1 1 1 0 0 lowaddr high addr Cycles: 3 or 5 (2 or 5 on 8085) States: 11 or 17 (9 or 18 on 8085) AddreSSing: immediate/register indirect Flags: none Example: For the sake of brevity, an example IS given for the CALL instruction but not for each of its closely related variants. CM CALL IF MINUS The CM inst-uction combines functions of the J M and PUSH instructions. CM tests the setting of the sign flag. If the flag is set to one (indicating that the contents of the accumulator are minus), CM pushes the contents of the progr,lm counter onto the stack and then jumps to the address specified by the CM instruction. If the flag is set to zero, program execution simply continues with the next sequential instruction. Opcode Operand CM address 3-10
  • 67. Chapter 3. Instruction Set Although the use of a label is most common, the address may also be specified as a number or an expression. 1 1 1 1 1 1 0 0 lowaddr high addr Cycles: 3 or 5 (2 or 5 on 8085) States: 11 or 17 (9 or 18 on 8085) Addressing: immediate/register indirect Flags: none Example: For the sake of brevity, an example is given for the CALL instruction but not for each of ItS closely related variants. CMA COMPLEMENT ACCUMULATOR CMA complements each bit of the accumulator to produce the one's complement. All condition flags remain unchanged. Opcode Operand CMA Operands are not permitted with the CMA instruction. 10 0 o Cycles: 1 States: 4 Flags: none To produce the two's complement, add one to the contents of the accumulator after the CMA instructions has been executed. Example: Assume that the accumulator contains the value 51H; when complemented by CMA, it becomes OAEH: 51H 01010001 OAEH 10101110 3-11
  • 68. Chapter 3. Instruction S, t CMC COMPLEMENT CARRY If the carry flag equals zero, CMC sets it to one. If the carry flag is one, CMC resets it to zero. All other flags remain unch,nged. Opcode Operand CMC Operands are not permitted with the CMC instruction. 10 0 Cycles: 1 States: 4 Flags: CYonly Example: Assume that a program uses bit 7 of a byte to control whether a subroutine is called. To test the bit, the pro- gram loads ti,e byte into the accumulator, rotates bit 7 into the carry flag, and executes a CC (Call if Carry) instruction. l:efore returning to the calling program, the subroutine reinitializes the flag byte using the following code: CMC ;SET BIT 7 OFF RAR ;ROTATE BIT 7 INTO ACCUMULATOR RET ;RETURN CMP COMPARE WITH ACCUMULATOR CMP compar,s the specified byte with the contents of the accumulator and Indicates the result by setting the carry and zelo flags. The values being compared remain unchanged. The zero flal indicates equality. No carry indicates that the accumulator is greater than the specified byte; a carry indicaus that the accumulator IS less than the byte. However, the meaning of the carry flag is reversed when the values have different signs or one of the values is complemented. The program tests the condition flags using one of the conditional Jump, Call, or Return instructions. For example, J Z (J ump if Zero l tests for equality Functnnal Description: Comparisons are performed by subtracting the specified byte from the contents of the accumulator, which IS why the zero and carry flags indicate the result. This subtraction uses the processor's internal registers so that source data is preserved. Because subtraction uses two's complement addition, the CMP instruction recoml'lements the carry flag generated by the sUbtraction. 3-12
  • 69. Chapter 3. Instruction Set Compare Register with Accumulator Opcode Operand CMP reg The operand must name one of the registers A through E, H or L. S s sl Cycles: 1 States: 4 Addressing: register Flags: Z,S,P,CY,AC Compare Memory with Accumulator Opcode Operand CMP M This instruction compares the contents of the memory location addressed by the Hand L registers with the contents of the accumulator. M is a symbolic reference to the Hand L register pair. Cycles: 2 States: 7 Addressing: register indirect Flags: Z,S,P,CY,AC Example 1: Assume that the accumulator contains the value OAH and register E contains the value OSH. The instruction CMP E performs the following internal subtraction (remember that subtraction is actually two's complement addition): Accumulator 00001010 +( -E Register) 11111011 00000101 +(-carry) After the carry is complemented to account for the subtract operation, both the zero and carry bits are zero, thus indicating A greater than E. Example 2: Assume that the accumulator contains the value -1 BH and register E contains OSH: Accumulator 11100101 +(-E Register) 11111011 111 00000 +(-carry) 3-13
  • 70. Chapter 3. Instruction S ,t After the 01P Instruction recomplements the carry flag, both the carry flag and zero flag are zero. Normally this indicate, that the accumulator is greater than register E. However. the meaning of the carry flag IS reversed since the val Jes have different signs. The user program is responsible for proper interpretation of the carry flag. CNC CALL IF NO CARRY The CNC in, truction combines functions of the JNC and PUSH instructions. CNC tests the setting of the carry flag. If the fag is set to zero, CNC pushes the contents of the program counter onto the stack and theniumps to the addre;s specified by the CNC instruction. If the flag IS set to one, program execution simply continues with the ne> t sequential instruction. Opcode Operand CNC address Although th,: use of a label is most common, the address may also be specified as a number or an expression. 1 1 0 1 0 1 0 0 low addr high addr Cycles: 3 or 5 (2 or 5 on 8085) States: 11 or 17 (9 or 18 on 8085) Addressing: immediate/register Indirect Flags: none Example: For the sake of brevity, an example IS given for the CALL instruction but not for each of its closely related vanants. CNZ CALL IF NOT ZERO The CNZ In, tructlon combines functions of the J NZ and PUSH Instructions. CNZ tests the setting of the zero flag. If the fag is off (indicating that the contents of the accumulator are other than zero), CNZ pushes the contents of :he program counter onto the stack and then jumps to the address specified in the Instruction's second and hiI'd bytes. If the flag is set to one, program execution simply continues with the next sequential instruction. Opcode Operand CNZ address Although th; use of a label is most common, the address may also be specified as a number or an expression. 3-14
  • 71. Chapter 3. Instruction Set 1 1 0 0 0 1 0 0 lowaddr high addr Cycles: 3 or 5 (2 or 5 on 8085) States: 1.1 or 17 (9 or 18 on 8085) Addressing: immediate/register indirect Flags: none Example: For the sake of breVity, an example is given for the CALL instruction but not for each of its closely related variants. CP CALL IF POSITIVE The CP instruction combines features of the J P and PUSH instructions. CP tests the setting of the sign flag. If the flag is set to zero (indicating that the contents of the accumulator are positive). CP pushes the contents of the program counter onto the stack and theniumps to the address specified by the CP Instruction. If the flag is set to one, program execution simply continues with the next sequential instruction. Opcode Operand CP address Although the use of a label is more common, the address may also be specified as a number or an expression. 1 1 1 1 0 1 0 0 low address high addr Cycles: 3 or 5 (2 or 5 on 8085) States: 11 or 17 (9 or 18 on 8085) Addressing: immediate/register indirect Flags: none Example: For the sake of brevity, an example is given for the CALL instruction but not for each of its closely related variants. 3-15
  • 72. Chapter 3. Instruction Se, CPE CALL IF PARITY EVEN Parity is even if the byte in the accumulator has an even number of one bits. The parity flag is set to one to indicate this condition. The CPE and CPO instructions are useful for testing the parity of input data. However, the IN instruc tion does not set any of the condition flags. The flags can be set without altering the data by adding OOH t" the contents of the accumulator. The ePE instI uction combines functions of the JPE and PUSH instructions. CPE tess the setting of the parity flag. If the flog is set to one, CPE pushes the contents of the program counter onto the stack and then jumps to the addres' specified by the CPE instruction. If the flag is set to zero, program execution simply continues with the next sequential instruction. Opcode Operand CPE address Although the use of a label is more common, the address may also be specified as a number or an expression. 1 1 1 0 1 1 0 0 lowaddr high addr Cycles: 3 or 5 (2 or 5 on 8085) States: 11 or 17 (9 or 18 on 8085) Addressing: immediate/register Indirect Flags: none Example: For the sake )f brevity, an example is given for the CALL instruction but not for each of its closely related variants. CPI COMPARE IMMEDIATE CPI compare, the contents of the second instruction byte with the contents of the accumulator and sets the zero and carry flap to indicate the result. The values being compared remain unchanged. The zero flag Indicates equality. No carry indicates that the contents of the accumulator are greater than the immediate da :a; a carry Indicates that the accumulator is less than the immediate data. However, the meaning of the carry 1lag is reversed when the values have different signs or one of the values is complemented. Opcode Operand CPI data 3·16
  • 73. Chapter 3. Instruction Set The operand must specify the data to be compared. This data may be in the form of a number, an ASCII constant, the label of a previously defined value, or an expression. The data may not exceed one byte. The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the HIGH or LOW operator to specify which byte of the address is to be used In the evaluation of the expression. When neither operator is present, the assembler assumes the LOW operator and issues an error message. o data Cycles: 2 States: 7 Addressing: register Indirect Flags: Z,S,P,CY,AC Example: The instruction CPI 'C' compares the contents of the accumulator to the letter C (43H). CPO CALL IF PARITY ODD Parity is odd if the byte in the accumulator has an odd number of one bits. The panty flag is set to zero to indicate this condition. The CPO and CPE instructions are useful for testing the parity of input data. However, the IN instruction does not set any of the condition flags. The flags can be set without altering the data by adding OOH to the contents of the accumulator. The CPO instruction combines functions of the JPO and PUSH instructions. CPO tests the setting of the panty flag. If the flag is set to zero, CPO pushes the contents of the program counter onto the stack and then jumps to the address specified by the CPO instruction. If the flag is set to one, program execution simply continues with the next sequential instruction. Opcode Operand CPO address Although the use of a label is more common, the address may also be specified as a number or an expression. 1 1 1 0 0 1 0 0 lowaddr high addr Cycles: 3 or 5 (2 or 5 on 8085) States: 11 or 17 (9 or 18 on 8085) Addressing: immediate/register indirect Flags: none 3-17
  • 74. Chapter 3. Instruction Sf t Example: For the sake of brevity, an example is given for the CALL Instruction but not for each of its closely related vanants. CZ CALL IF ZERO The CZ instrJCtion combines functions of the I Z and PUSH Instructions. CZ tests the setting of the zero flag. If the flag IS ;et to one (indicating that the contents of the accumulator are zero), CZ pushes the contents of the program :ounter onto the stack and then lumps to the address specified in the CZ instruction. If the flag IS set to zero (indicating that the contents of the accumulator are other than zero), program execution simply continues wil h the next sequential Instruction. Opcode Operand CZ address Although the use of a label is most common, the address may also be specified as a number or an expression. 1 I 0 0 1 1 0 0 lowaddr high addr Cycles: 3 or 5 (2 or 5 on 8085) States: 11 or 17 (9 or 18 on 8085) Addressing: Immediate/register Indirect Flags: none Example: For the sake of brevity, an example IS given for the CALL instruction but not for each of its closely related vanants. DAA DECIMAL ADJUST ACCUMULATOR The DAA lIl~truction adjusts the eight-bit value in the accumulator to form two four-bit binary coded deCimal digits. Opcode Operand DAA Operands are not permitted with the DAA IIlstructlon. DAA IS used when adding deCimal numbers. It is the only instruction whose function requires use of the auxiliary carry flag. In multi-byte arithmetiC operations, the DAA instruction typically is coded immediately after the arith- metic instruc tion so that the auxiliary carry flag is not altered unintentionally. 3-18
  • 75. Chapter 3. Instruction Set DAA operates as follows: 1. If the least significant four bits of the accumulator have a value greater than nine, or if the auxiliary carry flag is ON, DAA adds six to the accumulator. 2. If the most significant four bits of the accumulator have a value greater than nine, or if the carry flag IS ON, DAA adds six to the most significant four bits of the accumulator. 10 0 o 0 Cycles: 1 States: 4 Addressing: register Flags: Z,S,P,CY,AC Example: Assume that the accumulator contains the value 9BH as a result of adding 08 to 93: CY AC 0 0 1001 0011 0000 1000 1001 1011 = 9BH Since OBH IS greater than nine, the Instruction adds six to contents of the accumulator: CY AC o 1 1001 1011 0000 0110 1010 0001 = A1H Now that the most significant bits have a value greater than nine, the instruction adds SIX to them: CY AC 1 1 1010 0001 0110 0000 0000 0001 When the DAA has finished, the accumulator contains the value 01 in a BCD format; both the carry and auxiliary carry flags are set ON. Since the actual result of this addition is 101, the carry flag IS probably significant to the program. The program IS responsible for recovering and using this information. Notice that the carry flag setting is lost as soon as the program executes any subsequent Instruction that alters the flag. 3-19
  • 76. Chapter 3. Instruction S ,t DAD DOUBLE REGISTER ADD DAD adds ti,e 16-bit value in the specified register pair to the contents of the Hand L register pair. The result is stored in Hand L. Opcode Operand DAD DAD may add only the contents of the B&C, D&E, H&L, or the SP (Stack Pointer) register pairs to the contents of H& L. No ice that the letter H must be used to specify that the H& L register pair is to be added to Itself. DAD sets th ~ carry flag ON if there is a carry out of the Hand L registers. DAD affects none of the condition flags other han carry. Cycles: 3 States: 10 Addressing: register Flags: CY Examples: The DAD in ;truction provides a means for saving the current contents of the stack pointer. LXI H,OOH ;CLEAR H&L TO ZEROS DAD SP ;GET SP INTO H&L SHLD SAVSP ;STORE SP IN MEMORY The instruct on DAD H doubles the number in the Hand L registers except when the operation causes a carry out of the f- register. DCR DECREMENT DCR subtra'ts one from the contents of the specified byte. DCR affects all the condition flags except the carry flag. Becaus( DCR preserves the carry flag, it can be used within multi-byte arithmetic routines for decrementing character co Jnts and similar purposes. Decrement I ~egister Opcode Operand DCR reg 3-20
  • 77. Chapter 3. Instruction Set The operand must specify one of the registers A through E, H or L. Thp. instruction subtracts one from the contents of the specified register. ~D D D Cycles: 1 States: 5 (4 on 8085) Addressing: register Flags: Z,S,P,AC Decrement Memory Opcode Operand DCR M This instruction subtracts one from the contents of the memory location addressed by the Hand L registers. M is a symbol ic reference to the Hand L registers. 10 0 o Cycles: 3 States: 10 Addressing: register indirect Flags: Z,S,P,AC Example: The DCR instruction is frequently used to control multi-byte operations such as moving a number of characters from one area of memory to another: MVI B,5H ;SET CONTROL COUNTER LXI H,260H ;LOAD H&L WITH SOURCE ADDR LXI D.900H ;LOAD D&E WITH DESTINATION ADDR LOOP: MOV A,M ;LOAD BYTE TO BE MOVED STAX D ;STORE BYTE DCX D ;DECREMENT DESTINATION ADDRESS DCX M ;DECREMENT SOURCE ADDRESS DCR B ;DECREMENT CONTROL COUNTER JNZ LOOP ;REPEAT LOOP UNTIL COUNTER=O This example also illustrates an efficient programming technique. Notice that the control counter is decremented to zero rather than incremented until the desired count is reached. This technique avoids the need for a compare instruction and therefore conserves both memory and execution time. 3-21
  • 78. Chapter 3. Instruction Sct DCX DECREMENT REGISTER PAIR DCX decrerrents the contents of the specified register pair by one. DCX affects none of the condition flags. Because DC: preserves all the flags, it can be used for address modification in any instruction sequence that relies on the passing of the flags. Opcode Operand DCX DCX may dlcrement only the B&C, D&E, H&L, or the SP (Stack Pointer) register pairs. Notice that the letter H must be u;ed to specify the Hand L pair. Exercise carl' when decrementing the stack pointer as this causes a loss of synchronization between the pointer and the actual contents of the stack. Cycles: 1 States: 5 (6 on 8085) Addressing: register Flags: none Example: Assume that the Hand L registers contain the address 9800H when the instruction DCX H is executed. DCX considers tht: contents of the two registers to be a single 16-bit value and therefore performs a borrow from the H register te produce the value 97FFH. DI DISABLE INTERRUPTS The interruet system is disabled when the processor recognizes an interrupt or Immediately following execution of a DI instl uction. In applicaticns that use interrupts, the DI instruction is commonly used only when a code sequence must not be interrupted. For example, time-dependent code sequences become inaccurate when interrupted. You can disable the interrup system by including a DI instruction at the beginning of the code sequence. Because you cannot predict the llccurrence of an interrupt, include an EI instruction at the end of the time-dependent code sequence. Opcode Operand DI Operands an not permitted with the DI instruction. 3-22
  • 79. Chapter 3. Instruction Set 1 0 0 11 1 Cycles: 1 States: 4 Flags: none NOTE The 8085 TRAP interrupt cannot be disabled. This special interrupt is intended for serious problems that must be serviced regardless of the interrupt flag such as power failure or bus error. However. no interrupt including TRAP can interrupt the execution of the 01 or EI instruction. EI ENABLE INTERRUPTS The EI instruction enables the interrupt system following execution of the next program instruction. Enabling the interrupt system is delayed one instruction to allow interrupt subroutines to return to the main program before a subsequent interrupt is acknowledged. In applications that use interrupts, the interrupt system is usually disabled only when the processor accepts an interrupt or when a code sequence must not be interrupted. You can disable the interrupt system by including a 01 instruction at the beginning of the code sequence. Because you cannot predict the occurrence of an interrupt, include an EI instruction at the end of the code sequence. Opcode Operand EI Operands are not permitted With the EI instruction. o Cycles: 1 States: 4 Flags: none NOTE The 8085 TRAP interrupt cannot be disabled. This special interrupt is intended for serious problems that must be serviced regardless of the interrupt flag such as power failure or bus failure. However, no interrupt including TRAP can interrupt the execution of the 01 or EI instruction. Example: The EI instruction is frequently used as part of a start-up sequence. When power is first applied. the processor begins operating at some indeterminate address_ Application of a RESET signal forces the program counter to 3-23
  • 80. Chapter 3. Instruction 5 et zero. A common instruction sequence at this point is El, HLT, These instructions enable the interrupt system (RESET als" disables the interrupt system) and halt the processor. A subsequent manual or automatic interrupt then determ Ines the effective start-up address. HLT HALT The HLT in ;truction halts the processor. The program counter contains the address of the next sequential instruction. Jtherwise, the flags and registers remain unchanged. o Cycles: 1 States: 7 (5 on 8085) Flags: none Once in the halt state, the processor can be restarted only by an external event, typically an interrupt. Therefore, you should Je certain that interrupts are enabled before the HLT instruction is executed. See the description of the EI (EnaJle Interrupt) instruction. If an 8080 I-lLT instruction IS executed while interrupts are disabled, the only way to restart the processor is by applicatim of a RESET signal. This forces the program counter to zero. The same is true of the 8085, except for the TR/,P Interrupt, which IS recognized even when the interrupt system is disabled. The proceSSJr can temporarily leave the halt state to service a direct memory access request. However, the pro- cessor reent~rs the halt state once the request has been serviced. A basic purpose for the HLT instruction is to allow the processor to pause while waiting for an interrupt from a peripheral d~vice. However, a halt wastes processor resources and should be used only when there is no useful processing t Isk available. IN INPUT FROM PORT The IN inst uction reads eight bits of data from the specified port and loads it into the accumulator. NOTE fhis description IS restricted to the exact function of the IN instruction. Input/output structures are described in the 8080 or 8085 Microcomputer Systems User's Manual. Opcode Operand IN exp The operand expression may be a number or any expression that yields a value in the range OOH through OFFH. 3·24
  • 81. Chapter 3. Instruction Set ° ° exp Cycles: 3 States: 10 Addressing: direct Flags: none INR INCREMENT INR adds one to the contents of the specified byte. INR affects all of the condition flags except the carry flag. Because INR preserves the carry flag, it can be used within multi-byte arithmetic routines for incrementing character counts and similar purposes. Increment Register Opcode Operand INR reg The operand must specify one of the registers A through E, H or L. The Instruction adds one to the contents of the specified register, ~I D D D 1_ _ 0_01 Cycles: 1 States: 5 (4 on 8085) Addressing: register Flags: Z,S,P,AC Increment Memory Opcode Operand INR M This instruction increments by one the contents of the memory location addressed by the Hand L registers. M is a symbolic reference to the Hand L registers. 1° ° ° ° °I Cycles: 3 States: 10 Addressing: register indirect Flags: Z,S,P,AC 3·25
  • 82. Chapter 3. Instruction 5 ,t Example: If register C contains 99H, the instruction INR C increments the contents of the register to 9AH. INX INCREMENT REGISTER PAIR INX adds olle to the contents of the specified register pair. INX affects none of the condition flags. Because INX preserVlS all the condition flags, it can be used for address modification within multi-byte arithmetic routines. Opcode Operand INX INX may lIl;rement only the B&C, D&E, H& L, or the SP (Stack Pointer) register pairs. Notice that the letter H must be usd to specify the Hand L register pair. Exercise caro when incrementing the stack pOlllter. Assume, for example, that INX SP IS executed after a number of Items ha' e been pushed onto the stack. A subsequent POP instruction accesses the high-order byte of the most recent stack entry and the low-order byte of the next older entry. Similarly, a PUSH Instruction adds the two new bytes t) the stack, but overlays the low-order byte of the most recent entry Cycles: 1 States: 5 (6 on 8085) Addresslllg: register Flags: none Example: Assume tha. the D and E registers contalll the value 01 FFH. The instruction INX D increments the value to 0200H. By ;ontrast, the INR E Instruction ignores the carry out of the low-order byte and produces a result of 0100H. (Tills condition can be detected by testing the Zero condition flag.) If the stack pointer register contallls the value OFFFFH, the instruction INX SP increments the contents of SP to OOOOH. --he INX instruction sets no flags to IIldicate this condition. JC JUMP IF CARRY The JC instruction tests the setting of the carry flag. If the flag is set to one, program execution resumes at the address spe;ified in the JC instruction. If the flag is reset to zero, execution continues with the next sequential instruction. 3-26
  • 83. Chapter 3. Instruction Set Opcode Operand JC address The address may be specified as a number, a label, or an expression. The assembler inverts the high and low address bytes when it assembles the instruction. 1 1 0 1 1 0 1 0 lowaddr high addr Cycles: 3 (2 or 3 on 8085) States: 10 (7 or 10 on 8085) Addressing: immediate Flags: none Example: Examples of the variations of the jump instruction appear in the description of the JPO instruction. JM JUMP IF MINUS The JM Instruction tests the setting of the sign flag. If the contents of the accumulator are negative (sign flag = 1), program execution resumes at the address specified In the Jrv1 instruction. If the contents of the accumulator are positive (sign flag = 0), execution continues with the next sequential instruction. Opcode Operand JM address The address may be specified as a number, a label, or an expression. The assembler inverts the high and low address bytes when it assembles the instructions. 1 1 1 1 1 0 1 0 lowaddr high addr CYcles: 3 (2 or 3 on 8085) States: 10 (7 or 10 on 8085) Addressing: immediate Flags: none Example: Examples of the variations of the lump instruction appear in the description of the JPO instruction. 3-27
  • 84. Chapter 3. Instruction Set JMP JUMP The IMP inst"uction alters the execution sequence by loading the address in its second and third bytes into the program courter. Opeode Operand IMP address The address rnay be specified as a number, a label, or an expression. The assembler inverts the high and low address bytes when it assembles the address. 1 1 0 0 0 0 1 1 lowaddr high addr Cycles: 3 States: 10 Addressing: immediate Flags: none Example: Examples of the variations of the Jump instruction appear in the description of the JPO instruction. JNC JUMP IF NO CARRY The INC ins;ruction tests the setting of the carry flag. If there is no carry (carry flag = 0), program execution resumes at ti,e address specified in the I NC instruction. If there is a carry (carry flag = 1), execution continues with the nex t sequential Instruction. Ooeode Operand INC address The address nay be specified as a number, a label, or an expression. The assembler inverts the high and Jow address byte; when it assembles the instruction. 1 1 0 1 0 0 1 0 lowaddr high addr Cycles: 3 (2 or 3 on 8085) States: 10 (7 or 10 on 8085) Addressing: immediate Flags: none 3-28
  • 85. Chapter 3. Instruction Set Example: Examples of the variations of the jump instruction appear in the description of the JPO Instruction. JNZ JUMP IF NOT ZERO The J NZ Instruction tests the setting of the zero flag. If the contents of the accumulator are not zero (zero flag = 0), program execution resumes at the address specified In the JNZ instruction. If the contents of the accumulator are zero (zero flag = 1), execution continues with the next sequential instruction. Opcode Operand JNZ address The address may be specified as a number, a label, or an expression. The assembler inverts the high and low address bytes when it assembles the instruction. 1 1 0 0 0 0 1 0 lowaddr high addr Cycles: 3 (2 or 3 on 8085) States: 10 (7 or 10 on 8085) AddreSSing: immediate Flags: none Example: Examples of the variations of the lump instruction appear In the description of the J PO instruction. JP JUMP IF POSITIVE The JP instruction tests the setting of the sign flag. If the contents of the accumulator are positive (sign flag = 0), program execution resumes at the address specified in the JP Instruction. If the contents of the accumulator are = minus (sign flag 1), execution continues with the next sequential instruction. Opcode Operand JP address The address may be specified as a number, a label, or an expression. The assembler inverts the high and low order address bytes when it assembles the instruction. 3-29
  • 86. Chapter 3. Instruction 51 t 1 1 1 1 0 0 1 0 lowaddr high addr Cycles: 3 (2 or 3 on 8085) States: 10 (7 or 10 on 8085) Addressi ng: immediate Flags: none Example: Examples of the variations of the lump instruction appear in the description of the JPO instruction. JPE JUMP IF PARITY EVEN Parity IS evell if the byte In the accumulator has an even number of one bits. The parity flag IS set to one to indicate this condition. The J PE Instruction tests the setting of the parity flag. If the parity flag is set to one, program execution resumes at the addre~ s specified in the J PE instruction. If the flag IS reset to zero, execution continues with the next sequential in ;truction. Opcode Operand JPE address The address may be specified as a number, a label, or an expression. The assembler inverts the high and low address byte, when it assembles the instruction. The J PE anc J PO (jump if parity odd) instructions are especially useful for testing the parity of input data. However, th., IN instruction does not set any of the condition flags. The flags can be set by adding OOH to the contents of .he accumulator. 1 1 1 0 1 0 1 0 lowaddr high addr Cycles: 3 (2 or 3 on 8085) States: 10 (7 or 10 on 8085) Addressing: Immediate Flags: none Example: Examples 01 the variations of the lump instruction appear In the deSCrIption of the J PO instruction. 3-30
  • 87. Chapter 3. Instruction Set JPO JUMP IF PARITY ODD Parity is odd if the byte in the accumulator has an odd number of one bits. The parity flag is set to zero to indicate this condition. The JPO Instruction tests the setting of the parity flag. If the parity flag is reset to zero, program execution resumes at the address specified in the JPO instruction. If the flag is set to one. execution continues with the next sequential instruction. Opcode Operand JPO address The address may be specified as a number. a label. or an expression. The assembler Inverts the high and low address bytes when it assembles the instruction. The JPO and JPE (jump if panty even) instructions are especially useful for testing the parity of Input data. However. the IN instruction does not set any of the condition flags. The flags can be set by adding OOH to the contents of the accumulator. 1 1 1 0 0 0 1 0 low addr high addr Cycles: 3 (2 or 3 on 8085) States: 10 (7 or 10 on 8085) Addressing: Immediate Flags: none Example: This example shows three different but equivalent methods for lumping 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 the C register. Label Code Operand ONE: MOV A.C ANI 80H JZ PLUS JNZ MINUS TWO: MOV A.C RLC JNC PLUS JMP MINUS THREE: MOV A.C ADI 0 JM MINUS PLUS: ;SIGN BIT RESET MINUS: ;SIGN BIT SET 3-31
  • 88. Chapter 3. Instruction Set The AND iinmediate instruction in block ONE zeroes all bits of the data byte except the Sign bit, which re- mains unch lnged. If the Sign bit was zero, the Zero condition bit will be set, and the JZ instruction will cause program coltrol to be transferred to the Instruction at PLUS. Otherwise, the JZ instruction will merely update the progranl counter by three, and the JNZ instruction will be executed, causing control to be transferred to the instruct ion at MINUS. (The Zero bit IS unaffected by all jump instructions.) The RLC illstruction in block TWO causes the Carry bit to be set equal to the Sign bit of the data byte. If the Sign bit wai reset, the JNC instruction causes a lump to PLUS. Otherwise the JMP instruction is executed, unconditiollally transferring control to MINUS. (Note that, in this instance, a JC instruction could be sub- stituted for the unconditional jump with identical results.) The add irrmediate instruction In block THREE causes the condition bits to be set. If the sign bit was set, the J M instruction causes program control to be transferred to MINUS. Otherwise, program control flows auto- matically ino the PLUS routine. JZ JUMP IF ZERO The J Z Ins",ruction tests the setting of the zero flag. If the flag is set to one, program execution resumes at the address spe~ified in the JZ instruction. If the flag is reset to zero, execution continues with the next sequential Instruction Opcode Operand JZ address The addresi may be specified as a number, a label, or an expression. The assembler inverts the high and low address by! es when it assembles the instruction. 1 1 0 0 1 0 1 0 low addr high addr Cycles: 3 (2 or 3 on 8085) States: 10 (7 or lOon 8085) Addressing: Immediate Flags: none Example: Examples )f the variations of the jump instruction appear In the deswptlon of the JPO instruction. LOA LOAD ACCUMULATOR DIRECT LDA load~ the accumulator with a copy of the byte at the location specified In bytes two and three of the LDA instr Jction. 3-32
  • 89. Chapter 3. Instruction Set Opcode Operand LDA address The address may be stated as a number. a previously defined label. or an expression. The assembler inverts the high and low address bytes when it builds the instruction. 0 0 1 1 1 0 1 0 lowaddr high addr CYcles: 4 States: 13 Addressing: direct Flags: none Examples: The following instructions are equivalent. When executed. each replaces the accumulator contents with the byte of data stored at memory location 300H. LOAD: LDA 300H LDA 3*{16*16) LDA 200H+256 LDAX LOAD ACCUMULATOR INDIRECT L DAX loads the accumulator with a copy of the byte stored at the memory location addressed by register pair B or register pair D. Opcode Operand LDAX The operand B specifies the Band C register pair: D specifies the D and E register pair. This instruction may specify only the B or D register pair. 10 0 0 -'--------I I~ 0 0 I fo '" register pair B II '" register pair D Cycles: 2 States: 7 Addressing: register indirect Flags: none 3-33
  • 90. Chapter 3. Instruction :,et Example: Assume that register D contains 93H and register E contains 8BH. The following instruction ioads the accumulator with the contents of memory location 938BH: LDAX D LHLD LOAD HAND L DIRECT LHLD loads the L register with a copy of the byte stored ilt the memory location specified in bytes two and three of the LHLD instruction. LHLD then loads the H register with a copy of the byte stored at the next higher memory location. Opcode Operand LHLD address The address may be stated as a number, a label, or an expression. Certain instl uctions use the symbolic reference M to access the memory location currently specified by the Hand L registers. _HLD is one of the instructions provided for loading new addresses into the Hand L registers. The user may al:o load the current top of the stack into the Hand L registers (POP instruction). Both LHLD and POP replace the contents of the Hand L registers. You can also exchange the contents of Hand L with the D and E regist~rs (XCHG instruction) or the top of the stack (XTHL instruction) if you need to save the current Hand L registers for subsequent use. SHLD stores Hand L in memory. 0 0 1 0 1 0 1 0 lowaddr high addr Cycles: 5 States: 16 Addressing: direct Flags: none Example: Assume that locations 3000 and 3001 H contain the address 064EH stored in the format 4E06. In the following sequence, tlie MaY instruction moves a copy of the byte stored at address 064E into the accumulator: LHLD 3000H ;SET UP ADDRESS MaY A,M ;LOAD ACCUM FROM ADDRESS 3·34
  • 91. Chapter 3. Instruction Set LXI LOAD REGISTER PAIR IMMEDIATE LXI is a three-byte instruction; its second and third bytes contain the source data to be loaded into a register pair. LXI loads a register pair by copying its second and third bytes into the specified destination register pair. Opcode Operand LXI The first operand must specify the register pair to be loaded. LXI can load the Band C register pair, the D and E register pair, the Hand L register pair, or the Stack Pointer. The second operand specifies the two bytes of data to be loaded. This data may be coded in the form of a num- ber, an ASCII constant, the label of some previously defined value, or an expression. The data must not exceed two bytes. LXI is the only immediate instruction that accepts a 16-bit value. All other immediate instructions require 8-bit values. Notice that the assembler inverts the two bytes of data to create the format of an address stored in memory. LXI loads its third byte into the first register of the pair and its second byte into the second register of the pair. This has the effect of reinverting the data into the format required for an address stored in registers. Thus, the instruction LXI S,'AZ' loads A Into register Band Z into register C. 0 o I R P I0 0 0 1 low-order data high-order data Cycles: 3 States: 10 Addressing: immediate Flags: none Examples: A common use for LXI is to establish a memory address for use in subsequent instructions. In the following sequence, the LXI instruction loads the address of STRNG into the Hand L registers. The MOV instruction then loads the data stored at that address into the accumulator. LXI H,STRNG ;SET ADDRESS MOV A,M ;LOAD STRNG INTO ACCUMULATOR The following LXI instruction is used to initialize the stack pointer in a relocatable module. The LOCATE pro- gram provides an address for the special reserved label STACK. LXI SP,STACK 3-35
  • 92. Chapter 3. Instruction 5et MOV MOVE The MOV in~ tructlon moves one byte of data by copying the source field into the destination field. Source data remains unchanged. The instruction's operands specify whether the move is from register to register, from a register to m"mory, or from memory to a register. Move Reglsur to Register Opcode Operand MOV regl,reg2 The instructi)n copies the contents of reg2 into regl. Each operand must specify one of the registers A, B, C, D, E, H, or L. When the sal ne register is specified for both operands (as in MOV A,A), the MOV functions as a NOP (no opera- tion) since it has no other noticeable effect. This form of MOV requires one more machine state than NOP, and therefore ha~ a slightly longer execution time than NOP. Since M addresses a register pair rather than a byte of data, MOV H,M is not allowed. G D D Dis 5 51 Cycles: 1 States: 5 (4 on 8085) Addressing: register Flags: none Move to Men'lOry Opcode Operand MOV M,r This instruct ion copies the contents of the specified register Into the memory location addressed by the Hand L registers. M s a symbolic reference to the Hand L register pair. The second operand must address one of the registers. 1,--0 0 Is 5 51 Cycles: 2 States: 7 Addressing: register Indirect Flags: none Move from .Vlemory Opcode Operand MOV r,M 3-36
  • 93. Chapter 3. Instruction Set This instruction copies the contents of the memory location addressed by the Hand L registers into the specified register. The first operand must name the destination register. The second operand must be M. M is a symbolic reference to the Hand L registers. CID 0 °I 01 Cycles: 2 States: 7 Addressing: register indirect Flags: none Examples: Label Opcode Operands Comment LDACC: MOV A,M ;LOAD ACCUM FROM MEMORY MOV E,A ;COPY ACCUM INTO E REG NULOP: MOV C,C ;NULL OPERATION MVI MOVE IMMEDIATE MVI is a two-byte instruction; its second byte contains the source data to be moved. MVI moves one byte of data by copying its second byte into the destination field. The instruction's operands specify whether the move is to a register or to memory. Move Immediate to Register Opcode Operand MVI reg,data The first operand must name one of the registers A through E, H or L as a destination for the move. The second operand specifies the actual data to be moved. This data may be in the form of a number, an ASCII constant, the label of some previously defined value, or an expression. The data must not exceed one byte. The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. When neither operator is present, the assembler assumes the LOW operator and issues an error message. data Cycles: 2 States: 7 Addressing: immediate Flags: none 3-37
  • 94. Chapter 3. Instruction iet Move Immediate to Memory Opcode Operand MVI M,data This instruc:ion copies the data stored in its second byte into the memory location addressed by Hand L. M is a symbolic eference to the Hand L register pair. o 0 o o data Cycles: 3 States: 10 AddreSSing: Immediate/register indirect Flags: none Examples: The followilg examples show a number of methods for defining immediate data In the MVI instruction. All of the exampk s generate the bit pattern for the ASCII character A. MVI M,01000001B MVI M:A' MVI M.41H MVI M,101Q MVI M,65 MVI M,5+30*2 NOP NO OPERATION NOP perfor TIS no operation and affects none of the condition flags. NOP IS useful as filler in a timing loop. Opcode Operand NOP Operands al e not permitted with the NOP instruction. ORA INCLUSIVE OR WITH ACCUMULATOR ORA perf01 ms an inclusive OR logical operation uSing the contents of the specified byte and the accumulator. The result is pla:ed in the accumulator. 3-38
  • 95. Chapter 3. Instruction Set Summary of Logical Operations AND produces a one bit in the result only when the corresponding bits in the test data and the mask data are one. OR produces a one bit in the result when the corresponding bits in either the test data or the mask data are ones. Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are different; i.e., a one bit in either the test data or the mask data - but not both - produces a one bit in the result. AND OR EXCLUSIVE OR 1010 1010 1010 1010 1010 1010 0000 1111 0000 1111 0000 1111 00001010 1010 1111 1010 0101 OR Register with Accumulator Opcode Operand ORA reg The operand must specify one of the registers A through E, H or L. This instruction ORs the contents of the specified register and the accumulator and stores the result in the accumulator. The carry and auxiliary carry flags are reset to zero. o oIss S I Cycles: 1 States: 4 Addressing: register Flags: Z,S,P,CY,AC OR Memory with Accumulator Opcode Operand ORA M The contents of the memory location specified by the Hand L registers are inciusive-oRed with the contents of the accumulator. The result is stored in the accumulator. The carry and auxiliary carry flags are reset to zero. o o Cycles: 2 States: 7 Addressing: register indirect Flags: Z,S,P,CY,AC 3-39
  • 96. Chapter 3. Instruction Set Example: Since any tit inciusive-ORed with a one produces a one and any bit ORed with a zero remains unchanged, ORA is frequentl y used to set ON particular bits or groups of bits. The following example ensures that bit 3 of the accumulator is set ON, but the remaining bits are not disturbed. This is frequently done when individual bits are used as status flags in a program. Assume that register D contains the value OSH: Accumulator 01000011 Register D o 0 0 0 1 000 01001011 ORI INCLUSIVE OR IMMEDIATE ORI performs an inclusive OR logical operation using the contents of the second byte of the instruction and the contents 01 the accumulator, The result is placed in the accumulator. ORI also resets the carry and auxiliary carry flags to zero. Opcode Operand ORI data The operar d must specify the data to be used In the inclusive OR operation. This data may be in the form of a number, ar ASCII constant, the label of some previously defined value, or an expression. The data may not exceed one byte. The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. When neitrer operator is present, the assembler assume the LOW operator and issues an error message. o o data Cycles: 2 States: 7 Addressing: immediate Flags: Z,S,P,SY,AC Summary, If Logical Operations AND prod Jces a one bit in the result only when the corresponding bits in both the test data and the mask data are ones. OR prodU< es a one bit in the result when the corresponding bits in either the test data or the mask data are ones. Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are different; I.e., a one bit in either the test data or the mask data - but not both produces a one bit in the result. 3-40
  • 97. Chapter 3. Instruction Set AND OR EXCLUSIVE OR 1010 1010 1010 1010 1010 1010 00001111 00001111 0000 1111 00001010 1010 1111 10100101 Example: See the description of the ORA instruction for an example of the use of the inclusive OR. The following examples show a number of methods for defining immediate data in the ORI instruction. All of the examples generate the bit pattern for the ASCII character A. ORI 01000001B ORI 'A' ORI 41H ORI 101Q ORI 65 ORI 5+30*2 OUT OUTPUT TO PORT The OUT instruction places the contents of the accumulator on the eight-bit data bus and the number of the selected port on the sixteen-bit address bus. Since the number of ports ranges from 0 through 255, the port number is duplicated on the address bus. It is the responsibility of external logic to decode the port number and to accept the output data. NOTE Because a discussion of input/output structures is beyond the scope of this manual, this description is restricted to the exact function of the OUT instruction. Input/output structures are described in the 8080 or 8085 Microcomputer Systems User's Manual. Opcode Operand OUT exp The operand must specify the number of the desired output port. This may be in the form of a number or an expression in the range OOH through OFFH. 1 0 0 0 1 I I exp Cycles: 3 States: 10 Addressing: direct Flags: none 3·41
  • 98. Chapter 3. Instruction Se: PCHL MOVE H&L TO PROGRAM COUNTER PCHL loads tle contents of the Hand L registers Into the program counter register. Because the processor fetches the next instruction from the updated program counter address, PCHL has the effect of a iump instruc- tion. Opcode Operand PCHL Operands are not permitted with the PCHL instruction. PCHL moves the contents of the H register to the high-order eight bits of the program counter and the contents of the L regHer to the low-order eight bits of the program counter. The user pro'~ram must ensure that the Hand L registers contain the address of an executable instruction when the PCHL In: truction is executed. o o 0 1 I Cycles: 1 States: 5 (6 on 8085) AddreSSing: register Flags: none Example: One techniqlle for passing data to a subroutine IS to place the data Immediately after the subroutine call. The return addre, s pushed onto the stack by the CALL Instruction actually addresses the data rather than the next instruction ater the CALL. For tillS example, assume that two bytes of data follow the subroutine call. The following coding sequence performs a return to the next Instruction after the call: GO BACK: POP H ;GET DATA ADDRESS INR L ;ADD 2 TO FORM INR L ;RETURN ADDRESS PCHL ;RETURN POP POP The POP ins:ruction removes two bytes of data from the stack and copies them to a register pair or copies the Program Stttus Word into the accumulator and the condition flags. POP Registe, Pair POP copies: he contents of the memory location addressed by the stack pointer Into the low-order register of the register pair POP then increments the stack pointer by one and copies the contents of the resulting address into 3-42
  • 99. Chapter 3. Instruction Set the high-order register of the pair. POP then increments the stack pointer again so that it addresses the next older Item on the stack. Opcode Operand POP The operand may specify the B&C, D&E, or the H&L register pairs. POP PSW is explained separately. ~ R pi 0 0 0 11 Cycles: 3 States: 10 Addressing: register indirect Flags: none POP PSW POP PSW uses the contents of the memory location specified by the stack pointer to restore the condition flags. POP PSW increments the stack pointer by one and restores the contents of that address to the accumulator. POP then increments the stack pointer again so that it addresses the next older item on the stack. Cycles: 3 States: 10 Addressing: register Indirect Flags: Z,S,P,CY,AC Example: Assume that a subroutine is called because of an external interrupt. In general, such subroutines should save and restore any registers it uses so that main program can continue normally when it regains control. The following sequence of PUSH and POP instructions save and restore the Program Status Word and all the registers: 343
  • 100. Chapter 3. Instruction :,et PUSH PSW PUSH B PUSH D PUSH H subroutine coding POP H POP D POP B POP PSW RET Notice that the sequence of the POP instructions is the opposite of the PUSH instruction sequence. PUSH PUSH The PUSH ilstruction copies two bytes of data to the stack. This data may be the contents of a register pair or the Progran Status Word. as explained below: PUSH Regis'er Pair PUSH decrements the stack pointer register by one and copies the contents of the high-order register of the register pair to the resulting address. PUSH then decrements the pointer again and copies the low-order register to the resuh ing address. The source registers remain unchanged. Opcode Operand PUSH {U The operand may specify the B&C. D&E. or H&L register pairs. PUSH PSW is explained separately. Cycles: 3 States: 11 (13 on 8085) Addressi ng: register indirect Flags: none Example: Assume tha: register B contains 2AH. the C register contains 4CH, and the stack pOinter is set at 9AAF. The instruction'USH B stores the B register at memory address 9AAEH and the C register at 9AADH. The stack pointer is st:t to 9AADH: 344
  • 101. Chapter 3. Instruction Set Stack Stack Before PUSH Address After PUSH SP before .. xx 9AAF xx xx xx xx 9AAE 9AAD 9AAC 2A 4C xx .. SP after PUSH PSW PUSH PSW copies the Program Status Word onto the stack. The Program Status Word comprises the contents of the accumulator and the current settings of the condition flags. Because there are only five condition flags, PUSH PSW formats the flags Into an eight-bit byte as follows: 7 6 5 4 3 2 o ~AC 0 P I CY I On the 8080, bits 3 and 5 are always zero; bit one is always set to one. These filler bits are undefined on the 8085. PUSH PSW decrements the stack pointer by one and copies the contents of the accumulator to the resulting address. PUSH PSW again decrements the pointer and copies the formatted condition flag byte to the resulting address. The contents of the accumulator and the condition flags remain unchanged. o Cycles: 3 States: 11 (120n8085) Addressing: register indirect Flags: none Example: When a program calls subroutines, it is frequently necessary to preserve the current program status so the calling program can continue normally when it regains control. Typically, the subroutine performs a PUSH PSW prior to execution of any instruction that might alter the contents of the accumulator or the condition flag settings. The subroutine then restores the pre-call system status by executing a POP PSW instruction just before returning control to the calling program. RAL ROTATE LEFT THROUGH CARRY RAL rotates the contents of the accumulator and the carry flag one bit position to the left. The carry flag, which is treated as though it were part of the accumulator, transfers to the low-order bit of the accumulator. The high- order bit of the accumulator transfers into the carry flag. Opcode Operand RAL Operands are not permitted with the RAL instruction. 345
  • 102. Chapter 3. Instruction S"t 10 0 0 o Cycles: 1 States: 4 Flags: CYonly Example: Assume that the accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus- trate the eff, ct of the RAL instruction: Before Carry o }--------.., Accumulator o o o o After: Carry DJ Accumulator 1 0 0 0 0 01 RAR ROTATE RIGHT THROUGH CARRY RAR rotate~ the contents of the accumulator and the carry flag one bit position to the right. The carry flag, which is tre2ted as though it were part of the accumulator. transfers to the high-order bit of the accumulator. The low-ord"r bit of the accumulator transfers into the carry flag. Opcode Operand RAR Operands an' not permitted with the RAR instruction. 10 0 0 Cycles: 1 States: 4 Flags: CYonly 3-46
  • 103. Chapter 3. Instruction Set Example: Assume that the accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus- trate the effect of the RAR instruction: Before: Carry 0 Accumulator 0 0 0 0 After: Carry ~ Accumulator 1 0 0 0 0 1 I RC RETURN IF CARRY The RC instruction tests the carry flag. If the flag is set to one to indicate a carry. the instruction pops two bytes off the stack and places them in the program counter. Program execution resumes at the new address in the program counter. If the flag is zero, program execution simply continues with the next sequential instruction. Opcode Operand RC Operands are not permitted with the RC instruction. o o 0 0 I Cycles: 1 or 3 States: 5 or 11 (6 or 12 on 8085) Addressing: register indirect Flags: none Example: For the sake of brevity. an example is given for the RET instruction but not for each of its closely related variants. 347
  • 104. Chapter 3. Instruction Set RET RETURN FROM SUBROUTINE The RET irstruction pops two bytes of data off the stack and places them In the program counter register. Program ex,:cution resumes at the new address In the program counter. Typically, I:ET instructions are used in conjunction with CALL instructions. (The same IS true of the variants of these instructions.) In this case, it IS assumed that the data the RET instruction pops off the stack is a return addr:ss placed there by a previous CALL. This has the effect of returning control to the next Instruction after the CILL. The user must be certain that the RET instruction finds the address of executable code on the stack. If th,' instruction finds the address of data, the processor attempts to execute the data as though it were code. Opcode Operand RET Operands a'e not permitted with the RET Instruction. o 0 o 0 Cycles: 3 States: 10 Addressing: register indirect Flags: none Example: As mentior ed previously, subroutines can be nested. That is, a subroutine can call a subroutine that calls another sul,routine. The only practical limit on the number of nested calls is the amount of memory available for stackin:; return addresses. A nested subroutine can even call the subroutine that called it, as shown In the follOWing example. (Notice that the program must contain logic that eventually returns control to the main program. Ctherwlse, the two subroutines will call each other indefinitely.) 1~ MAlt1 PROGRAM SUBA r--~---CALLSUBA 1 SUBB CILL SUBA CNZ S U B ~ T T T - RET RET .... RIM (8085 PRO::ESSOR ONLY) READ INTERRUPT MASK The RIM ilstruction loads eight bits of data into the accumulator. The resulting bit pattern indicates the current setting of . he interrupt mask, the setting of the interrupt flag, pending interrupts, and one bit of serial input data, if any. 348
  • 105. Chapter 3. Instruction Set Opcode Operand RIM Operands are not permitted with the RIM instruction. The RIM instruction loads the accumulator with the following information: I 7 6 5 4 3 2 1 0 I SID 17 16 15 IE 7.5 6.5 5.5 "--v-' "---v---" V '---v----" I L L Interrupt Masks: 1 = masked Llnterrupt Enable Flag: = enabled Pending Interrupts: 1 = pending '----Serial Input Data Bit. if any The mask and pending flags refer only to the RST5.5, RST6.5, and RST7.5 hardware interrupts. The IE flag refers to the entire interrupt system. Thus, the IE flag is identical in function and level to the INTE pin on the 8080. A 1 bit in this flag indicates that the entire interrupt system is enabled. 0 0 0 0 0 0 01 1 Cycles: 1 States: 4 Flags: none RLC ROTATE ACCUMULATOR LEFT RLC sets the carry flag equal to the high-order bit of the accumulator, thus overwriting its previous setting. RLC then rotates the contents of the accumulator one bit position to the left with the high-order bit transferring to the low-order position of the accumulator. Opcode Operand RLC Operands are not allowed with the RLC instruction. 10 0 0 0 0 Cycles: 1 States: 4 Flags: CYonly 349
  • 106. Chapter 3. Instruction S,t Example: Assume that tne accumulator contains the value OAAH and the carry flag is zero. The following diagrams illus- trate the effect of the RLC instruction. Before: Carry 0 Accumulator 0 0 0 0 After: Carry Q Accumulator 1 0 0 0 0 1[ RM RETURN IF MINUS The RM instr Jction tests the sign flag. If the flag is set to one to indicate negative data in the accumulator, the instruction pcps two bytes off the stack and places them in the program counter, Program execution resumes at the new addr,'ss In the program counter. If the flag is set to zero, program execution simply continues with the next sequentlll instruction. Opcode Operand RM Operands are not permitted with the RM instruction. o 0 01 Cycles: 1 or 3 States: 5 or 11 (6 or 12 on 8085) Addressing: register indirect Flags: none Example: For the sake of brevity, an example is given for the RET instruction but not for each of its closely related variants. 3-50
  • 107. Chapter 3. Instruction Set RNC RETURN IF NO CARRY The RNC instruction tests the carry flag. If the flag is set to zero to indicate that there has been no carry, the instruction pops two bytes off the stack and places them in the program counter. Program execution resumes at the new address in the program counter. If the flag is one, program execution simply continues with the next sequential instruction. Opcode Operand RNC Operands are not permitted with the RNC instruction. a a a a 01 Cycles: 1 or 3 States: 5 or 11 (6 or 12 on 8085) Addressing: register indirect Flags: none Example: For the sake of breVity. an example is given for the RET instruction but not for each of its closely related variants. RNZ RETURN IF NOT ZERO The RNZ instruction tests the zero flag. If the flag is set to zero to indicate that the contents of the accumulator are other than zero. the instruction pops two bytes off the stack and places them in the program counter. Pro- gram execution resumes at the new address in the program counter. If the flag is set to one. program execution simply continues with the next sequential instruction. Opcode Operand RNZ Operands are not permitted with the RNZ instruction. 11 a a a a a 01 Cycles: 1 or 3 States: 501'11 (601' 12 on 8085) Addressing: register indirect Flags: none Example: For the sake of brevity. an example IS given for the RET instruction but not for each of its closely related variants. 3-51
  • 108. Chapter 3. Instruction S"t RP RETURN IF POSITIVE The RP instnlction tests the sign flag. If the flag is reset to zero to indicate positive data in the accumulator, the instruction pops two bytes off the stack and places them in the program counter. Program execution resumes at the new address in the program counter. If the flag is set to one, program execution simply continues with the next sequential instruction. Opcode Operand RP Operands are not permitted with the RP instruction. o 0 0 01 Cycles: 1 or 3 States: 5 or 11 (6 or 12 on 8085) Addressing: register indirect Flags: none Example: For the sake of brevity, an example is given for the RET instruction but not for each of its closely related variants. RPE RETURN IF PARITY EVEN Parity is ever if the byte in the accumulator has an even number of one bits. The parity flag IS set to one to indicate this ;ondition. The RPE and RPO instructions are useful for testing the parity of input data. However, the IN instru;tion does not set any of the condition flags. The flags can be set without altering the data by adding OOH to the contents of the accumulator. The RPE ins', ruction tests the parity flag. If the flag is set to one to indicate even parity, the instruction pops two bytes of' the stack and places them in the program counter. Program execution resumes at the new address in the program counter. If the flag IS zero. program execution simply continues with the next sequential instruc- tion. Opcode Operand RPE Operands are not permitted with the RPE instruction. o o 0 01 Cycles: 1 or 3 States: 5 or 11 (6 or 12 on 8085) Addressing: register indirect Flags: none 3-52
  • 109. Chapter 3. Instruction Set Example: For the sake of brevity, an example IS given for the RET instruction but not for each of its closely related variants. RPO RETURN IF PARITY ODD Parity is odd if the byte in the accumulator has an odd number of one bits. The parity flag is reset to zero to indicate this condition. The RPO and RPE instructions are useful for testing the parity of input data. However, the IN instruction does not set any of the condition flags. The flags can be set without altering the data by adding OOH to the contents of the accumulator. The RPO instruction tests the parity flag. If the flag is reset to zero to indicate odd parity, the instruction pops two bytes off the stack and places them in the program counter. Program execution resumes at the new address in the program counter. If the flag is set to one, program execution simply continues with the next sequential instruction. Opcode Operand RPO Operands are not permitted with the RPO instruction. o 0 0 0 01 Cycles: 1 or 3 States: 5 or 11 (6 or 12 on 8085) Addressing: register Indirect Flags: none Example: For the sake of brevity, an example is given for the RET instruction but not for each of its closely related variants. RRC ROTATE ACCUMULATOR RIGHT RRC sets the carry flag equal to the low-order bit of the accumulator, thus overwriting its previous setting. RRC then rotates the contents of the accumulator one bit position to the right with the low-order bit transferring to the high order position of the accumulator. Opcode Operand RRC Operands are not permitted with the RRC instruction. 3-53
  • 110. Chapter 3. Instruction Set 10 0 0 0 Cycles: States: 4 Flags: CYonly Example: Assume that the accumulator contains the value OAAH and the carry flag is zero. The folloving diagrams illus- trate the effect of the RRC instruction: Before: Carry G Accumulator 0 0 0 After: Carry G Accumulator 0 0 0 0 1 1 RST RESTART RST IS a special purpose CALL instruction designed primarily for use with interrupts. RST !,ushes the contents of the program counter onto the stack to provide a return address and then Jumps to one 0 eight predetermined addresses. A three-bit code carried in the opcode of the RST instruction specifies the Jump ,Iddress. The restart instruction IS unique because it seldom appears as source code 111 an applications program. More often, the peripheral devices seekll1g interrupt service pass this one-byte instruction to the processcr, When a deVice requests interrupt service and lI1terrupts are enabled, the processor acknowlecges the request and prepares its data lines to accept anyone-byte instruction from the deVice. RST is generally he instruction of chOice because its special purpose CALL establishes a return to the main program. The processor moves the three-bit address code from the RST instruction into bits 3, 4, ane 5 of the program counter. In effect, this multiplies the code by eight. Program execution resumes at the new address where eight bytes are available for code to service the interrupt. If eight bytes are too few, the program can either Jump to or call a subroutine. 3-54
  • 111. Chapter 3. Instruction Set 8085 NOTE The 8085 processor Includes four hardware inputs that generate internal RST instructions. Rather than send a RST instruction, the interrupting device need only apply a signal to the RST5.5, RST6.5, RST7.5, or TRAP input pin. The processor then generates an internal RST instruction. The execution depends on the input: INPUT RESTART NAME ADDRESS TRAP 24H RST5.5 2CH RST6.5 34H RSn.5 3CH Notice that these addresses are within the same portion of memory used by the RST instruction, and therefore allow only four bytes - enough for a call or jump and a return for the interrupt service routine. If Included in the program code, the RST instruction has the following format: Opcode Operand RST code The address code must be a number or expreSSion within the range 0008 through 1118. 11 IC ~ C r '" I1 11 Progrdm --~ Counter 15 14 13 12 11 10 9 8 7 6 5 4 3 2 0 After RST 10 0 0 0 0 0 0 0 0 0 C C C 0 0 01 Cycles: 3 States: 11 (12 on 8085) Addressing: register indirect Flags: none RZ RETURN IF ZERO The RZ instruction tests the zero flag. If the flag IS set to one to indicate that the contents of the accumulator are zero, the instruction pops two bytes of data off the stack and places them in the program counter. Program execution resumes at the new address in the program counter. If the flag is zero, program execution simply continues with the next sequential instruction. 3-55
  • 112. Chapter 3. Instruction Se Gpcode Operand RZ Operands are not permitted with the RZ instruction. o 0 o 0 01 Cycles: 1 or 3 States: 5 or 11 (6 or 12 on 8085) Addressing: register indirect Flags: none Example: For the sake of brevity. an example is given for the RET instruction but oot for each of its closely related variants. SBB SUBTRACT WITH BORROW SBB subtracts one byte of data and the setting of the carry flag from the contents of the accumulator. The result is stored in the accumulator. SBB then updates the setting of the carry flag to indicate the outcome of the operation SBB's use of he carry flag enables the program to subtract nulti-byte strings. SBB incorporates the carry flag by adding it to tile byte to be subtracted from the accumulator. It then subtracts the result from the accumulator by using two', complement addition. These preliminary operations occur in the processor's internal work registers so that the SOJrce data remains unchanged. Subtract Regl.'ter from Accumulator with Borrow Opcode Operand SBB reg The operand nust specify one of the registers A through E, H or L. This instruction subtracts the contents of the specified I egister and the carry flag from the accumulator and stores the result in the accumulator. 11 0 0 S 5 S I Cycles: 1 States: 4 Addressing: register Flags: Z,S,P,CY,AC 3-56
  • 113. Chapter 3. Instruction Set Subtract Memory from Accumulator with Borrow Opcode Operand SBB M This instruction subtracts the carry flag and the contents of the memory location addressed by the Hand L registers from the accumulator and stores the result in the accumulator. Cycles: 2 States: 7 Addressing: register indirect Flags: Z,S,P,CY,AC Example: Assume that register B contains 2, the accumulator contains 4, and the carry flag is set to 1. The instruction SBB B operates as follows: 2H + carry = 3H 2's complement of 3H = 11111101 Accumulator = 00000100 11111101 00000001 = 1H Notice that this two's complement addition produces a carry. When SBB complements the carry bit generated by the addition, the carry flag is reset OFF. The flag settings resulting from the SBB B instruction are as follows: Carry o Sign o Zero o Parity o Aux. Carry 1 SBI SUBTRACT IMMEDIATE WITH BORROW SBI subtracts the contents of the second Instruction byte and the setting of the carry flag from the contents of the accumulator. The result is stored in the accumulator. SBI's use of the carry flag enables the program to subtract multi-byte strings. SBI incorporates the carry flag by adding it to the byte to be subtracted from the accumulator. It then subtracts the result from the accumulator by using two's complement addition. These preliminary operations occur In the processor's internal work registers so that the immediate source data remains unchanged. 3-57
  • 114. Chapter 3. Instruction Se The assembler s relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the HIGH or LOlA operator to specify which byte of the address is to be used in the evaluation of the expression. When neither cJperator is present, the assembler assumes the LOW operator and issues an error message. Opcode Operand 5BI data The operand must specify the data to be subtracted. This data may be in the form of a number, an ASCII constant, the Iabel of some perviously defined value, or an expression. The data may not exceed one byte. o 01 Cycles: 2 States: 7 Addressing: immediate Flags: Z,5,P,CY.AC Example: The following sequence of instructions enables the program to test the setting of the carry flag: XRA A 5BI 1 The exclusive OR with the accumulator clears the accumulator to zeros but does not affect the setting of the carry flag. (Tfe XRA instruction is explained later in this chapter.) When the carry flag is OFF, 5BI 1 yields a minUS one. Nhen the flag is set ON, 5BI 1 yields a minus two. NOTE This example is included for illustrative purposes. In most cases, the carry flag can be tested more efficiently by using the JNC instruction (jump if no carry). SHLD STORE HAND L DIRECT 5HLD stores l copy of the L register in the memory location specified in bytes two and three of the SHLD Instruction. 5-lLD then stores a copy of the H register in the next higher memory location. Opcode Operand SHLD address The address may be stated as a number, a previously defined label. or an expression. 3·58
  • 115. Chapter 3. Instruction Set SHLD is one of the instructions provided for saving the contents of the Hand L registers. Alternately, the H and L data can be placed in the D and E registers (XCHG instruction) or placed on the stack (PUSH and XTHL instructions). 0 0 1 0 0 0 1 0 lowaddr high addr Cycles: 5 States: 16 Addressing: direct Flags: none Example: Assume that the Hand L registers contain OAEH and 29H, respectively, The following is an illustration of the effect of the SHLD lOAH instruction: MEMORY ADDRESS 109 lOA lOB 10C Memory Before SHLD 00 00 00 00 Memory After SH LD 00 29 AE 00 SIM (8085 PROCESSOR ONLY) SET INTERRUPT MASK SI M is a multi-purpose instruction that uses the current contents of the accumulator to perform the following functions: Set the interrupt mask for the 8085's RST5.5, RST6.5, and RST7.5 hardware interrupts: reset RST7.5's edge sensitive input; and output bit 7 of the accumulator to the Serial Output Data latch. Opcode Operand SIM Operands are not permitted with the SIM instruction. However, you must be certain to load the desired bit configurations into the accumulator before executing the SIM instruction. SIM interprets the bits in the accumu- lator as follows: ]-59
  • 116. Chapter 3. Instruction Set o = available { 1 = masked ignored If 1, bit 7 is output to Serial Output Data Latch Serial Output Data: ignored if bit 6 = 0 Accumulator :,its 3 and 6 function as enable switches. If bit 3 IS set ON (set to 1), the set mask function is enabled. Bits (J through 2 then mask or leave available the corresponding RST interrupt. A 1 bit masks the interrupt mak ng It unavailable; a 0 bit leaves the interrupt available. If bit 3 is set OFF (reset to 0), bits 0 through 2 hav~ no effect. Use this option when you want to send a serial output bit without affecting the interrupt mas!.. Notice that the DI (Disable Interrupts) instruction overrides the SIM instruction. Whether masked or not, RST5.5, RST6.5, and IlST7.5 are disabled when the DI instruction IS in effect. Use the RIM (Read Interrupt Mask) instruction to determine the current settings of the interrupt flag and the interrupt masks. If bit 6 is set to 1, the serial output data function is enabled. The processor latches accumulator bit 7 into the SOD output v'here it can be accessed by a peripheral device. If bit 6 IS reset to 0, bit 7 IS ignored. A 1 in accumiJlator bit 4 resets OFF the RST7.5 input flip flop. Unlike RST5.5 and 6.5, RST7.5 IS sensed via a processor flip flop that is set when a peripheral device Issues a pulse with a rising edge. This edge triggered Input supports devices that cannot maintain an interrupt request until serviced. RST7.5 is also useful when a device does not requ re any explicit hardware service for each interrupt. For example, the program might increment and test an event ,:ounter for each interrupt rather than service the device directly. The RST7.5 f ip flop remains set until reset by 1) Issuing a RESET to the 8085, 2) recognizing the interrupt, or 3) setting accLmulator bit 4 and executing a SIM instruction. The Reset RST7.5 feature of the SIM instruction allows the pre gram to override the interrupt. The RST7.5 Illput flip flop is not affected by the setting of the interrupt mask or the DI instruction and there- fore can be set at any time. However, the interrupt cannot be serviced when RST7.5 is masked or a DI instruction is in effect. 0 0 0 0 0 01 1 Cycles: 1 States: 4 Flags: none Example 1: <ssume that the accumulator contains the bit pattern 00011100. The SIM instruction resets the RST7.5 flip fl)p and sets the RST7.5 interrupt mask. If an RSn.5 interrupt is pending when this SIM instruction is executed, it is overridden without being serviced. Also, any subsequent RST7.5 Interrupt is masked and cannot be serviced urtil the interrupt mask is reset. 3-60
  • 117. Chapter 3. Instruction Set Example 2: Assume that the accumulator contains the bit pattern 11001111. The 51 M instruction masks out the R5T5.5, R5T6.5, and R5T7.5 level interrupts and latches a 1 bit into the SOD input. By contrast, the bit pattern 10000111 has no effect since the enable bits 3 and 6 are not set to ones. SPHL MOVE H&L TO SP 5PHL loads the contents of the Hand L registers into the SP (Stack Pointer) register. Opcode Operand SPHL Operands are not permitted with the SPHL instruction. SP is a special purpose 16·bit register used to address the stack; the stack must be in random access memory (RAM). Because different applications use different memory configurations, the user program must load the SP register with the stack's beginning address. The stack is usually assigned to the highest available location in RAM. The hardware decrements the stack pointer as items are added to the stack and increments the pointer as items are removed. The stack pointer must be initialized before any instruction attempts to access the stack. Typically, stack initialization occurs very early in the program. Once established, the stack pointer should be altered with caution. Arbitrary use of 5PHL can cause the loss of stack data. Cycles: 1 States: 5 (6 on 8085) Addressing: register Flags: none Example: Assume that the Hand L registers contain SOH and OFFH, respectively. SPHL loads the stack pointer with the value 50FFH. STA STORE ACCUMULATOR DIRECT STA stores a copy of the current accumulator contents into the memory location specified in bytes two and three of the STA instruction. Opcode Operand STA address The address may be stated as a number, a previously defined label, or an expression. The assembler inverts the high and low address bytes when it builds the instruction. 3-61
  • 118. Chapter 3. Instruction Se. 0 0 1 1 0 0 1 0 lowaddr high addr Cycles: 4 States: 13 Addressing: direct Flags: none Example: The following instruction stores a copy of the contents of the accumulator at memory location SB3H: STA SB3H When assembl( d. the previous instruction has the hexadecimal value 32 B3 05. Notice that the assembler inverts the high and I'lw order address bytes for proper storage in memory. STAX STORE ACCUMULATOR INDIRECT The STAX ins :ruction stores a copy of the contents of the accumulator into the memory location addressed by register pai B or register pair D. Opcode Operand STAX The operand E specifies the Band C register pair; D specifies the D and E register pair. This instruction may specify only tie B or D register pair. 10 0 oeJo '-...,-/ 0 01 IfII 0 = register pair B = register pair D CYcles: 2 States: 7 Addressing: register Indirect Flags: none Example: If register B c<.ntains 3FH and register C contains 16H. the following instruction stores a copy of the contents of the accumuiator at memory location 3F16H: STAX B 3-62
  • 119. Chapter 3. Instruction Set STC SET CARRY STC sets the carry flag to one. No other flags are affected. Opcode Operand STC Operands are not permitted with the STC instruction. 10 0 o Cycles: 1 States: 4 Flags: CY When used in combination with the rotate accumulator through the carry flag instructions, STC allows the pro- gram to modify individual bits. SUB SUBTRACT The SUB instruction subtracts one byte of data from the contents of the accumulator. The result IS stored in the accumulator, SUB uses two's complement representation of data as explained in Chapter 2. Notice that the SUB Instruction excludes the carry flag (actually a 'borrow' flag for the purposes of subtraction) but sets the flag to indicate the outcome of the operation. Subtract Register from Accumulator Opcode Operand SUB reg The operands must specify one of the registers A through E, H or L. The instruction subtracts the contents of the specified register from the contents of the accumulator using two's complement data representation. The result is stored in the accumulator, oIss S I Cycles: 1 States: 4 Addressing: register Flags: Z.S,P,CY,AC Subtract Memory from Accumulator Opcode Operand SUB M 3-63
  • 120. Chapter 3. Instruction Se This instruction subtracts the contents of the memory location addressed by the Hand L registers from the contents of th ~ accumulator and stores the result in the accumulator. M is a symbolic reference to the Hand L registers. o 01 Cycles: 2 States: 7 Addressing: register indirect Flags: Z,S,P,CY,AC Example: Assume that tne accumulator contains 3EH. The instruction SUB A subtracts the contents of the accumulator from the accumulator and produces a result of zero as follows: 3EH 00111110 +(-3EH) 11000001 one's complement 1 add one to produce two's complement carry out =1 00000000 result = 0 The conditior flags are set as follows: Carry 0 Sign 0 Zero 1 Parity 1 Aux. Carry 1 Notice that the SUB instruction complements the carry generated by the two's complement addition to form a 'borrow' flag. The auxiliary carry flag is set because the particular value used in this example causes a carry out of bit 3. SUI SUBTRACT IMMEDIATE SU I subtracts the contents of the second instruction byte from the contents of the accumulator and stores the result in the •.ccumulator. Notice that the SUI instruction disregards the carry ('borrow') flag during the sub- traction but ,ets the flag to Indicate the outcome ofthe operation. Opcode Operand SUI data The operand must specify the data to be subtracted. This data may be in the form of a number, an ASCII constant, the label of some previously defined value, or an expression. The data must not exceed one byte. The assemble "s relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbol. appears in the operand expression of an immediate instruction, it must be preceded by either the 3-64
  • 121. Chapter 3. Instruction Set HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. When neither operator is present, the assembler assumes the LOW operator and issues an error message. a a 01 Cycles: 2 States: 7 Addressing: immediate Flags: Z,S,P,CY,AC Example: Assume that the accumulator contains the value 9 when the instruction SUI 1 is executed: Accumulator 00001001 = 9H Immediate data (2's comp) 11111111 = -1 H 00001000 = 8H Notice that this two's complement addition results in a carry, The SUI instruction complements the carry generated by the addition to form a 'borrow' flag. The flag settings resulting from this operation are as follows: Carry a Sign a Zero a Parity a Aux. Carry 1 XCHG EXCHANGE HAND L WITH D AND E XCHG exchanges the contents of the Hand L registers with the contents of the D and E registers. Opcode Operand XCHG Operands are not allowed with the XCHG instruction. XCHG both saves the current Hand L and loads a new address into the Hand L registers. Since XCHG is a register-to-register instruction, it provides the quickest means of saving and/or altering the Hand L registers. a a Cycles: 1 States: 4 Addressing: register Flags: none 3-65
  • 122. Chapter 3. Instruction Set Example: Assume that the Hand L registers contain 1234H, and the D and E registers contain OABCDH. Following execution of tre XCHG instruction, Hand L contain OABCDH, and D and E contain 1234H. XRA EXCLUSIVE OR WITH ACCUMULATOR XRA performs an exclusive OR logical operation using the contents of the specified byte and the accumulator, The result IS pi Iced in the accumulator, Summary of Lugical Operations AND produces a one bit in the result only when the corresponding bits in the test data and the mask data are ones. OR produces a one bit in the result when the corresponding bits In either the test data or the mask data are ones. Exclusive OR produces a one bit only when the corresponding bits in the test data and the mask data are different; i.e., 2 one bit in either the test data or the mask data - but not both - produces a one bit in the resul t. AND OR EXCLUSIVE OR 1010 1010 1010 1010 1010 1010 0000 1111 0000 1111 0000 1111 0000 1010 10101111 1010 0101 XRA Register ,lith Accumulator Opcode Operand XRA reg The operand mJst specify one of the registers A through E, H or L. This instruction performs an exclUSive OR using the contelts of the specified register and the accumulator and stores the result In the accumulator. The carry and auxil ary carry flags are reset to zero. a a S S S Cycles: 1 States: 4 AddreSSing: register Flags: Z,S,P,CY,AC 3-66
  • 123. Chapter 3. Instruction Set XRA Memory with Accumulator Opcode Operand XRA M The contents of the memory location specified by the Hand L registers is exclusive-ORed with the contents of the accumulator. The result is stored in the accumulator. The carry and auxiliary carry flags are reset to zero. o o o, Cycles: 2 States: 7 Addressing: register indirect Flags: Z,S,P,CY,AC Examples: Since any bit exclusive-0Red with itself produces zero, XRA is frequently used to zero the accumulator. The following instructions zero the accumulator and the Band C registers. XRA A MOV B,A MOV C,A Any bit exclusive-ORed with a one bit is complemented. Thus, if the accumulator contains all ones (OFFH), the instruction XRA B produces the one's complement of the B register in the accumulator. XRI EXCLUSIVE OR IMMEDIATE WITH ACCUMULATOR XRI performs an exclusive OR operation using the contents of the second instruction byte and the contents of the accumulator. The result is placed in the accumulator. XRI also resets the carry and auxiliary carry flags to zero. Opcode Operand XRI data The operand must specify the data to be used in the OR operation. This data may be in the form of a number, an ASCII constant, the label of some previously defined value, or an expression. The data may not exceed one byte. The assembler's relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbols appears in the operand expression of an immediate instruction, it must be preceded by either the HIGH or LOW operator to specify which byte of the address is to be used in the evaluation of the expression. When neither operator IS present, the assembler assumes the LOW operator and issues an error message. 3-67
  • 124. Chapter 3. Instruction Se', o o data Cycles: 2 States: 7 Addressing: immediate Flags: Z,S,P,CY,AC Summary of LJgica/ Operations AND produce~ a one bit in the result only when the corresponding bits in the test data and the mask data are ones. OR produces, one bit in the result when the corresponding bits in either the test data or the mask data are ones. Exclusive OR Jroduces a one bit only when the corresponding bits in the test data and the mask data are different; i.e., a one bit in either the test data or the mask data - but not both - produces a one bit in the result. AND OR EXCLUSIVE OR 1010 1010 1010 1010 1010 1010 0000 1111 0000 1111 0000 1111 00001010 1010 1111 1010 0101 Example: Assume that a program uses bits 7 and 6 of a byte as flags that control the calling of two subroutines. The program tests the bits by rotating the contents of the accumulator until the desired bit is in the carry flag; a CC instructior (Call if Carry) tests the flag and calls the subroutine if required. Assume that tle control flag byte is positioned normally In the accumulator, and the program must set OFF bit 6 and set bit " ON. The remaining bits, which are status flags used for other purposes, must not be altered. Since any bit ~xclusive-ORed with a one is complemented, and any bit exclusive-oRed with a zero remains unchanged, th~ following Instruction is used: XRI 110000008 The Instruction has the follOWing results: Accumulator 01001100 Immediate data 11000000 10001100 3-68
  • 125. Chapter 3. Instruction Set XTHL EXCHANGE H&L WITH TOP OF STACK XTHL exchanges two bytes from the top of the stack with the two bytes stored in the Hand L registers. Thus, XTHL both saves the current contents of the Hand L registers and loads new values into Hand L. Opcode Operand XTHL Operands are not allowed with the XTHL instruction. XTHL exchanges the contents of the L register with the contents of the memory location specified by the SP (Stack Pointer) register. The contents of the H register are exchanged with the contents of SP+ 1. 000 1 I Cycles: 5 States: 18 (16 on 8085) Addressing: register indirect Flags: none Example: • Assume that the stack pOinter register contains 10ADH; register H contains OBH and L contains 3CH; and memory locations 10ADH and 10AEH contain FOH and ODH, respectively. The following is an illustration of the effect of the XTHL instruction: MEMORY ADDRESS H L lOAC lOAD 10AE lOAF Before XTHL FF Fa aD FF OB 3C After XTHL FF 3C OB FF aD Fa The stack pointer register remains unchanged following execution of the XTHL instruction. 3~9
  • 127. 4. ASSEMBLER DIRECTIVES This chapter describes the assembler directives used to control the 8080/85 assembler in its generation of object code. This chapter excludes the macro directives, which are discussed as a separate topic in Chapter 5. Generally, directives have the same format as instructions and can be interspersed throughout your program. Assembler directives discussed in this chapter are grouped as follows: GENERAL DIRECTIVES: • Symbol Definition EQU SET • Data Definition DB DW • Memory Reservation DS • Conditional Assembly IF ELSE ENDIF • Assembler Termination END LOCATION COUNTER CONTROL AND RELOCATION: • Location Counter Control ASEG DSEG CSEG ORG • Program Linkage PUBLIC EXTRN NAME STKLN 4-1
  • 128. Chapter 4. Assembler Oir ,ctives Three assembl" directives - EQU, SET, and MACRO - have a slightly different format from assembly language instnlctions. The EQU, SET. and MACRO directives require a name for the symbol or macro being defined to be present in the label field. Names differ from labels in that they must not be terminated with a colon (:) as laJels are. Also, the LOCAL and ENDM directives prohibit the use of the label field. The MACRO, ENDM, and LOCAL directives are explained in Chapter 5. SYMBOL DEFINITION The assembler automatically assigns values to symbols that appear as instruction labels. This value IS the current setting of the location counter when the instruction IS assembled. (The location counters are explained under 'Address Cont'ol and Relocation,' later in this chapter.) You may defile other symbols and assign them values by using the EQU and SET directives. Symbols defined using EQU callnot be redefined during assembly; those defined by SET can be assigned new values by subsequent SET directive~. The name req Jired in the label field of an EQU or SET directive must not be terminated with a colon. Symbols defined by EQU and SET have meaning throughout the remainder of the program. This may cause the symbol to have illegal multiple definitions when the EQU or SET directive appears in a macro definition. Use the LOCAL d rective (described in Chapter 5) to avoid this problem. EQU Directive EQU assigns t le value of 'expression' to the name specified in the label field. Label Opcode Operand name EQU expression The required lame in the label field may not be terminated with a colon. This name cannot be redefined by a subsequent EOU or SET directive. The EQU expression cannot contain any external symbol. (External symbols are explained under 'Location Counter Control and Relocation,' later in this chapter.) Assembly-tim! evaluation of EQU expressions always generates a modulo 64K address. Thus, the expression always yields 1 value in the range 0-65,536. Example: The following EQU directive enters the name ONES into the symbol table and assigns the binary value 11111111 to t: ONES EQU OFFH 4-2
  • 129. Chapter 4. Assembler Directives The value assigned by the EQU directive can be recalled in subsequent source lines by referring to its assigned name as in the following IF directive: IF TYPE EQ ONES ENDIF SET Directive SET assigns the value of 'expression' to the name specified in the label field. Label Opcode Operand name SET expression The assembler enters the value of 'expression' into the symbol table. Whenever 'name' is encountered sub- sequently in the assembly, the assembler substitutes its value from the symbol table. This value remains unchanged until altered by a subsequent SET directive. The function of the SET directive is identical to EQU except that 'name' can appear in multiple SET directives in the same program. Therefore, you can alter the value assigned to 'name' throughout the assembly. Assembly-time evaluation of SET expressions always generates a modulo 64K address. Thus, the expression always yields a value in the range 0-65,536. Examples: Label Opcode Operand Assembled Code IMMED SET 5 ADI IMMED C605 IMMED SET lOH-6 ADI IMMED C60A DATA DEFINITION The DB (define byte) and DW (define word) directives enable you to define data to be stored in your program. Data can be specified in the form of 8-bit or 16-bit values, or as a string of text characters. DB Directive The DB directive stores the specified data in consecutive memory locations starting with the current setting of the location counter. 4-3
  • 130. Chapter 4. Assembler Oi, ectives Label Opcode Operands optional: DB expresslon(s) or string(s) The operand 'ield of the DB directive can contain a list of expressions and/or text strings. The list can contain up to eight tc tal items: list items must be separated by commas. Because of limited workspace, the assembler may not be a Jle to handle a total of eight items when the list includes a number of complex expressions. If you ever haVE this problem, it is easily solved: simply use two or more directives to shorten the list. Expressions nlust evaluate to l-byte (8-bit) numbers in the range -256 through 255. Text strings may comprise a maximum of 128 ASCII characters enclosed in quotes. The assemble,'s relocation feature treats all external and relocatable symbols as 16-bit addresses. When one of these symbol~ appears in an operand expression of the DB directive, it must be preceded by either the HIGH or LOW operato' to specify which byte of the address is to be used in the evaluation of the expression. When neither opera .or is present, the assembler assumes the LOW operator and issues an error message. If the option;.! label IS present, it is assigned the starting value of the location counter, and thus references the first byte stored by the DB directive. Therefore, the label STR in the following examples refers to the letter T of the stmg TIME. Examples: Label Opcode Operands Assembled Code STR: DB 'TIME' 54494D45 HERE: DB OA3H A3 WORD1: DB -03H,5*2 FDOA DW Directive The DW direl tlve stores each 16-blt value from the expression list as an address. The values are stored starting at the curren setting of the location counter. Label Opcode Operands optional: DW expression list The least sigr ificant eight bits of the first value in the expression list are stored at the current setting of the location cour ter: the most significant eight bits are stored at the next higher location. This process is repeated for each item in the expression list. Expressions E valuate to 1-word (16-bit) numbers, typically addresses. If an expression evaluates to a single byte, it IS assumed to be the low order byte of a 16-bit word where the high order byte is all zeros. 44
  • 131. Chapter 4. Assembler Directives List items must be separated by commas. The list can contain up to eight total items. Because of limited work- space, the assembler may not be able to handle eight complex expressions. If you ever have this problem, simply use two or more OW directives to shorten the list. The reversed order for storing the high and low order bytes is the typical format for addresses stored in memory. Thus, the OW directive is commonly used for storing address constants. Strings containing one or two ASCII characters enclosed in quotation marks may also appear in the expression list. When using such strings in your program, remember that the characters are stored in reversed order. Specifying a string longer than two characters causes an error. If the optional label is present, it is assigned the starting address of the location counter, and thus references the first byte stored by the OW directive. (This is the low order byte of the first Item in the expression list.) Examples: Assume that COMP and FI LL are labels defined elsewhere in the program. COMP addresses memory location 3B1CH. FILL addresses memory location 3EB4H. Label Opcode Operands Assembled Code AOOR1: OW COMP lC3B AOOR2: OW FILL B43E STRNG: OW 'A','AB' 41004241 FOUR: OW 4H 0400 MEMORY RESERVATION OS Directive The OS directive can be used to define a block of storage. Label Opcode Operand optional: OS expression The value of 'expression' specifies the number of bytes to be reserved for data storage. In theory, this value may range from OOH through OFFFFH; in practice. you will reserve no more storage than will fit in your available memory and still leave room for the program. Any symbol appearing in the operand expression must be defined before the assembler reaches the OS directive. Unlike the OB and OW directives, OS assembles no data into your program. The contents of the reserved storage are unpredictable when program execution is initiated. 4-5
  • 132. Chapter 4. Assembler Dir 'ctives If the optlona label is present, it is assigned the current value of the location counter, and thus references the first byte of tle reserved memory block. If the value 01 the operand expression is zero, no memory is reserved. However, if the optional label is present, it is assigned 1he current value of the location counter. The DS directve reserves memory by Incrementing the location counter by the value of the operand expression. Example: TTYBUF: DS 72 ;RESERVE 72 BYTES FOR ;A TERMINAL OUTPUT BUFFER Programming Tips: Data Description and Access Random Access lersus Read Only Memory When coding data descriptions, keep in mind the mix of ROM and RAM in your application. Generally, the DB and DW directives define constants, Items that can be assigned to ROM. You can use these items In your program, but you cannot modify them. If these items are assigned to RAM, they have an initial value that YOL r program can modify during execution. Notice, however, that these initial values must be reloaded Into memory Jrior to each execution of the program. Variable data n memory must be assigned to RAM. Data Description Before coding your program, you must have a thorough understanding of ItS input and output data. But you'll probably find it more convenient to postpone coding the data descriptions until the remainder of the program is fairly well deeloped. This way you will have a better idea of the constants and workareas needed In your program. Also, the orgalization of a typical program places Instructions in lower memory, followed by the data, followed by the stack. Data Access Accessing dati from memory is typically a two·step process: First you tell the processor where to find the data, then the processor fetches the data from memory and loads it into a register, usually the accumulator. Therefore, the following ;ode sequences have the identical effect of loading the ASCII character A into the accumulator. AAA: DB 'A' ALPHA: DB 'ABC' LXI B,AAA LXI B,ALPHA LDAX B LDAX B 4-6
  • 133. Chapter 4. Assembler Directives In the examples, the LXI instructions load the address of the desired data into the Band C registers. The LDAX instructions then load the accumulator with one byte of data from the address specified in the Band C registers. The assembler neither knows nor cares that only one character from the three-character field ALPHA has been accessed. The program must account for the characters at ALPHA+1 and ALPHA+2, as in the following coding sequence: ALPHA: DB 'ABC' ;DEFINE ALPHA LXI B,ALPHA ;LOAD ADDRESS OF ALPHA LDAX B ;FETCH 1ST ALPHA CHAR INX B ;SET B TO ALPHA+l LDAX B ;FETCH 2ND ALPHA CHAR INX B ;SET B TO ALPHA+2 LDAX B ;FETCH 3RD ALPHA CHAR The coding above is acceptable for short data fields like ALPHA. For longer fields, you can conserve memory by setting up an instruction sequence that is executed repeatedly until the source data is exhausted. Add Symbols for Data Access The following example was presented earlier as an illustration of the DS directive: Label Opcode Operand Comment TTYBUF: DS 72 ;RESERVE TTY BUFFER To access data in this buffer using only expressions such as TTYBUF+l, TTYBUF+2, ... TTYBUF+72 can be a laborious and confusing chore, especially when you want only selected fields from the buffer. You can simplify this task by subdivid.ing the buffer with the EQU directive: Label Opcode Operand Comment TTYBUF: DS 72 ;RESERVE TTY BUFFER ID EQU TTYBUF ;RECORD IDENTIFIER NAME EQU TTYBUF+6 ;20-CHAR NAME FIELD NUMBER EQU TTYBUF+26 ;10-CHAR EMPLOYEE NUMBER DEPT EQU TTYBUF+36 ;5-CHAR DEPARTMENT NUMBER SSNO EQU TTYBUF+41 ;SOCIAL SEC. NUMBER DOH EQU TTYBUF+50 ;DATE OF HIRE DESC EQU TTYBUF+56 ;)OB DESCRIPTION 4-7
  • 134. Chapter 4. Assembler Dir'ctives Subdividing d. ta as shown in the example simplifies data access and provides useful documentation throughout your program. Notice that these EQU directives can be inserted anywhere within the program as you need them, but coding tht m as shown in the example provides a more useful record description. CONDITIONAL ASSEMBLY The IF. ELSE. and ENDIF directives enable you to assemble portions of your program conditionally, that is, only if certain conditions that you specify are satisfied. Conditional a~sembly is especially useful when your application requires custom programs for a number of com- mon options. As an example, assume that a basic control program requires customlz'ing to accept input from one of six dif erent sensing devices and to drive one of five different control dev,ices. Rather than code some ! thirty separat" programs to account for all the possibilities, you can code a single program. The code for the in- dividual senso's and drivers must be enclosed by the conditional directives. When you need to generate a custom program, you can insert SET directives near the beginning of the source program to select the desired sensor and driver routine .. IF, ELSE. ENDIF [irectives Because these directives are used in conjunction. they are described together here. Label Opcode Operand optional: IF expression optional: ELSE optional: ENDIF The assembler evaluates the expression in the operand field of the IF directive. If bit 0 of the resulting value is one (TRUE), til Instructions between the IF directive and the next ELSE or ENDIF directive are assembled. When bit 0 is zero (FALSE) these instructions are ignored. (A TRUE expression evaluates to OFFFFH and FALSE to OH: only bit zero need be tested.) All statement~ included between an IF directive and its required associated ENDIF directive are defined as an IF-ENDIF blo;k. The ELSE directive is optional, and only one ELSE directive may appear In an IF-ENDIF block. When i lcluded. ELSE is the converse of IF. When bit 0 of the expression in the IF directive IS zero, all statements be:ween ELSE and the next ENDIF are assembled. If bit 0 IS one. these statements are ignored. Operands are lOt allowed with the ELSE and ENDIF directives. An IF-ENDIF block may appear within another IF-ENDIF block. These blocks can be nested to eight levels. Macro definitions (explained in the next chapter) may appear within an IF-ENDIF block. Conversely, IF-ENDIF blocks may al'pear within macro definitions. In either case, you must be certain to terminate the macro definition 4-8
  • 135. Chapter 4. Assembler Directives or IF-ENDIF block so that it can be assembled completely, For example, when a macro definition begins In an IF block but terminates after an ELSE directive, only a portion of the macro can be assembled. Similarly, an IF-ENDIF block begun within a macro definition must terminate within that same macro definition. NOTE Caution IS required when symbols are defined in IF-ENDIF blocks and referenced elsewhere within the program. These symbols are undefined when the evaluation of the IF ex- pression suppresses the assembly of the IF-ENDIF block. Example 1. Simple IF-ENDIF Block: CONDl IF TYPE EQ 0 ;ASSEMBLED IF 'TYPE = 0' ;IS TRUE ENDIF Example 2. IF-ELSE-ENDIF Block: COND2: IF TYPE EQ 0 ;ASSEMBLED IF 'TYPE = 0' ;IS TRUE ELSE ;ASSEMBLED IF 'TYPE = 0' :IS FALSE ENDIF 4-9
  • 136. Chapter 4. Assembler Directives Example 3. Nested IF's: COt ID3: IF TYPE EO 0 ;ASSEMBLED IF 'TYPE = 0' ;15 TRUE IF MODE EO 1 LE'EL ;ASSEMBLED IF 'TYPE = 0' 1 ;AND 'MODE = l' ARE BOTH ;TRUE ENDIF ELSE LEVEL ;ASSEMBLED IF 'TYPE = 0' 2 ;15 FALSE IF MODE EO 2 ;ASSEMBLED IF 'TYPE = 0' ;15 FALSE AND 'MODE = 2' ;15 TRUE LEEL ELSE 1 ;ASSEMBLED IF 'TYPE = 0' ;AND 'MODE = 2' ARE BOTH ;FALSE ENDIF ENDIF ASSEMBLER TERMINATION END Directive The END dir~ctlve identifies the end of the source program and terminates each pass of the assembler. Label Opcode Operand optional: END expression Only one END statement may appear in a source program, and it must be the last source statement. If the optioml expression is present, its value is used as the starting address for program execution. If no ex- pression is gi len, the assembler assumes zero as the starting address. When a number of separate program modules are to be joined together, only one may specify a program starting address. The module with a starting address is the main module. When source files are combined using the IN- CLUDE cont'ol, there are no restrictions on which source file contains the END. 4-10
  • 137. Chapter 4. Assembler Directives END-OF-TAPE INDICATION The EOT directive allows you to specify the physical end of paper tape to simplify assembly of multiple-tape source programs. EOT Directive Label Opcode Operand optional: EOT When EOT is recognized by the assembler, the message 'NEXT TAPE' is sent to the console and the assembler pauses.' After the next tape is loaded, a 'space bar' character received at the console signals continuation of the assembly. Data in the operand field causes an error. LOCATION COUNTER CONTROL AND RELOCATION All the directives discussed in the remainder of this chapter relate directly to program relocation except for the ASEG and ORG directives. These directives are described first for the convenience of readers who do not use the relocation feature. Location Counter Control (Non-Relocatable Mode) When you elect not to use the relocation feature, an assembler default generates an ASEG directive for you. The ASEG directive specifies that the program is to be assembled in the non-relocatable mode and establishes a location counter for the assembly. The location counter performs the same function for the assembler as the program counter performs during execution. It tells the assembler the next memory location available for instruction or data assembly. Initially, the location counter is set to zero. The location counter can be altered by the ORG (origin) directive. ORG Directive The ORG directive sets the location counter to the value specified by the operand expression. Label Opcode Operand optional: ORG expression The location counter is set to the value of the operand expression. Assembly-time evaluation of ORG expressions always Yields a modulo 64K address. Thus, the expression always yields an address in the range 0 through 65,535. Any symbol In the expression must be preViously defined. The next machine instruction or data item is assembled at the specified address. 4-11
  • 138. Chapter 4. Assembler Oi 'ectives If no ORG di 'ective is included before the first instruction or data byte in your program, assembly begins at location zero. Your prograrr can include any number of ORG directives. Multiple ORG's need not specify addresses In ascending seq Jence, but if you fail to do so, you may instruct the assembler to write over some previously assembled POI tion of the program. If the option" label is present, it is assigned the current value of the location counter before it is updated by the ORG directiv". Example: Assume that the current value of the location counter is OFH (decimal 15) when the following ORG directive is encountered: ORG OFFH ;ORG ASSEMBLER TO LOCATION ;OFFH (decimal 225) The symbol FAG1 is assigned the address OFH. The next instruction or data byte is assembled at location OFFH. Introduction to Reocatability A maior feature of this assembler is its system for creating relocatable object code modules. Support for this new feature includes a number of new directives for the assembler and three new programs included in ISIS-II. The three new pr<lgrams - LIB, LINK, and LOCATE - are described in the ISIS-II System User's Guide. The new assembler dir ~ctives are described later in this chapter. Relocatabilit, allows the programmer to code programs or sections of programs without worrying about the final arrangerlent of the object code in memory. This offers developers of microcomputer systems malor ad- vantages In t",o areas: memory management and modular program development. Memory ManagEment When developing, testing, and debugging a system on your Intellec microcomputer development system, your only concern with locating a program is that it doesn't overlap the resident routines of 1515·11. Because the Intellec syste 11 has 32K, 48K, or 64K of random access memory, the location of your future program is not a great concerr. However, the program you are developing will almost certainly use some mix of random access memory (RAM), read-only memory (ROM), andior programmable read-only memory (PROM). Therefore, the location of y)ur program affects both cost and performance in your application. The relocatability feature allows you to deveillp, test, and debug your program on the Intellec development system and then simply relocate the object code 10 suit your application. The relocatal dlity feature also has a malor advantage at assembly-time: often, large programs with many symbols cannot be as,embled because of limited work space for the symbol table. Such a program can be divided Into a number of rrodules that can be assembled separately and then linked together to form a single object program. 4-12
  • 139. Chapter 4. Assembler Directives Modular Program Development Although 'relocatability' may seem to be a formidable term, what it really means is that you can subdivide a complex program into a number of smaller, simpler programs. This concept is best illustrated through the use of an example. Assume that a microcomputer program IS to control the spark advance on an automobile engine. This requires the program to sample the ambient air temperature, engine air intake temperature, coolant tempera- ture, manifold vacuum, idle sensor, and throttle sensor. Let us examine the approaches two different programmers might take to solve this problem. Both programmers want to calculate the degree of spark advance or retardation that provides the best fuel economy with the lowest emissions. Programmer A codes a single program that senses all inputs and calculates the correct spark advance. Programmer B uses a modular approach and codes separate programs for each input plus one program to calculate spark advance. Although Programmer A avoids the need to learn to use the relocatability feature, the modular approach used by Programmer B has a number of advantages you should consider: • Simplified Program Development It is generally easier to code, test, and debug several simple programs than one complex program. • Sharing the Programming Task If Programmer B finds that he is falling behind schedule, he can assign one or more of his sub- programs to another programmer. Because of his single program concept, Programmer A will probably have to complete the program himself. • Ease of Testing Programmer B can test and debug most of his modules as soon as they are assembled; Programmer A must test his program as a whole. Notice that Programmer B has an extra advantage if the sensors are being developed at the same time as the program. If one of the sensors is behind schedule, Programmer B can continue developing and testing programs for the sensors that are ready, Because Programmer A cannot test h is program until all the sensors are developed, his testing schedule IS dependent on events beyond his control. • Programming Changes Given the nature of automotive design, it IS reasonable to expect some changes during system development. If a change to one of the sensors requires a programming change, Programmer A must search through his entire program to find and alter the coding for that sensor. Then he must retest the entire program to be certain that those changes do not affect any of the other sensors. By contrast, Programmer B need be concerned only with the module for that one sensor. This advantage continues throughout the life of the program. 4-13
  • 140. Chapter 4. Assembler Directives DIRECTIVES USED FOR RELOCATION Several direc Ives have been added to the assembler to support the relocation feature. These fall into the general categories of location counter control and program linkage. Location Counter :ontrol (Relocatable Programs) Relocatable Jrograms or program modules may use three location counters. The ASEG, DSEG, and CSEG directives sp"cify which location counter is to be used. The ASEG c irective specifies an absolute code segment. Even in a relocatable program module, you may want to assign cer:ain code segments to specific addresses. For example, restart routines invoked by the RST instruc- tion require specific addresses. The CSEG c Ifective specifies a relocatable code segment. In general, the CSEG location counter is used for por- tions of the program that are to be in some form of read-only memory, such as machine instructions and pro- gram consta ltS. The DSEG ocation counter specifies a relocatable data segment. This location counter is used for program elements th It must be located In random access memory. These direc ives allow you to control program segmentation at assembly time. The LOCATE program, described In the ISIS-II System User's GUide, gives you control over program segment location. Therefore, the guidelines given above are only general since they can be overridden by the LOCATE program. Regardless 'If how many times the ASEG, CSEG, and DSEG directives appear in your program, the assembler produces a ;ingle, contiguous module. This module comprISes four segments: code, data, stack and memory. The LINK Ind LOCATE programs are used to combine segments from individual modules and relocate them in memory. T lese programs are explained in the ISIS-II System User's Guide. ASEG Directh'e ASEG dire,;ts the assembler to use the location counter for the absolute program segment. Label Opcode Operand optional: ASEG Operands ere not permitted with the ASEG directive. All instrucions and data following the ASEG directive are assembled In the absolute mode. The ASEG directive remains in effect until a CSEG or DSEG directive is encountered. The ASEG location counter has an initial value of zero. The ORG directive can be used to assign a new value to the ASEG location counter. 4-14
  • 141. Chapter 4. Assembler Directives When assembly begins. the assembler assumes the ASEG directive to be in effect. Therefore. a CSEG or DSEG must precede the first instruction or data definition in a relocatable module. If neither of these directives appears in the program. the entire program is assembled in absolute mode and can be executed immediately after assembly without using the LINK or LOCATE programs. CSEG Directive CSEG directs the assembler to assemble subsequent instructions and data In the relocatable mode uSing the code segment location counter. Labe! Opcode Operand blank } optional: CSEG PAGE { INPAGE When a program contains multiple CSEG directives. all CSEG directives throughout the program must specify the same operand. The operand of a CSEG directive has no effect on the current assembly. but is stored with ·the object code to be passed to the LINK and LOCATE programs. (These programs are described in the ISIS-II System User's Guide.) The LOCATE program uses this information to determine relocation boundaries when it joins this code segment to code segments from other programs. The meaning of the operand is as follows: • blank - This code segment may be relocated to the next available byte boundary. • PAGE - This code segment must begin on a page boundary when relocated. Page boundaries occur in multiples of 256 bytes beginning with zero (0. 256. 512. etc.). • INPAGE This code segment must fit within a single page when relocated. The CSEG directive remains in effect until an ASEG or DSEG directive is encountered. The code segment location counter has an initial value of zero. The ORG directive can be used to assign a new value to the CSEG location counter. DSEG Directive DSEG directs the assembler to assemble subsequent instructions and data In the relocatable mode using the data segment location counter. Labe! Opcode Operand optional: DSEG roo' PAGE INPAGE) i> When multiple DSEG directives appear in a program. they must all specify the same operand throughout the program. The operands for the DSEG directive have the same meaning as for the CSEG directive except that they apply to the data segment. 4-15
  • 142. Chapter 4. Assembler Dil ectives There IS no ir teraction between the operands specified for the DSEG and CSEG directives. Thus. a code segment can be byte r'locatable while the data segment is page relocatable. The DSEG diective remains in effect until an ASEG or CSEG directive is encountered. The data segr,lent location counter has an initial value of zero. The ORG directive can be used to assign a new value to the [)SEG location counter. ORG Directive ('?elocatable Mode) The ORG dirxtive can be used to alter the value of the location counter presently in use. Label Opcode Operand optional: ORG expression There are thr~e location counters. but only one location counter is in use at any given point in the program. Which one dEpends on whether the ASEG. CSEG, or DSEG directive is in effect. Any symboilised in the operand expression must have been previously defined. An exception causes phase errors for all abels that follow the ORG and a label error if the undefined error is defined later. When the O~ G directive appears in a relocatable program segment, the value of its operand expression must be either absolu'e or relocatable within the current segment. Thus, if the ORG directive appears within a data seg- ment, the val Je of its expression must be relocatable within the data segment. An error occurs if the expression evaluates to , n address in the code segment. If the option 11 label is present, It is assigned the current value of the location counter presently in use before the ORG din ctive is executed. Program Linkage [irectives Modular pro! ramming and the relocation feature enable you to assemble and test a number of separate programs that are to b; iOlned together and executed as a single program. Eventually, it becomes necessary for these separate programs to communicate Information among themselves. Establishing such communication is the function of the program linkage directives. A program n,ay share its data addresses and instruction addresses with other programs. Only Items having an entry in the iymbol table can be shared with other programs; therefore. the item must be assigned a name or a label when it IS defined in the program. Items to be shared with other programs must be declared in a PUBLIC directive. Your prograln can directly access data or instructions defined In another program if you know the actual address of tre item, but this is unlikely when both programs use relocation. Your program can also gain access to data or Instructions declared as PUBLIC in other programs. Notice, however, that the assembler normally 4-16
  • 143. Chapter 4. Assembler Directives flags as an error any reference to a name or label that has not been defined in your program. To avoid this, you must provide the assembler with a list of items used in your program but defined in some other program. These items must be declared in an EXTRN directive. The two remaining program linkage directives, NAME and STKLN, are individually explained later in this chapter. PUBLIC Directive The PUBLIC directive makes each of the symbols listed in the operand field available for access by other programs. Label Opcode Operands optional: PUBLIC name-list Each item in the operand name-list must be the name or label assigned to data or an instruction elsewhere in this program. When multiple names appear in the list. they must be separated by commas. Each name may be declared PUBLIC only once in a program module. Reserved words and external symbols (see the EXTRN directive below) cannot be declared to be PUBLIC symbols. PUBLIC directives may appear anywhere within a program module. If an item in the operand name-list has no corresponding entry in· the symbol table (implying that it i5 unde- fined), it is flagged as an error. Example: PUBLIC SIN,COS,TAN,SQRT EXTRN Directive The EXTRN directive provides the assembler with a list of symbols referenced in th is program but defined in a different program. Because of this, the assembler establishes linkage to the other program and does not flag the undefi ned references as errors. Label Opcode Operands optional: EXTRN name-list Each item in the name-list identifies a symbol that may be referenced in this program butis defined in another program. When multiple items appear in the list, they must be separated by commas. If a symbol in the operand name-list is also defined in this program by the user, or is a reserved symbol. the effect is the same as defining the same symbol more than once in a program. The assembler flags this error. EXTRN directives may appear anywhere within a program module. A symbol may be declared to be external only once in a program module. Symbols declared to be PUBLIC cannot also be declared to be EXTRN symbols. 4·17
  • 144. Chapter 4. Assembler Oi, ectives If you omit a symbol from the name-list but reference it 111 the program, the symbol is undefined. The assembler flags this erro', You may include symbols in the operand name-list that are not referenced in the program with- out causing ail error. Example: EXTRN ENTRY,ADDRTN,BEGIN NAME Directive The NAME directive assigns a name to the object module generated by this assemblY, Label Opcode Operand optional: NAME module-name The NAME directive requires the presence of a module-name in the operand field. This name must conform to the rules for jefining symbols. Module names are necessary so that you can refer to a module and specify the proper sequence of modules when a numr er of modules are to be bound together. The NAME directive must precede the first data or instruction coding in the source program, but may follow comments anj control lines. If the NAME directive is missing from the program, the assembler supplies a default NAME directive with the module-name MODULE. This will cause an error if you attempt to bind together several object program modules and more than one has the name MODULE. Also, if you make an error coding the NAME directive, the default nime MODULE is assigned. The module···name assigned by the NAME directive appears as part of the page heading in the assembly listing. Example: NAME MAIN STKLN Directile Regardless 01 the number of object program modules you may bind together, only one stack is generated. The STKLN dire' tive allows you to specify the number of bytes to be reserved for the stack for each module. Label Opcode Operand optional: STKLN expression The operand expression must evaluate to a number which will be used as the maximum size of the stack. 4-18
  • 145. Chapter 4. Assembler Directives When the STKLN directive is omitted, the assembler provides a default STKLN of zero. This is useful when multiple programs are bound together; only one stack will be generated, so only one program module need specify the stack size. However, you should provide a STKLN if your module is to be tested separately and uses the stack. If your program includes more than one STKLN directive, only the last value assigned is retained. Example: STKLN 100 STACK and MEMORY Reserved Words The reserved words STACK and MEMORY are not directives but are of interest to programmers using the relocation feature. These reserved words are external references whose addresses are supplied by the LOCATE program. STACK is the symbolic reference to the stack origin address. You need this address to initialize the stack pointer register. Also, you can base data structures on this address using svmbolic references such as STACK+1, STACK+2, etc. MEMORY is the symbolic reference to the first byte of unused memory past the end of your program. Again, you can base data structures on this address using symbolic references such as MEMORY, MEMORY+l, etc. Programming Tips: Testing Relocatable Modules The ability to test individual program modules is a maior advantage of modular programming. However, many program modules are not logically self-sufficient and require some modification before they can be tested. The following is a discussion of some of the more common modifications that may be required. Initialization Routines In most complete programs, a number of housekeeping or initialization procedures are performed when execution first begins. If the program module you are testing relies on initialization procedures aSSigned to a different module, you must duplicate those procedures in the module to be tested. (Notice, however, that you can link any number of modules together for testing.) One of the most important initialization procedures is to set the stack pointer. The LOCATE program determines the origin of the stack. Your program should include the following instruction to initialize the stack pointer: LXI SP,STACK 4-19
  • 146. Chapter 4. Assembler [irectives Input/Output When testing ,rogram modules, it is likely that some input or output procedures appear in other modules. Your program must simulate any of these procedures it needs to operate. Since your Intellec development system probably has considerably more random access memory than you need to test a program module, you may be able to simula:e Input and output data right in memory, The LOCATE program supplies an address for the reserved word MEMORY; this is the address of the first byte of unused memory past the end of your program. You can acces, this memory using the symbolic reference MEMORY, MEMORY+l, and so on. This memory can be used fer storing test data or even for a program that generates test data. Remove Coding Used for Testing After testing ~our program, be certain to remove any code you inserted for testing. In particular, make certain that only one module in the complete program initializes the stack pointer. 4-20
  • 147. 5. MACROS INTRODUCTION TO MACROS Why Use Macros? A macro is essentially a facility for replacing one set of parameters with another. In developing your program, you will frequently find that many Instruction sequences are repeated several times with only certain parameters changed. As an example, suppose that you code a routine that moves five bytes of data from one memory location to another. A little later, you find yourself coding another routine to move four bytes from a different source field to a different destination field. If the two routines use the same coding techniques, you will find that they are identical except for three parameters: the character count, the source field starting address, and the d:",tiiCatltl:' field starting address. Certainly It would be handy if there were some way to regenerate that original 'outine substituting the new parameters rather than rewrite that code yourself. The macro facility provides this capability and offers several other advantages over writing code repetitiously' e The tedium of frequent rewrite (and the probability of error) is reduced. e Symbols used in macros can be restricted so that they have meaning only within the macro itself. Therefore, as you code your program, you need not worry that you will accidentally duplicate a symbol used in a macro. Also, a macro can be used any number of times in the same program without duplicating any of its own symbols. e An error detected In a macro need be corrected only once regardless of how many times the macro appears in the program. This reduces debugging time. e Duplication of effort between programmers can be reduced. Useful functions can be collected In a library to allow macros to be copied into different programs. In addition, macros can be used to improve program readability and to create structured programs. USing macros to segment code blocks provides clear program notation and simplifies tracing the flow of the program. What Is A Macro? A macro can be described as a routine defined in a formal sequence of prototype instructions that, when called within a program, results in the replacement of each such call with a code expansion consisting of the actual instructions represented. 5-'
  • 148. Chapter 5. Macros The concepts c f macro definition, call, and expansion can be illustrated by a tYPical business form letter, where the prototypenstructions conSISt of preset text. For example, we could define a macro CNFIRM with the text Air FI ght welcomes you as a passenger. Your 'Iight number FNO leaves at DTIME and arrives in DEsT at ATIME. This macro ha, four dummy parameters to be replaced, when the macro is called, by the actual flight number, departure time destination, and arrival time. Thus the macro call might look like CNFII~M 123, '10:45', 'Ontario', '11 :52' A second macro, CAR, could be called if the passenger has requested that a rental car be reserved at the desti- nation airport. This macro might have the text Your lutomobile reservation has been confirmed with MAKE rent-a-car agency. Finally, a macro GREET could be defined to specify the passenger name. Dear~AME: The entire tex of the business letter (source file) would then look like GREET 'Ms. scannel' CNFl~M 123, '10:45', 'Ontario', '11:52' CAR 'Blotz' We tr Jst you will enioy your flight. Since ely, When this sou,ce file is passed through a macro processor, the macro calls are expanded to produce the following letter. Dear 'v1s. scannel: Air Fight welcomes you as a passenger. Your flight number 123 leaves at 10:45 and arrives in Ortario at 11 :52. Your automobile reservation has been confirmed with Blotz rent-a-car agency. We trust you will enjoy your flight. Since'ely, While this exallple illustrates the substitution of parameters in a macro, it overlooks the relationship of the macro processor and the assembler. The purpose of the macro processor is to generate source code which is then assembled. 5-2
  • 149. Chapter 5. Macros Macros Vs. Subroutines At this point, you may be wondering how macros differ from subroutines Invoked by the CALL instruction. Both aid program structuring and reduce the coding of frequently executed routines. One distinction between the two IS that subroutines necessarily branch to another part of your program while macros generate in-line code. Thus, a program contains only one version of a given subroutine, but contains as many versions of a given macro as there are calls for that macro. Notice the emphasis on 'versions' in the prevIous sentence, for this is a malor difference between macros and subroutines. A macro does not necessarily generate the same source code each time it is called. By changing the parameters In a macro call, you can change the source code the macro generates. In addition, macro parameters can be tested at assembly-time by the conditional assembly directives. These two tools enable a general-purpose macro definition to generate customized source code for a particular programming situation. Notice that macro expansion and any code customization occur at assembly-time and at the source code level. By contrast, a generalized subroutine resides in your program and requires execution time. It IS usually possible to obtain similar results using either a macro or a subroutine. Determining which of these facilities to use is not always an obvious decision. In some cases, uSing a single subroutine rather than multiple In-line macros can reduce the overall program size. In situations involving a large number of parameters, the use of macros may be more efficient. Also, notice that macros can call subroutines, and subroutines can contain macros. USING MACROS The assembler recognizes the following macro operations: .. MACRO directive CI ENDM directive .. LOCAL directive CI REPT directive .. IRP directive .. IRPC directive CI EXITM directive .. Macro call All of the directives listed above are related to macro definition. The macro call initiates the parameter sub- stitution (macro expansion) process. Macro Definition Macros must be defined in your program before they can be used. A macro definition is Initiated by the MACRO assembler directive, which lists the name by which the macro can later be called, and the dummy parameters to be replaced during macro expansion. The macro definition is terminated by the ENDM directive. The prototype instructions bounded by the MACRO and ENDM directives are called the macro body. 5·3
  • 150. Chapter 5. Macros When label sy mbols used in a macro body have 'global' scope, multiply-defined symbol errors result if the macro is called more than once. A label can be given limited scope using the LOCAL directive. This directive assigns a unique value :0 the symbol each time the macro is called and expanded. Dummy parameters also have limited scope. Occasionally "ou may wish to duplicate a block of code several times, either within a macro or in line with other source ':ode. This can be accomplished with minimal coding effort using the REPT (repeat block), IRP (indefinite repeat), and IRPC (indefinite repeat character) directives. Like the MACRO directive, these directives are terminated by ENDM. The EXITM c irective provides an alternate exit from a macro. When encountered, it terminates the current macro just as if EN['M had been encountered. Macro Definitior, Directives MACRO Dire:tive Label Opcode Operand name MACRO optional dummy parameter(s) The name in :he label field specifies the name of the macro body being defined. Any valid user-defined symbol name can be Jsed as a macro name. Note that this name must be present and must not be terminated by a colon. A dummy panmeter can be any valid user-defined symbol name or can be null. When multiple parameters are listed, they must be ,eparated by commas. The scope of a dummy parameter is limited to its specific macro definition. If a reserved symt 01 is used as a dummy parameter, its reserved value is not recognized. For example, if you code A,B,C as a dLmmy parameter list, substitutions will occur properly. However, you cannot use the accumulator or the Band::: registers within the macro. Because of the limited scope of dummy parameters, the use of these registers is not affected outside the macro definition. Dummy paralneters in a comment are not recognized. No substitution occurs for such parameters. Dummy paralneters may appear in a character string. However, the dummy parameter must be adjacent to an ampersand chlracter (&) as explained later In this chapter. Any machine Instruction or applicable assembler directive can be included in the macro body. The distinguishing feature of ma;ro prototype text is that parts of it can be made variable by placing substitutable dummy param- eters in instrLction fields. These dummy parameters are the same as the symbols in the operand field of the MACRO dire'tive. Example: Define macro MACl with dummy parameters Gl, G2, and G3. 5-4
  • 151. Chapter 5. Macros NOTE The following macro definition contains a potential error that IS clarified in the description of the LOCAL directive later in this chapter. MACl MACRO Gl,G2,G3 ;MACRO DIRECTIVE MOVES: LHLD Gl ;MACRO BODY MOV A,M LHLD G2 MOV B,M LHLD G3 MOV C,M ENDM ;ENDM DIRECTIVE ENDM Directive Label Opcode Operand ENDM The ENDM directive is required to terminate a macro definition and follows the last prototype instruction. It is also required to terminate code repetition blocks defined by the REPT, IRP, and IRPC directives. Any data appearing in the label or operand fields of an ENDM directive causes an error. NOTE Because nested macro calls are not expanded during macro definition, the ENDM directive to close an outer macro can- not be contained in the expansion of an inner, 'nested' macro call. (See 'Nested Macro Definitions' later in this chapter.) LOCA L Directive Label Opcode Operand LOCAL label name(s) The specified label names are defined to have meaning only within the current macro expansion. Each time the macro is called and expanded, the assembler assigns each local symbol a unique symbol in the form 77nnnn. The assembler assigns ?7OOO1 to the first local symbol, 770002 to the second, and so on. The most recent symbol name generated always indicates the total number of symbols created for all macro expansions. The assembler never duplicates these symbols. The user should avoid coding symbols in the form ??nnnn so that there will not be a conflict with these assembler-generated symbols. 5-5
  • 152. Chapter 5. Macros Dummy parameters included in a macro call cannot be operands of a LOCAL directive. The ~ cope of a dummy parameter is always local to its own macro definition. Local symbols can be defined only within a macro definition. Any number of LOCAL directves may appear in a macro definition, but they must all follow the macro call and must precede the first line 01 prototype code. A LOCAL directive appearing outside a macro definition causes an error. Also, a name appea-ing in the label field of a LOCAL directive causes an error. Example: The definition of MACl (used as an example in the description of the MACRO directive) cOlltains a potential error because the symbol MOVES has not been declared local. This is a potential error since no error occurs if MACl IS called only once in the program, and the program itself does not use MOVES as a ~ymbol. However, if MACl is called more than once, or if the program uses the symbol MOVES, MOVES is a multiply-defined symbol. This potential error is avoided by naming MOVES in th'eoperand field of a LOCAL directive: MACl MACRO Gl,G2,G3 LOCAL MOVES MOVES: LHLD Gl MOV A,M LHLD G2 MaY B,M LHLD G3 MaY C,M ENDM Assume that MACl is the only macro in the program and that it is called twice. The first tirle MACl is expanded, MOVES IS replaced with the symbol 7?OOOl; the second time, MOVES is replaced with 7?0002. Because the assembler encounters only these special replacement symbols, the program may contain the 'ymbol MOVES without causing a multiple definition. REPT Directive Label Opcode Operand optional: REPT expression The REPT directive causes a sequence of source code lines to be repeated 'expression' times. All lines appeanng between the REPT directive and a subsequent ENDM directive constitute the block to be repeated. When 'expression' contains symbolic names, the assembler must encounter the definition of he symbol prior to encountering the expression. The insertion of repeat blocks is performed in-line when the assembler encounters the REPl directive. No explicit call is required to cause the code insertion since the definition is an implied call for expansion. 5-6
  • 153. Chapter 5. Macros Example 1: Rotate accumulator right six times. ROTR6: REPT 6 RRC ENDM Example 2: The following REPT directive generates the source code for a routine that fills a five-byte field with the character stored in the accumulator: PROGRAM CODE GENERA TED CODING LHLD CNTR1 LHLD CNTR1 REPT 5 MOV M,A MOV M,A INX H INX H MOV M,A ENDM INX H MOV M,A INX H MOV M,A INX H MOV M,A INX H Example 3: The following example illustrates the use of REPT to generate a multiplication routine. The multiplication is accomplished through a series of shifts. If this technique is unfamiliar, refer to the example of multiplication in Chapter 6. The example in Chapter 6 uses a program loop for the multiplication. This example replaces the loop with seven repetitions of the four instructions enclosed by the REPT-ENDM directives. Notice that the expansion specified by this REPT directive causes the label SKIPAD to be generated seven times. Therefore, SKIPAD must be declared local to this macro. FSTMUL: MVI D,D ;FAST MULTIPLY ROUTINE LXI H,D ;MULTIPLY E*A - 16-BIT RESULT ;IN H&L REPT 7 LOCAL SKIPAD RLC ;;GET NEXT MULTIPLIER BIT jNC SKIPAD ;;DON'T ADD IF BIT = D DAD D ;;ADD MULTIPLICAND INTO ANSWER SKIPAD: DAD H ENDM RLC RNC DAD D RET 5-7
  • 154. Chapter 5. Macros This example ilustrates a classic programming trade-off: speed versus memory Although this example executes more qUickly tlan the example in Chapter 6, it requires more memory. IRP Directive Label Opcode Operand optional: IRP dummy param, <list> The operand field for the IRP (indefinite repeat) directive must contain one macro dummy parameter followed by a list of actual parameters enclosed In angle brackets. IRP expands its associated macro prototype code sub- stituting the fi 'st actual parameter for each occurrence of the dummy parameter. IRP then expands the proto- type code agai 1 substituting the second actual parameter from the list. This process continues until the list is exhausted. The list of actJal parameters to be substituted for the dummy parameter must be enclosed In angle brackets « ». Individu, I items in the list must be separated by commas. The number of actual parameters in the list controls the nilmber of times the macro body is repeated; a list of n Items causes n repetitions. An empty list (one with no Jarameters coded) specifies a null operand list. IRP generates one copy of the macro body sub- stituting a nul' for each occurrence of the dummy parameter. Also, two commas with no intervening character create a null parameter within the list. (See 'Special Operators' later in this chapter for a description of null operands.) Example: The following code sequence gathers bytes of data from different areas of memory and then stores them in consecutive b~ tes beginning at the address of STORIT PROGRAM CODE GENERA TED CODING LXI H,STORIT LXI H,STORIT IRP X,<FL01,3E20H,FLD3> LOA FLOl LOA X MOV M,A MOV M,A INX H INX H LDA 3E20H ENOM MOV M,A INX H LOA FL03 MOV M,A INX H IRPC Directhe Label Opcode Operand optional: IRPC dummy param,text 5-8
  • 155. Chapter 5. Macros The IRPC (indefinite repeat character) directive causes a sequence of macro prototype instructions to be repeated for each text character of the actual parameter specified. If the text string is enclosed in optional angle brackets, any delimiters appearing in the text string are treated simply as text to be substituted into the prototype code. The assembler generates one iteration of the prototype code for each character in the text string. For each Iteration, the assembler substitutes the next character from the string for each occurrence of the dummy param- eter. A list of n text characters generates n repetitions of the IRPC macro body. An empty string specifies a null actual operand. IRPC generates one copy of the macro body substituting a null for each occurrence of the dummy parameter. Example: PROGRAM CODE GENERA TED CODING LHLD DATE-l LHLD DATE-l MVDATE: IRPC X,1977 INX H INX H MVI M,l MVI M,X INX H ENDM MVI M,9 INX H MVI M,7 INX H MVI M,7 IRPC provides the capability to treat each character of a string individually; concatenation (described later in this chapter) provides the capability for building text strings from Individual characters. EXITM Directive Label Opcode Operand optional: EXITM EXITM provides an alternate method for terminating a macro expansion or the repetition of a REPT, IRP, or IRPC code sequence. When EX!TM is encountered, the assembler ignores all macro prototype instructions located between the EXITM and ENDM directive for this macro. Notice that EXITM may be used in addition to ENDM, but not in place of ENDM. When used in nested macros, EXITM causes an exit to the previous level of macro expansion. An EXITM within a REPT, IRP. or IRPC terminates not only the current expansion, but all subsequent iterations as well. Any data appearing in the operand field of an EXITM directive causes an error. Example: EXITM is typically used to suppress unwanted macro expansion. In the following example, macro expansion is terminated when the EX1TM directive is assembled because the condition X EQ 0 is true. 5-9
  • 156. Chapter 5. Macros MAC3 MACRO X,Y IF X EQ 0 EXITM ENDM Special Macro Op?rators In certain specal cases, the normal rules for dealing with macros do not work. Assume. for example, that you want to specif" three actual parameters. and the second parameter happens to be the comma character. To the assembler, the list PARM1,,,PARM3 appears to be a list of four parameters where the second and third param- eters are missirg. The list can be passed correctly by enclosing the comma in angle brackets: PARM1,<,>,PARM3. These special ( perators instruct the assembler to accept the enclosed character (the comma) as an actual param- eter rather tha'l a del im iter. The assembler recognizes a number of operators that allow special operations: & Ampersand. Used to concatenate (link) text and dummy parameters. See the further discussion of ampersands below. <> Angle brackets. Used to delimit text, such as lists, that contain other delimiters. Notice that blanks are usually treated as delimiters. Therefore, when an actual parameter contains blanks (passing the instruction MOV A,M, for example) the parameter must be enclosed in angle brackets. This is also true for any other de- limiter that is to be passed as part of an actual parameter. To pass such text to nested macro calls, use one set of angle brackets for each level of nesting. (See 'Nested Macro Definitions,' below.) Double semicolon. Used before a comment in a macro definition to prevent inclusion of the comment in expansions of the macro and reduce storage requirements. The comment still appears in the listing of the definition. Exclamation point (escape character). Placed before a character (usually a delimiter) to be passed as literalized text in an actual parameter. Used primarily to pass angle brackets as part of an actual parameter. To pass a literalized exclamation point, issue!!. Carriage returns cannot be passed as actual parameters. The 'I' is always preserved while building an actual parameter. It is not echoed when an actual parameter is substituted for a dummy parameter, except when the substitution is being used to build another actual parameter. 5-10
  • 157. Chapter 5. Macros NUL In certain cases it is not necessary to pass a parameter to a macro. It is necessary, however, to indicate the omission of the parameter. The omitted (or null) parameter can be represented by two consecutive delimiters as in the list PARMl "PARM3. A null parameter can also be represented by two consecutive single quotes: ",PARM2,PARM3. Notice that a null is quite different from a blank: a blank is an ASCII character with the hexadecimal representation 20H; a null has no character representation. In the assembly listing a null looks the same as a blank, but that is only because no substi- tution has taken place. The programmer must decide the meaning of a null parameter. Although the mechanism is somewhat different, the defaults taken for assembler controls provide a good example of what a null parameter can mean. For example. coding MOD85 as an assembler control specifies that the assembler is to generate obiect code for the 8085. The absence of this control (which In effect is a null parameter) specifies that the assembler is to generate only 8080 object code. Assembler controls are explained in the 1515-11 8080/8085 Macro Assembler Operator's Manual, 9800292. Example: In a macro with the dummy parameters W,X,Y,Z it is acceptable for either the X or Y parameter to be null, but not both. The following IF directive tests for the error condition: IF NUL X&Y EXITM When a macro IS expanded, any ampersand preceding or following a dummy parameter in a macro definition is removed and the substitution of the actual parameter occurs at that point. When it is not adjacent to a dummy parameter, the ampersand is not removed and is passed as part of the macro expansion text. NOTE The ampersand must be immediately adjacent to the text being concatenated; Intervening blanks are not allowed. If nested macro definitions (described below) contain ampersands, the only ampersands removed are those adjacent to dummy parameters belonging to the macro definition currently being expanded. All ampersands must be reo moved by the time the expansion of the encompassing macro body is performed. Exceptions force illegal character errors. Ampersands placed inside strings are recognized as concatenation delimiters when adjacent to dummy parameters; similarly, dummy parameters within character strings are recognized only when they are adjacent to ampersands. Ampersands are not recognized as operators in comments. 5-11
  • 158. Chapter 5. Macros Nested Macro Del initions A macro definition can be contained completely within the body of another macro definition (that is, macro definitions can be nested). The body of a macro consists of all text (including nested macro definitions) bounded by mltching MACRO and ENDM directives. The assembler allows any number of macro definitions to be nested. When a higher-evel macro is called for expansion, the next lower-level macro is defined and eligible to be called for expansion. A lower-level macro cannot be called unless all higher-level macro definitions have already been called and exp;.nded. A new macro I nay be defined or an existing macro redefined by a nested macro definition depending on whether the name of the nested macro is a new label or has previously been established as a dummy parameter in a higher-level ma:ro definition. Therefore, each time a higher-level macro is called, a lower-level definition can be defined differe ltly if the two contain common dummy parameters. Such redefinition can be costly, however, in terms of assem oler execution speed. Since IRP, IRFC, and REPT blocks constitute macro definitions, they also can be nested within another definition created by IRF, IRPC, REPT, or MACRO directives. In addition, an element in an IRP or IRPC actual parameter list (enclosed 1,1 angle brackets) may itself be a list of bracketed parameters; that is, lists of parameters can contain elements that ,.re also lists. Example: LISTS MACRO PARAM1,PARAM2 ENDM LISTS <A, <B,C» MACRO CALLS Once 'a macro las been defined, it can be called any number of times in the program. The call consists of the macro name alid any actual parameters that are to replace dummy parameters during macro expansion_ During assembly, each macro call is replaced by the macro definition code; dummy parameters are replaced by actual parameters. Macro Call Format Label Opcode Operand optional: macro name optional actual parameter(s) 5-12
  • 159. Chapter 5. Macros The assembler must encounter the macro definition before the first call for that macro. Otherwise. the macro call is assumed to be an illegal opcode. The assembler inserts the macro body identified by the macro name each time it encounters a call to a previously defined macro in your program. The positioning of actual parameters in a macro call is critical since the substitution of parameters is based solely on position. The first-listed actual parameter replaces each occurrence of the first-listed dummy param- eter; the second actual parameter replaces the second dummy parameter, and so on. When coding a macro call, you must be certain to list actual parameters in the appropriate sequence for the macro. Notice that blanks are usually treated as delimiters. Therefore, when an actual parameter contains blanks (passing the instruction MOV A,M, for example) the parameter must be enclosed in angle brackets. This is also true for any other delimiter that is to be passed as part of an actual parameter. Carriage returns cannot be passed as actual parameters, If a macro call specifies more actual parameters than are listed in the macro definition, the extra parameters are ignored. If fewer parameters appear in the call than in the definition, a null replaces each missing parameter. Example: The following example shows two calls for the macro LOAD. LOAD is defined as follows: LOAD MACRO Gl,G2,G3 LOCAL MOVES MOVES: LHLD Gl MOV A,M LHLD G2 MOV B,M LHLD G3 MOV C,M ENDM LOAD simply loads the accumulator with a byte of data from the location specified by the first actual parameter, the B register with a byte from the second parameter, and the C register with a byte from the third parameter. The first time LOAD is called, It is used as part of a routine that inverts the order of three bytes in memory. The second time LOAD is called, it is part of a routine that adds the contents of the B register to the accumu· lator and then compares the result with the contents of the C register. 5-13
  • 160. Chapter 5. Macros MAIN PROGRAM SUBSTITUTION JNZ nEXT JNZ NEXT LOA[ FLD,FLD+1,FLD+2 ??0001 . LHLD FLD MOY M,A ;INYERT BYTES MOY A,M DCX H LHLD FLD+1 MOY M,B MOY B.M DCX H LHLD FLD+2 MOY M,C MOY C,M LOM' 3EOH,BYTE,CHECK MOY M,A ;INYERT BYTES ADD B ;CHECK DIGIT DCX H CMP C MOY M,B CNZ DGTBAD DCX H MOY M,C 7?0002: LHLD 3EOH MOY A,M LHLD BYTE MOY B,M LHLD CHECK MOY C,M ADD B ;CHECK DIGIT CMP C CNZ DGTBAD Nested Macro Calls Macro calls (in:luding any combination of nested IRP, IRPC, and REPT constructs) can be nested within macro definitions up to eight levels. The macro being called need not be defined when the enclosing macro is defined; however, it ml st be defined before the enclosing macro is called. A macro defin tlon can also contain nested calls to itself (recursIVe macro calls) up to eight levels, as long as the recursive macr" expansions can be terminated eventually, This operation can be controlled using the conditional assembly direc:lves described in Chapter 4 (IF, ELSE, ENDIF). Example: Have a macro :all itself five times after it is called from elsewhere in the program. PARAM1 SET 5 RECALL MACRO IF PARAM1 NE 0 PARAM1 SET PARAM1-1 RECALL ;RECURSIYE CALL ENDIF ENDM 5-14
  • 161. Chapter 5. Macros Macro Expansion When a macro is called, the actual parameters to be substituted into the prototype code can be passed in one of two modes. Normally, the substitution of actual parameters for dummy parameters is simply a text substitution. The parameters are not evaluated until the macro is expanded. If a percent sign (%) precedes the actual parameter in the macro call, however, the parameter is evaluated immediately, before expansion occurs, and is passed as a decimal number representing the value of the param- eter. In the case of IRPC, a '%' preceding the actual parameter causes the entire text string to be treated as a single parameter. One IRPC iteration occurs for each digit in the decimal string passed as the result of immediate evaluation of the text string. The normal mechanism for passing actual parameters is adequate for most applications. Using the percent sign to pre-evaluate parameters is necessary only when the value of the parameter is different within the local con- text of the macro definition as compared to its global value outside the macro definition. Example: The macro shown in this example generates a number of rotate instructions. The parameters passed in the macro call determine the number of positions the accumulator is to be rotated and whether rotate right or rotate left instructions are to be generated. Some typical calls for this macro are as follows: SHIFTR 'R',3 SHIFTR L,%COUNT-l The second call shows an expression used as a parameter. This expression is to be evaluated immediately rather than passed simply as text. The definition of the SHIFTR macro is shown below. This macro uses the conditional IF directive to test the validity of the first parameter. Also, the REPT macro directive is nested within the SHIFTR macro. SHIFTR MACRO X,Y IF X EQ 'R' REPT Y RAR ENDM ENDIF IFXNE'L' EXITM ELSE REPT Y RAL ENDM ENDIF ENDM The indentation shown in the definition of the SHIFTR macro graphically illustrates the relationships of the IF, ELSE, ENDIF directives and the REPT. ENDM directives. Such indentation is not required in your program, but may be desirable as documentation. 5-15
  • 162. Chapter 5. Macros The SHI FTRllacro generates nothing if the first parameter is neither R nor L. Therefore, the following calls produce no c(,de. The result in the object program is as though the SHIFTR macro does not appear in the source program. SHIFTR 5 SHIFTR 'B',2 The following call to the SHIFTR macro generates three RAR instructions: SHIFTR 'R',3 Assume that, SET directive elsewhere in the source program has given COUNT the value 6. The following call generates five RAL instructions: SHIFTR 'L ',%COUNT -1 The following is a redefinition of the SHIFTR macro. In this definition, notice that concatenation is used to form the RAf: or RAL operation code. If a call to the SHIFTR macro specifies a character other than R or L, illegal operati,m codes are generated. The assembler flags all illegal operation codes as errors. SHIFTR MACRO X,y REPT Y RA&X ENDM ENDM NULL MACROS A macro may legally comprise only the MACRO and ENDM directives. Thus, the following is a legal macro definition: NADA MACRO P1,P2,P3,P4 ENDM A call to thiS macro produces no source code and therefore has no effect on the program. Although thel e is no reason to write such a macro, the null (or empty) macro body has a practical application. For example, all the macro prototype instructions might be enclosed With IF-ENDIF conditional directives. When none 0', the specified conditions IS satisfied. all that remainS of the macro is the MACRO directive and the ENDM di ·ective. SAMPLE MACR05 The followin! sample macros further demonstrate the use of macro directives and operators. 5-16
  • 163. Chapter 5. Macros Example 1: Nested IRPC The following macro definition contains a nested IRPC directive. Notice that the third operand of the outer macro becomes the character string for the IRPC: MOVE MACRO X,Y,l IRPC PARAM,l LHLD X&&PARAM SHLD Y&&PARAM ENDM ENDM Assume that the program contains the call MOVE SRC,DST,123. The third parameter of this call IS passed to the IRPC. This has the same effect as coding IRPC PARAM,123. When expanded, the MOVE macro generates the following source code: LHLD SRCl SHLD DSTl LHLD SRC2 SHLD DST2 LHLD SRC3 SHLD DSn Notice the use of concatenation to form labels in this example. Example 2: Nested Macros Used to Generate DB Directives This example generates a number of DB 0 directives, each With ItS own label. Two macros are used for this purpose: INC and BLOCK. The INC macro is defined as follows: INC MACRO Fl,F2 $ SAVE GEN Fl&F2: DB 0 ;GENERATE LABELS & DB's RESTORE ENDM The BLOCK macro, which accepts the number of DB's to be generated (NUMB) and a label prefix (PREFIX), is defi ned as follows: BLOCK MACRO NUMB,PREFIX $ SAVE NOGEN COUNT SET o REPT NUMB COUNT SET COUNT+l INC PREFIX,%COUNT ;NESTED MACRO CALL ENDM $ RESTORE ENDM 5-17
  • 164. Chapter 5. Macros The macro ca I BLOCK 3.LAB generates the following source code: BLOCK 3.LAB LABl: DB o LAB2: DB o LAB3: DB o The assemblet controls specified in these two macros (the lines beginning with $) are used to clean up the assembly Iistit,g for easier reading. The source code shown for the call BLOCK 3.LAB is what appears in the assembly listillg when the controls are used. Without the controls. the assembly listing appears as follows: BLOCK 3.LAB COUNT SET 0 REPT 3 COUNT SET COUNT+l INC LAB.%COUNT ENDM COUNT SET COUNT+1 INC LAB.%COUNT LAB1: DB 0 COUNT SET COUNT+l INC LAB.%COUNT LAB2: DB 0 COUNT SET COUNT+l INC LAB.%COUNT LAB3: DB 0 Example 3: " Macro that Converts Itself into a Subroutine In some case5. the in-line coding substituted for each macro call imposes an unacceptable memory requirement. The next thrEe examples show three different methods for converting a macro call into a subroutine call. The first time the SBMAC macro is called. it generates a full in-line substitution which defines the SUBR subroutine. Each subsequ;nt call to the SBMAC macro generates only a CALL instruction to the SUBR subroutine. Within the fo.lowing examples. notice that the label SUBR must be global so that it can be called from outside the first expa 1sion. This IS possible only when that part of the macro definition containing the global label is called only Ollce in the entire program. Method #1: i~ested Macro Definitions Macros can b" redefined during the course of a program. In the following example. the definition of SBMAC contains its own redefinition as a nested macro. The first time SBMAC is called, it is full expanded. and the redefinition of SBMAC replaces the original definition. The second time SBMAC IS called. only its redefinition (a CALL inst"uction) is expanded. 5-18
  • 165. Chapter 5. Macros SBMAC MACRO SBMAC MACRO CALL SUBR ;;REDEFINITION OF SBMAC ENDM CALL SUBR LINK: jMP DUN SUBR: RET DUN: ENDM Notice that both versions of SBMAC contain CALL SUBR instructions. This is necessary to provide a return address at the end of the SUBR routine. The jump instruction labelled LINK is required to prevent the SUBR subroutine from executing a return to itself. Notice that the return address for the second CALL SUBR instruction would be SUBR if the jump instruction were omitted. The j MP DUN instruction simply transfers control past the end of the subroutine. NOTE The assembler allows the use of a source line consisting only of a label. Such a label IS assigned to the next source line for which code or data is generated. Notice that neither code nor data is generated for an ENDM directive, so the label DUN is assigned to whatever instruction follows the ENDM directive. This construct is required because the ENDM directive itself may not be given a label. Method #2: Conditional Assembly The second method for altering the expansion of the SBMAC macro uses conditional assembly. In this example, a switch (FI RST) is set TRUE just before the first call for SBMAC. SBMAC is defined as follows: TRUE EQU OFFH FALSE EQU 0 FIRST SET TRUE SBMAC MACRO CALL SUBR IF FIRST FIRST SET FALSE LINK: jMP DUN SUBR: RET DUN: ENDIF ENDM 5-19
  • 166. Chapter 5. Macros The first call 0 SBMAC expands the full definition, including the call to and definition of SUBR: SBMAC CALL SUBR IF FIRST LINK: JMP DUN SUBR: RET DUN: ENDIF Because FI RS r is TRUE when encountered during the first expansion of SBMAC, all the statements between IF and ENDI!' are assembled into the program. In subsequent calls, the conditionally-assembled code is skipped so that the sUJroutine is not regenerated. Only the following expansion is produced: SBMAC CALL SUBR IF FIRST Method #3: :onditlonal Assembly with EXITM The third met hod for altering the expansion of SBMAC also uses conditional assembly. but uses the EXIT M directive to Sl ppress unwanted macro expansion after the first call. EXITM is effective when FIRST is FALSE, which it is aft er the first call to SBMAC. TRUE EQU OFFH FALSE EQU 0 FIRST SET TRUE SBMAC MACRO CALL SUBR IF NOT FIRST EXITM ENDIF FIRST SET FALSE JMP DUN SUBR: RET DUN: ENDM 5-20
  • 167. Chapter 5. Macros Example 4: Computed GOTO Macro This sample macro presents an implementation of a computed GOTO for the 8080 or 8085. The computed GOTO, a common feature of many high level languages, allows the program to jump to one of a number of different locations depending on the value of a variable. For example, if the variable has the value zero, the program jumps to the first item In the list; if the variable has the value 3, the program jumps to the fourth address In the list. In this example, the variable IS placed in the accumulator. The list of addresses is defined as a series of DW directives starting at the symbolic address TABLE. This macro (T JUMP) also modifies itself with a nested definition. Therefore, only the first call to the TJ UMP macro generates the calculated GOTO routine. Subse- quent calls produce only the jump instruction JMP TJCODE. TJUMP MACRO ;JUMP TO A-TH ADDR IN TABLE TJCODE: ADD A ;MULTIPLY A BY 2 MVI D,O ;CLEAR DREG MOV E,A ;GET TABLE OFFSET INTO D&E DAD D ;ADD OFFSET TO TABLE ADDR IN H&L MOV E,M ;GET 1ST ADDRESS BYTE INX H MOV D,M ;GET 2ND ADDRESS BYTE XCHG PCHL ;J UMP TO ADDRESS TJUMP MACRO ;REDEFINE TJUMP TO SAVE CODE JMP TJCODE ;NEXT CALL JUMPS TO ABOVE CODE ENDM ENDM Notice that the definition of the TJ UMP macro does not account for loading the address of the address table into the Hand L registers; the user must load this address just before calling the TJ UMP macro. The following shows the coding for the address table (TABLE) and a typical call sequence for the TJ UMP macro: MVI A,2 LXI H,TABLE TJUMP TABLE: DW LOCO DW LOC1 DW LOC2 The call sequence shown above causes a lump to LOC2. 5-21
  • 168. Chapter 5. Macros Example 5: Using IRP to Define the Jump Table The TJ UMP macro becomes even more useful when a second macro (GOTOl IS used to define the jump table, load the addr"ss of the table Into the Hand L registers, and then call TJ UMP, The GOTO macro is defined as follows: GOTO MACRO INDEX,L1ST LOCAL JTABLE LDA INDEX ;LOAD ACCUM WITH INDEX LXI H,JTABLE ;LOAD H&L WITH TABLE ADDRESS TJUMP ;CALL TJUMP MACRO )TABLE: IRP FORMAL,(L1ST> DW FORMAL ;SET UP TABLE ENDM ENDM A typical call to the GOTO macro would be as follows: GOTO CASE,(COUNT,TIMER,DATE,PTDRVR> This call to He GOTO macro builds a table of DW directives for the labels COUNT, TIMER, DATE, and PTDRVR. It hen loads the base address of the table into the Hand L registers and calls the Tj UMP macro. If the value o' the variable CASE is 2 when the GOTO macro is called, the GOTO and TJ UMP macros together causl a jump to the address of the DATE routine. Notice that allY number of addresses may be specified in the list for the GOTO routine as long as they all fit on a single so Jrce line. Also, the GOTO macro may be called any number of times, but only one copy of the coding for thl TjUMP is generated since the TJUMP macro redefines itself to generate only a jMP TjCODE instruction. 5-22
  • 169. 6. PROGRAMMING TECHNIQUES This chapter describes some techniques that may be of help to the programmer. BRANCH TABLES PSEUDO-SUBROUTINE Suppose a program consists of several separate routines. any of which may be executed depending upon some initial condition (such as a number passed In a register). One way to code this would be to check each condition sequentially and branch to the routines accordingly as follows: CONDITION = CONDITION ]I IF YES BRANCH TO ROUTINE 1 CONDITION = CONDITION 2? IF YES BRANCH TO ROUTINE 2 BRANCH TO ROUTINE N A sequence as above is inefficient. and can be improved by using a branch table. The logic at the beginning of the branch table program loads the starting address of the branch table into the H and L registers. The branch table itself consists of a list of starting addresses for the routines to be branched to. Using the Hand L registers as a pointer. the branch table program loads the selected routine's starting address into the program counter. thus effecting a jump to the desired routine. For example. consider a program that executes one of eight routines depending on which bit of the accumulator is set: Jump to routine 1 if the accumulator holds 00000001 2 .. .. 00000010 3 .... .. 00000100 4" If .. 00001000 5 II lJ .. 00010000 6 II " .. 00100000 7" " .. 01000000 8 II II .. 10000000 A program that provides such logic follows. The program is termed a 'pseudo-subroutine' because it IS treated as a subroutine by the programmer (i.e .• it appears just once in memory), but is entered via a regular JUMP instruction rather than via a CALL Instruction. 6-1
  • 170. Chapter 6. Programming Techniques Main Pre gram Branch Table Jump Program Routines I normal subroutine return sequence not followed by branch table program 6-2
  • 171. Chapter 6. Programming Techniques Label Code Operand START: LXI H.BTBL ;REGISTERS HAND L WILL ;POINT TO BRANCH TABLE GTBIT: RAR jC GETAD INX H ;(H.L)=(H,L)+2 TO INX H ;POINT TO NEXT ADDRESS ;IN BRANCH TABLE JMP GTBIT GETAD: MOV E,M ;BIT FOUND INX H ;LOAD JUMP ADDRESS ;INTO D AND E REGISTERS MOV D.M XCHG ;EXCHANGE D AND E ;WITH HAND L PCHL ;JUMP TO ROUTINE ;ADDRESS BTBL: DW ROUTl ;BRANCH TABLE. EACH DW ROUT2 :ENTRY IS A TWO-BYTE DW ROUTJ ;ADDRESS DW ROUT4 ;HELD LEAST SIGNIFICANT DW ROUTS ;BYTE FIRST DW ROUT6 DW ROUT7 DW ROUT8 The control routine at START uses the Hand L registers as a pointer into the branch table (BTBL) corresponding to the bit of the accumulator that is set. The rdutine at GETAD then transfers the address held In the corres- ponding branch table entry to the Hand L registers via the D and E registers. and then uses a PCH L Instruction. thus transferring control to the selected routine. TRANSFERRING DATA TO SUBROUTINES A subroutine typically requires data to perform its operations. In the simplest case. this data may be transferred In one or more registers. Sometimes it is more convenient and economical to let the subroutine load its own registers. One way to do this is to place a list of the required data (called a parameter list) in some data area of memory. and pass the address of this list to the subroutine in the Hand L registers. 6-3
  • 172. Chapter 6. Programming Techniques For example, the subroutine ADSUB expects the address of a three-byte parameter list in the Hand L registers. It adds the fiJ st and second bytes of the list, and stores the result in the third byte of the list: Label Code Operand Comment LXI H.PLlST ;LOAD HAND L WITH ;ADDRESSES OF THE PARAM- ;ETER LIST CALL ADSUB ;CALL THE SUBROUTINE RET1: 'LIST DB 6 ;FIRST,NUMBER TO BE ADDED DB 8 ;SECOND NUMBER TO BE ;ADDED DS 1 ;RESULT WILL BE STORED HERE LXI H.L1ST2 ;LOAD HAND L REGISTERS CALL ADSUB ;FOR ANOTHER CALL TO ADSUB RET2: L1ST2: DB 10 DB 35 DS 1 PDSUB: MOV A,M ;GET FIRST PARAMETER INX H ;INCREMENT MEMORY ;ADDRESS MOV B.M ;GET SECOND PARAMETER ADD B ;ADD FIRST TO SECOND INX H ;INCREMENT MEMORY ;ADDRESS MOV M,A ;STORE RESU LTAT TH IRD ;PARAMETER STORE RET ;RETURN UNCONDITIONALLY The first time ADSUB is called, it loads the A and B registers from PLiST and PLlST+1 respectively, adds them, and stores tr e result in PLiST+2. Return is then made to the instruction at RET1. 6-4
  • 173. Chapter 6. Programming Techniques First call to ADSUB: 06 PLIST 08 PLlST+l OEH PLlST+2 The second time ADSUB IS called, the Hand L registers POint to the parameter list L1ST2. The A and B registers are loaded with 10 and 35 respectively, and the sum is stored at L1ST2+2. Return is then made to the Instruction at RET2. Note that the parameter lists PLIST and L1ST2 could appear anywhere in memory without altering the results produced by ADSUB. This approach does have its limitations, however. As coded, ADSUB must receive a list of two and only two numbers to be added, and they must be contiguous in memory. Suppose we wanted a subroutine (GENAD) which would add an arbitrary number of bytes, located anywhere in memory. and leave the sum in the accumu- lator. This can be done by passing the subroutine a parameter list which is a list of addresses of parameters, rather than the parameters themselves. and signifying the end of the parameter list be a number whose first byte is FFH (assuming that no parameters will be stored above address FFOOH). Call to GENAD: H L D GENAD: PARMl ADRl PARM4 ADR2 ADR3 PARM3 ADR4 FFFF PARM2 As implemented below, GENAD saves the current sum (beginning with zero) in the C register. It then loads the address of the first parameter into the D and E registers. If this address is greater than or equal to FFOOH, it reloads the accumulator with the sum held in the C register and returns to the calling routine. Otherwise, it 6-5
  • 174. Chapter 6. Programming Techniques loads the panmeter into the accumulator and adds the sum in the C register to the accumulator. The routine then loops b:,ck to pick up the remaining parameters. Label Code Operand Comment LXI H,PLlST ;LOAD ADDRESS OF CALL GENAD ;PARAMETER ADDRESS LIST HALT PLlST: DW PARM1 ;L1ST OF PARAMETER ADDRESSES DW PARM2 DW PARM3 DW PARM4 DW OFFFFH ;TERMINATOR PA.RM1 : DB 6 PARM4: DB 16 FARM3: DB 13 FARM2: DB 82 GENAD: XRA A ;CLEAR ACCUMULATOR LOOP: MOV C,A ;SAVE CURRENT TOTAL IN C MOV E,M ;GET LOW ORDER ADDRESS BYTE ;OF FIRST PARAMETER INX H MOV A,M ;GET HIGH ORDER ADDRESS BYTE ;OF FIRST PARAMETER CPI OFFH ;COMPARE TO FFH jZ BACK ;IF EQUAL, ROUTINE IS COMPLETE MOV D,A ;D AND E NOW ADDRESS PARAMETER LDAX D ;LOAD ACCUMULATOR WITH PARAMETER ADD C ;ADD PREVIOUS TOTAL INX H ;INCREMENT HAND L TO POINT ;TO NEXT PARAMETER ADDRESS JMP LOOP ;GET NEXT PARAMETER BACK: MOV A,C ;ROUTINE DONE - RESTORE TOTAL RET ;RETURN TO CALLING ROUTINE END 6-6
  • 175. Chapter 6. Programmmg Techniques Note that GENAD could add any combination of the parameters with no change to the parameters themselves. The sequence: LXI H,PLlST CALL GENAD PUST: DW PARM4 DW PARMl DW OFFFFH would cause PARMl and PARM4 to be added, no matter where in memory they might be located (excluding addresses above FFOOH). Many variations of parameter passing are possible. For example, if it IS necessary to allow parameters to be stored at any address, a calling program can pass the total number of parameters as the first parameter; the subroutine then loads this first parameter into a register and uses It as a counter to determine when all param- eters had been accepted. SOFTWARE MULTIPLY AND DIVIDE The multiplication of two unsigned 8-bit data bytes may be accomplished by one of two techniques: repetitive addition, or use of a register shifting operation. Repetitive addition provides the simplest, but slowest, form of multiplication. For example, 2AH*74H may be generated by adding 74H to the (initially zeroed) accumulator 2AH times. Shift operations provide faster multiplication. Shifting a byte left one bit is equivalent to multiplying by 2, and shifting a byte right one bit IS equivalent to dividing by 2. The following process will produce the correct 2-byte result of multiplying a one byte multiplicand by a one byte multiplier: A. Test the least significant bit of multiplier. If zero, go to step b. If one, add the multiplicand to the most significant byte of the result. B. Shift the entire two-byte result right one bit position. C. Repeat steps a and b until all 8 bits of the multiplier have been tested. For example, consider the multiplication: 2AH*3CH=9D8H Step 1: Test multiplier O-bit; it is 0, so shift 16-bit result right one bit. Step 2: Test multiplier l-bit; it is 0, so shift 16-bit result right one bit. Step 3: Test multiplier 2-blt; it is 1, so add 2AH to high-order byte of result and shift 16-bit result right one bit. 6-7
  • 176. Chapter 6. Programming Techniques Step 4: Test multiplier 3-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit result right one bit. Step 5: Test multiplier 4-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit result right one bit. Step 6: Test multiplier 5-bit; it is 1, so add 2AH to high-order byte of result and shift 16-bit result right one bit. Step 7: Test multiplier 6-bit; it is 0, so shift 16-bit result right one bit. Step 8: Test multiplier 7-bit; it is 0, so shift 16-bit result right one bit. The result produced is 09D8. HIGH-ORDER BYTE LOW-0RDER BYTE MULTIPLIER MULTIPLICAND OF RESULT OF RESULT Start 00111100(3C) 00101010(2A) 00000000 00000000 Step 1 a b 00000000 00000000 Step 2 a b 00000000 00000000 Step 3 a . '>.,., ..•. , , 00101010 00000000 b 00010101 00000000 Step 4 a . . . . , ... 00111111 00000000 b 00011111 10000000 Step 5 a ".,." . " . ' .. "" , 01001001 10000000 b 00100100 11000000 Step 6 a .. """" .. 01001110 11000000 b 00100111 01100000 Step 7 a . '" 0 .• ' · · · •• , b 00010011 10110000 Step 8 a . ..0 . . . b 00001001 11 011 000(9D8) Since the mliitiplication routine described above uses a number of important programming techniques, a sample program IS g ven with comments. The prograrr uses the B register to hold the most significant byte of the result. and the C register to hold the least signific,Lnt byte of the result. The 16-bit right shift of the result is performed in the accumulator by two rotate-right-! hrough -carry instructions. 6-8
  • 177. Chapter 6. Programming Techniques Zero carry and then rotate B: B C I ~~0 [_ _ _I D Then rotate C to complete the shift: B C D 'I~b Register D holds the multiplicand. and register C originally holds the multiplier. MULT: MVI B.O ;INITIALIZE MOST SIGNIFICANT BYTE ;OF RESULT MVI E,9 ;BIT COUNTER MULTO: MOV A,C ;ROTATE LEAST SIGNIFICANT BIT OF RAR ;MULTIPLIER TO CARRY AND SHIFT MOV C,A ;LOW-ORDER BYTE OF RESULT DCR E JZ DONE ;EXIT IF COMPLETE MOV A.B JNC MULT1 ADD D ;ADD MULTIPLICAND TO HIGH- ;ORDER BYTE OF RESULT IF BIT ;WAS A ONE MULT1: RAR ;CARRY=O HERE SHIFT HIGH- ;ORDER BYTE OF RESULT MOV BA JMP MULTO DONE: An analogous procedure is used to divide an unsigned 16-bit number by an unsigned 16-bit number. Here, the process involves subtraction rather than addition, and rotate-left instructions instead of rotate-right instructions. 6-9
  • 178. Chapter 6. Programming Techniques The followin: reentrant program uses the Band C registers to hold the dividend and quotient, and the D and E register to held the divisor and remainder. The Hand L registers are used to store data temporarily. DIV: MOV A,D :NEGATE THE DIVISOR CMA MOV D,A MOV A,E CMA MOV E,A INX D :FOR TWO'S COMPLEMENT LXI H,O ;IN ITIAL VALUE FOR REMAINDER MVI A,17 ;INITIALIZE LOOP COUNTER DVO: PUSH H ;SAVE REMAINDER DAD D ;SUBTRACT DIVISOR (ADD NEGATIVE) JNC DVl :UNDER FLOW, RESTORE HL XTHL DV1: POP H PUSH PSW :SAVE LOOP COUNTER (A) MOV A,C ;4 REGISTER LEFT SHIFT RAL ;WITH CARRY MOV C,A ;CY->C->B->L->H MOV A,B RAL MOV BA MOV A,L RAL MOV L,A MOV A,H RAL MOV H,A POP PSW :RESTORE LOOP COUNTER (A) DCR A ;DECREMENT IT JNZ DVO :KEEP LOOPING ;POST·DIVIDE CLEAN UP :SHIFT REMAINDER RIGHT AND RETURN IN DE ORA A MOV A.H RAR MOV D,A MOV A,L RAR MOV E,A RET END 6·10
  • 179. Chapter 6. Programming Techniques MULTI BYTE ADDITION AND SUBTRACTION The carry flag and the ADC (add with carry) instructions may be used to add unsigned data quantities of arbitrary length. Consider the following addition of two three-byte unsigned hexadecimal numbers: 32AF8A +84BA90 B76A1A To perform this addition, add to the low-order byte uSing an ADD instruction. ADD sets the carry flag for use in subsequent instructions, but does not Include the carry flag in the addition. Then use ADC to add to all higher order bytes. 3n ~ 8A 84 BA 90 B7 I 6A i 1A carry = 1 ...J carry = 1 . J The following routine will perform this multibyte addition, making these assumptions: The E register holds the length of each number to be added (in this case, 3). The numbers to be added are stored from low-order byte to high-order byte beginning at memory locations FI RST and SECND, respectively. The result will be stored from low-order byte to high-order byte beginning at memory location FIRST, replacing the original contents of these locations. MEMORY LOCATION before after FIRST 8A --+ ,. lA ~ carry FIRST+l FIRSTt2 AF 32 --t +-- +-liI>- 6A B7 ~ carry SECND 90 90 SECND+l BA BA SECND+2 84 84 6-11
  • 180. Chapter 6. Programming Techniques The followin: routine uses an ADC instruction to add the low-order bytes of the operands. This could cause the result to be high by one if the carry flag were left set by some previous instruction. This routine avoids the problem Jy clearing the carry flag with the XRA instruction just before LOOP. Label Code Operand Comment I~ADD: LXI B,FIRST ;B AND C ADDRESS FIRST LXI H,SECND ;H AND L ADDRESS SECND XRA A ;CLEAR CARRY FLAG LOOP: LDAX B ;LOAD BYTE OF FIRST ADC M ;ADD BYTE OF SECND ;WITH CARRY STAX B ;STORE RESULT AT FIRST DCR E ;DONE IF E = 0 JZ DONE INX B ;POINT TO NEXT BYTE OF ;FIRST INX H ;POINT TO NEXT BYTE OF ;SECND JMP LOOP ;ADD NEXT TWO BYTES DONE: FIRST DB 90H DB OBAH DB 84H ~ECND: DB 8AH DB OAFH DB 32H Since none cf the instructions in the program loop affect the carry flag except ADC, the addition with carry will proceed cornctly. When locaticn DONE is reached. bytes FIRST through FIRST+2 will contain 1A6AB7, which is the sum shown at the beginldng of this section arranged from low-order to high-order byte. In order to (reate a multibyte subtraction routine, it is necessary only to duplicate the multibyte addition routine of this sectic n, changing the ADC instruction to an SBB instruction. The program will then subtract the number beginning at SECND from the number beginning at FIRST, placing the result at FIRST. DECIMAL ADDIlION Any 4-bit d, ta quantity may be treated as a decimal number as long as it represents one of the decimal digits from 0 throllgh 9, and does not contain any of the bit patterns representing the hexadecimal digits A through F. In order to preserve this decimal interpretation when performing addition, the value 6 must be added to the 4-bit quantily whenever the addition produces a result between 10 and 15. This is because each 4-bit data quantity car hold 6 more combinations of bits than there are decimal digits. 6-12
  • 181. Chapter 6. Programming Techniques Decimal addition is performed by letting each 8-bit byte represent two 4-bit decimal digits. The bytes are summed In the accumulator in standard fashion, and the DAA (decimal adiust accumulator) instruction is then used to convert the 8-bit binary result to the correct representation of 2 decimal digits. For multibyte strings, you must perform the decimal adiust before adding the next higher-order bytes. This is because you need the carry flag setting from the DAA instruction for adding the higher-order bytes. To perform the decimal addition: 2985 +4936 7921 the process works as follows: 1. Clear the Carry and add the two lowest-order digits of each number (remember that each 2 decimal digits are represented by one byte). 85 = 10000101 B 36 = 00110110B carry 0 Q]10111011B Carry = 0 ~ ~ Auxiliary Carry = 0 The accumulator now contains OBBH. 2. Perform a DAA operation. Since the rightmost four bits are greater than 9, a 6 is added to the accumulator. Accumulator = 10111011 B 6 = 0110B 11000001 B Since the leftmost bits are greater than 9. a 6 is added to these bits, thus setting the carry flag_ Accumulator = 11000001 B 6=0110 B /]00100001B Carry flag = 1 The accumulator now contains 21 H. Store these two digits. 6-13
  • 182. Chapter 6. Programming Techniques 3, Add the next group of two digits: 29 = 001 01 001 B 49 = 01001001B carry .Q] 0111 0011 B Carry = 0 ~ ~AuXiliary Carry = 1 The accumulator now contains 73H. Perform a DAA operation. Since the auxiliary carry flag is set. 6 is added to the accumulator. Accumulator = 01110011 B 6 = 0110B /QlOl111001B Carry flag = 0 Since the leftmost 4 bits are less than 10 and the carry flag is reset, no further action occurs. Thus, the correct decimal result 7921 IS generated in two bytes. A routine wlich adds decimal numbers, then, IS exactly analogous to the multibyte addition routine MADD of the last sect on, and may be produced by Inserting the instruction DAA after the ADC M instruction of that example. Each iteration of the program loop will add two decimal digits (one byte) of the numbers. DECIMAL SUBTltACTION DeCimal subtraction is considerably more complicated than decimal addition. In general, the process consists of generating tle tens complement of the subtrahend digit, and then adding the result to the minuend digit. For example, to subtract 34 from 56, form the tens complement of 34 (99-34=65+1=66), Then, 56+66=122. By truncating eff the carry out of the high order digit, we get 22, the correct result. The problerl of handling borrows arises in multibyte deCimal subtractions. When no borrow occurs from a sub- tract, you v'ant to use the tens complement of the subtrahend for the next operation. If a borrow does occur, you want t,. use the nines complement of the subtrahend. Notice that the meaning of the carry flag IS Inverted because you are dealing with complemented data. Thus, a one bit in tle carry flag Indicates no borrow: a zero bit In the carry flag indicates a borrow. This inverted carry flag setting :an be used in an add operation to form either the nines or tens complement of the subtrahend. 6-14
  • 183. Chapter 6. Programming Techniques The detailed procedure for subtracting multi-digit decimal numbers is as follows: 1. Set the carry flag = 1 to indicate no borrow. 2. Load the accumulator with 99H, representing the number 99 decimal. 3. Add zero to the accumulator with carry, producing either 99H or 9AH, and resetting the carry flag. 4. Subtract the subtrahend digits from the accumulator. producing either the nines or tens complement. 5. Add the minuend digits to the accumulator. 6. Use the DAA instruction to make sure the result In the accumulator is In decimal format, and to indicate a borrow in the carry flag if one occurred. 7. If there are more digits to subtract, go to step 2. Otherwise. stop. Example: Perform the decimal subtraction: 43580 -13620 29960 1. Set carry = 1 . 2. Load accumulator with 99H. 3. Add zero with carry to the accumulator, producing 9AH. Accumulator = 100110018 = 000000008 Carry 100110108 = 9AH 4. Subtract the subtrahend digits 62 from the accumulator. Accumulator = 100110108 62 = 1001111 08 ] 001110008 6-15
  • 184. Chapter 6. Programming -rechniques 5. Add the minuend digits 58 to the accumulator. Accumulator = 00111 OOOB 58 = 01011 OOOB Q] 1001 OOOOB = 90H Carry = 0 ~ 'AUXiliarY Carry = 1 6. DAA converts accumulator to 96 (since Auxiliary Carry = 1) and leaves carry flag =0 Indicating that a borrow occurred. 7 Load accumulator with 99H. 8. Add zero with carry to accumulator. leaving accumulator = 99H. 9. Subtract the subtrahend digits 13 from the accumulator. Accumulator = 10011 001 B 13= 11101101B 1] 10000110B 10. Add the minuend digits 43 to the accumulator. Accumulator = 1000011 OB 43 = 01000011 B ~~ 11001001B = C9H Carry = 0 'AUXiliary Carry = 0 11 DAA converts accumulator to 29 and sets the carry flag = 1. indicating no borrow occurred. Therefore, the result of subtracting 1362 from 4358 is 2996. The followinl. subroutine will subtract one 16-digit decimal number from another using the following assumptions: The minuend IS stored least significant (2) digits first beginning at location MINU. The subtrahe ld IS stored least significant (2) digits first beginning at location SBTRA. The result will be stored least significant (2) digits first, replacing the minuend. 6-16
  • 185. Chapter 6. Programming Techniques Label Code Operand Comment DSUB: LXI D,MINU ;D AND E ADDRESS MINUEND LXI H,SBTRA ;H AND L ADDRESS SUBTRA- ;HEND MVI C,8 ;EACH LOOP SUBTRACTS 2 ;DIGITS (ONE BYTE), ;THEREFORE PROGRAM WILL ;SUBTRACT 16 DIGITS. STC ;SET CARRY INDICATING ;NO BORROW LOOP: MVI A,99H ;LOAD ACCUMULATOR ;WITH 99H. ACI 0 ;ADD ZERO WITH CARRY SUB M ;PRODUCE COMPLEMENT ;OF SUBTRAHEND XCHG ;SWITCH D AND E WITH ;H AND L ADD M ;ADD MINUEND DAA ;DECIMAL ADJUST ;ACCUMULATOR MOV M,A ;STORE RESULT XCHG ;RESWITCH D AND E ;WITH HAND L DCR C ;DONE IF C = 0 JZ DONE INX D ;ADDRESS NEXT BYTE ;OF MINUEND INX H ;ADDRESS NEXT BYTE ;OF SUBTRAHEND JMP LOOP ;GET NEXT 2 DECIMAL DIGiTS DONE: NOP 6-17
  • 187. 7. INTERRUPTS INTERRUPT CONCEPTS The following is a general description of interrupt handling and applies to both the 8080 and 8085 processors. However, the 8085 processor has some additional hardware features for interrupt handling. For more infor- mation on these features, see the description of the 8085 processor in Chapter 1 and the descriptions of the RIM, SIM, and RST instructions in Chapter 3. Often, events occur external to the central processing unit which require immediate action by the CPU. For example, suppose a device is sending a string of 80 characters to the CPU, one at a time, at fixed intervals. There are two ways to handle such a situation: A. A program could be written which accepts the first character, waits until the next character is ready (e.g., executes a timeout by incrementing a sufficiently large counter), then accepts the next character, and proceeds in this fashion until the entire 80 character string has been received. This method is referred to as programmed Input/Output. B. The device controller could interrupt the CPU when a character is ready to be input, forcing a branch from the executing program to a special interrupt service routine. The interrupt sequence may be illustrated as follows: INTERRUPT Normal Program Program Execution Execution Continues Interrupt Service Routine 7-1
  • 188. Chapter 7. Interrupts The 8080 cor tains a bit named INTE which may be set or reset by the instructions EI and DI described in Chapter 3. Wilenever INTE is equal to 0, the entire interrupt handling system is disabled, and no interrupts will be accepl ed. When the 8010 recognizes an interrupt request from an external device, the following actions occur: 1. The instruction currently being executed is completed. 2. The interrupt enable bit. INTE, is reset = O. 3. The interrupting device supplies. via hardware. one instruction which the CPU executes. This instruction does not appear anywhere in memory, and the programmer has no control over it, since it is a function of the interrupting device's controller design. The program counter is not incremented before this instruction. The Instruction supplied by the interrupting device is normally an RST instruction (see Chapter 3), since this is an efficienl one byte call to one of 8 eight-byte subroutines located in the first 64 words of memory. For instance, the jevice may supply the instruction: RST OH with each in, ut interrupt. Then the subroutine which processes data transmitted from the deVice to the CPU will be called into execution via an eight-byte instruction sequence at memory locations OOOOH to 0007H. A digital inplt device may supply the instruction: RST 1H Then the sub'outine that processes the digital input signals will be called via a sequence of instructions occupying m"mory locations 0008H to OOOFH. d Transfers :epvpi~i::a~ST OH .~ 0000 Beginning of c_o_n_t_ro_l_t_o subroutine for 0007 } device 'a' Device " d T_ra_n_s_fe_r_s control to .- • 0008 I Beginning of subroutine for supplie, RST 1 H OOOF J device 'b' 7-2
  • 189. Chapter 7. Interrupts Transfers } Beginning of Device 'x' control to 0038 subroutine for supplies RST 7H 003F device 'x' Note that any of these 8-byte subroutines may in turn call longer subroutines to process the interrupt, if necessary. Any device may supply an RST instruction (and indeed may supply anyone-byte 8080 instruction). The following is an example of an Interrupt sequence: ARBITRARY MEMOR Y ADDRESS INSTRUCTION ~3COC 3COB ~~~ ~'1~{,o",,"p<f,om D,,'ce , A I Device 1 supplies RST OH Program Counter = I 3COC pushed onto the stack. Control transferred to B .j to 0000 0000 '0"'",';00 , / Instruction 2 RET t Stack popped into C program counter Device 1 signals an interrupt as the CPU is executing the instruction at 3COB. This instruction is completed. The program counter remains set to 3COC. and the instruction RST OH supplied by device 1 is executed. Since this is a call to location zero. 3COC is pushed onto the stack and program control is transferred to location OOOOH. (This subroutine may perform jumps, calls, or any other operation.) When the RETURN is executed, address 3COC is popped off the stack and replaces the contents of the program counter, causing execution to continue at this point. 7-3
  • 190. Chapter 7. Interrupts WRITING INTERRJPT SUBROUTINES In general, anI registers or condition bits changed by an Interrupt subroutine must be restored before returning to the interrurted program, or errors will occur. For example, . uppose a program is interrupted lust prior to the instruction: JC LOC and the carry Jlt equals 1, If the interrupt subroutine happens to reset the carry bit before returning to the Interrupted pngram, the jump to LOC which should have occurred will not, causing the interrupted program to produce err Jneous results. Like any othe subroutine then, any interrupt subroutine should save at least the condition bits and restore them before perfornling a RETURN operation. (The obVIOUS and most convenient way to do this IS to save the data In the stack, u,lng PUSH and POP operations.) Further, the II terrupt enable system is automatically disabled whenever an Interrupt is acknowledged. Except in special cases, 1herefore, an interrupt subroutine should include an EI instruction somewhere to permit detection and handling (of future interrupts. One instruction after an EI is executed, the interrupt subroutine may itself be Interrupted. T lis process may continue to any level, but as long as all pertinent data are saved and restored, correct progra n execution will continue automatically, A typical intel rupt subroutine, then, could appear as follows: Code Operand Comment PUSH PSW ;SAVE CONDITION BITS AND ACCUMULATOR EI ;RE-ENABLE INTERRUPTS ;PERFORM NECESSARY ACTIONS TO SERVICE ;THE INTERRUPT POP PSW ;RESTORE MACHINE STATUS RET ;RETURN TO INTERRUPTED PROGRAM 74
  • 191. APPENDIX A. INSTRUCTION SUMMARY This appendix summarizes the bit patterns and number of time states associated with every 8080 CPU instruction. The instructions are listed in both mnemonic (alphabetical) and operation code (numerical) sequence. When USing this summary, note the following symbology DDD represents a destination register. SSS represents a source register. Both DDD and SSS are interpreted as follows: DDD or SSS Interpretation 000 Register B 001 Register C 010 Register D 011 Register E 100 Register H 101 Register L 110 A memory register or stack pointer or PSW (flags + accumulator) 111 The accumulator Instruction execution time equals number of time periods multiplied by the duration of a time period. A time period may vary from 480 nanoseconds to 2 microseconds on the 8080 or 320 nanoseconds to 2 microseconds on the 8085. Where two numbers of time periods are shown (eq.5/11), it means that the smaller number of time periods is required if a condition is not met, and the larger number of time periods is required if the condition IS met. NUMBER OF TIME PERIODS MNEMONIC D7 D6 D5 D4 D3 D2 D1 DO 8080 8085 CALL 1 1 0 0 1 1 0 1 17 18 I ! CC 1 1 0 1 1 1 0 0 11/17 9/18 I CNC 1 I 0 1 0 1 0 0 11/17 9/18 CZ 1 1 0 0 1 1 0 0 11/17 9/18 CNZ 1 1 0 0 0 1 0 0 11/17 9/18 CP 1 1 1 1 0 1 0 0 11/17 9/18 CM 1 1 1 1 1 1 0 0 11/17 9/18 CPE 1 1 1 0 1 1 0 0 11/17 9/17 CPO 1 1 1 0 0 1 0 0 11/17 9/18 RET 1 1 0 0 1 0 0 1 10 10 RC 1 1 0 1 1 0 0 0 5/11 6/12 RNC 1 1 0 1 0 0 0 0 5/11 6/12 RZ 1 1 0 0 1 0 0 0 5/11 6/12 ALL MNEMONICS©7974, 7975, 7976, 7977 INTEL CORPORATION A-l
  • 192. Appendix A. Instruction 5ummary NUMBER OF TIME PERIODS MNEMONIC D7 D6 D5 D4 D3 D2 D1 DO 8080 8085 RNZ 1 1 0 0 0 0 0 0 5/11 6/12 RP 1 1 1 1 0 0 0 0 5/11 6/12 RM 1 1 1 1 1 0 0 0 I 5/11 6/12 RPE 1 1 1 0 1 0 0 0 5/11 6/12 RPO 1 1 1 0 0 0 0 0 5/11 6/12 RST 1 1 A A A 1 1 1 11 12 IN 1 1 0 1 1 0 1 1 10 10 OUT 1 1 0 1 0 0 1 1 10 10 LXI B 0 0 0 0 0 0 0 1 10 10 LXI D 0 0 0 1 0 0 0 1 10 10 LXI H 0 0 1 0 0 0 0 1 10 10 LXI SP 0 0 1 1 0 0 0 1 10 10 PUSH B 1 1 0 0 0 1 0 1 11 12 PUSH D PUSH H 1 1 1 1 0 1 1 0 0 0 I 1 1 0 0 1 1 11 11 12 12 PUSH PSW 1 1 1 1 0 1 0 1 11 12 POP B 1 1 0 0 0 0 0 1 10 10 POP D 1 1 0 1 0 0 0 1 10 10 POP H 1 1 1 0 0 0 0 1 10 10 POP PSW 1 1 1 1 0 0 0 1 10 10 STA 0 0 1 1 0 0 1 0 13 13 LDA 0 0 1 1 I 1 0 1 0 13 13 XCHG 1 1 1 0 1 0 1 1 4 4 XTHL 1 1 1 0 0 0 1 1 18 16 SPHL 1 1 1 1 1 0 0 1 5 6 PCHL 1 1 1 0 1 0 0 1 5 6 DAD B 0 0 0 0 1 0 0 1 10 10 DAD D 0 0 0 1 1 0 0 1 10 10 DAD H 0 0 1 0 1 0 0 1 10 10 DAD SP 0 0 I 1 1 0 0 1 10 10 STAX B 0 0 0 0 0 0 1 0 7 7 STAX D 0 0 0 1 0 0 1 0 7 7 LDAX B 0 0 0 0 1 0 1 0 7 7 LDAX D 0 0 0 1 1 0 1 0 7 7 INX B 0 0 0 0 0 0 1 1 5 6 INX D 0 0 0 1 0 0 1 1 5 6 INX H 0 0 1 0 0 0 1 1 5 6 INX SP 0 0 1 1 0 0 1 1 5 6 MOV r1/2 0 1 D D D S S S 5 4 MOV M,r 0 1 1 1 0 S S S 7 7 MOV r,M 0 1 D D D 1 1 0 7 7 HLT 0 1 1 1 0 1 1 0 7 5 MVI r 0 0 D D D 1 1 0 7 7 MVI M 0 0 1 1 0 1 1 0 10 10 INR 0 0 D D D 1 0 0 5 4 DCR 0 0 D D D ALL MNEMON/CS© 1974,7975,7976, 7977/NTEL CORPORATION 1 0 I 1 5 4 A-2
  • 193. Appendix A. Instruction Summary NUMBER OF TIME PERIODS MNEMONIC D7 D D5 D4 D3 D2 D1 DO 6 8080 8085 INR A 0 0 1 1 1 1 0 0 5 4 DCR A 0 0 1 1 1 1 0 1 5 4 INR M 0 0 1 1 0 1 0 0 10 10 DCR M 0 0 1 1 0 1 0 1 10 10 ADD r 1 0 0 0 0 5 5 5 4 4 ADC r 1 0 0 0 1 5 5 5 4 4 SUB r 1 0 0 1 0 5 5 5 4 4 SBB r 1 0 0 1 1 5 5 5 4 4 ,AND r 1 0 1 0 0 5 5 5 4 4 XRA r 1 0 1 0 1 5 i 5 5 4 4 I ORA r 1 0 1 1 0 5 5 5 4 4 CMPr 1 0 1 1 1 5 5 5 4 4 ADD M 1 0 0 0 0 1 1 0 7 7 ADC M 1 0 0 0 1 1 1 0 7 7 SUB M 1 0 0 1 0 1 I 1 0 7 7 5BB M 1 0 0 1 1 1 1 0 7 7 AND M 1 0 1 0 0 1 1 0 7 7 XRA M 1 0 1 0 1 1 1 0 7 7 ORA M 1 0 1 1 0 1 1 0 7 7 CMP M 1 0 1 1 1 1 1 0 7 7 ADI 1 1 0 0 0 1 1 0 7 7 ACI 1 1 0 0 1 1 1 0 7 7 SUI 1 1 0 1 0 1 1 0 7 7 5BI 1 1 0 1 1 1 1 0 7 7 ANI 1 1 1 0 0 1 1 0 7 7 XRI 1 1 1 0 1 1 1 0 7 7 ORI 1 1 1 1 0 1 1 0 7 7 CPI 1 1 1 1 1 1 1 0 7 7 RLC 0 0 0 0 0 1 1 1 4 4 RRC 0 0 0 0 1 1 1 1 4 4 RAL 0 0 0 1 0 1 1 1 4 4 RAR 0 0 0 1 1 1 1 1 4 4 JMP 1 1 0 0 0 0 1 1 10 10 JC 1 1 0 1 1 0 1 0 10 7{10 JNC 1 1 0 1 0 0 1 0 10 7{10 JZ 1 1 0 0 1 0 1 0 10 7{10 JNZ 1 1 0 0 0 0 1 0 10 7{10 JP 1 1 1 1 0 0 1 0 10 7/10 JM 1 1 1 1 1 0 1 0 10 7/10 JPE 1 1 1 0 1 0 1 0 10 7/10 JPO 1 1 1 0 0 0 1 0 10 7{10 DCX B 0 0 0 0 1 0 1 1 5 6 DCX D 0 0 0 1 1 0 1 1 5 6 DCX H 0 0 1 0 1 0 1 1 5 6 DCX 5P 0 0 1 1 1 0 1 1 5 6 ALL MNEMONICS©7974, 7975, 7976, 7977 INTEL CORPORATION A-3
  • 194. Appendix A. Instruction S!lmmary NUMBER OF TIME PERIODS MNEMONIC D7 D D D D 6 s 4 3 °2 °1 DO 8080 8085 CMA 0 0 1 0 1 1 1 1 4 4 STC I 0 0 1 1 0 1 1 1 4 4 CMC 0 0 1 1 1 1 1 1 4 4 OAA 0 0 1 0 0 1 1 1 4 4 SHLD 0 0 1 0 0 0 1 0 16 16 LHLD 0 0 1 0 1 0 1 0 16 16 RIM 0 0 1 0 0 0 0 0 - 4 SIM 0 0 1 1 0 0 0 0 - 4 EI 1 1 1 1 1 0 1 1 4 4 DI 1 1 1 1 0 0 1 1 4 4 NOP 0 0 0 0 0 0 0 0 4 4 ALL MNEMONICS ©7~ 74, 7975, 7976. 7977 INTEL CORPORA nON A4
  • 195. Appendix A. Instruction Summary The following is a summary of the instruction set: 8080/85 CPU INSTRUCTIONS IN OPERATION CODE SEQUENCE OP OP OP OP OP OP CODE MNEMONIC CODE MNEMONIC CODE MNEMONIC CODE MNEMONIC CODE MNEMONIC CODE MNEMONIC 00 NOP 2B DCX H 56 MOY D,M 81 ADD C AC XRA H D7 RST 2 01 LXI B.D16 2C INR L 57 MOY D,A 82 ADD D AD XRA L D8 RC 02 STAX B 2D DCR L 58 MOY E.B 83 ADD E AE XRA M D9 - 03 INX B 2E MYI L,D8 59 MOY E.C 84 ADD H AF XRA A DA JC Adr 04 INR B 2F CMA SA MOY E,D 85 ADD L BO ORA B DB IN D8 05 DCR B 30 SIM 5B MOY E,E 86 ADD M B1 ORA C DC CC Adr 06 MYI B,D8 31 LXI SPD16 5C MOY E,H 87 ADD A B2 ORA D DD 07 RLC 32 STA Adr 5D MOY E.L 88 ADC B B3 ORA E DE SBI D8 08 - 33 INX SP 5E MOY E,M 89 ADC C B4 ORA H DF RST 3 09 DAD B 34 INR M SF MOY E,A 8A ADC D B5 ORA L EO RPO OA LDAXB 35 DCR M 60 MOY H,B 8B ADC E B6 ORA M E1 POP H OB DCX B 36 MVI M,D8 61 MOV H,C 8C ADC H B7 ORA A E2 jPO Adr OC INR C 37 STC 62 MOV H,D 8D ADC L B8 CMP B E3 XTHL OD DCR C 38 -- 63 MOV H,E 8E ADC M B9 CMP C E4 CPO Adr OE MYI C.08 39 DAD SP 64 MOY H,H 8F ADC A BA CMP D E5 PUSH H OF RRC 3A LDA Adr 65 MOY H,L 8G SUB B BB CMP E E6 ANI D8 10 -- 3B DCX SP 66 MOY H,M 91 SUB C BC CMP H E7 RST 4 11 LXI D,D16 3C INR A 67 MOV H,A 92 SUB D BD CMP L E8 RPE 12 STAX D 3D DCR A 68 MOV L,B 93 SUB E BE CMP M E9 PCHL 13 INX D 3E MYI A,D8 69 MOY L.C 94 SUB H BF CMP A EA IPE Adr 14 INR D 3F CMC 6A MOY L,D 95 SUB L CO RNZ EB XCHG 15 DCR D 40 MOY B.B 6B MOY L,E 96 SUB M C1 POP B EC CPE Adr 16 MYI D,D8 41 MOV B,C 6C MOY L,H 97 SUB A C2 jNZ Adr ED -- 17 RAL 42 MOY B.D 6D MOV L,L 98 SBB B C3 IMP Adr EE XRI D8 18 -- 43 MOV B,E 6E MOV L,M 99 SBB C C4 CNZ Adr EF RST 5 19 DAD D 44 MOV B.H 6F MOV L,A 9A SBB D C5 PUSH B FO RP 1A LDAXD 45 MOV B,L 70 MOV M.B 9B SBB E C6 ADI D8 F1 POP PSW 1B DCX D 46 MOY B,M 71 MOV M,C 9C SBB H C7 RST 0 F2 JP Adr 1C INR E 47 MOY B,A 72 MOY M,D 9D SBB L C8 RZ F3 DI 10 DRC E 48 MOY C,B 73 MOV M.E 9E SBB M C9 RET Adr F4 CP Adr 1E MYI E.D8 49 MOY C,C 74 MOV M.H 9F SBB A CA jZ F5 PUSH PSW 1F RAR 4A MOY C.D 75 MOV M.L AO ANA B CB -- F6 ORI D8 20 RIM 4B MOY C,E 76 HLT A1 ANA C CC CZ Adr F7 RST 6 21 LXI H.D16 4C MOV C,H 77 MOY M,A A2 ANA D CD CALL Adr F8 RM 22 SHLD Adr 4D MOY C.L 78 MOV A,B A3 ANA E CE ACI D8 F9 SPHL 23 INX H 4E MOV C,M 79 MOY A.C A4 ANA H CF RST 1 FA jM Adr 24 INR H 4F MOV C.A 7A MOY A.D A5 ANA L DO RNC FB EI 25 DCR H 50 MOV D.B 7B MOV A.E A6 ANA M D1 POP D FC CM Adr 26 MYI H,D8 51 MOV D.C 7C MOV A,H A7 ANA A D2 INC Adr FD -- 27 DAA 52 MOY D,D 7D MOV A.L A8 XRA B D3 OUT D8 FE CPI D8 28 -- 53 MOY D.E 7E MOY A.M A9 XRA C D4 CNC Adr FF RST 7 29 DAD H 54 MOY D,H 7F MOY A,A AA XRA D D5 PUSH D 2A LHLD Adr 55 MOY D.L 80 ADD B AB XRA E D6 SUI D8 08 = constant. or logical/arithmetic expressIOn that evaluates 016 constant. or logical/arithmetic expression that evaluates to an 8 bit data quantity. to a 16 bit data quantity Adr ~ 16-bit address ALL MNEMONICS © 1974, 7975, 1976, 7977 INTEL CORPORA TfON A-5
  • 196. Appendix A. Instruction :;ummary Instruction Sct Guidc Thc following IS I slIl11l11dry of thc IIlstrllclion sct: ,ADD ADI ,A DC ACI SUB SUI S3B REGM S SBI DS ,ANA ANI >RA XRI eRA ORI CMP CPI RLC RAL RRC RAR CMA DAA INR} DCR REGM 8 rlCCUMULATORI FLAGS ISTC CMC HIGH LOW INXi MOV REGM 8 ,REGM S[ B I C 1DCXJ REG 16 STACK I POINTER I [ DIE ~XCHG RST LXI REG 16 ,D 16 [ H L ,-------- jMP CALL RET IC jNCi CC CNCl RC RNCl I jZ jP jNZ jM JPE jPO J A CZ 16 CP CPE CNZ CPO A CM > 16 J RZ RP RPE RNZ RM RPO J LHLDi I ~-" STHDj A16 OUT P8 CONTROL LDAX BC DE STAX) , INPUT INSTRUCTIONS MEMORY OUTPUT PORTS PORTS RST LDA~ NOP STA) A16 HLT EI MVI D8 DI MOV REGM8,REGI~8 --------- PUSH I SIMI STACK I-E-'-- POP j B,D,H,PSW 8085 ONLY RIM] CODE MEANING REGM 8 The operand l11ay specify one of the 8-bit registers A,B,C,D,E,H, or L or M (a l11el11ol-y reference via the 16-bit address 111 the Hand L registers). The MOV instruction, which calls for two operands, can specify M for only one of Its operands_ Designates 8·bit Il11mediatc operand. Designates a 16·bit address. Designates an 8·bit port number. Designates a -16·bit register pair (B&C,D&E,H&L,or SP). Designates a 16 -bit immediate operand. ALL MNEMONICS © 1:174, 1975, 7976, 1977 INTEL CORPORA nON A-6
  • 197. APPENDIX B. ASSEMBLER DIRECTIVE SUMMARY Assembler directives are summarIZed alphabetically In this appendix. The following terms are used to describe the contents of directive fields. NOTATION Term Interpretation Expression Numerical expression evaluated during assembly: must evaluate to 8 or 16 bits depending on directive issued. List Series of symbolic values or expreSSions, separated by commas. Name Symbol name terminated by a space. Null Field must be empty or an error results. Oplab Optional label; must be terminated by a colon. Parameter Dummy parameters are symbols holding the place of actual parameters (symbolic values or expressIOns) specified elsewhere in the program. String Series of any ASCII characters, surrounded by single quote marks. Single quote within string is shown as two consecutive single quotes. Text Series of ASCII characters. Macro definitions and calls allow the use of the special characters listed below. Character Function & Ampersand. Used to concatenate symbols. Angle brackets. Used to delimit text, such as lists, that contain other delimiters. Double semicolon. Used before a comment in a macro definition to prevent inclusion of the comment in each macro expansion. Exclamation point (escape character). Placed before a delimiter to be passed as a literal in an actual parameter. To pass a literal exclamation point, issue'!!.' % Percent sign. Precedes actual parameters to be evaluated immediately when the macro is called. ALL MNEMONICS © 7974, 7975, 7976, 7977 INTEL CORPORA nON 8-1
  • 198. Appendix B. Assembler 0 :rective Summary SUMMARY OF DI~.ECTIVES FORMAT FUNCTION Label Jpcode Operand(s) oplab: )8 exp(sl or string(sl Define 8-bit data byte(s). Expressions must evaluate to one byte. oplab: )S expression Reserve data storage area of specified length. oplab: )W exp(sl or string(s) Define 16·blt data word(s). Strings limited to 1-2 characters. oplab: "LSE null Conditional assembly. Code between ELSE and ENDIF directives is assembled if expression in IF clause is FALSE. (See IF.) oplab: "ND expression Terminate assembler pass. Must be last statement of program. Program execution starts at 'exp,' if present; otherWise, at location O. oplab: "NDIF null Terminate conditional assembly block. name "QU expression Define symbol 'name' with value 'exp.' Symbol is not redefi nab Ie. oplab: iF expression Assemble code between IF and following ELSE or ENDIF directive if 'exp' is true. oplab: )RG expression Set location counter to 'expression.' name ;ET expression Define symbol 'name' with value 'expression.' Symbol can be redefined. MACRO DIRECTIV::S FORMAT FUNCTION Label Opcode Operand(s) null I:NDM null Terminate macro definition. oplab: l:XITM null Alternate terminator of macro definition. (See ENDM.) oplab: IRP dummy param,<lisO Repeat instruction sequence, substituting one character form 'list' for 'dummy param' in each iteration. ALL MNEMONICS©7974, 7975, 7976, 7977 INTEL CORPORATION 8-2
  • 199. Appendix B. Assembler Directive Summary FORMAT FUNCTION Label Opcode Operand(s) oplab: IRPC dummy param,text Repeat instruction sequence, substituting one character from 'text' for 'dummy param' in each iteration. null LOCAL label name(s) Specify label(s) in macro definition to have local scope. name MACRO dummy param(s) Define macro 'name' and dummy parameter(s) to be used in macro definition. oplab: REPT expression Repeat REPT block 'expression' times. RELOCATION DIRECTIVES FORMAT FUNCTION Label Opcode Operand(s) oplab: ASEG null Assemble subsequent instructions and data in the absol ute mode. oplab: CSEG boundary specification Assemble subsequent instructions and data In the relocatable mode using the code location counter. oplab: DSEG boundary specification Assemble subsequent instructions and data in the relocatable mode using the data location counter. oplab: EXTRN name(s) Identify symbols used in this program module but defined in a different module. oplab: NAME module-name ASSigns a name to the program module. oplab: PUBLIC name(s) Identify symbols defined in this module that are to be available to other modules. oplab: STKLN expression Specify the number of bytes to be reserved for the stack for this module. ALL MNEMONICS©7974, 7975, 7976, 7977 INTEL CORPORA TlON B-3
  • 201. APPENDIX C. ASCII CHARACTER SET ASCII CODES The 8080 and 8085 usc the seven-bit ASCII code, with the high-order eighth bit (parity bitl always reset. , GRAPHIC OR ASCII GRAPHIC OR ASCII GRAPHIC OR ASCII CONTROL (HEXADECIMAL) CONTROL (HEXADECIMAL) CONTROL (HEXADECIMAL) NUL 00 + 2B V 56 SOH 01 2C W 57 STX 02 2D X 58 ETX 03 2E Y 59 EaT 04 I 2F Z 5A ENQ 05 0 30 [ 5B ACK 06 1 31 5C BEL 07 2 32 1 5D BS 08 3 33 i (t) 5E HT 09 4 34 (+-) 5F LF OA 5 35 , 60 VT OB 6 36 a 61 FF OC 7 37 b 62 CR OD 8 38 c 63 SO OE 9 39 d 64 SI OF 3A e 65 DLE 10 3B f 66 DCl (X-ON) 11 < 3C 9 67 DC2 (TAPE) 12 3D h 68 DC3 (X-OFF) 13 > 3E I 69 DC4 (+Afl8 14 3F J 6A I NAK 15 @ 40 k 6B SYN 16 A 41 I 6C ETB 17 B 42 m 6D CAN 18 C 43 n 6E EM 19 D 44 0 6F SUB lA E 45 P 70 ESC lB F 46 q 71 FS lC G 47 r 72 GS 10 H 48 s 73 RS lE I 49 t 74 US IF J 4A u 75 SP 20 K 4B v 76 21 L 4C w 77 22 M 4D x 78 # 23 N 4E v 79 $ 24 a 4F z 7A I % 25 P 50 7B 26 Q 51 I 7C & 27 R 52 , (ALT MODE) I 7D 28 S 53 ~ 7E 29 T 54 DEL (RUB OUT) 7F 2A U 55 C-1
  • 203. APPENDIX D. BINARY -DECIMAL-HEXADECIMAL CONVERSION TABLES. D-l
  • 204. Appendix D. BinarVMDecinal-Hexadecimal Conversion Tables P<)WERS OF TWO n ·n 2 n 2 1 o 1.0 2 1 0.5 4 2 0.25 8 3 0.125 16 4 0.062 5 32 5 0.031 25 64 6 0.015 625 128 7 0.007 812 5 256 8 0.003 906 25 512 9 0.001 953 125 1 024 10 0.000 976 562 5 2 Cl48 11 0.000 488 281 25 4 096 12 0.000 244 140 625 8 192 13 0.000 122 070 312 5 16 384 14 0.000 061 035 156 25 32 768 15 0.000 030 517 578 125 65 536 16 0.000 015 258 789 062 5 131 072 17 0.000 007 629 394 531 25 262 144 18 0.000 003 814 697 265 625 524 288 19 0.000 001 907 348 632 812 5 1 048 576 20 0.000 000 953 674 316 406 25 2 097 152 21 0.000 000 476 837 158 203 125 4 194 304 22 0.000 000 238 418 579 101 5625 8 388 308 23 0.000 000 119 209 289 550 781 25 16 7?7 216 24 0.000 000 059 6Cl4 644 77 5 390 625 33 554 ~32 25 0.000 000 029 802 322 387 695 312 5 67 108 364 26 0000 000 014 901 161 193 847 656 25 134 217 728 27 0.000 000 007 450 580 596 923 828 125 268 435 ~56 28 0.000 000 003 725 290 298 461 914 062 5 536 870 :l12 29 0.000 000 001 862 645 149 230 957 031 25 1 073 741 324 30 0.000 000 000 931 322 574 615 478 515 625 2 147 483 548 31 0.000 000 000 465 661 287 307 739 257 812 5 4 294 967 296 32 0000 000 000 232 830 643 653 869 628 906 25 8 589 934 592 33 0000 000 000 116 415 321 826 934 814 453 125 17 179 869 184 34 0000 000 000 058 207 660 913 467 407 226 562 5 34 359 738 368 35 0.000 000 000 029 103 830 456 733 703 613 281 25 68 719 476 736 36 0.000 000 000 014 551 915 228 366 851 806 640 625 137 438 953 ~72 37 0.000 000 000 007 275 957 614 183 425 903 320 312 5 274 877 906 :l44 38 0.000 000 000 003 637 978 807 091 712 951 660 156 25 549 755 813 388 39 0.000 000 000 001 818 989 403 545 856 475 830 078 125 1 099 511 627 776 40 0.000 000 000 000 909 494 701 772 928 237 915 039 062 5 2 199 023 255 55241 0.000 00.0 000 000 4,,4 747 350 886 464 118957 519531 25 4 398 046 511 104 42 0.000 000 000 000 227 373 675 443 232 059 478 759 765 625 8 796 093 022 208 43 0.000 000 000 000 113 686 837 721 616 029 739 379 882 812 5 17 592 186 044 41644 0.000 000 000 000 056 843 418 860 808 014 869 689 941 406 25 35 184 372 088 332 45 0.000 000 000 000 028 421 709 430 404 007 434 844 970 703 125 70 368 744 177 56446 0.000 000 000 000 014 210 854 715202 003 717 422 485 351 5625 140 737 488 355 328 47 0.000 000 000 000 007 105427 357 601 001 858 711 242675 781 25 281 474 976 710 556 48 0.000 000 000 000 003 552 713 678 800 500 929 355 621 337 890 625 562 949 953 421 312 49 0.000 000 000 000 001 776 356 839 400 250 464 677 810 668 945 312 5 1 125899906842 524 50 0.000 000 000 000 000 888 178419 700 125 232 338 905 3Cl4 472 656 25 2 251 799 813 685 248 51 0.000 000 000 000 000 444 089 209 850 062 616 169 452 667 236 328 125 4 503 599 627 370 496 52 0.000 000 000 000 000 222 044 604 925 031 308 084 726 333 618 164 062 5 9 007 199 254 740 992 53 0.000 000 000 000 000 111 022 302 462 515 654 042 363 166 809 082 031 25 18 014 398 509 481 98454 0.000 000 000 000 000 055511 151 231 257827 021 181 583404 541 015625 36 028 797 018 963 968 55 0.000 000 000 000 000 027 755 575 615 628 913 510 590 791 702 270 507 812 5 72 057 594 037 927 936 56 0.000 000 000 000 000 013 877 787 807 814 456 755 295 395 851 135 253 906 25 144 115 188 075 855 872 57 0.000 000 000 000 000 006 938 893 903 907 228 377 647 697 925 567 676 950 125 288 230 376 151 711 744 58 0.000 000 000 000 000 003 469 446 951 953 614 188 823 848 962 783 813 476 562 5 576 460 752 303 423 488 59 0.000 000 000 000 000 001 734 723 475 976 807 094 411 924 481 391 906 738 281 25 1 152 921 504 606 846 976 60 0000 000 000 000 000 000 867 361 737 988 403 547 205 962 240 695 953 369 140 625 2 305 843 009 213 693 952 61 0.000 000 000 000 000 000 433 680 868 994 201 773 602 981 120 347 976 684 570 312 5 4 611 686 018 427 387 904 62 0.000 000 000 000 000 000 216 840 434 497 100 886 801 490 560 173 988 342 285 156 25 9 223 372 036 854 775 808 63 0.000 000 000 000 000 000 108 420 217 248 550 443 400 745 280 086 994 171 142 578 125 D-2
  • 205. Appendix D. Binary~Decimal-Hexadecimal Conversion Tables POWERS OF 16 (IN BASE 10) 16" 16'" 1 0 0.10000 00000 00000 00000 X 10 16 1 0.62500 00000 00000 00000 X 10- 1 256 2 0.39062 50000 00000 00000 X 10- 2 4 096 3 0.24414 06250 00000 00000 X 10- 3 65 536 4 0.15258 78906 25000 00000 X 10-4 1 048 576 5 0.95367 43164 06250 00000 X 10-6 16 777 216 6 0.59604 64477 53906 25000 X 10- 7 268 435 456 7 0.37252 90298 46191 40625 X 10-8 4 294 967 296 8 0.23283 06436 53869 62891 x 10-9 68 719 476 736 9 0.14551 91522 83668 51807 x 10- 10 1 099 511 627 776 10 0.90949 47017 72928 23792 X 10- 12 17 592 186 044 416 11 0.56843 41886 08080 14.870 X 10- 13 281 474 976 710 656 12 0.35527 13678 80050 09294 X 10- 14 4 503 599 627 370 496 13 0.22204 46049 25031 30808 X 10- 15 72 057 594 037 927 936 14 0.13877 78780 78144 56755 X 10- 16 152 921 504 606 846 976 15 0.86736 17379 88403 54721 X 10- 18 POWERS OF 10 (IN BASE 16) 10" 10'" 1 0 1.0000 0000 0000 0000 A 1 0.1999 9999 9999 999A 64 2 0.28F5 C28F 5C28 F5C3 x 16- 1 3E8 3 0.4189 374B e6A7 EF9E x 16 -2 2710 4 0.68oB 8BAC 710C B296 x 16- 3 1 86AO 5 0.A7C5 AC47 lB47 8423 x 16- 4 F 4240 6 0.10C6 F7AO B5EO 8037 x 16-4 98 9680 7 0.lA07 F29A BCAF 4858 X 16- 5 5F5 El00 8 0.2AF3 lOC4 6118 73BF x 16-6 3B9A CAOO 9 0.44BB 2FAO 9B5A 52CC x 16- 7 2 540B E400 10 0.6oF3 7F67 SEF6 EAoF x 16-8 17 4876 E800 11 O.AFEB FFOB CB24 AAFF x 16- 9 E8 o4A5 1000 12 0.1197 9981 20EA 1119 x 16-9 918 4E72 AOOO 13 0.lC25 C268 4976 81C2 X 16- 10 5AF3 107A 4000 14 0.2009 3700 4257 3604 x 16- 11 3 807E A4C6 8000 15 0.480E BE7B 9058 5660 X 16- 12 23 8652 6FCl 0000 16 0.734A CA5F 6226 FOAE x 16- 13 163 4578 508A 0000 17 0.B877 AA32 36A4 B449 x 16- 14 oEO B6B3 A764 0000 18 0.1272 5001 0243 ABAl X 16- 14 8AC7 2304 89E8 0000 19 0.1083 C94F B602 AC35 X 16- 15 D-3
  • 206. Appendix D. Binary-Declllal-Hexadecimal ConversIon Tables HEXADECIMAL-DECIMAL INTEGER CONVERSION The table below provide! for direct conversions between hexadecimal Integers In the range O-FFF and decimal integers In the range 0-4095. For conVHSlon of larger Integers, the table values may be added to the following figures: Hexadecimal Decimal Hexadecimal Decimal 01000 4096 20000 131072 02000 8192 30000 196608 03000 12288 40000 262144 04000 16384 50000 327 680 05000 20480 60000 393216 06000 24576 70000 458752 07000 28672 80000 524288 08000 32768 90000 589824 09000 36864 AO 000 655360 OA 000 40960 80000 720896 OB 000 45056 CO 000 786432 oe 000 49152 DO 000 851 968 OD 000 53248 EO 000 917504 OE 000 57344 FO 000 983040 OF 000 61440 100000 1048576 10000 65536 200000 2097152 11 000 69632 300000 3 145728 12000 73728 400000 4194304 13000 77 824 500000 5242880 14000 81920 600000 6291456 15000 86016 700000 7340032 16000 90112 800000 8388608 17000 94208 900000 9437184 18000 98304 AOO 000 10485760 19000 102400 BOO 000 11 534336 lAOOO 106496 COO 000 12 582912 lB 000 110592 DOO 000 13631488 leOOO 114688 EOO 000 14680064 10 000 118784 FOO 000 15728640 lE 000 122 880 1000000 16777216 1F 000 126976 2000000 33554432 0 1 2 3 4 5 6 7 8 9 A B e D E F 000 0000 0001 0002 0003 0004 0005 0006 0007 OOOB 0009 0010 0011 0012 0013 0014 0015 010 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 020 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 030 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 040 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 050 0080 0081 0082 0083 0084 0085 00B6 0087 0088 0089 0090 0091 0092 0093 0094 0095 060 0096 0097 0098 0099 0100 0101 0102 0103 0104 0105 0106 0107 0108 0109 0110 0111 070 0112 0113 o 14 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 080 0128 0129 030 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 090 0144 0145 046 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 OAO 0160 0161 062 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 OBO 0176 0177 078 0179 0180 0181 0182 0183 0184 0185 0186 0187 0188 0189 0190 0191 oeo 0192 0193 094 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 ODO 0208 0209 0:!10 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 OEO 0224 0225 0:!26 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 OFO 0240 0241 0:!42 0243 0244 0245 0246 0247 0248 0249 0250 0251 0252 0253 0254 0255 D-4
  • 207. Appendix D. Binary-Decimal-Hexadecimal Conversion Tables HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cant'dl 0 1 2 3 4 5 6 7 8 9 A B C D E F 100 0256 0257 0258 0259 0260 0261 0262 0263 0264 0265 0266 0267 0268 0269 0270 0271 110 0272 0273 0274 0275 0276 0277 0278 0279 0280 0281 0282 0283 0284 0285 0286 0287 120 0288 0289 0290 0291 0292 0293 0294 0295 0296 0297 0298 0299 0300 0301 0302 0303 130 0304 0305 0306 0307 0308 0309 0310 0311 0312 0313 0314 0315 0316 0317 0318 0319 140 I 0320 0321 0322 0323 0324 0325 0326 0327 0328 0329 0330 0331 0331 0333 0334 0335 150 0336 0337 0338 0339 0340 0341 0342 0343 0344 0345 0346 0347 0348 0349 0350 0351 160 0352 0353 0354 0355 0356 0357 0358 0359 0360 0361 0362 0363 0364 0365 0366 0367 170 0368 0369 0370 0371 0372 0373 0374 0375 0376 0377 0378 0379 0380 0381 0382 0383 180 0384 0385 0386 0387 038l:l 0389 0390 0391 0392 0393 0394 0395 0396 0397 0398 0399 190 0400 0401 0402 0403 0404 0405 0406 0407 0408 0409 0410 0411 0412 0413 0414 0415 lAO 0416 0417 0418 0419 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 0430 0431 lBO 0432 0433 0434 0435 0436 0437 0438 0439 0440 0441 0442 0443 0444 0445 0446 0447 lCO lDO I 0448 0464 0449 0465 0450 0451 0466 0467 0452 0468 0453 0469 0454 0470 0455 0471 0456 0472 0457 0473 0458 0474 0459 0475 0460 0476 0461 0477 0462 0478 0463 0479 lEO 0480 0481 0482 0483 0484 0485 0486 0487 0488 0489 0490 0491 0492 0493 0494 0495 lFO 0496 0497 0498 0499 0500 0501 0502 0503 0504 0505 0506 050"/ 0508 0509 0510 0511 200 0512 0513 0514 0515 0516 0517 0518 0519 0520 0521 0522 0523 0524 0525 0526 0527 210 I 05280529 0530 0531 0532 0533 0534 0535 0536 0537 0538 0539 0540 0541 0542 0543 220 0544 0545 0546 0547 0548 0549 0550 0551 0552 0553 0554 0555 0556 0557 0558 0559 230 0560 0561 0562 0563 0564 0565 0566 0567 0568 0569 0570 0571 0572 0573 0574 0575 240 0576 0577 0578 0579 0580 0581 0582 0583 0584 0585 0586 0587 0588 0589 0590 0591 250 0592 0593 0594 0595 0596 0597 0598 0599 0600 0601 0602 0603 0604 0605 0606 0607 260 0608 0609 0610 0611 0612 0613 0614 0615 0616 0617 0618 0619 0620 0621 0622 0623 270 0624 0625 0626 0627 0628 0629 0630 0631 0632 0633 0634 0635 0636 0637 0638 0639 280 0640 0641 0642 0643 0644 0645 0646 0647 0648 0649 0650 0651 0652 0653 0654 0655 290 0656 0657 0658 0659 0660 0661 0662 0663 0664 0665 0666 0667 0668 0669 0670 0671 2AO 0672 0673 0674 0675 0676 0677 0678 0679 0680 0681 0682 0683 0684 0685 0686 0687 2BO 0688 0689 0690 0691 0692 0693 0694 0695 0696 0697 0698 0699 0700 0701 0702 0703 2CO 0704 0705 0706 0707 0708 0709 0710 0711 0712 0713 0714 0715 0716 0717 0718 0719 2DO 0720 0721 0722 0723 0724 0725 0726 0727 0728 0729 0730 0731 0732 0733 0734 0735 2EO 0736 0737 0738 0739 0740 0741 0742 0743 0744 0745 0746 0747 0748 0749 0750 0751 2FO 0752 0753 0754 0755 0756 0757 0758 0759 0760 0761 0762 0763 0764 0765 0766 0767 300 0768 0769 0770 0771 0772 0773 0774 0775 0776 0777 0778 0779 0780 0781 0782 0783 310 0784 0785 0786 0787 0788 0789 0790 0791 0792 0793 0794 0795 0796 0797 0798 0799 320 0800 0301 0802 0803 0804 0805 0806 0807 0808 0809 0810 0811 0812 0813 0814 0815 330 0816 0817 0818 0819 0820 0821 0822 0823 0824 0825 0826 0827 0828 0829 0830 0831 340 0832 0833 0834 0835 0836 0837 0838 0839 0840 0841 0842 0843 0844 0845 0846 0847 350 0848 0849 0850 0851 0852 0853 0854 0855 0856 0857 0858 0859 0860 0861 0862 0863 360 0864 0865 0866 0867 0868 0869 0870 0871 0872 0873 0874 0875 0876 0877 0878 0879 370 0880 0881 0882 0883 0884 0885 0886 0887 0888 0889 0890 0891 0892 0893 0894 0895 380 0896 0897 0898 0899 0900 0901 0902 0903 0904 0905 0906 0907 0908 0909 0910 0911 390 0212 0913 0914 0915 0916 0917 0918 0919 0920 0921 0922 0923 0924 0925 0926 0927 3AO 0928 0929 0930 0931 0932 0933 0934 0935 0936 0937 0938 0939 0940 0941 0942 0943 3BO 0944 0945 0946 0947 0948 0949 0950 0951 0952 0953 0954 0955 0956 0957 0958 0959 j3CO 0960 0961 0962 0963 0964 0965 0966 0967 0968 0969 0970 0971 0972 0973 0974 0975 3DO 0976 0977 0978 0979 0980 0981 0982 0983 0984 0985 0986 0987 0988 0989 0990 0991 3EO 0992 0993 0994 0995 0996 0997 0998 0999 1000 1001 1002 1003 1004 1005 1006 1007 1 i 3FO 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 D-5
  • 208. Appendix O. Binarv-Oet Imal~HexadecimaJ Conversion Tables HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cont'd) I 0 1 2 3 4 5 6 7 8 9 A B C 0 E F 400 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 410 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 420 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 430 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 440 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 450 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 460 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 470 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 480 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 490 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 4AO 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 4BO 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 4CO 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 400 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 4EO 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 4FO 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 500 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 510 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1'306 1307 1308 1309 1310 1311 520 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 530 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 540 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 550 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 560 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 570 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 580 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 590 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 5AO 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 5BO 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 5CO 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 500 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 5EO 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 5FO 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 600 1536 1537 1538 1539 1540 1541 154~ 1543 1544 1545 1546 1547 1548 1549 1550 1551 610 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 620 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 630 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 640 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 650 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 660 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 670 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 680 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 690 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 6AO 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 680 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 6CO 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 600 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 6EO 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 6FO 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 D-6
  • 209. Appendix D. Binarv-Decimal-Hexadecimal Conversion Tables HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cont'd) 0 1 2 3 4 5 6 7 8 9 A B C 0 E F 700 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 710 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 720 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 ! 730 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 I 740 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 750 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 760 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 770 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1911j 1917 1918 1919 780 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 790 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1 7AO 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 7BO 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 7CO 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 700 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 7EO 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 7FO 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 800 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 810 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 820 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 830 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 840 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 .850 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 860 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 870 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 880 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 890 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 8AO 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 8BO 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 8CO 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 800 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 8EO 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 8FO 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 900 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 910 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 920 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 930 I 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 1 940 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 950 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 960 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 970 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 980 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 990 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 9AO 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 980 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 9CO 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 900 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 9EO 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 9FO 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 0-7
  • 210. Appendix D. Binary-Declmal-Hexadeclmal Conversion Tables HEXADECIMAL·DECIMAL INTEGER CONVERSION (Cont'dl 0 1 2 3 4 5 6 7 8 9 A 8 C D E F Aoo 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 Al0 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 A20 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 A30 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 A40 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 A50 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 A60 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 A70 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 A80 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 A90 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 AAO 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 ABO 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 ACO 12752 2753 2754 2755 2756 2757 2758 2759 2760 4761 2762 2763 2764 2765 2766 2767 ADO I 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 AEO 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 AFO 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 BOO 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 Bl0 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 B20 2848 2849 2850 3851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 B30 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 B40 2880 2881 2882 2883 2884 2885 2866 2887 2888 2889 2890 2891 2892 2893 2894 2895 B50 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 B60 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 B70 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 B80 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 B90 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 BAO 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 BBO 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 BCO 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 BDO 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 BEO 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 BFO 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 --- COO 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 Cl0 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 C20 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 C30 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 C40 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 C50 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 C60 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 C70 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 C80 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 C90 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 CAO 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 CBO 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 CCO 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 CDO 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 CEO 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 CFO 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 D-8
  • 211. Appendix D. Binary-Declmal-Hexadecimal ConverSion Tables HEXADECIMAL-DECIMAL INTEGER CONVERSION (Cont'd) 0 1 2 3 4 5 6 7 8 9 A B C 0 E F 000 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 010 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 020 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 030 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 040 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 050 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 060 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 070 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 080 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 090 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 OAO 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 OBO 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 OCO 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 000 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 OEO 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 OFO 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 EOO 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 El0 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 E20 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3E528 3629 3630 3631 E30 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 E40 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 E50 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 E60 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 E70 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 E80 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 E90 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 EAO 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 EBO 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 ECO 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 EOO 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 EEO 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 EFO 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 FOO 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 FlO 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 F20 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 F30 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 F40 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 F50 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 F60 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 F70 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 F80 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 F90 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 FAO 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 FBO 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 FCO 4032 4033 4034 4035 4036 4037 4038 4039 .4040 4041 4042 4043 4044 4045 4046 4047 FOO 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 FEO 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 FFO 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 0-9
  • 213. INDEX Absolute symbols 2-11. 2-16 Accumulator 1-6. 1-7 Accumulator Instructions _/-79 ACI Instruction 3-2 ADC Instruction 3-2 ADD Instruction 3-4 ADI Instruction 3-5 Addressing Modes .7-75 Addressing Registers 1-7 ANA (AND) Instruction · 3-6 AND Operator .2-73 ANI (AND Immediate) Instruction · 3-7 Arithmetic Expression Operators .2-12 Arithmetic Instructions .7-77 ASCII Constant 2-6 ASEG (Absolute Segment) Directive ,4-74 Assembler. Need for 1-3 Assembler Character Set 2-1 Assembler Compared with PL/M 1-3 Assembler Function . 1-1 Assembler Termination .4-70 Assembly-Time Expression Evaluation .2-11 Auxiliary Carry Flag ,7-77 Auxiliary Carry Flag Setting - 8080/8085 Differences ./-72 Binary Data (Coding Rules) · 2-6 blank (character) · 2-3 Branching Instructions 7-78. 7-22 Branch Table · 6-1 Byte Isolation Operations .2-74 CALL Instruction 3-8 Carry Flag . ./-/0 CC (Call if Carry) Instruction .3-70 CM (Call if Minus) Instruction .3-70 CMA (Complement Accumulator) Instruction ,3-ll CMC (Complement Carry) Instruction ,3-72 CMP (Compare) Instruction .3-72 CNC (Call if no carry) Instruction ,3-/4 CNZ (Call if not Zero) Instruction .3-74 Combined Addressing Modes .7-/6 Comment Field · 2-4 Compare Operators .2-/3 Comparing Complemented Data 2-8 Comparisons in Expressions .2-13 Complement Used for Subtraction · 2-7 Complemented Data · 2-8 Concatenation 5-10.5-11.5-15.5-16 1-1
  • 214. Condition Fla 5S 1-9 Conditional /J ssembly 4-8 CP (Call if I'ositlve) Instruction 3-75 CPE (Call if Parity Even) Instruction 3-76 CPI (Compan Immediate) Instruction 3-76 CPO (Call if Parity Odd) Instruction 3-77 CSEG (Code Segment) Directive 4-75 CZ (Call if ,~ero) Instruction . 3-78 DAA (Decim; I Adjust Accumulator) Instruction 3-78 DAD (DoublE Register Add) Instruction 3-20 Data Access Example 4-7 Data Definiti<n 4-3 Data Descrtpt on Example 4-6 Data for Subroutines 6-3 Data Label 2-5 Data Transfer Instructions 7-76 DB (Define Iiyte) Directive .4-3 DCR (DecrelT ent) Instruction 3-20 DCX (DecrelT ent Register Pair) 3-22 Decimal AddiCion Routine 6-12 Decimal Data (Coding Rules) 2-5 Decimal Subt 'action Routine 6-14 Delimiters 2-2 DI (Disable Interrupts) Instruction .3-22,3-60 Direct Addre~ sing 7-75 Divide (Soft', are Example) 6-9 Division in Expressions 2-12 DS (Define ~ torage) Directive 4-5 DSEG (Data Segment) Directive 4-75 Dummy Paralneters 5-4 DW (Define Nord) Directive 4-4 EI (Enable I:1terrupts) Instruction 3-23 ELSE Directi'e . 4-8 END Directlv ~ 4-70 ENDIF Direclve 4-8 ENDM (End Macro) Directive 5-5,5-6,5-7,5-12 EOT Directive 4-77 EPROM 1-5 EQ Operator 2-73 EQU Directlv ~ 4-2 EXITM (Exit Macro) DireClive 5-9 Expression E' aluatton 2-11 Expression O,erators 2-11 Expressions 2-6 Expressions. I'recedence of Operators 2-75 Expressions, ~ange of Values 2-75 EXTRN Dire, tive . . . 4-77 1-2
  • 215. GE Operator 2-73 General Purpose Registers 7-7 GT Operator 2-73 Hardware Overview 1-5 Hexadecimal Data (Coding Rules) 2-5 HIGH Operator 2-74, 3-2, 3-5, 3-7, 404 HLT (Halt) Instruction . . . . . . 3-24 IF Directive 4-8 Immediate Addressing 7-75 Implied Addressing 7-75 IN (Input) Instruction . 7-74, 3-24 INPAGE Reserved Word ·4-74,4-75 Input/Output Ports 7-74 IN R (I ncrement) Instruction 3-25 Instruction Addressing Modes 7-75 Instruction Execution 1-9 Instruction Fetch 1-8 Instructlon Label 2-6 Instruction Naming Conventions 1-16 Instruction Set GUide 7-23 Instruction Summary .1-19,7-23 Instruction Timing 3-7 Instructions as Operands 2-7 INTE Pin 3-49 Internal Registers 1-6 Interrupt Subroutines 7-4 Interrupts 7-1 Interrupts (8085) 1-24 INX (Increment Register Pair) Instructions 3-26 IRP (Indefinite Repeat) Directive .5-8, 5-12,5-22 IRPC (Indefinite Repeat Character) .5-8,5-12,5-17 )C (J ump if Carry) Instruction 3-26 JM (J ump if Minus) Instruction 3-27 JMP (J ump) Instruction 3-28 JNC (Jump if no carry) Instruction 3-28 JNZ (J ump if not zero) Instruction 3-29 JP (Jump if Positive) Instruction 3-29 JPE (Jump if parity Even) 3-30 JPO (J ump if parity Odd) 3-37 j Z (J ump if Zero) Instruction 3-32 Label Field 2-3 Labels 2-6 LDA (Load Accumulator Direct) Instruction 3-32 LDAX (Load Accumulator Indirect) 3-33 1-3
  • 216. LE OperatOl 2-13 LIB Prograrr 4-12 LHLD (Load L Direct) Instruction 3-34 LINK Progr; m 4-12,4-14,4-15 Linkage 4-16 List File 1-1 LOCAL Dip-ctive 5-5 LOCAL Syrlbols 5-6 LOCATE Pr Jgram 4-12,4-13,4-14,4-19 Location Counter (Coding Rules) 2-6 Location Counter Control (Absolute Mode) 4-77 Location Counter Control (Relocatable Mode) 4-74 Logical Instr uctions 7-17 Logical Instl uctions, Summary 3-6 Logical Ope-a tors 2-13 LOW Opera:or 2-74, 3-2, 3-5,3-7,4-4 LT Operato 2-13 LXI (Load Register Pair Immediate) 3-35 Macros 5-1 Macro Calls 5-12 Macro Defir Ition 5-4 MACRO Dir ective 5-4 Macro Expa lSlon 5-15 Macro Parar leters 5-5 Macros verslls Subroutines 5-3 Manual ProFamming 1-3 Memory 1-5 Memory Management with Relocation 4-72 Memory REservation 4-5 MEMORY I:eserved Word 4-19 MOD Opera tor 2-12 Modular Pr<gramming 4-72 MODULE [efault Name 4-17 MOV (MovE) Instruction 3-36 Multibyte P ddition Routines 6-11 Multibyte S Jbtraction Routine 6-11 Multiplicatiol in Expressions 2-12 Multiply (Software Example) 6-7 MVI (Move Immediate) 3-37 NAME Dire;tive 4-78 NE Operatcr 2-13 Nested Maco Calls 5-14 Nested Mac'o Definitions 5-12 Nested Sub-outines 3-48 Nine's Com~lement 2-7 NOP (No Operation) Instruction 3-38 1-4
  • 217. NOP via MOV . , , 3-36 NOT Operator . , 2-73 NUL Operator ,2-13.5-77 Null Macros 5-16 Null Parameter 5-11 Object Code 7-2 Object File 1-1 Octal Data (Coding Rules) 2-5 One's Complement 2-7 Opcode 1-1 Opcode Field 2-4 Operand Field 2-4 Operand Field (Coding Rules) 2-4 Operands 2-5 Operators, Expression 2-11 OR Operator 2-73 ORG (Origin) Directive (Absolute Mode) 4-77 ORG (Origin) Directive (Relocatable Mode) 4-76 ORA (Inclusive OR) Instruction 3-38 OR! (Inclusive OR Immediate) 3-40 OUT Instruction 1-14.3-47 PAGE Reserved Word . 4 c74, 4-75 Parity Flag 7-77 PCHL (Move H & L to Program Counter) Instruction 3-42 Permanent Symbols 2-11 PL/M 1-3 PL/M Compared with Assembler 1-3 POP Instruction 3-42 POP PSW instruction 3-43 Precedence of Expression Operators 2-75 Processor Registers 1-9 Program Counter 1-6 Program linkage Directives 4-76 Program listing 1-2 Program Status 1-13 Program Status Word (PSW) 7-74 Programming the 8085 1-24 PROM 1-5 PSW .7-74, 3-45 PUBLIC Directive 4-77 PUSH Instruction 3-44 PUSH PSW Instruction 3-45 RAM 1-5 RAM versus ROM 4-6 RAL (Rotate Left through Carry) Instruction 3-45 1-5
  • 218. RAR (Rotte Right through Carry) Instruction 3-46 RC (Retum if Carry) Instruction 3-47 Redefinable Symbols 2-11 Register AddreSSing 7-75 Register Injirect Addressing 7-76 Register Pc ir Instructions 7-27 Register Pc irs 1-7 Relocatabili ty Defined 4-72 Relocatable Expressions .2-76,2-79 Relocatable Symbols 2-11 Relocation Feature 1-2 Reserved 5ymbols 2-9 RESET Si f nal 3-24 RET (Retl rn) Instruction 3-48 REPT DirE ctive 5-6,5-12,5-15,5-16,5-17,5-18 RIM (Read Interrupt Mask) 8085 Instruction 3-48 RLC (Rot, te Accumulator Left) Instruction 3-49 RM (RetUi n if Minus) Instruction 3-50 RNC (Retllrn if no Carry) Instruction 3-57 RNZ (Retllrn if not Zero) Instruction 3-57 ROM 1-5 RP (Retur 1 if Positive) Instruction 3-52 RPE (Retun if Parity Even) Instruction 3-52 RPO (RetiTn if Parity Odd) Instruction 3-53 RRC (Rot Ite Accumulator Right) Instruction 3-53 RST (Restlrt) Instruction 3-54 RST5.5 . 3-49, 3-55, 3-59, 3-60 RST6.5 . 3-49, 3-55, 3-59, 3-60 RST7.5 3-49, 3-55, 3-59, 3-60 RZ (Return if Zero) Instruction 3-55 Savings Program Status 7-73 SBB (Subtract with Borrow) Instruction 3-56 SBI (Subtlact Immediate with Borrow) Instruction 3-57 Scope of Symbols 2-10 SET Direc:ive 4-3 Shift Expression Operators 2-12 Shift Opel ations in Expressions 2-12 SHL Oper.ltor 2-72 SHLD (St"re H & L Direct) Instruction 3-58 SHR Operltor 2-72 Sign Flag 7-70 SIM (Set Interrupt Mask) 8085 Instruction 3-59 Software Divide Routine 6-7 Software I~ultiply Routine 6-7 Source Coje Format 2-1 Source Lilie Fields 2-1 Source Program File 1-1 SPHL (Mcve H & L to Stack Pointer) Instruction 3-67 1-6
  • 219. SP (Stack Pointer Register) 3-35 STA (Store Accumulator Direct) Instruction 3-67 Stack 7-7 2 Stack and Machine Control Instructions 1-19 Stack Operations 1-13 Stack Pointer 1-72 STACK Reserved Word 4-79, 3-35 Start Execution Address 4-10 STAX (Store Accumulator Indirect) Instruction 3-62 STC (Set Carry) Instruction 3-63 STKLN Directive 4-18 SUB (Subtract) Instruction 3-63 Subroutine Data 6-3 Subroutines , 1;72, 3-9 Subroutines versus Macros 5-3 Subtraction for Comparison 3-12 SUI (Subtract Immediate) Instruction 3-64 Symbol-Cross-Reference File 1-1,1-3 Symbol Definition 4-2 Symbol Table 2-9 Symbol ic Addressing 2-9 Symbols 2-9 Symbols, Absolute 2-11 Symbols (Coding Rules) 2-9 Symbols, Global 2-10 Symbols, limited 2·10 Symbols, Permanent 2·11 Symbols, Redefinable 2-11 Symbols, Relocatable 2-11 Symbols, Reserved 2·9 TRAP Interrupt 3-54 Ten's Complement 2-7 Testing Relocatable Modules 4-19 Timing Effects of Addressing Modes 1·16 TRAP (8085) 3-23 Two's Complement Data 2-7 Use of Macros 5-1 Using Symbols for Data Access 4-7 Val ue of ExpreSSions 2-15 What is a Macro? 5·2 Word Instructions 7·27 Word Storage in Memory 4-4 Work Registers 1-7 .7
  • 220. XCHG (Excllange H & L with D & E) Instruction 3-65 XOR Operator 2-73 XRA (Exclu ;Ive OR) Instruction 3-66 XRI (Exclus ve OR Immediate) Instruction 3-67 XTHL (Exciange H & L with Top of Stack) Instruction 3-69 Zero Flag 7-77 & (ampepand) 5-10 <> (angle brackets) 5-10 CR (carriag = return character) 2-2 (colon) 2-2 (comm.) 2-2 (doubk semicolon) 5-10 (divlslo 1) Operator 2-12 (excian ation pOint) 5-10 HT (horizo ltal tab character) 2-2 (minus) Operator 2-12 * (multiplication) Operator 2-12 ( ) (parent 1eses) 2-2 + (plus) Operator 2-12 ??nnnn Svmbo s 5-5 (semic( Ion) 2-2 (single quote) 2-2 space (charac .er) 2-2 8080/8085 !)ifferences 7-24 8085 Featul es 1-24 8085 Proces ;or 7-24 8085 Programming 1-24 1-8
  • 221. NOTES
  • 223. NOTES