deci d#-4,s ;deci directement à la place du paramètre addsp d#-4,i jsr Facto deco d#0,s ;deco direct de la solution addsp d#2,i ;nettoyer la pile stop ;*********************************************** ;Factorielle: ;N! = N * (N-1)! ;0! = 1 ; ;Pile à l'entrée: -4 ;Pile à la sortie: +2 ; ;Paramètre à l'entrée: SP-4: N ;Paramètre à la sortie: SP+0: N! ;*********************************************** REGX: .equate d#0 ;vieux registre X REGA: .equate d#2 ;vieux registre A RET: .equate d#4 ;adresse de retour de la fonction N: .equate d#6 ;Le paramètre N FN: .equate d#8 ;N! Facto: addsp d#-4,i ;* storea REGA,s ;* "Entrée de la fonction" storex REGX,s ;* loada N,s brne cont ;N=0? loada d#1,i ;oui, retourner 1 br fin cont: suba d#1,i ;A = N-1 storea d#-4,s ;store le nouveau N addsp d#-4,i ;on pointe sur N jsr Facto ;Appeler Factorielle(N-1) loada d#0,s ;récupérer la réponse addsp d#2,i ;nettoyer la pile storea d#-6,s ;(N-1)! loada N,s storea d#-8,s ;N addsp d#-8,i jsr Mulss ;N * (N-1)! loada d#2,s ;A = N! addsp d#4,i ;nettoyer la pile fin: storea FN,s loada RET,s ;* storea N,s ;* loada REGA,s ;* "Sortie de la fonction" loadx REGX,s ;* addsp N,i ;* rts ;* ; ------- 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; .END