; ------- Mulss ------- ; Multiplication sans signe de deux nombres entiers de 16 bits ; dont les valeurs se trouvent sur la pile (1 mot chacun); ; rangement du résultat sur la pile (2 mots). La pile est ; nettoyée des deux nombres. Mres2: .EQUATE d#14 ; Fin résultat Mres1: .EQUATE d#12 ; Début résultat Mnb1: .EQUATE d#10 ; Nombre 1 Mnb2: .EQUATE d#8 ; Nombre 2 MAdRet: .EQUATE d#6 ; Adresse de retour MVieuxA: .EQUATE d#4 ; Sauvegarde registre A MVieuxX: .EQUATE d#2 ; Sauvegarde registre X Mtemp: .EQUATE d#0 ; Temporaire ; PROCEDURE Mulss(Ent1, Ent2: Integer; Ent3: OUT Integer) IS Mulss: ADDSP d#-6,i ; STOREA MVieuxA,s ; sauvegarder registre STOREX MVieuxX,s ; sauvegarder registre LOADA d#0,i ; STOREA Mres1,s ; résultat nul STOREA Mres2,s ; résultat nul STOREA Mtemp,s ; nul pour décalage A Muldeca: LOADA Mnb2,s ; LOOP ASRA ; décaler multiplicateur ANDA h#7FFF,i ; sans extension du signe STOREA Mnb2,s ; BRC Mtrans ; IF bit 1 sorti THEN BR Muldec2 ; Mtrans: LOADA Mres2,s ; ajouter A décalé ADDA Mnb1,s ; au produit 2 STOREA Mres2,s ; BRC Majout2 ; sans oublier les retenues Mcont1: LOADA Mres1,s ; ajouter début A décalé ADDA Mtemp,s ; au produit 1 STOREA Mres1,s ; BR Muldec2 ; END IF; Majout2: LOADA Mres1,s ; ADDA d#1,i ; {ajoute bit 1 retenue} STOREA Mres1,s ; {au résultat} BR Mcont1 ; Majout3: LOADA Mtemp,s ; ADDA d#1,i ; {ajoute bit 1 retenue} STOREA Mtemp,s ; {au début de A} BR Mcont3 ; Muldec2: LOADA Mtemp,s ; décaler début A ASLA ; pour prochaine itération STOREA Mtemp,s ; LOADA Mnb1,s ; décaler A ASLA ; STOREA Mnb1,s ; BRC Majout3 ; passer retenue à première partie Mcont3: LOADA Mnb2,s ; EXIT WHEN B = 0; BRNE Muldeca ; END LOOP; LOADA MAdRet,s ; STOREA Mnb1,s ; LOADA MVieuxA,s ; restaure A LOADX MVieuxX,s ; restaure X ADDSP d#10,i ; nettoyer pile RTS ; END Mulss;