- Data Structure
- Networking
- RDBMS
- Operating System
- Java
- MS Excel
- iOS
- HTML
- CSS
- Android
- Python
- C Programming
- C++
- C#
- MongoDB
- MySQL
- Javascript
- PHP
- Physics
- Chemistry
- Biology
- Mathematics
- English
- Economics
- Psychology
- Social Studies
- Fashion Studies
- Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
8085 program with a subroutine to add ten packed BCD numbers.
Here we will see how to add ten packed BCD numbers using 8085.
Problem Statement
A set of ten packed BCD numbers is stored in the memory location starting from 8040H to 8049H.
Write a program with a subroutine to add these numbers in BCD. If a carry is generated save it to register B, and adjust it to BCD. The final sum will be less than 9999BCD. Store the sum at locations 8060H and 8061H.
Write a second subroutine to unpack the BCD sum stored in registers A and B, and store them in the OutputBuffer memory starting at 8062H. The most significant digit (BCD4) should be stored at 8065H and the least significant digit (BCD1) at 8062H.
Discussion
The numbers are present at 8040 onwards. As the B will store the carry, we have to clear the B first. In the first phase we have to take the number from memory, then add them as BCD numbers, and store them accordingly. In the next phase the Unpacking task will be completed. In that part we are taking the 16-bit BCD number then break it into 4 digits. Then store them into given location.
Input
Address | Data |
---|---|
… | … |
8040 | 12 |
8041 | 23 |
8042 | 42 |
8043 | 55 |
8044 | 10 |
8045 | 99 |
8046 | 35 |
8047 | 45 |
8048 | 76 |
8049 | 81 |
… | … |
Flow Diagram
Program
Address | HEX Codes | Labels | Mnemonics | Comments |
---|---|---|---|---|
8000 | 21, 40, 80 | | LXI H 8040H | Initialize pointer with the first location of IN-BUFFER |
8003 | 0E, 0A | | MVI C 0AH | Initialize counter with the number of data to be add |
8005 | AF | | XRA A | Clear the contents of the accumulator and the Reg. B |
8006 | 47 | | MOV B, A | |
8007 | CD, 23, 80 | NEXTBCD: | CALL BCDADD | A subroutine that add BCD numbers |
800A | 23 | | INX H | Go to next location |
800B | 0D | | DCR C | Decrement count until 0 is reached |
800C | C2, 07, 80 | | JNZ NEXTBCD | |
800F | 32, 60, 80 | | STA 8060 H | Store the result byte available in A |
8012 | 57 | | MOV D, A | Temporarily D = A |
8013 | 78 | | MOV A, B | Putting B in A |
8014 | 32, 61, 80 | | STA 8061 H | To store it in OUT-BUFFER |
8017 | 7A | | MOV A, D | Restoring back A |
8018 | 21, 62, 80 | | LXI H 8062H | Initialize pointer with the last location of OUT-BUFFER |
801B | CD, 2E, 80 | | CALL UNPAK | A subroutine that separates two nibbles from a packed BCD number |
801E | 78 | | MOV A, B | Copy B to A |
801F | CD, 2E, 80 | | CALL UNPAK | A subroutine that separates two nibbles from a packed BCD number |
8022 | 76 | | HLT | Terminate the program |
8023 | 86 | BCDADD: | ADD M | Add the contents of the memory location specified by the HL register pair with A |
8024 | 27 | | DAA | Decimal adjust accumulator |
8025 | D0 | | RNC | If no carry is produced then return to the calling program |
8026 | 57 | | MOV D, A | Copy A to D |
8027 | 78 | | MOV A, B | If a carry is produced then adjust the contents of the Reg. B |
8028 | C6. 01 | | ADI 01H | |
802A | 27 | | DAA | |
802B | 47 | | MOV B, A | |
802C | 7A | | MOV A, D | Copy D to A |
802D | C9 | | RET | Return to the calling program |
802E | 57 | UNPAK: | MOV D, A | Copy A to D |
802F | E6, 0F | | ANI 0FH | Mask off the most significant four bits |
8031 | 77 | | MOV M, A | Writing A to the memory |
8032 | 23 | | INX H | Go to next location |
8033 | 7A | | MOV A, D | Copy D to A |
8034 | E6, F0 | | ANI F0H | Mask off the least significant four bits |
8036 | 0F | | RRC | Rotate accumulator 4 times to get the first BCD digit |
8037 | 0F | | RRC | |
8038 | 0F | | RRC | |
8039 | 0F | | RRC | |
803A | 77 | | MOV M, A | Writing A to the memory |
803B | 23 | | INX H | Go to next location |
803C | C9 | | RET | Return to the calling program |
Output
Address | Data |
---|---|
… | … |
8060 | 78 |
8061 | 04 |
8062 | 08 |
8063 | 07 |
8064 | 04 |
8065 | 00 |
… | … |