E8BC : add with carry

8bits peuvent représenter un nombre jusqu’à 255 (non signé). Le résultat d’une addition de  2 nombres de 8 bits peut dépasser cette limite, on doit donc faire les calculs sur 16bits. La solution ? : l’instruction ADC (add with carry) qui tient compte d’une éventuelle retenue (carry). J’ai également profité de l’occasion pour résoudre un bug : le bit de carry est à présent modifié uniquement en cas d’addition ou soustraction (signal de contrôle FN=11).

Le dépôt du projet : https://github.com/CodingPat/E8BC/

Le programme de test

Remarque : à partir de maintenant, nous ne reprendrons plus le code machine qui est peu lisible, et commenterons directement le code assembleur correspondant.

IN 0
MOV B,A
IN 2
CLC
ADD B
OUT 0
IN 1
MOV B,A
IN 3
ADC B
OUT 1
JMP 00

Le principe est simple : le premier nombre de 16 bits est présent dans les ports IN1(HI) et IN0 (LO). Le deuxième nombre de 16 bits est présent dans les ports IN3(HI) et IN2 (LO). Le résultat de l’addition 16 bits est placé dans le port OUT1(HI) et OUT0 (LO).

On commence par placer IN0 dans le registre B, et IN2 dans le registre A. Avant d’effectuer l’addition, on réinitialise le flag Carry par l’instuction CLC (clear carry). Le résultat de l’addition est placé dans le port OUT0.
Ensuite on place IN1 dans le registre B, et IN3  dans le registre A, et on effectue l’addition en tenant compte de l’éventuelle retenue de l’addition précédente. Pour ce faire, on utilise l’instruction ADC (Add with carry). Le résultat de l’addition est placé dans le port OUT1.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s