; ------- Divss ------- ; Division 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: quotient et ; reste). S'il y a division par zéro on retourne h#FFFF à la ; fois comme quotient et reste. ; La pile est nettoyée des deux nombres. Dquotie: .EQUATE d#18 ; Quotient Dreste: .EQUATE d#16 ; Reste Ddivise: .EQUATE d#14 ; Diviseur Ddivide: .EQUATE d#12 ; Dividende DAdRet: .EQUATE d#10 ; Adresse de retour DVieuxA: .EQUATE d#8 ; Sauvegarde registre A DVieuxX: .EQUATE d#6 ; Sauvegarde registre X Dtemp: .EQUATE d#4 ; Diviseur temporaire Dqtemp: .EQUATE d#2 ; Quotient temporaire Dinit: .EQUATE d#0 ; Indicateur départ ; PROCEDURE Divss(Ent1, Ent2: Integer; Ent3: OUT Integer) IS Divss: ADDSP d#-10,i ; STOREA DVieuxA,s ; sauvegarder registre STOREX DVieuxX,s ; sauvegarder registre LOADA d#0,i ; STOREA Dquotie,s ; résultat nul STOREA Dreste,s ; résultat nul Div1: LOADA Ddivise,s ; LOOP BREQ Div5 ; EXIT WHEN diviseur null STOREA d#-6,s ; empiler diviseur LOADA Ddivide,s ; STOREA d#-4,s ; empiler dividende ADDSP d#-6,i ; JSR Granss ; IF Diviseur > Dividende THEN LOADA d#0,s ; ADDSP d#2,i ; désempile Booléen COMPA d#0,i ; BREQ Div6 ; EXIT; LOADA Ddivise,s ; ELSE STOREA Dtemp,s ; LOADA d#0,i ; STOREA Dqtemp,s ; quotient temporaire := 0; STOREA Dinit,s ; première := true; Div2: LOADA Dtemp,s ; WHILE Diviseur > Dividende LOOP STOREA d#-6,s ; empiler diviseur LOADA Ddivide,s ; STOREA d#-4,s ; empiler dividende ADDSP d#-6,i ; JSR Granss ; IF Diviseur > Dividende THEN LOADA d#0,s ; ADDSP d#2,i ; désempile Booléen COMPA d#0,i ; EXIT; BREQ Div3 ; END IF; LOADX Dqtemp,s ; ASLX ; Décaler quotient temporaire STOREX Dqtemp,s ; LOADA Dinit,s ; BRNE Dsuite ; IF première THEN ADDX d#1,i ; quotient temporaire + 1 STOREX Dqtemp,s ; première := false; STOREX Dinit,s ; END IF; Dsuite: LOADA Dtemp,s ; IF bit15 = 1 THEN BRLT Div4 ; EXIT et ne pas défaire le décalage ASLA ; ELSE STOREA Dtemp,s ; décaler diviseur BR Div2 ; END LOOP; Div3: LOADA Dtemp,s ; ASRA ; annuler dernier décalage ANDA h#7FFF,i ; sans extension du signe STOREA Dtemp,s ; Div4: LOADA Ddivide,s ; SUBA Dtemp,s ; STOREA Ddivide,s ; dividende := dividende - diviseur temp ADDX Dquotie,s ; STOREX Dquotie,s ; ajouter quotient temporaire BR Div1 ; END LOOP; Div5: LOADA h#FFFF,i ; résultat de division par zéro FFFF FFFF STOREA Dreste,s ; STOREA Dquotie,s ; BR Div7 ; Div6: LOADA Ddivide,s ; ranger le reste STOREA Dreste,s ; Div7: LOADA DAdRet,s ; STOREA Ddivise,s ; LOADA DVieuxA,s ; restaure A LOADX DVieuxX,s ; restaure X ADDSP d#14,i ; nettoyer pile RTS ; END Divss; ; ------- Granss ; Comparaison de deux entiers sans tenir compte des signes ; Les entiers sont sur la pile. Le résultat est placé sur ; la pile et celle-ci est nettoyée des paramètres. ; Si Nb1 > Nb2 résultat = 1 sinon 0. Cresult: .EQUATE d#10 ; Booléen résultat Cent1: .EQUATE d#8 ; Nombre 1 Cent2: .EQUATE d#6 ; Nombre 2 CAdRet: .EQUATE d#4 ; Adresse de retour CVieuxA: .EQUATE d#2 ; Ancienne valeur de A CVieuxX: .EQUATE d#0 ; Ancienne valeur de X ; Granss: ADDSP d#-4,i ; espace local sauvegarde STOREA CVieuxA,s ; sauvegarde A STOREX CVieuxX,s ; sauvegarde X LOADA Cent1,s ; IF nombre 1 > 0 THEN BRLT Neg1 ; LOADX Cent2,s ; IF nombre 2 > 0 THEN BRLT Cgrand ; COMPA Cent2,s ; test normal BRLT Cpetit ; Cgrand: LOADA d#1,i ; plus grand BR Cretour ; Cpetit: LOADA d#0,i ; plus petit BR Cretour ; END IF; Neg1: LOADX Cent2,s ; ELSIF nombre 2 > 0 THEN BRGE Cpetit ; plus petit COMPX Cent1,s ; BRGE Cgrand ; BR Cpetit ; END IF; Cretour: STOREA Cresult,s ; LOADA CAdRet,s ; adresse retour STOREA Cent1,s ; déplacée LOADA CVieuxA,s ; restaure A LOADX CVieuxX,s ; restaure X ADDSP d#8,i ; nettoyer pile RTS ; END Granss