What do bitrate operations in the Intel 8085 assembly do?

I am trying to explain to myself the following assembly code 8085

I have this code that requests two numbers (from the virtual keyboard inside the IDE) and displays them on LEDs 7 and 8:

.ORG 0000 CALL DATA MOV C,A CALL PRNT CALL DATA MOV E,A CALL PRNT MVI D,00H MOV L,E MVI H,00H MOV A,C DCR A JUMP: DAD D DCR A JNZ JUMP MOV A,L DAA JMP IMPR RET DATA: MVI A,00000000B OUT 00H IN 00H RLC RLC RLC RLC ANI F0H MOV B,A MVI A,00000000B OUT 00H IN 00H ANI 0FH ORA B RET IMPR: MOV B,A ANI F0H RLC RLC RLC RLC CALL NUMZ OUT 06H MOV A,B ANI 0FH CALL NUMZ OUT 07H RET NUMZ: CPI 00H JNZ ONE MVI A,01110111B JMP EXIT ONE: CPI 01H JNZ TWO MVI A,01000100B JMP EXIT TWO: CPI 02H JNZ THREE MVI A,00111110B JMP EXIT THREE: CPI 03H JNZ FOUR MVI A,01101110B JMP EXIT FOUR: CPI 04H JNZ FIVE MVI A,01001101B JMP EXIT FIVE: CPI 05H JNZ SIX MVI A,01101011B JMP EXIT SIX: CPI 06H JNZ SEVEN MVI A,01111011B JMP EXIT SEVEN: CPI 07H JNZ EIGHT MVI A,01000110B JMP EXIT EIGHT: CPI 08H JNZ NINE MVI A,01111111B JMP EXIT NINE: CPI 09H JNZ SAL MVI A,01001111B JMP EXIT EXIT: RET 

I do not include PRNT because it is not important for my question.

I understand .ORG 0000 , which is the beginning of the program - it's like BEGIN in Pascal.

CALL DATA is a routine that fills the Battery with binary zeros and displays them (?) In port 0 (00H in hexadecimal format), then it receives (from the virtual keyboard) a number, and then rotates it to the left of the shift.

My question is why? What is the point of this? What is the use? I read about it on Wikipedia, but I still don't get it. What does he do in this code and why is it needed?

+4
source share
1 answer

The DATA routine loads two decimal ASCII characters and forms them into a two-digit BCD value . It shifts the first character remaining 4 bits, saving only the LS 4 bit, and then puts the LS 4 bits of the second character in the LS 4 bit of the result.

In C, this would be roughly equivalent:

 char c = getchar(); // get first ASCII decimal character char result = (c << 4) & 0xf0; // shift into MS nybble of result and mask c = getchar(); // get second ASCII decimal characters result = result | (c & 0x0f); // mask and inset into LS nybble of result return result; 

Note that masking everything except LS nybble decimal ASCII gives you its decimal equivalent, for example. ASCII '4' = 0x34 => 0x04.


To make this clear, I drew a diagram that shows, step by step, what happens when the user enters the number β€œ69”, that is, ASCII '6', followed by ASCII '9', as the two characters are masked and combined to give Representation of BCD number 69:

enter image description here

+7
source

All Articles