[BACK]Return to mp.s CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari-2.2 / src / kernel / m68k

Annotation of OpenXM_contrib/pari-2.2/src/kernel/m68k/mp.s, Revision 1.1.1.1

1.1       noro        1: # $Id: mp.s,v 1.2 2000/11/03 21:00:25 karim Exp $
                      2: #
                      3: # Copyright (C) 2000  The PARI group.
                      4: #
                      5: # This file is part of the PARI/GP package.
                      6: #
                      7: # PARI/GP is free software; you can redistribute it and/or modify it under the
                      8: # terms of the GNU General Public License as published by the Free Software
                      9: # Foundation. It is distributed in the hope that it will be useful, but WITHOUT
                     10: # ANY WARRANTY WHATSOEVER.
                     11: #
                     12: # Check the License for details. You should have received a copy of it, along
                     13: # with the package; see the file 'COPYING'. If not, write to the Free Software
                     14: # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
                     15:
                     16: #*******************************************************************#
                     17: #===================================================================#
                     18: #*                                                                 *#
                     19: #=     oooooooooo          ooooo       oooooooooo      ooooo       =#
                     20: #*      ooooooooooo      ooooooooo      ooooooooooo     ooo        *#
                     21: #*      ooo     ooo     ooo     ooo     ooo     ooo     ooo        *#
                     22: #=      ooo     ooo     ooo     ooo     ooo     ooo     ooo        =#
                     23: #*      ooooooooooo     ooooooooooo     oooooooooo      ooo        *#
                     24: #=      oooooooooo      ooooooooooo     ooooooooooo     ooo        =#
                     25: #*      ooo             ooo     ooo     ooo     ooo     ooo        *#
                     26: #=      ooo             ooo     ooo     ooo     ooo     ooo        =#
                     27: #*     ooooo           ooooo   ooooo   ooooo   ooooo   ooooo       *#
                     28: #*                                                                 *#
                     29: #=                                                                 =#
                     30: #*                      version numero 2                           *#
                     31: #*                                                                 *#
                     32: #=                          commentee                              =#
                     33: #*                                                                 *#
                     34: #=                 fichier cree le 22 sept. 1987                   =#
                     35: #*                                                                 *#
                     36: #=                              par                                =#
                     37: #*                                                                 *#
                     38: #=        christian batut , henri cohen , michel olivier           =#
                     39: #*                                                                 *#
                     40: #=        """"""""""""""""""""""""""""""""""""""""""""""           =#
                     41: #*                                                                 *#
                     42: #===================================================================#
                     43: #*******************************************************************#
                     44: #-------------------------------------------------------------------#
                     45: #  Notations :                                                      #
                     46: #               T = type ( S , I , ou R ).                          #
                     47: #               R = type reel.                                      #
                     48: #               S = type entier court ( long du C).                 #
                     49: #               P = p-adique.                                       #
                     50: #                                                                   #
                     51: #               L = longueur de la mantisse pour un reel ;          #
                     52: #                   longueur de la mantisse effective pour un entier#
                     53: #               l = longueur totale du nombre avec codage.          #
                     54: #               le= longueur effective totale de l'entier avec code #
                     55: #                   on doit avoir : l <= 2^15-1.                    #
                     56: #                                                                   #
                     57: #               exp = exposant non biaise d'un reel.                #
                     58: #               fexp= exposant biaise ( fexp = exp + 2^23 ).        #
                     59: #                     on doit avoir : -2^23 <= exp < 2^23           #
                     60: #               fvalp=valuation p-adique biaisee d'un p-adique.     #
                     61: #                     ( fvalp = valuation + 2^15 )                  #
                     62: #-------------------------------------------------------------------#
                     63: #-------------------------------------------------------------------#
                     64: #   Conventions :                                                   #
                     65: #               Tous les sous programmes creent la place necessaire #
                     66: #               pour stocker le resultat , a l'exception des        #
                     67: #               programmes d'affectation et d'echange , ainsi que   #
                     68: #               des programmes dont le nom se termine par la lettre #
                     69: #               "z" . On entre dans ces derniers avec une zone creee#
                     70: #               dans la pile PARI ou le resultat est range.         #
                     71: #                                                                   #
                     72: #               Le nombre reel 0 s'ecrit avec mantisse non          #
                     73: #               significative;le deuxieme lgmot code contient       #
                     74: #               -32*L + (2^23) ou L est la longueur de la mantisse  #
                     75: #                                                                   #
                     76: #               Les registres a0,a1,d0,d1 sont en general utilises  #
                     77: #               par les programmes et ne sont pas restaures a leurs #
                     78: #               valeurs d'entree.Tous les autres sont sauvegardes.  #
                     79: #                                                                   #
                     80: #               Les objets utilises par PARI sont crees dans une    #
                     81: #               pile dite dans la suite "pile PARI",pointee par     #
                     82: #               _avma.                                              #
                     83: #-------------------------------------------------------------------#
                     84:
                     85: affer1  = 23
                     86: affer2  = 24
                     87: affer3  = 25
                     88: affer4  = 26
                     89: affer5  = 27
                     90: shier1  = 28
                     91: shier2  = 29
                     92: truer1  = 30
                     93: truer2  = 31
                     94: adder1  = 32
                     95: adder2  = 33
                     96: adder3  = 34
                     97: adder4  = 35
                     98: adder5  = 36
                     99: muler1  = 37
                    100: muler2  = 38
                    101: muler3  = 39
                    102: muler4  = 40
                    103: muler5  = 41
                    104: muler6  = 42
                    105: diver1  = 43
                    106: diver2  = 44
                    107: diver3  = 45
                    108: diver4  = 46
                    109: diver5  = 47
                    110: diver6  = 48
                    111: diver7  = 49
                    112: diver8  = 50
                    113: diver9  = 51
                    114: diver10 = 52
                    115: diver11 = 53
                    116: diver12 = 54
                    117: divzer1 = 55
                    118: dvmer1  = 56
                    119: moder1  = 57
                    120: reser1  = 58
                    121: arier1  = 59
                    122: arier2  = 60
                    123: errpile = 61
                    124:
                    125:         .text
                    126:
                    127:         .globl  _cget,_cgetg,_cgeti,_cgetr
                    128:         .globl  _mpaff,_affsz,_affsi,_affsr,_affii,_affir
                    129:         .globl  _affrs,_affri,_affrr
                    130:         .globl  _stoi,_itos
                    131:         .globl  _mptrunc,_mptruncz,_mpent,_mpentz
                    132:         .globl  _vals,_vali
                    133:         .globl  _mpshift,_mpshiftz,_shifts,_shifti,_shiftr
                    134:         .globl  _mpcmp,_cmpsi,_cmpsr,_cmpis,_cmpii,_cmpir
                    135:         .globl  _cmprs,_cmpri,_cmprr
                    136:         .globl  _mpadd,_addss,_addsi,_addsr,_addii,_addir,_addrr
                    137:         .globl  _mpaddz,_addssz,_addsiz,_addsrz,_addiiz,_addirz,_addrrz
                    138:         .globl  _mpsub,_subss,_subsi,_subsr,_subis,_subii,_subir
                    139:         .globl  _subrs,_subri,_subrr
                    140:         .globl  _mpsubz,_subssz,_subsiz,_subsrz,_subisz,_subiiz,_subirz
                    141:         .globl  _subrsz,_subriz,_subrrz
                    142:         .globl  _mpmul,_mulss,_mulsi,_mulsr,_asmmulii,_mulir,_mulrr
                    143:         .globl  _mpmulz,_mulssz,_mulsiz,_mulsrz,_muliiz,_mulirz,_mulrrz
                    144:         .globl  _dvmdss,_dvmdsi,_dvmdis,_asmdvmdii
                    145:         .globl  _mpdvmdz,_dvmdssz,_dvmdsiz,_dvmdisz,_dvmdiiz
                    146:         .globl  _mpdiv,_divss,_divsi,_divsr,_divis,_divii,_divir
                    147:         .globl  _divrs,_divri,_divrr
                    148:         .globl  _mpdivis,_divise
                    149:         .globl  _mpdivz,_divssz,_divsiz,_divsrz,_divisz,_diviiz,_divirz
                    150:         .globl  _divrsz,_divriz,_divrrz
                    151:         .globl  _mpinvz,_mpinvsr,_mpinvir,_mpinvrr
                    152:         .globl  _modss,_modsi,_modis,_modii
                    153:         .globl  _mpmodz,_modssz,_modsiz,_modisz,_modiiz
                    154:         .globl  _resss,_ressi,_resis,_resii
                    155:         .globl  _mpresz,_resssz,_ressiz,_resisz,_resiiz
                    156:         .globl  _addsii,_mulsii,_divisii
                    157:
                    158: #*******************************************************************#
                    159: #*******************************************************************#
                    160: #**                                                               **#
                    161: #**             PROGRAMMES DE GESTION DE LA MEMOIRE PARI          **#
                    162: #**                                                               **#
                    163: #*******************************************************************#
                    164: #*******************************************************************#
                    165:
                    166:
                    167:
                    168: #===================================================================#
                    169: #                                                                   #
                    170: #           Allocation memoire dans pile PARI en C                  #
                    171: #                                                                   #
                    172: #       entree : a7@(4) contient la longueur totale a attribuer     #
                    173: #       sortie : d0 pointe sur un type I ou R                       #
                    174: #                d1 et a1 sont inutilises                           #
                    175: #                                                                   #
                    176: #===================================================================#
                    177:
                    178: _cget:  movl    sp@(4),d0
                    179:         bsr     get
                    180:         movl    a0,d0
                    181:         rts
                    182:
                    183: _cgetg: movl    sp@(8),d0       | a7@(8) contient le type
                    184:         rorl    #8,d0
                    185:         movw    sp@(6),d0
                    186:         bsr     get
                    187:         movl    a0,d0
                    188:         rts
                    189:
                    190: _cgeti: movl    sp@(4),d0
                    191:         bsr     geti
                    192:         movl    a0,d0
                    193:         rts
                    194:
                    195: _cgetr: movl    sp@(4),d0
                    196:         bsr     getr
                    197:         movl    a0,d0
                    198:         rts
                    199:
                    200: #===================================================================#
                    201: #                                                                   #
                    202: #               Allocation memoire dans pile PARI                   #
                    203: #                                                                   #
                    204: #       entree : d0.w contient le nombre total de longs mots        #
                    205: #                demandes si type I ou R                            #
                    206: #       sortie : a0 pointe sur la zone allouee ; _avma est mis      #
                    207: #                a jour ; message d'erreur si memoire insuffisante ;#
                    208: #                d0 est inchange;d1 et a1 sont sauvegardes.         #
                    209: #       remarque : il est interdit de creer des type S dans la pile #
                    210: #                                                                   #
                    211: #===================================================================#
                    212:
                    213:                                 | allocation memoire type qcque
                    214:
                    215: get:    movl    d1,sp@-         | d0.l contient code et longueur
                    216:         moveq   #0,d1
                    217:         movw    d0,d1
                    218:         lsll    #2,d1
                    219:         movl    _avma,a0
                    220:         subl    d1,a0
                    221:         cmpl    _bot,a0
                    222:         bmi     mnet
                    223:         movl    a0,_avma
                    224: #        swap    d0
                    225: #        movb    #1,d0
                    226: #        swap    d0
                    227:         movl    d0,a0@
                    228:         movl    sp@+,d1
                    229:         rts
                    230:
                    231:                                 | allocation memoire de type I
                    232:
                    233: geti:   movl    d1,sp@-
                    234:         moveq   #0,d1
                    235:         movw    d0,d1
                    236:         lsll    #2,d1
                    237:         movl    _avma,a0
                    238:         subl    d1,a0
                    239:         cmpl    _bot,a0
                    240:         bmi     mnet
                    241:         movl    a0,_avma
                    242:         movw    #0x100,a0@
                    243:         movw    d0,a0@(2)
                    244:         movl    sp@+,d1
                    245:         rts
                    246:
                    247:                                 | allocation memoire type R
                    248:
                    249: getr:   movl    d1,sp@-
                    250:         moveq   #0,d1
                    251:         movw    d0,d1
                    252:         lsll    #2,d1
                    253:         movl    _avma,a0
                    254:         subl    d1,a0
                    255:         cmpl    _bot,a0
                    256:         bmi     mnet
                    257:         movl    a0,_avma
                    258:         movw    #0x200,a0@
                    259:         movw    d0,a0@(2)
                    260:         movl    sp@+,d1
                    261:         rts
                    262:
                    263:                                 | nettoyage pile PARI
                    264:                                 | a ecrire .....!!!!!!!!!
                    265: mnet:   movl    #errpile,sp@-
                    266:         jsr     _pari_err
                    267:
                    268: #===================================================================#
                    269: #                                                                   #
                    270: #               Desallocation memoire PARI                          #
                    271: #                                                                   #
                    272: #       entree : a0@ contient le premier long mot code d'une        #
                    273: #                zone memoire a desallouer : uniquement de type     #
                    274: #                I ou R                                             #
                    275: #       sortie : _avma est mis a jour si necessaire                 #
                    276: #                a0 pointe sur avma a jour                          #
                    277: #                tous les autres registres sont inchanges           #
                    278: #                                                                   #
                    279: #===================================================================#
                    280:
                    281: giv:    movl    d0,sp@-
                    282:         cmpl    _avma,a0
                    283:         bne     givf
                    284:                                 | ici la zone en tete de pile: on desalloue
                    285:         movw    a0@(2),d0
                    286:         lea     a0@(0,d0:w:4),a0| a0 pointe sur zone suivante
                    287:         movl    a0,_avma
                    288:
                    289: givf:   movl    sp@+,d0
                    290:         rts
                    291:
                    292: #*******************************************************************#
                    293: #*******************************************************************#
                    294: #**                                                               **#
                    295: #**             PROGRAMMES D'AFFECTATION OU D'ECHANGE             **#
                    296: #**                                                               **#
                    297: #*******************************************************************#
                    298: #*******************************************************************#
                    299:
                    300:
                    301:
                    302:
                    303:
                    304: #===================================================================#
                    305: #                                                                   #
                    306: #       Affectation generale    n2 --> n1                           #
                    307: #                                                                   #
                    308: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                    309: #                a7@(8) pointe sur n1 de type I ou R                #
                    310: #       sortie : la zone pointee par a7@(8) contient n2             #
                    311: #       interdit : n2 ou n1 de type S                               #
                    312: #       remarques: erreur dans le cas R --> I                       #
                    313: #                  d0,d1,a0,a1 sont inchanges                       #
                    314: #                                                                   #
                    315: #===================================================================#
                    316:
                    317: _mpaff: cmpb    #1,sp@(8)@
                    318:         bne     1$
                    319:                                 | ici T1 = I
                    320:         cmpb    #1,sp@(4)@
                    321:         beq     _affii          | ici T1 = T2 = I
                    322:         bra     _affri          | ici T1 = I et T2 = R
                    323:                                 | ici T1 = R
                    324: 1$:     cmpb    #1,sp@(4)@
                    325:         beq     _affir          | ici T1 = R et T2 = I
                    326:         bra     _affrr          | ici T1 = T2 = R
                    327:
                    328: #-------------------------------------------------------------------#
                    329:
                    330:                                 | affectation s2 --> i1 ou r1
                    331: _affsz: cmpb    #2,sp@(4)@
                    332:         beq     _affsr
                    333:                                 | affectation s2 --> i1
                    334:
                    335: _affsi: link    a6,#0
                    336:         moveml  d0/a0,sp@-
                    337:         movl    a6@(8),d0       | d0.l contient s2
                    338:         movl    a6@(12),a0      | a0 pointe sur i1
                    339:         cmpw    #2,a0@(2)
                    340:         bne     1$
                    341:                                 | ici l1 = 2 (i1 = 0)
                    342:         tstl    d0
                    343:         beq     4$
                    344:                                 | ici s2 <> 0 (erreur)
                    345:         movl    #affer1,sp@-
                    346:         jsr     _pari_err
                    347:                                 | ici s2 = 0 ou l1 >= 3
                    348: 1$:     tstl    d0
                    349: 4$:     bmi     2$
                    350:                                 | ici s2 >= 0
                    351:         bne     3$
                    352:                                 | ici s2 = 0
                    353:         movl    #2,a0@(4)
                    354:         bra     affsif
                    355:                                 | ici s2 > 0 et l1 >= 3
                    356: 3$:     movl    #0x1000003,a0@(4)
                    357:         movl    d0,a0@(8)
                    358:         bra     affsif
                    359:                                 | ici s2 < 0 et l1 >= 3
                    360: 2$:     movl    #0xff000003,a0@(4)
                    361:         negl    d0
                    362:         movl    d0,a0@(8)
                    363: affsif: moveml  sp@+,d0/a0
                    364:         unlk    a6
                    365:         rts
                    366:
                    367: #-------------------------------------------------------------------#
                    368:
                    369:                                 | affectation i2 --> i1
                    370:
                    371: _affii: link    a6,#0
                    372:         moveml  d0/a0-a1,sp@-
                    373:         movl    a6@(8),a1       | a1 pointe sur i2
                    374:         movl    a6@(12),a0      | a0 pointe sur i1
                    375:         cmpl    a0,a1
                    376:         beq     affiif
                    377:                                 | ici a0 <> a1
                    378:         movw    a0@(2),d0       | d0.w contient l1
                    379:         cmpw    a1@(6),d0
                    380:         bcc     1$
                    381:                                 | ici le2 > l1 (erreur)
                    382:         movl    #affer3,sp@-
                    383:         jsr     _pari_err
                    384:                                 | ici le2 <= l1
                    385: 1$:     movw    a1@(6),d0       | d0.w contient le2
                    386:         subqw   #2,d0           | d0.w contient L2
                    387:         addql   #4,a0
                    388:         addql   #4,a1
                    389:                                 | copie de i2 dans i1
                    390: 2$:     movl    a1@+,a0@+
                    391:         dbra    d0,2$
                    392: affiif: moveml  sp@+,d0/a0-a1
                    393:         unlk    a6
                    394:         rts
                    395:
                    396: #-------------------------------------------------------------------#
                    397:
                    398:                                 | conversion i --> long du C dans d0
                    399:
                    400: _itos:  movl    a1,sp@-
                    401:         movl    sp@(8),a1       | a1 pointe sur i2
                    402:         cmpw    #3,a1@(6)
                    403:         bls     1$
                    404:                                 | ici l2 >= 4 (erreur)
                    405:         movl    #affer2,sp@-
                    406:         jsr     _pari_err
                    407:                                 | ici l2 <= 3
                    408: 1$:     beq     2$
                    409:                                 | ici l2 = 2 (i2 = 0)
                    410:         moveq   #0,d0
                    411:         bra     itosf
                    412:                                 | ici l2 = 3
                    413: 2$:     movl    a1@(8),d0       | d0.l contient |i2|
                    414:         cmpl    #0x80000000,d0
                    415:         bcs     3$
                    416:         beq     4$
                    417:                                 | ici |i2| > 2^31 (erreur)
                    418: 5$:     movl    #affer2,sp@-
                    419:         jsr     _pari_err
                    420:                                 | ici |i2| = 2^31
                    421: 4$:     tstb    a1@(4)
                    422:         bpl     5$              | si i2 = 2^31 erreur
                    423:         bra     itosf           | ici i2 = -2^31
                    424:                                 | ici |i2| <= 2^31-1
                    425: 3$:     tstw    a1@(4)
                    426:         bpl     itosf
                    427:         negl    d0
                    428: itosf:  movl    sp@+,a1
                    429:         rts
                    430:
                    431: #-------------------------------------------------------------------#
                    432:
                    433:                                 | conversion long du C --> i cree
                    434:
                    435: _stoi:  movl    sp@(4),d1
                    436:         bne     1$
                    437:        movl    _gzero,d0
                    438:        rts
                    439: 1$:     movl    #3,d0
                    440:         bsr     geti
                    441:         tstl    d1
                    442:         bmi     2$
                    443:         movl    #0x1000003,a0@(4)
                    444:         bra     3$
                    445: 2$:     movl    #0xff000003,a0@(4)
                    446:         negl    d1
                    447: 3$:     movl    d1,a0@(8)
                    448:        movl    a0,d0
                    449:         rts
                    450:
                    451: #-----------------------------------------------------------------------#
                    452:
                    453:                                 | affectation s2 --> r1
                    454:
                    455: _affsr: link    a6,#0
                    456:         moveml  d0-d1/a0,sp@-
                    457:         movl    a6@(12),a0      | a0 pointe sur r1
                    458:         movl    a6@(8),d0       | d0.l contient s2
                    459:         bne     1$
                    460:                                 | ici s2 = 0
                    461:         moveq   #0,d0
                    462:         movw    a0@(2),d0
                    463:         subqw   #2,d0
                    464:         lsll    #5,d0
                    465:         negl    d0
                    466:         addl    #0x800000,d0    | d0.l contient fexp(0)
                    467:         movl    d0,a0@(4)
                    468:         clrl    a0@(8)
                    469:         bra     affsrf
                    470:                                 | ici s2 <> 0
                    471: 1$:     bpl     2$
                    472:         negl    d0
                    473:         movb    #0xff,a0@(4)    | mise signe si s2 < 0
                    474:         bra     3$
                    475: 2$:     movb    #1,a0@(4)       | mise signe si s2 > 0
                    476:                                 | ici s2 <> 0
                    477: 3$:     bfffo   d0{#0:#0},d1    | d1.l recoit nb. de shifts (=k)
                    478:         lsll    d1,d0           | d0.l est norme
                    479:         negw    d1
                    480:         addw    #31,d1
                    481:         movw    d1,a0@(6)
                    482:         movb    #0x80,a0@(5)    | mise exposant
                    483:         movl    d0,a0@(8)       | mise 1er long mot mantisse
                    484:         moveq   #0,d0
                    485:         movw    a0@(2),d1
                    486:         subql   #3,d1           | d1.w recoit L1-1
                    487:         addl    #12,a0          | a0 pointe sur 2eme long mot mantisse
                    488:         bra     4$
                    489: 5$:     movl    d0,a0@+
                    490: 4$:     dbra    d1,5$
                    491: affsrf: moveml  sp@+,d0-d1/a0
                    492:         unlk    a6
                    493:         rts
                    494:
                    495: #-------------------------------------------------------------------#
                    496:
                    497:                                 | affectation i2 --> r1
                    498:
                    499: _affir: link a6,#0
                    500:         moveml  d0-d6/a0-a1,sp@-
                    501:         movl    a6@(8),a1       | a1 pointe sur i2
                    502:         movl    a6@(12),a0      | a0 pointe sur r1
                    503:         tstb    a1@(4)
                    504:         bne     1$
                    505:                                 | ici i2 = 0
                    506:         moveq   #0,d0
                    507:         movw    a0@(2),d0
                    508:         subqw   #2,d0
                    509:         lsll    #5,d0
                    510:         negl    d0
                    511:         addl    #0x800000,d0
                    512:         movl    d0,a0@(4)
                    513:         clrl    a0@(8)
                    514:         bra     affirf
                    515:                                 | ici i2 <> 0
                    516: 1$:     movl    a1@(8),d0       | d0.l contient 1er lg mot mantisse
                    517:         bfffo   d0{#0:#0},d1    | d1.l recoit nb de shifts (=k)
                    518:         lsll    d1,d0           | d0.l normalise
                    519:         moveq   #0,d2
                    520:         movw    a1@(6),d2
                    521:         lsll    #5,d2
                    522:         subl    d1,d2
                    523:         addl    #0x7fffbf,d2    | d2.l = fexp2 = 2^23 + L1*32 -1 -k
                    524:         movl    d2,a0@(4)       | mise exposant
                    525:         movb    a1@(4),a0@(4)   | mise signe
                    526:         movw    a1@(6),d4
                    527:         subqw   #3,d4           | d4.w recoit L2-1 (compteur)
                    528:         movw    a0@(2),d2
                    529:         subqw   #3,d2           | d2.w recoit L1-1
                    530:         addl    #12,a1          | a1 pointe sur 2eme lg mot mantisse i2
                    531:         addql   #8,a0           | a0 ponte sur 1er lg mot mantisse r1
                    532:         moveq   #1,d6           | masque
                    533:         lsll    d1,d6
                    534:         subql   #1,d6
                    535:         subw    d4,d2           | d2.w  recoit L1-L2
                    536:         bpl     2$
                    537:                                 | ici L1 < L2
                    538:         addw    d2,d4           | d4.w  recoit L1-1
                    539:         bra     2$
                    540:                                 | copie mantisse shiftee dans r1
                    541: 3$:     movl    a1@+,d3
                    542:         roll    d1,d3
                    543:         movl    d3,d5
                    544:         andl    d6,d3
                    545:         addl    d3,d0
                    546:         movl    d0,a0@+
                    547:         subl    d3,d5
                    548:         movl    d5,d0
                    549: 2$:     dbra    d4,3$
                    550:         tstw    d2
                    551:         bmi     4$
                    552:                                 | ici L1 > L2 completer par des 0
                    553:         moveq   #0,d3
                    554:         movl    d0,a0@+
                    555:         bra     5$
                    556: 6$:     movl    d3,a0@+
                    557: 5$:     dbra    d2,6$
                    558:         bra     affirf
                    559:                                 | ici L1 <= L2
                    560: 4$:     movl    a1@+,d3
                    561:         roll    d1,d3
                    562:         andl    d6,d3
                    563:         addl    d3,d0
                    564:         movl    d0,a0@+         | mise a jour dernier lg mot
                    565: affirf: moveml  sp@+,d0-d6/a0-a1
                    566:         unlk    a6
                    567:         rts
                    568:
                    569: #-------------------------------------------------------------------#
                    570:
                    571:                                 | affectation r2 --> r1
                    572:
                    573: _affrr: link    a6,#0
                    574:         moveml  d0-d1/a0-a1,sp@-
                    575:         movl    a6@(8),a1       | a1 pointe sur r2
                    576:         movl    a6@(12),a0      | a0 pointe sur r1
                    577:         cmpl    a0,a1
                    578:         beq     affrrf
                    579:                                 | ici a0 <> a1
                    580:         tstb    a1@(4)
                    581:         bne     6$
                    582:                                 | ici r2 = 0
                    583:         movl    a1@(4),a0@(4)
                    584:         clrl    a0@(8)
                    585:         bra     affrrf
                    586:                                 | ici r2 <> 0
                    587: 6$:     addql   #4,a0
                    588:         addql   #4,a1
                    589:         movw    a0@(-2),d0
                    590:         movw    a1@(-2),d1      | d0.w , d1.w contient l1,l2
                    591:         cmpw    d0,d1
                    592:         bhi     1$
                    593:                                 | ici l1 >= l2
                    594:         subw    d1,d0           | d0.w contient l1-l2
                    595:         subqw   #2,d1           | d1.w  contient L2
                    596: 3$:     movl    a1@+,a0@+       | copie de r2 dans r1
                    597:         dbra    d1,3$
                    598:         moveq   #0,d1
                    599:         bra     2$
                    600:                                 | ici completer par des 0
                    601: 4$:     movl    d1,a0@+
                    602: 2$:     dbra    d0,4$
                    603:         bra     affrrf
                    604:                                 | ici l2 > l1
                    605: 1$:     subqw   #2,d0           | d0.w recoit L1 (compteur)
                    606: 5$:     movl    a1@+,a0@+
                    607:         dbra    d0,5$
                    608: affrrf: moveml  sp@+,d0-d1/a0-a1
                    609:         unlk    a6
                    610:         rts
                    611:
                    612: #-------------------------------------------------------------------#
                    613:
                    614:                                 | affectation r2 --> s1
                    615:
                    616: _affrs: movl    #affer4,sp@-
                    617:         jsr     _pari_err
                    618:
                    619: #-------------------------------------------------------------------#
                    620:
                    621:                                 | affectation r2 --> i1
                    622:
                    623: _affri: movl    #affer5,sp@-
                    624:         jsr     _pari_err
                    625:
                    626:
                    627: #*******************************************************************#
                    628: #*******************************************************************#
                    629: #**                                                               **#
                    630: #**                     VALUATION                                 **#
                    631: #**                                                               **#
                    632: #*******************************************************************#
                    633: #*******************************************************************#
                    634:
                    635:
                    636:
                    637:
                    638:
                    639: #===================================================================#
                    640: #                                                                   #
                    641: #       Valuation 2-adique d'un entier court ou d'un entier         #
                    642: #                                                                   #
                    643: #       entree : a7@(4) contient s1 de type S ou pointe sur i1 de   #
                    644: #                type I                                             #
                    645: #       sortie : d0.l contient k tel que : k>=0 , n1=2^k*n2 ,       #
                    646: #                avec n2 et 2 premiers entre eux ; si n1=0 , alors  #
                    647: #                d0.l contient -1.                                  #
                    648: #       remarque : type R interdit                                  #
                    649: #                                                                   #
                    650: #===================================================================#
                    651:
                    652:                                 | valuation de s1 de type S
                    653:
                    654: _vals:  link    a6,#0
                    655:         movl    d2,sp@-
                    656:         moveq   #-1,d0
                    657:         movl    a6@(8),d1       | d1.l contient s1
                    658:         beq     valsf
                    659:         moveq   #0,d0
                    660:         tstw    d1
                    661:         bne     1$
                    662:         addl    #16,d0
                    663:         swap    d1
                    664: 1$:     tstb    d1
                    665:         bne     2$
                    666:         addql   #8,d0
                    667:         lsrl    #8,d1
                    668: 2$:     movl    d1,d2
                    669:         andl    #15,d2
                    670:         bne     3$
                    671:         addql   #4,d0
                    672:         lsrl    #4,d1
                    673: 3$:     movl    d1,d2
                    674:         andl    #3,d2
                    675:         bne     4$
                    676:         addql   #2,d0
                    677:         lsrl    #2,d1
                    678: 4$:     btst    #0,d1
                    679:         bne     valsf
                    680:         addql   #1,d0
                    681: valsf:  movl    sp@,d2
                    682:         unlk    a6
                    683:         rts
                    684:
                    685:                                 | valuation de i1 de type I
                    686:
                    687: _vali:  link    a6,#0
                    688:         movl    d2,sp@-
                    689:         movl    a6@(8),a1       | a1 pointe sur i1
                    690:         moveq   #-1,d0
                    691:         tstb    a1@(4)
                    692:         beq     valif
                    693:                                 | ici i1 <> 0
                    694:         movw    a1@(6),d1       | d1.w contient L1+2
                    695:         lea     a1@(0,d1:w:4),a1| a1 pointe fin mantisse de i1
                    696:         movl    #0xffff,d0
                    697: 5$:     tstl    a1@-
                    698:         dbne    d0,5$
                    699:         notw    d0
                    700:         lsll    #5,d0           | d0.l contient 32*nb.de lgmots nuls
                    701:         movl    a1@,d1          | a droite de i1 et a1 pointe 1er lgmot
                    702:         tstw    d1              | non nul (qui existe car i1 <> 0)
                    703:         bne     1$
                    704:         addl    #16,d0
                    705:         swap    d1
                    706: 1$:     tstb    d1
                    707:         bne     2$
                    708:         addql   #8,d0
                    709:         lsrl    #8,d1
                    710: 2$:     movl    d1,d2
                    711:         andl    #15,d2
                    712:         bne     3$
                    713:         addql   #4,d0
                    714:         lsrl    #4,d1
                    715: 3$:     movl    d1,d2
                    716:         andl    #3,d2
                    717:         bne     4$
                    718:         addql   #2,d0
                    719:         lsrl    #2,d1
                    720: 4$:     btst    #0,d1
                    721:         bne     valif
                    722:         addql   #1,d0
                    723: valif:  movl    sp@,d2
                    724:         unlk    a6
                    725:         rts
                    726:
                    727:
                    728:
                    729:
                    730:
                    731: #*******************************************************************#
                    732: #*******************************************************************#
                    733: #**                                                               **#
                    734: #**                     PROGRAMMES DE SHIFT                       **#
                    735: #**                                                               **#
                    736: #*******************************************************************#
                    737: #*******************************************************************#
                    738:
                    739:
                    740:
                    741:
                    742:
                    743: #===================================================================#
                    744: #                                                                   #
                    745: #                       Shift general                               #
                    746: #                                                                   #
                    747: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                    748: #                a7@(8) contient k = nombre de shifts               #
                    749: #       sortie : d0 pointe sur n1 de type I ou R                    #
                    750: #                contenant n1 = 2^k * n2 (zone creee)               #
                    751: #       interdit : type S                                           #
                    752: #                                                                   #
                    753: #===================================================================#
                    754:
                    755: _mpshift:cmpb   #1,sp@(4)@
                    756:         beq     _shifti
                    757:         bra     _shiftr
                    758:
                    759: #===================================================================#
                    760: #                                                                   #
                    761: #                       Shift (par valeur)                          #
                    762: #                                                                   #
                    763: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                    764: #                a7@(8) contient le nombre de shifts (=k)           #
                    765: #                a7@(12) pointe sur n1 de type I ou R               #
                    766: #       sortie : la zone pointee par a7@(12) contient 2^k * n2      #
                    767: #       interdit : type S                                           #
                    768: #                                                                   #
                    769: #===================================================================#
                    770:
                    771: _mpshiftz:movl  sp@(4),a0
                    772:         cmpl    sp@(12),a0
                    773:         bne     1$
                    774:         cmpb    #2,a0@
                    775:         bne     1$
                    776:         movl    a0@(4),d0
                    777:         andl    #0xffffff,d0
                    778:         addl    sp@(8),d0
                    779:         bvs     shier
                    780:         cmpl    #0x1000000,d0
                    781:         bcc     shier
                    782:         tstl    d0
                    783:         bmi     shier
                    784:         movw    d0,a0@(6)
                    785:         swap    d0
                    786:         movb    d0,a0@(5)
                    787:         rts
                    788: 1$:     movl    sp@(8),sp@-
                    789:         movl    sp@(8),sp@-
                    790:         bsr     _mpshift
                    791:         movl    d0,sp@
                    792:         movl    sp@(20),sp@(4)
                    793:         bsr     _mpaff
                    794:         movl    sp@,a0
                    795:         addql   #8,sp
                    796:         bra     giv
                    797:
                    798: #===================================================================#
                    799: #                                                                   #
                    800: #               Shift d'un entier court = entier                    #
                    801: #                                                                   #
                    802: #       entree : a7@(4) contient s2 de type S                       #
                    803: #                a7@(8) contient k = nombre de shifts               #
                    804: #       sortie : d0 pointe sur i1 de type I                         #
                    805: #                avec i1 = 2^k * s2 (zone creee)                    #
                    806: #                                                                   #
                    807: #===================================================================#
                    808:
                    809: _shifts:link    a6,#-12
                    810:         movl    a6@(12),sp@-    | empilage k
                    811:         movl    a6@(8),d0       | d0.l contient s2
                    812:         bne     1$
                    813:                                 | ici s2 = 0
                    814:         movl    #0x1000002,a6@(-12)
                    815:         movl    #2,a6@(-8)      | creation de 0 en var. locale
                    816:         bra     3$
                    817:                                 | ici s2 <> 0
                    818: 1$:     movl    #0x1000003,a6@(-12)
                    819:         movl    #0x1000003,a6@(-8)
                    820:         tstl    d0
                    821:         bpl     2$
                    822:         negl    d0
                    823:         movb    #0xff,a6@(-8)
                    824: 2$:     movl    d0,a6@(-4)      | creation de s2 en var. locale
                    825: 3$:     pea     a6@(-12)        | empilage adresse var. locale
                    826:         bsr     _shifti
                    827:         unlk    a6
                    828:         rts
                    829:
                    830: #===================================================================#
                    831: #                                                                   #
                    832: #                       Shift entier = entier                       #
                    833: #                                                                   #
                    834: #       entree : a7@(4) pointe sur i2 de type I                     #
                    835: #                a7@(8) contient k = nombre de shifts               #
                    836: #       sortie : d0 pointe sur i1 de type I                         #
                    837: #                avec i1 = 2^k * i2 (zone creee)                    #
                    838: #                                                                   #
                    839: #===================================================================#
                    840:
                    841: _shifti:link    a6,#0
                    842:         moveml  d2-d7/a2-a3,sp@-
                    843:         movl    a6@(8),a2       | a2 pointe sur i2
                    844:         movl    a6@(12),d7      | d7.l contient k
                    845:         bne     1$
                    846:                                 | ici k = 0
                    847:         movw    a2@(2),d0
                    848:         bsr     geti
                    849:         movl    a0,a3   | sauvegarde adresse resultat
                    850:         subqw   #2,d0
                    851:         addql   #4,a0
                    852:         addql   #4,a2
                    853: 24$:    movl    a2@+,a0@+
                    854:         dbra    d0,24$
                    855:         bra     shiftif
                    856:                                 | ici k <> 0
                    857: 1$:     tstb    a2@(4)
                    858:         bne     2$
                    859:                                 | ici i1 = 0
                    860: 6$:     movl    _gzero,d0       | sauvegarde adresse resultat
                    861:         bra     shiftig
                    862:                                 | ici k <> 0 et i2 <> 0
                    863: 2$:     moveq   #0,d0
                    864:         movw    a2@(6),d0       | d0.w contient L2+2
                    865:         cmpl    #1,d7
                    866:         bne     3$
                    867:                                 | ici k = 1 et i2 <> 0
                    868:         movl    a2@(8),d5
                    869:         btst    #31,d5
                    870:         beq     4$
                    871:                                 | ici d5 >= 2^31
                    872:         addqw   #1,d0           | demander 1 lgmot supplementaire
                    873:         cmpw    #0x8000,d0
                    874:         bcs     4$
                    875:                                 | ici debordement
                    876: 18$:    movl    #shier1,sp@-
                    877:         jsr     _pari_err
                    878:                                 | ici k = 1 et i2 <> 0
                    879: 4$:     bsr     geti
                    880:         movl    a0,a3           | sauvegarde adresse resultat
                    881:         movw    a0@(2),a0@(6)   | mise longueur effective
                    882:         movb    a2@(4),a0@(4)   | mise signe
                    883:         lea     a0@(0,d0:w:4),a1| a1 pointe fin resultat
                    884:         lea     a2@(0,d0:w:4),a2
                    885:         btst    #31,d5
                    886:         beq     5$
                    887:         subqw   #4,a2           | ici a2 pointe fin i2
                    888:         movl    #1,a0@(8)
                    889:         subqw   #1,d0
                    890: 5$:     subqw   #3,d0           | d0.w compteur
                    891: 7$:     movl    a2@-,d1
                    892:         roxll   #1,d1
                    893:         movl    d1,a1@-
                    894:         dbra    d0,7$
                    895:         bra     shiftif
                    896:                                 | ici k <> 1 et i2 <> 0
                    897: 3$:     cmpl    #-1,d7
                    898:         bne     8$
                    899:                                 | ici k = -1 et i2 <> 0
                    900:         cmpl    #1,a2@(8)
                    901:         bhi     9$
                    902:         subqw   #1,d0
                    903:         cmpw    #2,d0
                    904:         beq     6$              | si i1 = 0
                    905: 9$:     bsr     geti
                    906:         movl    a0,a3
                    907:         movb    a2@(4),a0@(4)   | mise signe
                    908:         movw    a0@(2),a0@(6)   | mise longueur effective
                    909:         addql   #8,a0
                    910:         addql   #8,a2
                    911:         movw    a2@(-2),d0
                    912:         subqw   #3,d0           | d0.w compteur
                    913:         movl    a2@+,d1
                    914:         lsrl    #1,d1
                    915:         beq     10$
                    916:         movl    d1,a0@+
                    917:         bra     10$
                    918: 11$:    movl    a2@+,d1
                    919:         roxrl   #1,d1
                    920:         movl    d1,a0@+
                    921: 10$:    dbra    d0,11$
                    922:         bra     shiftif
                    923:                                 | ici k<>0,k<>1,k<>-1 et i2<>0
                    924: 8$:     tstl    d7
                    925:         bpl     12$
                    926:                                 | ici shift a droite : k < -1 et i2 <> 0
                    927:         negl    d7              | d7.l contient /k/
                    928:         movl    d7,d4
                    929:         lsrl    #5,d4           | d4.l contient q
                    930:         andl    #31,d7          | k=32*q+r; d7.l contient r
                    931:
                    932:         subw    #2,d0           | d0.w contient L2
                    933:         cmpw    d4,d0
                    934:         bls     6$              | si r1 <= 0
                    935:         addw    #2,d0           |
                    936:         subw    d4,d0           | d0.w contient L2+2-q
                    937:
                    938:         movl    a2@(8),d4
                    939:         lsrl    d7,d4
                    940:         bne     13$
                    941:                                 | ici on perd un lgmot de resultat
                    942:         subqw   #1,d0
                    943:         cmpw    #2,d0
                    944:         beq     6$              | si r1 = 0
                    945: 13$:    bsr     geti            | allocation memoire pour resultat
                    946:         movl    a0,a3
                    947:         movb    a2@(4),a0@(4)   | mise signe
                    948:         movw    a0@(2),a0@(6)   | mise longueur effective
                    949:         lea     a2@(0,d0:w:4),a2| a2 pointe ou il faut !
                    950:         lea     a0@(0,d0:w:4),a1| a1 pointe fin resultat
                    951:         tstl    d4
                    952:         beq     14$
                    953:         movl    d4,a0@(8)
                    954:         subqw   #3,d0           | d0.w compteur
                    955:         bra     15$
                    956: 14$:    addql   #4,a2
                    957:         subqw   #2,d0
                    958: 15$:    moveq   #-1,d6
                    959:         lsrl    d7,d6           | masque de shift
                    960:         movl    a2@-,d4
                    961:         lsrl    d7,d4
                    962:         bra     16$
                    963: 17$:    movl    a2@-,d2         | boucle de shift
                    964:         rorl    d7,d2
                    965:         movl    d2,d3
                    966:         andl    d6,d3
                    967:         subl    d3,d2
                    968:         addl    d2,d4
                    969:         movl    d4,a1@-
                    970:         movl    d3,d4
                    971: 16$:    dbra    d0,17$
                    972:         bra     shiftif
                    973:                                 | ici shift a gauche : k > 1 et i2 <> 0
                    974: 12$:    movl    d7,d4
                    975:         andl    #31,d7          | d7.l contient r
                    976:         lsrl    #5,d4           | d4.l contient q (k=32*q+r)
                    977:         addl    d4,d0           | d0.l contient L2+2+q
                    978:         cmpw    #0x7fff,d0
                    979:         bcc     18$
                    980:         moveq   #-1,d6
                    981:         lsll    d7,d6
                    982:         notl    d6              | masque de shift
                    983:         movl    a2@(8),d2
                    984:         roll    d7,d2
                    985:         movl    d2,d3
                    986:         andl    d6,d3
                    987:         beq     19$
                    988:         addqw   #1,d0           | un long mot supplementaire
                    989: 19$:    bsr     geti
                    990:         movl    a0,a3
                    991:         movl    a0@(2),a0@(6)   | mise longueur effective
                    992:         movb    a2@(4),a0@(4)   | mise signe
                    993:         addql   #8,a0
                    994:         tstl    d3
                    995:         beq     20$
                    996:         movl    d3,a0@+
                    997: 20$:    subl    d3,d2
                    998:         movl    d2,d5
                    999:         movw    a2@(6),d0
                   1000:         addl    #12,a2
                   1001:         subqw   #3,d0           | d0.w contient compteur
                   1002:         bra     21$
                   1003: 22$:    movl    a2@+,d2
                   1004:         roll    d7,d2
                   1005:         movl    d2,d3
                   1006:         andl    d6,d3
                   1007:         subl    d3,d2
                   1008:         addl    d3,d5
                   1009:         movl    d5,a0@+
                   1010:         movl    d2,d5
                   1011: 21$:    dbra    d0,22$
                   1012:         movl    d5,a0@+
                   1013:         moveq   #0,d0
                   1014:         bra     23$
                   1015: 25$:    movl    d0,a0@+
                   1016: 23$:    dbra    d4,25$
                   1017: shiftif:movl    a3,d0           | d0 pointe sur resultat
                   1018: shiftig:moveml  sp@+,d2-d7/a2-a3
                   1019:         unlk    a6
                   1020:         rts
                   1021:
                   1022: #===================================================================#
                   1023: #                                                                   #
                   1024: #                       Shift reel = reel                           #
                   1025: #                                                                   #
                   1026: #       entree : a7@(4) pointe sur r2 de type R                     #
                   1027: #                a7@(8) contient k = nombre de shifts               #
                   1028: #       sortie : d0 pointe sur r1 de type R                         #
                   1029: #                avec r1 = 2^k * r2 zone creee)                     #
                   1030: #                                                                   #
                   1031: #===================================================================#
                   1032:
                   1033: _shiftr:link    a6,#0
                   1034:         moveml  d2/a2-a3,sp@-
                   1035:         movl    a6@(8),a2       | a2 pointe sur r2
                   1036:         movl    a6@(12),d2      | d2.l contient k
                   1037:         bne     1$
                   1038:                                 | ici k = 0
                   1039:         movw    a2@(2),d0
                   1040:         bsr     getr
                   1041:         movl    a0,a3
                   1042:         subqw   #2,d0
                   1043:         addql   #4,a0
                   1044:         addql   #4,a2
                   1045: 4$:     movl    a2@+,a0@+
                   1046:         dbra    d0,4$           | boucle de recopie de r2 dans r1
                   1047:         bra     shiftrf
                   1048:                                 | ici k <> 0
                   1049: 1$:     movl    a2@(4),d1
                   1050:         andl    #0xffffff,d1
                   1051:         addl    d2,d1           | d1.l contient fexp2 + k
                   1052:         bvc     sh
                   1053:                                 | ici debordement
                   1054: shier:  movl    #shier2,sp@-
                   1055:         jsr     _pari_err
                   1056:                                 | ici k + fexp2 <= 2^31 -1
                   1057: sh:     cmpl    #0x1000000,d1
                   1058:         bcc     shier           | si k + fexp2 >= 2^24
                   1059:         tstl    d1
                   1060:         bmi     shier           | si k + fexp2 < 0
                   1061:         movw    a2@(2),d0
                   1062:         bsr     getr            | allocation memoire pour resultat
                   1063:         movl    a0,a3
                   1064:         movl    d1,a0@(4)       | mise exposant
                   1065:         movb    a2@(4),a0@(4)   | mise signe
                   1066:         addql   #8,a0
                   1067:         addql   #8,a2
                   1068:         subqw   #3,d0
                   1069: 5$:     movl    a2@+,a0@+
                   1070:         dbra    d0,5$
                   1071: shiftrf:movl    a3,d0           | d0 pointe sur resultat
                   1072:         moveml  sp@+,d2/a2-a3
                   1073:         unlk    a6
                   1074:         rts
                   1075:
                   1076:
                   1077:
                   1078:
                   1079:
                   1080: #*******************************************************************#
                   1081: #*******************************************************************#
                   1082: #**                                                               **#
                   1083: #**                     PROGRAMMES DE PARTIE ENTIERE              **#
                   1084: #**                                                               **#
                   1085: #*******************************************************************#
                   1086: #*******************************************************************#
                   1087:
                   1088:
                   1089:
                   1090:
                   1091:
                   1092: #===================================================================#
                   1093: #                                                                   #
                   1094: #               Fausse partie entiere (trunc)                       #
                   1095: #                                                                   #
                   1096: #       entree : a7@(4) pointe sur n1 de type I ou de type R        #
                   1097: #       sortie : d0 pointe sur i1 de type I (zone creee)            #
                   1098: #       calcul : si r1 >= 0 , i1 est la partie entiere              #
                   1099: #                si r1 < 0 , i1 = - Ent (-r1)                       #
                   1100: #       remarque : type S interdit                                  #
                   1101: #                                                                   #
                   1102: #===================================================================#
                   1103:
                   1104: _mptrunc:link   a6,#0
                   1105:         moveml  d2-d6/a2-a4,sp@-
                   1106:         movl    a6@(8),a1       | a1 pointe sur n1
                   1107:         cmpb    #1,a1@
                   1108:         bne     5$
                   1109:                                 | ici n1 est de type I
                   1110:         movw    a1@(6),d0
                   1111:         bsr     geti
                   1112:         movl    a0,a4
                   1113:         subqw   #2,d0
                   1114:         addql   #4,a0
                   1115:         addql   #4,a1
                   1116: 7$:     movl    a1@+,a0@+
                   1117:         dbra    d0,7$
                   1118:         bra     truncf
                   1119:                                 | ici n1 est de type R
                   1120: 5$:     movl    a1@(4),d3       | d3.l contient second long mot code r1
                   1121:         movl    d3,d0
                   1122:         andl    #0xffffff,d0    | d0.l contient fexp1
                   1123:         subl    #0x800000,d0    | d0.l contient exp1
                   1124:         bpl     1$
                   1125:                                 | ici exp1 < 0 (trunc r1 = 0)
                   1126:        movl    _gzero,d0
                   1127:         bra     truncg
                   1128:                                 | ici exp1 >= 0
                   1129: 1$:     movl    d0,d2           | d2.l  contient exp1
                   1130:         lsrl    #5,d0           | d0.l contient exp1 div 32 = q
                   1131:         addql   #3,d0           | d0.l  contient le(i1)
                   1132:         cmpl    #0x7fff,d0
                   1133:         bls     2$
                   1134:                                 | ici le(i1)> 2^15 : erreur
                   1135:         movl    #truer1,sp@-
                   1136:         jsr     _pari_err
                   1137:                                 | ici le(i1)<=2^15
                   1138: 2$:     bsr     geti            | allocation q+3 longs mots pour i1
                   1139:         movl    a0,a4
                   1140:         movw    d0,a0@(6)       | mise longueur effective de i1
                   1141:         movb    a1@(4),a0@(4)   | mise signe de i1
                   1142:         movl    a0,a3           | sauvegarde adresse i1
                   1143:         addql   #8,a0
                   1144:         addql   #8,a1           | a0,a1 pointent sur mantisses i1,r1
                   1145:         movw    a1@(-6),d1      | d1.w contient l(r1)
                   1146:         subw    d0,d1           | d1.w contient l(r1)-le(i1)
                   1147:         bpl     3$
                   1148:                                 | ici l(r1)<le(i1) : erreur
                   1149:         movl    #truer2,sp@-
                   1150:         jsr     _pari_err
                   1151:                                 | ici l(r1)>=le(i1)
                   1152: 3$:     subqw   #3,d0           | d0.w contient l(i1)-1 (compteur)
                   1153:         addqb   #1,d2           | d2.b contient exp1+1 (derniers bits)
                   1154:         andb    #31,d2          | d2.b contient exp1+1 mod 32
                   1155:         bne     4$
                   1156:                                 | ici pas de shift a faire
                   1157: 8$:     movl    a1@+,a0@+
                   1158:         dbra    d0,8$           | recopie des mantisses
                   1159:         bra     truncf
                   1160:                                 | ici d2.b shifts a faire
                   1161: 4$:     moveq   #1,d6
                   1162:         lsll    d2,d6
                   1163:         subql   #1,d6           | masque de shift
                   1164:         moveq   #0,d5
                   1165: 6$:     movl    a1@+,d3         | boucle de shift
                   1166:         roll    d2,d3
                   1167:         movl    d3,d4
                   1168:         andl    d6,d4
                   1169:         subl    d4,d3
                   1170:         addl    d5,d4
                   1171:         movl    d4,a0@+
                   1172:         movl    d3,d5
                   1173:         dbra    d0,6$
                   1174: truncf: movl    a4,d0           | d0 pointe sur resultat
                   1175: truncg: moveml  sp@+,d2-d6/a2-a4
                   1176:         unlk    a6
                   1177:         rts
                   1178:
                   1179: #===================================================================#
                   1180: #                                                                   #
                   1181: #               Fausse partie entiere (par valeur)                  #
                   1182: #                                                                   #
                   1183: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   1184: #                a7@(8) pointe sur n1 de type I ou R                #
                   1185: #       sortie : la zone pointee par a7@(8) contient trunc(n2)      #
                   1186: #       interdit : type S                                           #
                   1187: #                                                                   #
                   1188: #===================================================================#
                   1189:
                   1190: _mptruncz:movl  sp@(4),sp@-
                   1191:         bsr     _mptrunc
                   1192:         movl    sp@(12),sp@
                   1193:         movl    d0,sp@-
                   1194:         bsr     _mpaff
                   1195:         movl    d0,a0
                   1196:         addql   #8,sp
                   1197:         bra     giv
                   1198:
                   1199: #===================================================================#
                   1200: #                                                                   #
                   1201: #               Partie entiere ( max { n <= x} )                    #
                   1202: #                                                                   #
                   1203: #       entree : a7@(4) pointe sur n1 de type I ou R                #
                   1204: #       sortie : d0 pointe sur i1 de type I (zone creee)            #
                   1205: #       remarque : type S interdit                                  #
                   1206: #                                                                   #
                   1207: #===================================================================#
                   1208:
                   1209: _mpent: link    a6,#0
                   1210:         moveml  d2-d6/a2-a4,sp@-
                   1211:         movl    a6@(8),a1       | a1 pointe sur n1
                   1212:         cmpb    #1,a1@
                   1213:         bne     1$
                   1214:                                 | ici n1 est de type I
                   1215:         movw    a1@(6),d0       | d0.w recoit le1
                   1216:         bsr     geti
                   1217:         movl    a0,a4           | sauvegarde adresse resultat
                   1218:         subqw   #2,d0
                   1219:         addql   #4,a0
                   1220:         addql   #4,a1
                   1221: 6$:     movl    a1@+,a0@+
                   1222:         dbra    d0,6$
                   1223:         bra     entf
                   1224:                                 | ici n1 est de type R
                   1225: 1$:     tstb    a1@(4)
                   1226:         blt     2$
                   1227:                                 | ici n1 >= 0 (ent(n1)=trunc(n1))
                   1228:         movl    a6@(8),sp@-     | empilage adresse n1
                   1229:         bsr     _mptrunc
                   1230:         movl    d0,a4           | sauvegarde adresse resultat
                   1231:         addql   #4,sp
                   1232:         bra     entf
                   1233:                                 | ici n1 < 0
                   1234: 2$:     movl    a1@(4),d3
                   1235:         andl    #0xffffff,d3
                   1236:         subl    #0x800000,d3    | d3.l contient exp1
                   1237:         bpl     3$
                   1238:                                 | ici exp1 < 0 (ent(n1)=-1)
                   1239:         moveq   #3,d0
                   1240:         bsr     geti
                   1241:         movl    a0,a4           | sauvegarde adresse resultat
                   1242:         movl    #0xff000003,a0@(4)
                   1243:         movl    #1,a0@(8)
                   1244:         bra     entf
                   1245:                                 | ici exp1 >= 0
                   1246: 3$:     movl    _avma,a3        | ancien _avma dans var. locale
                   1247:         movl    a6@(8),sp@-     | empilage adresse n1
                   1248:         bsr     _mptrunc
                   1249:         movl    d0,a4           | sauvegarde adresse res. provisoire
                   1250:         addql   #4,sp           | depilage des parametres
                   1251:         movl    d3,d1           | d1.l contient exp1
                   1252:         lsrl    #5,d3           | d3.l contient exp1 div 32 = q
                   1253:         andl    #31,d1          | d1.l contient exp1 mod 32 = r
                   1254:         movl    a6@(8),a1
                   1255:         lea     a1@(8,d3:l:4),a2| a2 pointe q+1eme lgmot mantisse
                   1256:         movl    #0x80000000,d6  | d6.l contient 2^31
                   1257:         lsrl    d1,d6           | d6.l  contient 2^(31-r)
                   1258:         subql   #1,d6           | masque:0...01...1 avec r+1 zeros
                   1259:         moveq   #0,d2
                   1260:         movw    a1@(2),d2
                   1261:         subql   #3,d2           | d2.l contient L1-1
                   1262:         subl    d3,d2           | d2.l contient L1-1-q
                   1263:         movl    a2@+,d5         | d5.l contient le q+1 eme lgmot
                   1264:         andl    d6,d5
                   1265:         beq     4$
                   1266:         bra     5$
                   1267: 7$:     tstl    a2@+
                   1268: 4$:     dbne    d2,7$
                   1269:         bne     5$
                   1270:                                 | ici tous les lgmots sont nuls
                   1271:         bra     entf
                   1272:                                 | ici un au moins non nul
                   1273: 5$:     movl    a4,sp@-         | empilage trunc(n1)
                   1274:         movl    #0xffffffff,sp@-| empilage -1
                   1275:         bsr     _addsi          | calcul de trunc(n1)-1
                   1276:         addql   #8,sp           | depilage
                   1277:         movl    a4,a1           | a1 pointe sur trunc(n1)
                   1278:         movl    a3,a4           | a4 contient _avma ancien
                   1279:         movl    d0,a0           | a0 pointe sur resultat (res)
                   1280:         movw    a0@(2),d0       | d0.w contient l(res)
                   1281:         subqw   #1,d0           | d0.w contient l-1
                   1282: 8$:     movl    a1@-,a4@-
                   1283:         dbra    d0,8$           | transfert du resultat ds pile PARI
                   1284:         movl    a4,_avma        | mise a jour pile PARI
                   1285: entf:   movl    a4,d0           | d0 pointe sur resultat
                   1286:         moveml  sp@+,d2-d6/a2-a4
                   1287:         unlk    a6
                   1288:         rts
                   1289:
                   1290: #===================================================================#
                   1291: #                                                                   #
                   1292: #                       Partie entiere (par valeur)                 #
                   1293: #                                                                   #
                   1294: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   1295: #                a7@(8) pointe sur n1 de type I ou R                #
                   1296: #       sortie : la zone pointee par a7@(8) contient ent(n2)        #
                   1297: #       interdit : type S                                           #
                   1298: #                                                                   #
                   1299: #===================================================================#
                   1300:
                   1301: _mpentz:movl    sp@(4),sp@-
                   1302:         bsr     _mpent
                   1303:         movl    sp@(12),sp@
                   1304:         movl    d0,sp@-
                   1305:         bsr     _mpaff
                   1306:         movl    d0,a0
                   1307:         addql   #8,sp
                   1308:         bra     giv
                   1309:
                   1310:
                   1311:
                   1312:
                   1313:
                   1314: #*******************************************************************#
                   1315: #*******************************************************************#
                   1316: #**                                                               **#
                   1317: #**             PROGRAMMES DE COMPARAISON                         **#
                   1318: #**                                                               **#
                   1319: #*******************************************************************#
                   1320: #*******************************************************************#
                   1321:
                   1322:
                   1323:
                   1324:
                   1325:
                   1326: #===================================================================#
                   1327: #                                                                   #
                   1328: #                       Comparaison generale                        #
                   1329: #                                                                   #
                   1330: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   1331: #                a7@(8) pointe sur n1 de type I ou R                #
                   1332: #       sortie : d0.l contient -1 si n2<n1,0 si n2=n1,1 sinon.      #
                   1333: #                d1,a0,a1 sont sauvegardes                          #
                   1334: #       interdit : type S                                           #
                   1335: #                                                                   #
                   1336: #===================================================================#
                   1337:
                   1338: _mpcmp: link    a6,#0
                   1339:         moveml  d1-d2/a1-a2,sp@-
                   1340:         movl    a6@(8),a2
                   1341:         movl    a6@(12),a1      | a1 et a2 pointent sur n1 et n2
                   1342:         moveq   #0,d1
                   1343:         movb    a2@,d2          | d2.b contient T2
                   1344:         cmpb    a1@,d2
                   1345:         ble     1$
                   1346:                                 | ici T2 > T1
                   1347:         exg     a1,a2
                   1348:         moveq   #1,d1
                   1349:                                 | ici T2 <= T1
                   1350: 1$:     movl    a1,sp@-
                   1351:         movl    a2,sp@-
                   1352:         cmpb    #1,a1@
                   1353:         bne     2$
                   1354:                                 | ici T1 = T2 = I
                   1355:         bsr     _cmpii
                   1356:         bra     cmpf
                   1357:                                 | ici T1 = R
                   1358: 2$:     cmpb    #1,a2@
                   1359:         bne     3$
                   1360:                                 | ici T1 = R et T2 = I
                   1361:         bsr     _cmpir
                   1362:         bra     cmpf
                   1363:                                 | ici T1 = T2 = R
                   1364: 3$:     bsr     _cmprr
                   1365: cmpf:   addql   #8,sp
                   1366:         tstb    d1
                   1367:         beq     1$
                   1368:         negl    d0
                   1369: 1$:     moveml  sp@+,d1-d2/a1-a2
                   1370:         unlk    a6
                   1371:         rts
                   1372:
                   1373: #===================================================================#
                   1374: #                                                                   #
                   1375: #               Comparaison : entier court et entier                #
                   1376: #                                                                   #
                   1377: #       entree : a7@(4) contient s2 de type S                       #
                   1378: #                a7@(8) pointe sur i1 de type I                     #
                   1379: #       sortie : d0.l contient 1 si s2>i1,0 si s2=i1,-1 sinon       #
                   1380: #                d1,a0,a1 sont sauvegardes                          #
                   1381: #                                                                   #
                   1382: #===================================================================#
                   1383:
                   1384: _cmpsi: link    a6,#0
                   1385:         moveml  d1-d4/a1,sp@-
                   1386:         movl    a6@(12),a1      | a1 pointe sur i1
                   1387:         movb    a1@(4),d1       | d1.b contient signe de i1 (si1)
                   1388:         movb    d1,d4           | d4.b contient si1
                   1389:         movb    #1,d3
                   1390:         movl    a6@(8),d2       | d2.l contient s2
                   1391:         bgt     1$              | si s2 > 0
                   1392:                                 | ici s2 <= 0
                   1393:         bne     2$              | si s2 < 0
                   1394:                                 | ici s2 = 0
                   1395:         movb    #0,d3
                   1396:         bra     1$
                   1397:                                 | ici s2 < 0
                   1398: 2$:     movb    #-1,d3          | d3.b contient signe de s2 (ss2)
                   1399: 1$:     eorb    d3,d4           | d4.b contient :
                   1400:                                 | 0 si les deux nuls ou >0 ou <0
                   1401:                                 | >0 si un nul l'autre >0
                   1402:                                 | <0 si un nul autre<0,un<0 autre>0
                   1403:         bpl     3$
                   1404:                                 | ici d4.b < 0
                   1405:         moveq   #1,d0
                   1406:         tstb    d3
                   1407:         bpl     4$
                   1408:                                 | ici s2<0 et i1>0
                   1409:         moveq   #-1,d0
                   1410: 4$:     bra     cmpsif
                   1411:                                 | ici d4.b >=0
                   1412: 3$:     cmpw    #3,a1@(6)
                   1413:         ble     5$
                   1414:                                 | ici L1 >= 2
                   1415: 8$:     moveq   #-1,d0
                   1416:         tstb    d1
                   1417:         bpl     6$
                   1418:         negl    d0
                   1419: 6$:     bra     cmpsif
                   1420:                                 | ici L1 <= 1
                   1421: 5$:     cmpw    #2,a1@(6)
                   1422:         beq     7$
                   1423:                                 | ici L1 = 1
                   1424:         tstl    d2
                   1425:         bpl     9$
                   1426:         negl    d2
                   1427: 9$:     moveq   #1,d0
                   1428:         cmpl    a1@(8),d2
                   1429:         bhi     10$
                   1430:         bne     11$
                   1431:         moveq   #0,d0
                   1432:         bra     cmpsif
                   1433: 11$:    moveq   #-1,d0
                   1434: 10$:    tstb    d1
                   1435:         bpl     cmpsif
                   1436:         negl    d0
                   1437:         bra     cmpsif
                   1438: 7$:     moveq   #1,d0
                   1439:         tstb    d3
                   1440:         bne     cmpsif
                   1441:         moveq   #0,d0
                   1442: cmpsif: moveml  sp@+,d1-d4/a1
                   1443:         unlk    a6
                   1444:         rts
                   1445:
                   1446: #===================================================================#
                   1447: #                                                                   #
                   1448: #               Comparaison : entier court et reel                  #
                   1449: #                                                                   #
                   1450: #       entree : a7@(4) contient s2 de type S                       #
                   1451: #                a7@(8) pointe sur r1 de type R                     #
                   1452: #       sortie : d0.l contient 1 si s2>r1, 0 si s2=r1, -1 sinon     #
                   1453: #                d1,a0,a1 sont sauvegardes                          #
                   1454: #                                                                   #
                   1455: #===================================================================#
                   1456:
                   1457: _cmpsr: link    a6,#0
                   1458:         moveml  d1-d4/a0-a2,sp@-
                   1459:         movl    a6@(12),a1      | a1 pointe sur r1
                   1460:         movb    a1@(4),d1       | d1.b contient sr1 (signe de r1)
                   1461:         movb    d1,d4           | d4.b aussi
                   1462:         movb    #1,d3
                   1463:         movl    a6@(8),d2       | d2.l contient s2
                   1464:         bgt     1$
                   1465:         bne     2$
                   1466:         movb    #0,d3
                   1467:         bra     1$
                   1468: 2$:     movb    #-1,d3          | d3.b contient ss2 (signe de s2)
                   1469: 1$:     eorb    d3,d4           | d4.b contient 'signe'
                   1470:         bpl     3$
                   1471:                                 | ici d4.b < 0
                   1472:         moveq   #1,d0
                   1473:         tstb    d3
                   1474:         bpl     4$
                   1475:         moveq   #-1,d0
                   1476: 4$:     bra     cmpsrf
                   1477:                                 | ici d4.b >= 0
                   1478: 3$:     tstb    d1
                   1479:         bne     5$
                   1480:                                 | ici r1 = 0
                   1481:         moveq   #1,d0
                   1482:         tstb    d3
                   1483:         bne     6$
                   1484:                                 | ici s2 = r1 = 0
                   1485:         moveq   #0,d0
                   1486: 6$:     bra     cmpsrf
                   1487:                                 | ici r1 <> 0
                   1488: 5$:     movw    a1@(2),d0
                   1489:         bsr     getr            | pour copie reelle de s2
                   1490:         movl    a0,a2   | sauvegarde adresse copie
                   1491:         movl    a0,sp@-         | empilage adresse copie
                   1492:         movl    d2,sp@-         | empilage s2
                   1493:         bsr     _affsr
                   1494:         addql   #8,sp           | depilage
                   1495:         movl    a1,sp@-         | empilage adresse r1
                   1496:         movl    a0,sp@-         | empilage adresse copie
                   1497:         bsr     _cmprr
                   1498:         addql   #8,sp
                   1499:         movl    a2,a0
                   1500:         bsr     giv
                   1501: cmpsrf: moveml  sp@+,d1-d4/a0-a2
                   1502:         unlk    a6
                   1503:         rts
                   1504:
                   1505: #===================================================================#
                   1506: #                                                                   #
                   1507: #               Comparaison : entier et entier court                #
                   1508: #                                                                   #
                   1509: #       entree : a7@(4) pointe sur i2 de type I                     #
                   1510: #                a7@(8) contient s1                                 #
                   1511: #       sortie : d0.l contient le signe de i2 - s1                  #
                   1512: #                aucun autre registre n'est affecte                 #
                   1513: #                                                                   #
                   1514: #===================================================================#
                   1515:
                   1516: _cmpis: movl    sp@(4),sp@-
                   1517:         movl    sp@(12),sp@-
                   1518:         bsr     _cmpsi
                   1519:         addql   #8,sp
                   1520:         negl    d0
                   1521:         rts
                   1522:
                   1523: #===================================================================#
                   1524: #                                                                   #
                   1525: #               Comparaison : entier et entier                      #
                   1526: #                                                                   #
                   1527: #       entree : a7@(4) pointe sur i2 de type I                     #
                   1528: #                a7@(8) pointe sur i1 de type I                     #
                   1529: #       sortie : d0.l contient :1 si i2>i1,0 si i2=i1,-1 sinon      #
                   1530: #                d1,a0,a1 sont sauvegardes                          #
                   1531: #                                                                   #
                   1532: #===================================================================#
                   1533:
                   1534: _cmpii: link    a6,#0
                   1535:         moveml  d1-d4/a1-a2,sp@-
                   1536:         movl    a6@(8),a2
                   1537:         movl    a6@(12),a1      | a1, a2 pointent sur i1, i2
                   1538:         movb    a1@(4),d1       | d1.b contient si1
                   1539:         movb    d1,d4
                   1540:         movb    a2@(4),d2       | d2.b contient si2
                   1541:         eorb    d2,d4
                   1542:         bpl     1$
                   1543:                                 | ici d4.b < 0
                   1544:         moveq   #1,d0
                   1545:         tstb    d2
                   1546:         bpl     cmpiif
                   1547:         moveq   #-1,d0
                   1548:         bra     cmpiif
                   1549:                                 | ici d4.b >= 0
                   1550: 1$:     movw    a1@(6),d1
                   1551:         movw    a2@(6),d2       | d1.w et d2.w contiennent le1 et le2
                   1552:         cmpw    d1,d2
                   1553:         blt     3$
                   1554:         beq     4$
                   1555:                                 | ici le2 > le1
                   1556: 6$:     moveq   #1,d0
                   1557:         tstb    a1@(4)
                   1558:         bpl     cmpiif
                   1559:         moveq   #-1,d0
                   1560:         bra     cmpiif
                   1561:                                 | ici le2 < le1
                   1562: 3$:     moveq   #-1,d0
                   1563:         tstb    a2@(4)
                   1564:         bpl     cmpiif
                   1565:         moveq   #1,d0
                   1566:         bra     cmpiif
                   1567:                                 | ici le2 = le1
                   1568: 4$:     cmpw    #2,d1
                   1569:         bne     7$
                   1570:         moveq   #0,d0
                   1571:         bra     cmpiif
                   1572:                                 | ici i1 et i2 <> 0
                   1573: 7$:     movb    a1@(4),d3
                   1574:         addql   #8,a1
                   1575:         addql   #8,a2
                   1576:         subqw   #3,d1
                   1577: 11$:    cmpml   a1@+,a2@+
                   1578:         dbne    d1,11$
                   1579:         bhi     8$
                   1580:         beq     9$
                   1581:         moveq   #-1,d0
                   1582:         bra     10$
                   1583: 9$:     moveq   #0,d0
                   1584:         bra     cmpiif
                   1585: 8$:     moveq   #1,d0
                   1586: 10$:    tstb    d3
                   1587:         bpl     cmpiif
                   1588:         negl    d0
                   1589: cmpiif: moveml  sp@+,d1-d4/a1-a2
                   1590:         unlk    a6
                   1591:         rts
                   1592:
                   1593: #===================================================================#
                   1594: #                                                                   #
                   1595: #               Comparaison : entier et reel                        #
                   1596: #                                                                   #
                   1597: #       entree : a7@(4) pointe sur i2 de type R                     #
                   1598: #                a7@(8) pointe sur r1 de type R                     #
                   1599: #       sortie : d0.l contient :1 si i2>r1,0 si i2=r1,-1 sinon      #
                   1600: #                d1,a0,a1 sont sauvegardes                          #
                   1601: #                                                                   #
                   1602: #===================================================================#
                   1603:
                   1604: _cmpir: link    a6,#0
                   1605:         moveml  d1-d4/a0-a3,sp@-
                   1606:         movl    a6@(8),a2
                   1607:         movl    a6@(12),a1      | a1 et a2 pointent sur r1 et i2
                   1608:         movb    a1@(4),d1
                   1609:         movb    d1,d4
                   1610:         movb    a2@(4),d2
                   1611:         eorb    d2,d4
                   1612:         bpl     1$
                   1613:         moveq   #1,d0
                   1614:         tstb    d2
                   1615:         bpl     2$
                   1616:         moveq   #-1,d0
                   1617: 2$:     bra     cmpirf
                   1618:                                 | ici d4.b >= 0
                   1619: 1$:     tstb    d1
                   1620:         bne     3$
                   1621:         moveq   #1,d0
                   1622:         tstb    d2
                   1623:         bne     4$
                   1624:         moveq   #0,d0
                   1625: 4$:     bra     cmpirf
                   1626:                                 | ici faire copie de i2 en type R
                   1627: 3$:     movw    a1@(2),d0       | allouer memoire pour copie de i2
                   1628:         bsr     getr
                   1629:         movl    a0,a3
                   1630:         movl    a0,sp@-         | empiler adresse copie
                   1631:         movl    a2,sp@-         | empiler adresse i2
                   1632:         bsr     _affir
                   1633:         addql   #8,sp           | depiler
                   1634:         movl    a1,sp@-         | empiler adresse r1
                   1635:         movl    a0,sp@-         | empiler adresse copie
                   1636:         bsr     _cmprr
                   1637:         addql   #8,sp           | depiler
                   1638:         movl    a3,a0
                   1639:         bsr     giv             | rendre copie
                   1640: cmpirf: moveml  sp@+,d1-d4/a0-a3
                   1641:         unlk    a6
                   1642:         rts
                   1643:
                   1644: #===================================================================#
                   1645: #                                                                   #
                   1646: #               Comparaison : reel et entier court                  #
                   1647: #                                                                   #
                   1648: #       entree : a7@(4) pointe sur r2 de type R                     #
                   1649: #                a7@(8) contient s1                                 #
                   1650: #       sortie : d0.l contient le signe de r2 - s1                  #
                   1651: #                aucun autre registre n'est affecte                 #
                   1652: #                                                                   #
                   1653: #===================================================================#
                   1654:
                   1655: _cmprs: movl    sp@(4),sp@-
                   1656:         movl    sp@(12),sp@-
                   1657:         bsr     _cmpsr
                   1658:         addql   #8,sp
                   1659:         negl    d0
                   1660:         rts
                   1661:
                   1662: #===================================================================#
                   1663: #                                                                   #
                   1664: #               Comparaison : reel et entier                        #
                   1665: #                                                                   #
                   1666: #       entree : a7@(4) pointe sur r2 de type R                     #
                   1667: #                a7@(8) contient i1                                 #
                   1668: #       sortie : d0.l contient le signe de r2 - i1                  #
                   1669: #                aucun autre registre n'est affecte                 #
                   1670: #                                                                   #
                   1671: #===================================================================#
                   1672:
                   1673: _cmpri: movl    sp@(4),sp@-
                   1674:         movl    sp@(12),sp@-
                   1675:         bsr     _cmpir
                   1676:         addql   #8,sp
                   1677:         negl    d0
                   1678:         rts
                   1679:
                   1680: #===================================================================#
                   1681: #                                                                   #
                   1682: #               Comparaison : reel et reel                          #
                   1683: #                                                                   #
                   1684: #       entree : a7@(4) pointe sur r2 de type R                     #
                   1685: #                a7@(8) pointe sur r1 de type R                     #
                   1686: #       sortie : d0.l contient :1 si r2>r1,0 si r2=r1,-1 sinon      #
                   1687: #                d1,a0,a1 sont sauvegardes                          #
                   1688: #                                                                   #
                   1689: #===================================================================#
                   1690:
                   1691: _cmprr: link    a6,#0
                   1692:         moveml  d1-d5/a1-a2,sp@-
                   1693:         movl    a6@(8),a2
                   1694:         movl    a6@(12),a1      | a1 et a2 pointent sur r1 et r2
                   1695:         movb    a1@(4),d1
                   1696:         movb    d1,d4
                   1697:         movb    a2@(4),d2
                   1698:         eorb    d2,d4
                   1699:         bpl     1$
                   1700:                                 | ici d4.b < 0
                   1701:         moveq   #1,d0
                   1702:         tstb    d2
                   1703:         bpl     2$
                   1704:         moveq   #-1,d0
                   1705: 2$:     bra     cmprrf
                   1706:                                 | ici d4.b >= 0
                   1707: 1$:     tstb    d1
                   1708:         bne     3$
                   1709:         moveq   #1,d0
                   1710:         tstb    d2
                   1711:         bne     4$
                   1712:         moveq   #0,d0
                   1713: 4$:     bra     cmprrf
                   1714: 3$:     tstb    a2@(4)
                   1715:         bne     5$
                   1716:         moveq   #-1,d0
                   1717:         bra     cmprrf
                   1718:                                 | ici r2 <> 0
                   1719: 5$:     moveq   #1,d0
                   1720:         movw    a1@(2),d1
                   1721:         movw    a2@(2),d2
                   1722:         cmpw    d1,d2
                   1723:         bpl     6$
                   1724:         exg     d1,d2
                   1725:         exg     a1,a2
                   1726:         moveq   #-1,d0
                   1727: 6$:     tstb    a2@(4)
                   1728:         bpl     7$
                   1729:         negl    d0
                   1730: 7$:     movl    a1@(4),d5
                   1731:         andl    #0xffffff,d5
                   1732:         movl    a2@(4),d3
                   1733:         andl    #0xffffff,d3
                   1734:         cmpl    d5,d3
                   1735:         bpl     8$
                   1736: 10$:    negl    d0
                   1737:         bra     cmprrf
                   1738: 8$:     bne     cmprrf
                   1739:         subw    d1,d2
                   1740:         subqw   #3,d1
                   1741:         addql   #8,a1
                   1742:         addql   #8,a2
                   1743: 9$:     cmpml   a1@+,a2@+
                   1744:         dbne    d1,9$
                   1745:         bcs     10$
                   1746:         beq     11$
                   1747:         bra     cmprrf
                   1748: 12$:    tstl    a2@+
                   1749: 11$:    dbne    d2,12$
                   1750:         bne     cmprrf
                   1751:         moveq   #0,d0
                   1752: cmprrf: moveml  sp@+,d1-d5/a1-a2
                   1753:         unlk    a6
                   1754:         rts
                   1755:
                   1756:
                   1757:
                   1758:
                   1759:
                   1760: #*******************************************************************#
                   1761: #*******************************************************************#
                   1762: #**                                                               **#
                   1763: #**                     PROGRAMMES D'ADDITION                     **#
                   1764: #**                                                               **#
                   1765: #*******************************************************************#
                   1766: #*******************************************************************#
                   1767:
                   1768:
                   1769:
                   1770:
                   1771:
                   1772: #===================================================================#
                   1773: #                                                                   #
                   1774: #                       Addition generale                           #
                   1775: #                                                                   #
                   1776: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   1777: #                a7@(8) pointe sur n1 de type I ou R                #
                   1778: #       sortie : d0 pointe sur n2 + n1 de type I ou R (zone creee)  #
                   1779: #       interdit : type S                                           #
                   1780: #       precision : voir les formules des routines specalisees      #
                   1781: #                                                                   #
                   1782: #===================================================================#
                   1783:
                   1784: _mpadd: movl    sp@(4),a0
                   1785:         movl    sp@(8),a1       | a1 et a0 pointent sur n1 et n2
                   1786:         movb    a0@,d0
                   1787:         movb    a1@,d1          | d1.b et d0.b contiennent T1 et T2
                   1788:         cmpb    d1,d0
                   1789:         ble     1$
                   1790:                                 | ici T2 > T1
                   1791:         exg     a1,a0
                   1792:         exg     d1,d0
                   1793:         movl    a0,sp@(4)
                   1794:         movl    a1,sp@(8)
                   1795:                                 | ici T2 <= T1
                   1796: 1$:     cmpb    #1,d1
                   1797:         beq     _addii          | ici T1 = T2 = I
                   1798: 2$:     cmpb    #2,d0
                   1799:         beq     _addrr          | ici T1 = T2 = R
                   1800:         bra     _addir
                   1801:
                   1802: #===================================================================#
                   1803: #                                                                   #
                   1804: #                       Addition (par valeur)                       #
                   1805: #                                                                   #
                   1806: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   1807: #                a7@(8) pointe sur n1 de type I ou R                #
                   1808: #                a7@(12) pointe sur n3 de type I ou R               #
                   1809: #       sortie : la zone pointee par a7@(12) contient n2+n1         #
                   1810: #       interdit : type S                                           #
                   1811: #                                                                   #
                   1812: #===================================================================#
                   1813:
                   1814: _mpaddz:lea     _mpadd,a0
                   1815:         bra     mpopz
                   1816:
                   1817:                                 | addition S+S=I ou R
                   1818:
                   1819: _addssz:lea     _addss,a0
                   1820:         bra     mpopz
                   1821:
                   1822:                                 | addition S+I=I ou R
                   1823:
                   1824: _addsiz:lea     _addsi,a0
                   1825:         bra     mpopz
                   1826:
                   1827:                                 | addition S+R=R sinon erreur
                   1828:
                   1829: _addsrz:lea     _addsr,a0
                   1830:         bra     mpopz
                   1831:
                   1832:                                 | addition I+I=I ou R
                   1833:
                   1834: _addiiz:lea     _addii,a0
                   1835:         bra     mpopz
                   1836:
                   1837:                                 | addition I+R=R sinon erreur
                   1838:
                   1839: _addirz:lea     _addir,a0
                   1840:         bra     mpopz
                   1841:
                   1842:                                 | addition R+R=R sinon erreur
                   1843:
                   1844: _addrrz:lea     _addrr,a0
                   1845:         bra     mpopz
                   1846:
                   1847: #===================================================================#
                   1848: #                                                                   #
                   1849: #    Addition : entier court + entier court = entier                #
                   1850: #                                                                   #
                   1851: #       entree : a7@(4) contient s2 de type S                       #
                   1852: #                a7@(8) contient s1 de type S                       #
                   1853: #       sortie : d0 pointe sur s1+s2 de type I(zone cree)           #
                   1854: #       remarque : s1 + s2 = s0 est interdit                        #
                   1855: #                                                                   #
                   1856: #===================================================================#
                   1857:
                   1858: _addss: link    a6,#-2
                   1859:         movl    d2,sp@-
                   1860:         movl    a6@(8),d1
                   1861:         movl    a6@(12),d2
                   1862:         addl    d2,d1           | d1.l contient s2 + s1
                   1863:         bne     1$
                   1864:                                 | ici d1.l=0
                   1865:         bvs     2$
                   1866:                                 | ici s1+s2=0
                   1867:        movl    _gzero,d0
                   1868:         bra     addssg
                   1869:                                 | ici s1+s2=-2^32 (s1=s2=-2^31)
                   1870: 2$:     movw    #4,d0
                   1871:         bsr     geti
                   1872:         movl    #0xff000004,a0@(4)
                   1873:         movl    #1,a0@(8)
                   1874:         clrl    a0@(12)
                   1875:         bra     addssf
                   1876:                                 | ici d1.l<>0
                   1877: 1$:     movw    #3,d0
                   1878:         bsr     geti
                   1879:         movl    #0x1000003,a0@(4)
                   1880:         addl    a6@(8),d2       | repositionne les indicateurs
                   1881:         bvs     3$
                   1882:                                 | ici pas d'overflow
                   1883:         bmi     4$              | d1 donne bien le signe du resultat
                   1884:         bra     5$
                   1885:                                 | ici overflow
                   1886: 3$:     bcc     5$              | le carry donne le signe du resultat
                   1887: 4$:     negl    d1
                   1888:         movb    #0xff,a0@(4)
                   1889: 5$:     movl    d1,a0@(8)
                   1890: addssf: movl    a0,d0           | d0 pointe sur resultat
                   1891: addssg: movl    sp@,d2
                   1892:         unlk    a6
                   1893:         rts
                   1894:
                   1895: #===================================================================#
                   1896: #                                                                   #
                   1897: #               Addition : entier court + entier = entier           #
                   1898: #                                                                   #
                   1899: #       entree : a7@(4) contient s2 de type S                       #
                   1900: #                a7@(8) pointe sur i1 de type I                     #
                   1901: #       sortie : d0 pointe sur s2 + i1 de type I (zone creee)       #
                   1902: #                                                                   #
                   1903: #===================================================================#
                   1904:
                   1905: _addsi: link    a6,#0
                   1906:         moveml  d2-d4/a2,sp@-
                   1907:         movl    a6@(12),a1      | a1 pointe sur i1
                   1908:         movl    a6@(8),d2       | d2.l contient s2
                   1909:         bne     1$              | si s2 <> 0
                   1910:                                 | ici s2 = 0 (i1 + s2 = i1)
                   1911:         movw    a1@(6),d0
                   1912:         bsr     geti            | allocation memoire pour resultat
                   1913:         movl    a0,d4
                   1914:         subqw   #2,d0           | compteur de boucle pour recopie de i1
                   1915:         addql   #4,a0
                   1916:         addql   #4,a1
                   1917: 2$:     movl    a1@+,a0@+       | recopie de i1
                   1918:         dbra    d0,2$
                   1919:         bra     addsif
                   1920:                                 | ici s2 <> 0
                   1921: 1$:     tstb    a1@(4)
                   1922:         bne     3$              | si i1 <> 0
                   1923:                                 | ici i1 = 0 (i1 + s2 = s2)
                   1924:         moveq   #3,d0
                   1925:         bsr     geti            | allocation memoire pour resultat
                   1926:         movl    a0,d4
                   1927:         movl    #0x1000003,a0@(4)
                   1928:         movl    d2,a0@(8)
                   1929:
                   1930:         bpl     addsif
                   1931:                                 | ici s2 < 0
                   1932:         movb    #0xff,a0@(4)
                   1933:         negl    a0@(8)
                   1934:         bra     addsif
                   1935:                                 | ici s2 et i1 <> 0
                   1936: 3$:     movw    a1@(6),d0       | d0.w contient le1
                   1937:         bsr     geti
                   1938:         movl    a0,d4
                   1939:         movw    a1@(4),d1
                   1940:         extl    d1              | d1.l contient signe de i1
                   1941:         lea     a0@(0,d0:w:4),a0
                   1942:         lea     a1@(0,d0:w:4),a2| a0 pointe fin du resultat;a2 fin de i1
                   1943:         moveq   #0,d3
                   1944:         subqw   #3,d0           | d0.w compteur boucle addition
                   1945:         eorl    d2,d1           | comparaison signes i1 et s2
                   1946:         bmi     susi            | si i1 * s2 < 0
                   1947:                                 | ici i1 * s2 > 0
                   1948:         tstl    d2
                   1949:         bpl     51$             | valeur absolue de s2
                   1950:         negl    d2
                   1951: 51$:    addl    a2@-,d2
                   1952:         bra     4$              | boucle d'addition
                   1953: 5$:     movl    d2,a0@-
                   1954:         movl    a2@-,d2
                   1955:         addxl   d3,d2
                   1956: 4$:     dbra    d0,5$
                   1957:         bcc     6$              | ici retenue finale
                   1958:         movl    d2,a0@-         | mise a jour dernier long mot
                   1959:         moveq   #1,d0
                   1960:         bsr     geti            | allocation un long mot supplementaire
                   1961:         movl    a0,d4
                   1962:         movl    a0@(4),a0@
                   1963:         addqw   #1,a0@(2)       | mise a jour premier long mot code
                   1964:         cmpw    #0x7fff,a0@(2)
                   1965:         bls     7$
                   1966:                                 | ici debordement
                   1967:         movl    #adder1,sp@-
                   1968:         jsr     _pari_err
                   1969: 7$:     movw    a0@(2),a0@(6)   | mise longueur effective
                   1970:        movw    a1@(4),a0@(4)   | signe du resultat
                   1971:         movl    #1,a0@(8)       | mise a jour retenue finale
                   1972:         bra     8$
                   1973:                                 | ici pas de retenue finale
                   1974: 6$:     movl    d2,a0@-         | mise a jour dernier long mot
                   1975:         subqw   #8,a0
                   1976:         movw    a0@(2),a0@(6)   | longueur effective
                   1977:        movw    a1@(4),a0@(4)   | signe du resultat
                   1978: 8$:     movl    a0,d4
                   1979: addsif: movl    d4,d0           | d0 pointe sur resultat
                   1980:         moveml  sp@+,d2-d4/a2
                   1981:         unlk    a6
                   1982:         rts
                   1983:                                 | ici i1 * s2 < 0 : soustraction
                   1984: susi:   movl    d2,d1           | d1.l recoit s2
                   1985:         bpl     6$
                   1986:         negl    d1              | d1.l recoit |s2|
                   1987: 6$:     movl    a2@-,d2
                   1988:         subl    d1,d2           | amorcage de la soustraction
                   1989:         bra     1$
                   1990:                                 | boucle de soustraction
                   1991: 2$:     movl    d2,a0@-
                   1992:         movl    a2@-,d2
                   1993:         subxl   d3,d2
                   1994: 1$:     dbra    d0,2$
                   1995:         bcc     3$
                   1996:                                 | ici retenue finale:longueur resultat=3
                   1997:         negl    d2
                   1998:         movl    d2,a0@-
                   1999:         subql   #8,a0           | a0 pointe sur resultat
                   2000:         movw    #3,a0@(6)       | mise a jour longueur effective
                   2001:         movb    a1@(4),d2
                   2002:         negb    d2
                   2003:         movb    d2,a0@(4)       | mise a jour signe (-|i1|)
                   2004:         bra     addsif
                   2005:                                 | ici pas de retenue finale
                   2006: 3$:     tstl    d2
                   2007:         beq     4$
                   2008:                                 | ici d2 <> 0
                   2009:         movl    d2,a0@-
                   2010:         movl    a1@(4),a0@-     | mise a jour second long mot code
                   2011:         bra     addsif
                   2012:                                 | ici d2 = 0
                   2013: 4$:     movl    a1@(4),a0@-
                   2014:         subqw   #1,a0@(2)
                   2015:         cmpw    #2,a0@(2)
                   2016:         bne     5$
                   2017:                                 | ici L1 = 1 ; le resultat est 0
                   2018:         clrb    a0@
                   2019: 5$:     movl    a0@(-8),a0@-
                   2020:         subqw   #1,a0@(2)
                   2021:         movl    a0,d4
                   2022:         addql   #4,_avma                | mise a jour pile PARI
                   2023:         bra     addsif
                   2024:
                   2025: #===================================================================#
                   2026: #                                                                   #
                   2027: #               Addition : entier + entier = entier                 #
                   2028: #                                                                   #
                   2029: #       entree : a7@(4) pointe sur i2 de type I                     #
                   2030: #                a7@(8) pointe sur i1 de type I                     #
                   2031: #       sortie : d0 pointe sur i2 + i1 de type I (zone creee)       #
                   2032: #                                                                   #
                   2033: #===================================================================#
                   2034:
                   2035: _addii: link    a6,#0
                   2036:         moveml  d2-d7/a2-a4,sp@-
                   2037:         movl    a6@(8),a2       | a2 pointe sur i2
                   2038:         movl    a6@(12),a1      | a1 pointe sur i1
                   2039:         moveq   #0,d2
                   2040:         moveq   #0,d1
                   2041:         movw    a2@(6),d2
                   2042:         movw    a1@(6),d1       | d1.w recoit le1 et d2.w recoit le2
                   2043:         cmpw    d1,d2
                   2044:         bcc     1$
                   2045:         exg     a1,a2
                   2046:         exg     d1,d2           | si L2 < L1 ,echanger a1,a2 et d1,d2
                   2047:                                 | ici L2 >= L1
                   2048: 1$:     tstb    a1@(4)
                   2049:         bne     2$              | ici i1 = 0 : i1 + i2 = i2
                   2050:         movw    a2@(6),d0
                   2051:         bsr     geti            | allocation memoire pour recopie de i2
                   2052:         subqw   #2,d0           | compteur de recopie
                   2053:         movl    a0,a1
                   2054:         addql   #4,a1
                   2055:         addql   #4,a2
                   2056:                                 | boucle de recopie
                   2057: 3$:     movl    a2@+,a1@+
                   2058:         dbra    d0,3$
                   2059:         bra     addiif
                   2060:                                 | ici i1 <> 0 ( donc i2 <> 0)
                   2061: 2$:     movb    a1@(4),d3
                   2062:         movb    a2@(4),d4
                   2063:         eorb    d4,d3           | d3 contient signe de i2 * i1
                   2064:         bmi     suii
                   2065:                                 | ici i2 * i1 > 0
                   2066:         movw    d2,d0
                   2067:         bsr     geti            | allocation memoire le2 longs mots
                   2068:         lea     a0@(0,d0:w:4),a0| a0 pointe fin du resultat
                   2069:         lea     a2@(0,d0:w:4),a2| a2 pointe fin de i2
                   2070:         lea     a1@(0,d1:w:4),a1| a1 pointe fin de i1
                   2071:         subw    d1,d2           | d2.w contient L2-L1
                   2072:         subqw   #3,d1           | d1.w contient L1-1 (compteur)
                   2073:         moveq   #0,d4
                   2074:                                 | ici premiere boucle d'addition
                   2075: 4$:     movl    a1@-,d0
                   2076:         movl    a2@-,d5
                   2077:         addxl   d5,d0
                   2078:         movl    d0,a0@-
                   2079:         dbra    d1,4$
                   2080:         roxrw   d4,d0           | mise a jour dernier long mot
                   2081:         bra     5$
                   2082:                                 | ici deuxieme boucle:propagation carry
                   2083: 6$:     movl    a2@-,d0
                   2084:         addxl   d4,d0
                   2085:         movl    d0,a0@-
                   2086:         roxrw   d4,d0
                   2087: 5$:     dbcc    d2,6$
                   2088:         bcs     7$              | si carry jusqu'a la fin
                   2089:                                 | ici pas de carry
                   2090:         bra     8$
                   2091:                                 | ici troisieme boucle:recopie mantisse
                   2092: 9$:     movl    a2@-,a0@-
                   2093: 8$:     dbra    d2,9$
                   2094:                                 | ici pas de carry finale
                   2095:         movl    a2@-,a0@-
                   2096:         subql   #4,a0
                   2097:         bra     addiif
                   2098:                                 | ici carry finale
                   2099: 7$:     movw    a2@(-2),d2
                   2100:         addqw   #1,d2
                   2101:         cmpw    #0x8000,d2
                   2102:         bcs     10$
                   2103:                                 | ici debordement
                   2104:         movl    #adder2,sp@-
                   2105:         jsr     _pari_err
                   2106:                                 | ici demander 1 long mot en plus
                   2107: 10$:    moveq   #1,d0
                   2108:         bsr     geti
                   2109:         movl    #1,a0@(8)       | mise retenue
                   2110:         movl    a0@(4),a0@
                   2111:         movw    d2,a0@(2)       | mise a jour premier long mot code
                   2112:         movl    a2@-,a0@(4)
                   2113:         movw    d2,a0@(6)       | idem deuxieme long mot code
                   2114: addiif: movl    a0,d0           | d0 pointe sur resultat
                   2115: addiig: moveml  sp@+,d2-d7/a2-a4
                   2116:         unlk    a6
                   2117:         rts
                   2118:                                 | ici i2 * i1 < 0 : soustraction
                   2119: suii:   movl    a1,a3
                   2120:         movl    a2,a4           | a3,a4 pointent sur i1,i2
                   2121:         subw    d1,d2           | d2.w contient L2-L1
                   2122:         bne     1$
                   2123:                                 | ici L2=L1
                   2124:         subqw   #3,d1           | d1.w  contient L1-1
                   2125:         addql   #8,a3
                   2126:         addql   #8,a4           | a3,a4 pointent debut mantisses i1,i2
                   2127: 2$:     cmpml   a3@+,a4@+
                   2128:         dbne    d1,2$           | on compare |i1| et |i2|
                   2129:         bhi     1$              | si |i2| > |i1|
                   2130:                                 | ici |i2| < |i1|
                   2131:         bne     3$
                   2132:                                 | ici |i2| = |i1| : i2 + i1 = 0
                   2133:        movl    _gzero,d0
                   2134:         bra     addiig
                   2135:                                 | ici |i2| < |i1| : echanger i2 et i1
                   2136: 3$:     exg     a1,a2
                   2137:                                 | ici |i2| > |i1| (signe i2=signe resultat)
                   2138: 1$:     movw    a2@(6),d0
                   2139:         bsr     geti            | allocation memoire le2 longs mots
                   2140:         movw    a1@(6),d1       | d1.w  contient L1+2
                   2141:         movl    a0,sp@-         | empilage adresse resultat
                   2142:         movb    a2@(4),d7       | d7.b  contient signe resultat
                   2143:         lea     a1@(0,d1:w:4),a1
                   2144:         lea     a2@(0,d0:w:4),a2
                   2145:         lea     a0@(0,d0:w:4),a0| a0,a1,a2 pointent fin resultat,i1,i2
                   2146:         subl    d3,d3           | initialisation bit X
                   2147:         subqw   #3,d1           | d1.w contient L1-1 (compteur)
                   2148:                                 | premiere boucle de soustraction
                   2149: 4$:     movl    a2@-,d0
                   2150:         movl    a1@-,d5
                   2151:         subxl   d5,d0
                   2152:         movl    d0,a0@-
                   2153:         dbra    d1,4$
                   2154:         roxrw   d3,d0           | restauration du bit C
                   2155:         bra     5$
                   2156:                                 | deuxieme boucle:propagation carry
                   2157: 6$:     movl    a2@-,d5
                   2158:         subxl   d3,d5
                   2159:         movl    d5,a0@-
                   2160:         roxrw   d3,d0
                   2161: 5$:     dbcc    d2,6$
                   2162:         bra     7$
                   2163:                                 | troisieme boucle:recopie fin i2
                   2164: 8$:     movl    a2@-,a0@-
                   2165: 7$:     dbra    d2,8$
                   2166:         movl    sp@+,a0         | depilage adresse resultat
                   2167:         movw    a0@(2),d1       | d1.w contient lon eff du resultat
                   2168:         moveq   #0,d2
                   2169:         movw    d1,d2           | d2.w idem
                   2170:         addql   #8,a0           | a0 pointe mantisse resultat
                   2171: 9$:     tstl    a0@+
                   2172:         dbne    d1,9$           | chasse aux '0' partie gauche resultat
                   2173:         subql   #4,a0           | a0 pointe 1er long mot non nul
                   2174:         movl    d1,a0@-         | mise a jour longueur effective
                   2175:         movb    d7,a0@          | mise a jour signe
                   2176:         movw    d1,a0@-         | mise a jour longueur totale
                   2177:         movw    #0x100,a0@-     | mise a jour type
                   2178:         subw    d1,d2
                   2179:         lsll    #2,d2
                   2180:         addl    d2,_avma                | mise a jour pile PARI
                   2181:         bra     addiif
                   2182:
                   2183: #===================================================================#
                   2184: #                                                                   #
                   2185: #               Addition : entier court + reel = reel               #
                   2186: #                                                                   #
                   2187: #       entree : a7@(4) contient s2 de type S                       #
                   2188: #                a7@(8) pointe sur r1 de type R                     #
                   2189: #       sortie : d0 pointe sur s2 + r1 de type R (zone creee)       #
                   2190: #                                                                   #
                   2191: #===================================================================#
                   2192:
                   2193: _addsr: link    a6,#-12         | 3 lgmots pour transformer s2 en type I
                   2194:         movl    a6@(8),d1       | d1.l contient s2
                   2195:         bne     1$
                   2196:                                 | ici s2 = 0
                   2197:         movl    #0x1000002,a6@(-12)
                   2198:         movl    #2,a6@(-8)
                   2199:         bra     3$
                   2200:                                 | ici s2 <> 0
                   2201: 1$:     bmi     2$
                   2202:         movl    #0x1000003,a6@(-12)
                   2203:         movl    #0x1000003,a6@(-8)
                   2204:         movl    d1,a6@(-4)
                   2205:         bra     3$
                   2206:                                 | ici s2 < 0
                   2207: 2$:     movl    #0x1000003,a6@(-12)
                   2208:         movl    #0xff000003,a6@(-8)
                   2209:         negl    d1
                   2210:         movl    d1,a6@(-4)
                   2211: 3$:     movl    a6@(12),sp@-
                   2212:         pea     a6@(-12)
                   2213:         bsr     _addir
                   2214:         unlk    a6
                   2215:         rts
                   2216:
                   2217: #===================================================================#
                   2218: #                                                                   #
                   2219: #               Addition : entier + reel = reel                     #
                   2220: #                                                                   #
                   2221: #       entree : a7@(4) pointe sur i2 de type I                     #
                   2222: #                a7@(8) pointe sur r1 de type R                     #
                   2223: #       sortie : d0 pointe sur i2 + r1 de type R (zone creee)       #
                   2224: #       precision : si exp2>=exp1 , L = L1 + int((exp2-exp1)/32) + 1#
                   2225: #                   si exp2<exp1  , L = L1                          #
                   2226: #                   i2 est transforme en un reel                    #
                   2227: #                                                                   #
                   2228: #===================================================================#
                   2229:
                   2230: _addir: link    a6,#-4          | var. locale pour copie i2 en r2
                   2231:         moveml  d2-d3/a2,sp@-
                   2232:         movl    a6@(8),a2
                   2233:         movl    a6@(12),a1      | a1,a2 pointent sur r1,i2
                   2234:         tstb    a2@(4)
                   2235:         bne     1$
                   2236:                                 | ici i2 = 0 ( i2 + r1 = r1)
                   2237: 6$:     movw    a1@(2),d0
                   2238:         bsr     getr
                   2239:         movl    a0,a6@(-4)      | sauve adresse resultat
                   2240:         addql   #4,a1
                   2241:         addql   #4,a0
                   2242:         subqw   #2,d0
                   2243:                                 | boucle de copie d'un reel
                   2244: 4$:     movl    a1@+,a0@+
                   2245:         dbra    d0,4$
                   2246:         bra     addirf
                   2247:                                 | ici i2 <> 0
                   2248: 1$:     tstb    a1@(4)
                   2249:         bne     3$
                   2250:                                 | ici r1 = 0 (i2 + r1 = i2)
                   2251:         movl    a1@(4),d1
                   2252:         subl    #0x800000,d1
                   2253:         asrl    #5,d1
                   2254:         moveq   #0,d0
                   2255:         movw    a2@(6),d0
                   2256:         subl    d1,d0           | d0.l contient L2-[exp1/32]
                   2257:         cmpl    #3,d0
                   2258:         bcs     2$
                   2259:         cmpl    #0x8000,d0
                   2260:         bcc     2$
                   2261:         bsr     getr
                   2262:         movl    a0,a6@(-4)
                   2263:         movl    a0,sp@-
                   2264:         movl    a2,sp@-
                   2265:         bsr     _affir          | le resultat est i2 en type R
                   2266:         addql   #8,sp           | de longueur L2-[exp1/32]
                   2267:         bra     addirf
                   2268:                                 | ici i2 et r1 <> 0
                   2269: 3$:     movl    a2@(8),d0
                   2270:         bfffo   d0{#0:#0},d1    | d1.l recoit nb de shifts (=s)
                   2271:         moveq   #0,d0
                   2272:         movw    a2@(6),d0
                   2273:         subqw   #2,d0
                   2274:         lsll    #5,d0
                   2275:         subl    d1,d0
                   2276:         subql   #1,d0           | d0.l recoit 32*L2-s-1 = exp2
                   2277:         moveq   #0,d3
                   2278:         movw    a1@(2),d3       | d3.w recoit l1
                   2279:         movl    a1@(4),d2
                   2280:         andl    #0xffffff,d2
                   2281:         subl    #0x800000,d2    | d2.l recoit exp1
                   2282:         subl    d0,d2           | d2.l recoit exp1-exp2
                   2283:         ble     5$
                   2284:                                 | ici exp1 > exp2
                   2285:         lsrl    #5,d2           | d2.l recoit L3=[(exp1-exp2)/32]
                   2286:         subl    d2,d3           | d3.l recoit L1-L3+2
                   2287:         cmpl    #2,d3
                   2288:         ble     6$              | si L1 <= L3 alors:r1+i2=r1
                   2289:                                 | ici L1 > L3
                   2290: 7$:     movl    _avma,sp@-      | empilage pile PARI
                   2291:         movw    d3,d0
                   2292:         bsr     getr            | allocation memoire L1-L3+2 lg mots
                   2293:                                 | pour ecrire i2 en type R
                   2294:         movl    a0,sp@-         | empilage r2 (copie de i2)
                   2295:         movl    a2,sp@-         | empilage i2
                   2296:         bsr     _affir
                   2297:         movl    a1,sp@          | empilage r1
                   2298:         bsr     _addrr
                   2299:         movl    d0,a0           | a0 pointe sur r2 + r1
                   2300:         movw    a0@(2),d0       | d0.w contient lr (longueur resultat)
                   2301:         subqw   #1,d0           | d0.w contient lr-1 (compteur pile)
                   2302:         movl    sp@(4),a1       | a1 pointe sur r2
                   2303:         addql   #8,sp           | depilage r1 et r2
                   2304:         moveq   #0,d1
                   2305:         movw    a1@(2),d1
                   2306:         lsll    #2,d1           | d1.l contient 4*l2 (nb d'octets a
                   2307:                                 | desallouer dans pile PARI)
                   2308:
                   2309:         movl    sp@+,a0         | a0 pointe sur ancien _avma
                   2310:                                 | boucle de transfert du resultat
                   2311: 8$:     movl    a1@-,a0@-
                   2312:         dbra    d0,8$
                   2313:         addl    d1,_avma        | mise a jour pile PARI
                   2314:         movl    a0,a6@(-4)
                   2315:         bra     addirf
                   2316:                                 | ici exp1 <= exp2
                   2317: 5$:     negl    d2
                   2318:         lsrl    #5,d2           | d2.l recoit L3=[(exp2-exp1)/32]
                   2319:         addw    d2,d3
                   2320:         addqw   #1,d3           | d3.w recoit L1+L3+1
                   2321:         cmpw    #0x8000,d3
                   2322:         bcs     7$
                   2323:                                 | ici debordement
                   2324: 2$:     movl    #adder3,sp@-
                   2325:         jsr     _pari_err
                   2326: addirf: movl    a6@(-4),d0      | d0 pointe sur resultat
                   2327:         moveml  sp@+,d2-d3/a2
                   2328:         unlk    a6
                   2329:         rts
                   2330:
                   2331: #===================================================================#
                   2332: #                                                                   #
                   2333: #               Addition : reel + reel = reel                       #
                   2334: #                                                                   #
                   2335: #       entree : a7@(4) pointe sur r2 de type R                     #
                   2336: #                a7@(8) pointe sur r1 de type R                     #
                   2337: #       sortie : d0 pointe sur r2 + r1 de type R (zone creee)       #
                   2338: #       precision : L = inf ( L2 , L1 + [(exp2-exp1)/32])           #
                   2339: #                       si exp2 >= exp1 (sinon echanger r1 et r2)   #
                   2340: #                                                                   #
                   2341: #===================================================================#
                   2342:
                   2343: _addrr: link    a6,#-16
                   2344:         moveml  d2-d7/a2-a4,sp@-
                   2345:         movl    a6@(8),a2       | a2 pointe sur r2
                   2346:         movl    a6@(12),a1      | a1 pointe sur r1
                   2347:         tstb    a2@(4)
                   2348:         bne     1$
                   2349:                                 | ici r2 = 0 (r2 + r1 = r1)
                   2350: 4$:     tstb    a1@(4)
                   2351:         bne     22$
                   2352:                                 | ici r2=r1=0
                   2353:         movl    a1@(4),d1
                   2354:         cmpl    a2@(4),d1
                   2355:         bgt     23$
                   2356:         movl    a2@(4),d1       | d1.l contient sup(fexp1,fexp2)
                   2357: 23$:    moveq   #3,d0
                   2358:         bsr     getr
                   2359:         movl    a0,a6@(-8)
                   2360:         movl    d1,a0@(4)
                   2361:         clrl    a0@(8)
                   2362:         bra     addrrf
                   2363:                                 | ici r2 = 0 et r1 <> 0
                   2364: 22$:    moveq   #0,d0
                   2365:         movl    a2@(4),d2       | d2.l contient fexp2
                   2366:         movl    a1@(4),d1
                   2367:         andl    #0xffffff,d1    | d1.l contient fexp1
                   2368:         subl    d2,d1           | d1.l recoit exp1-exp2
                   2369:         bcc     24$
                   2370:                                 | ici exp2 > exp1
                   2371:         moveq   #3,d0
                   2372:         bsr     getr
                   2373:         movl    a0,a6@(-8)      | le resultat est 0 avec exposant fexp2
                   2374:         movl    a2@(4),a0@(4)
                   2375:         clrl    a0@(8)
                   2376:         bra     addrrf
                   2377:                                 | ici exp2 <= exp1
                   2378: 24$:    lsrl    #5,d1           | d1.l contient [(exp1-exp2)/32]
                   2379:         movw    a1@(2),d0
                   2380:         subqw   #2,d0           | d0.l contient L1
                   2381:         cmpl    d1,d0
                   2382:         ble     25$
                   2383:         movl    d1,d0           | d0.l=inf(L1,[(e1-e2)/32])=L
                   2384:         addql   #1,d0           | le resultat est r1 en longueur:
                   2385: 25$:    addql   #2,d0           | L1 si L1<=[(e1-e2)/32] ou
                   2386:         bsr     getr
                   2387:         movl    a0,a6@(-8)
                   2388:         addql   #4,a1
                   2389:         addql   #4,a0
                   2390:         subqw   #2,d0
                   2391: 27$:    movl    a1@+,a0@+
                   2392:         dbra    d0,27$
                   2393:         bra     addrrf
                   2394:                                 | ici r2 <> 0
                   2395: 1$:     tstb    a1@(4)
                   2396:         bne     3$
                   2397:                                 | ici r1 = 0 (r2 + r1 = r2)
                   2398:         exg     a2,a1
                   2399:         bra     22$
                   2400:                                 | ici r1 * r2 <> 0
                   2401: 3$:     movb    a1@(4),d3
                   2402:         movb    a2@(4),d5
                   2403:         eorb    d5,d3           | d3.b contient : 0 si r1 * r2 > 0
                   2404:                                 | et est negatif sinon
                   2405:         movb    d3,a6@(-2)      | sauvegarde du 'signe'
                   2406:         movl    a2@(4),d3
                   2407:         andl    #0xffffff,d3    | d3.l contient fexp2=e2
                   2408:         movl    a1@(4),d1
                   2409:         andl    #0xffffff,d1    | d1.l contient fexp1=e1
                   2410:         subl    d1,d3           | d3.l  contient exp2-exp1
                   2411:         beq     5$              | si e2 = e1
                   2412:         bcc     6$              | si e2 > e1
                   2413:                                 | ici e2 < e1
                   2414:         exg     a1,a2
                   2415:         negl    d3              | d3.l recoit e1-e2 > 0
                   2416:                                 | ici e2-e1 > 0
                   2417: 6$:     movw    d3,d4
                   2418:         andw    #31,d4
                   2419:         lsrl    #5,d3           | e2-e1=32*L3+r ; d4.w,d3.l recoit r,L3
                   2420:         moveq   #0,d2
                   2421:         movw    a2@(2),d2
                   2422:         subqw   #2,d2           | d2.l recoit L2
                   2423:         cmpl    d2,d3
                   2424:         bcs     7$
                   2425:                                 | ici L3 >= L2 (r1 + r2 = r2)
                   2426:         movw    a2@(2),d0
                   2427:         bsr     getr
                   2428:         movl    a0,a6@(-8)
                   2429:         addql   #4,a2
                   2430:         addql   #4,a0
                   2431:         subqw   #2,d0
                   2432: 28$:    movl    a2@+,a0@+
                   2433:         dbra    d0,28$
                   2434:         bra     addrrf
                   2435:                                 | ici L3 < L2
                   2436: 7$:     moveq   #0,d1
                   2437:         movw    a1@(2),d1
                   2438:         subqw   #2,d1           | d1.l recoit L1
                   2439:         movl    d3,d5
                   2440:         addl    d1,d5           | d5.l recoit L1 + L3
                   2441:         cmpl    d2,d5
                   2442:         bcs     8$              | si L1 + L3 < L2
                   2443:                                 | ici L3 < L2 <= L1 + L3
                   2444:         movb    #1,a6@(-4)      | a6@(-4) flag contenant :
                   2445:                                 | 0 si L1+L3 < L2 faire alors copie r1
                   2446:                                 | 1 si L3 < L2 <= L1+L3 et idem
                   2447:                                 | 2 si e1 = e2 et alors pas de copie
                   2448:         movw    d2,d0
                   2449:         addqw   #2,d0           | d0.w recoit l2
                   2450:         bsr     getr            | allocation L2+2 lgmots pour resultat
                   2451:         movl    a0,a6@(-8)      | adresse resultat dans var. locale
                   2452:         movw    d2,d5
                   2453:         subw    d3,d5           | d5.w contient L2 - L3
                   2454:         movw    d5,d0
                   2455:         addqw   #1,d0           | d0.w contient L2 - L3 + 1
                   2456:         bsr     getr            | allocation L2-L3+1 pour copie r1 avec
                   2457:                                 | un unique longmot code
                   2458:         subqw   #2,d0           | d0.w contient L2 - L3 - 1
                   2459:         movw    a2@(2),d1
                   2460:         lea     a2@(0,d1:w:4),a2| a2 pointe fin de r2
                   2461:         bra     9$
                   2462:                                 | ici L1 + L3 < L2
                   2463: 8$:     clrb    a6@(-4)         | a6@(-4) mis a 0
                   2464:         movw    d5,d0
                   2465:         addqw   #3,d0           | d0.w contient L1 + L3 + 3
                   2466:         bsr     getr            | allocation pour resultat
                   2467:         movl    a0,a6@(-8)      | adresse resultat dans var. locale
                   2468:         lea     a2@(0,d0:w:4),a2| a2 pointe ou necessaire !!
                   2469:         movw    a1@(2),d5       | d5.w contient L1 + 2
                   2470:         movw    d5,d0           | d0.w contient L1 + 2
                   2471:         subqw   #2,d5           | d5.w contient L1
                   2472:         bsr     getr            | allocation L1+2 pour copie r1 avec
                   2473:                                 | un  seul lgmot code
                   2474:         subqw   #3,d0           | d0.w contient L1 - 1
                   2475: 9$:     movl    a0,a6@(-12)     | adresse copie r1 dans var. locale
                   2476:         addql   #4,a0
                   2477:         movl    a0,a3           | a0 et a3 pointent sur debut copie
                   2478:         addql   #8,a1           | a1 pointe debut mantisse r1
                   2479: 29$:    movl    a1@+,a0@+
                   2480:         dbra    d0,29$          | boucle copie r1
                   2481:         tstw    d4              | test de r = nb de shifts
                   2482:         bne     10$
                   2483:                                 | ici r = 0 ; pas de shift a faire
                   2484:                                 | a0 pointe fin copie r1
                   2485:                                 | a3 pointe debut mantisse copie r1
                   2486:         moveq   #0,d7
                   2487:         movw    a3@(-2),d7
                   2488:         subqw   #1,d7           | d7.w contient longueur mantisse copie
                   2489:         movw    d7,d2
                   2490:         subqw   #1,d2           | d2.w = compteur boucle addition
                   2491:         lea     a3@(0,d7:w:4),a3| a3 pointe fin copie r1
                   2492:         movl    a3,a1           | a1 aussi
                   2493:         bra     11$
                   2494:                                 | ici r <> 0 ; shift a faire
                   2495: 10$:    subqw   #1,d5
                   2496:         movew   d5,d2           | d5.w et d2.w = compteur boucle shift
                   2497:         movl    #-1,d6
                   2498:         lsrl    d4,d6           | masque de shift:0...01...1; avec r '0'
                   2499:         moveq   #0,d0
                   2500:                                 | boucle de shift de copie de r1
                   2501: 12$:    movl    a3@,d7
                   2502:         rorl    d4,d7
                   2503:         movl    d7,d1
                   2504:         andl    d6,d1
                   2505:         subl    d1,d7
                   2506:         addl    d1,d0
                   2507:         movl    d0,a3@+
                   2508:         movl    d7,d0
                   2509:         dbra    d5,12$
                   2510:         movl    a3,a1
                   2511:         tstb    a6@(-4)
                   2512:         bne     11$             | si a6@(-4) <> 0
                   2513:                                 | ici a6@(-4) = 0
                   2514:         movl    d0,a1@+
                   2515:         addqw   #1,d2           | d2.w = compteur boucle addition
                   2516: 11$:    movl    a6@(-8),a0      | a0 pointe sur resultat
                   2517:         moveq   #0,d1
                   2518:         movw    a0@(2),d1
                   2519:         lea     a0@(0,d1:w:4),a0| a0 pointe fin du resultat
                   2520:         bra     14$
                   2521:                                 | ici e1 = e2
                   2522: 5$:     movb    #2,a6@(-4)      | a6@(-4) recoit 2
                   2523:         movl    d1,a6@(-16)     | a6@(-16) recoit e1=e2 biaise
                   2524:         movw    a1@(2),d0
                   2525:         cmpw    a2@(2),d0
                   2526:         bcs     15$
                   2527:         movw    a2@(2),d0
                   2528: 15$:    bsr     getr            | allocation inf (l1,l2) pour resultat
                   2529:         movl    a0,a6@(-8)      | adresse du resultat dans var. locale
                   2530:         moveq   #0,d2
                   2531:         movw    d0,d2
                   2532:         movl    d2,d0
                   2533:         subqw   #3,d2
                   2534:         moveq   #0,d3
                   2535:         movl    a2,a4
                   2536:         movl    a1,a3
                   2537:         lea     a0@(0,d0:w:4),a0| a0 pointe fin resultat
                   2538:         lea     a1@(0,d0:w:4),a1| a1 pointe fin de r1 ou copie
                   2539:         lea     a2@(0,d0:w:4),a2| a2 pointe fin de r2
                   2540:
                   2541:                                 | zone des boucles d'addition
                   2542:
                   2543:                                 | conditions initiales :
                   2544:                                 | a0 pointe fin resultat
                   2545:                                 | a1 pointe fin r1 ou copie
                   2546:                                 | a2 pointe fin r2
                   2547:                                 | d2.w contient L4-1
                   2548:                                 | d3.w contient L3 avec L3+L4=long.res.
                   2549: 14$:    subl    d4,d4           | initialisation bit X
                   2550:         tstb    a6@(-2)         | test du signe de r1*r2
                   2551:         bne     surr
                   2552:                                 | ici r1 * r2 > 0
                   2553:                                 | 1ere boucle d'addition
                   2554: 16$:    movl    a1@-,d1
                   2555:         movl    a2@-,d5
                   2556:         addxl   d5,d1
                   2557:         movl    d1,a0@-
                   2558:         dbra    d2,16$
                   2559:         roxrw   d4,d0           | remise a jour du bit C
                   2560:         bcc     17$             | si pas de carry
                   2561:         bra     18$             | si carry
                   2562:                                 | 2eme boucle:propagation carry
                   2563: 19$:    movl    a2@-,d5
                   2564:         addxl   d4,d5
                   2565:         movl    d5,a0@-
                   2566:         roxrw   d4,d0           | mise a jour bit C
                   2567: 18$:    dbcc    d3,19$
                   2568:         bcs     20$             | si carry finale
                   2569:         bra     17$
                   2570:                                 | 3eme boucle:recopie reste mantisse r2
                   2571: 30$:    movl    a2@-,a0@-
                   2572: 17$:    dbra    d3,30$
                   2573:         movl    a2@-,a0@-       | mise signe et exposant:celui de r2
                   2574:         cmpb    #2,a6@(-4)
                   2575:         beq     addrrf          | si a6@(-4) = 2
                   2576:                                 | ici rendre copie de r1
                   2577:         movl    a6@(-12),a0
                   2578:         bsr     giv
                   2579:         bra     addrrf
                   2580:                                 | ici carry finale
                   2581: 20$:    movl    a2@-,d1
                   2582:         andl    #0xffffff,d1
                   2583:         addql   #1,d1           | d1.l recoit fexp resultat
                   2584:         cmpl    #0x1000000,d1
                   2585:         blt     2$
                   2586:                                 | ici fexp>=2^24 : erreur
                   2587:         movl    #adder4,sp@-
                   2588:         jsr     _pari_err
                   2589:                                 | ici non debordement
                   2590: 2$:     cmpb    #2,a6@(-4)
                   2591:         beq     13$
                   2592:                                 | ici rendre copie de r1
                   2593:         movl    a0,a3
                   2594:         movl    a6@(-12),a0
                   2595:         bsr     giv
                   2596:         movl    a3,a0
                   2597: 13$:    movl    d1,a0@(-4)
                   2598:         movb    a2@,a0@(-4)     | mise a jour exp et sign resultat
                   2599:         movw    a0@(-6),d2
                   2600:         subqw   #3,d2           | compteur de shift
                   2601:         movw    #-1,d0
                   2602:         movw    d0,cc           | mise a 1 des bit x et c
                   2603: 31$:    roxrw   a0@+
                   2604:         roxrw   a0@+            | boucle de mise de retenue finale et
                   2605:         dbra    d2,31$          | shift de 1 vers la droite mantisse
                   2606: addrrf: movl    a6@(-8),d0      | d0 pointe sur resultat
                   2607:         moveml  sp@+,d2-d7/a2-a4
                   2608:         unlk    a6
                   2609:         rts
                   2610:                                 | ici faire une soustraction
                   2611:                                 | pour conditions initiales cf.plus haut
                   2612: surr:   moveq   #0,d6
                   2613:         movw    d2,d6
                   2614:         movw    d2,d7
                   2615:         addw    d3,d7
                   2616:         addqw   #3,d7
                   2617:         cmpb    #2,a6@(-4)
                   2618:         bne     1$
                   2619:                                 | ici e2 = e1:comparer les mantisses
                   2620:         addql   #8,a3
                   2621:         addql   #8,a4
                   2622: 12$:    cmpml   a3@+,a4@+
                   2623:         dbne    d2,12$
                   2624:         bhi     1$              | si |r2| > |r1|
                   2625:         bne     2$              | si |r2| < |r1|
                   2626:                                 | ici |r2| = |r1| et donc r2 + r1 = 0
                   2627:         movl    a6@(-8),a0      | le resultat est 0 avec comme exposant
                   2628:         moveq   #0,d2           | -32*inf(l1,l2)+e1
                   2629:         movw    a0@(2),d2
                   2630:         subqw   #2,d2
                   2631:         lsll    #5,d2
                   2632:         negl    d2
                   2633:         addl    a6@(-16),d2     | ajouter e1 biaise
                   2634:         bpl     15$
                   2635:         movl    #adder5,sp@-    | underflow dans R+R
                   2636:         jsr     _pari_err
                   2637: 15$:    cmpl    #0x1000000,d2
                   2638:         blt     16$
                   2639:                                 | ici fexp>=2^24 : erreur overflow dans R+R
                   2640:         movl    #adder4,sp@-
                   2641:         jsr     _pari_err
                   2642: 16$:    bsr     giv
                   2643:         moveq   #3,d0
                   2644:         bsr     getr
                   2645:         movl    a0,a6@(-8)
                   2646:         movl    d2,a0@(4)
                   2647:         clrl    a0@(8)
                   2648:         bra     addrrf
                   2649:                                 | ici |r2| < |r1| : echanger r2 et r1
                   2650: 2$:     exg     a1,a2
                   2651:                                 | ici |r2| > |r1|
                   2652: 1$:     subw    d2,d6
                   2653:         subl    d4,d4           | initialisation bit X
                   2654:                                 | 1ere boucle de soustraction
                   2655: 3$:     movl    a2@-,d0
                   2656:         movl    a1@-,d5
                   2657:         subxl   d5,d0
                   2658:         movl    d0,a0@-
                   2659:         dbra    d2,3$
                   2660:         roxrw   d4,d0           | remise ajour bit C
                   2661:         bra     4$
                   2662:                                 | 2eme boucle:propagation carry
                   2663: 5$:     movl    a2@-,d5
                   2664:         subxl   d4,d5
                   2665:         movl    d5,a0@-
                   2666:         roxrw   d4,d0
                   2667: 4$:     dbcc    d3,5$
                   2668:         bra     6$
                   2669:                                 | 3eme boucle:copie reste mantisse r2
                   2670: 13$:    movl    a2@-,a0@-
                   2671: 6$:     dbra    d3,13$
                   2672:         moveq   #0,d3
                   2673:         moveq   #-1,d2
                   2674:         movw    d2,d3
                   2675: 14$:    tstl    a0@+
                   2676:         dbne    d2,14$          | chasse aux '0' du resultat provisoire
                   2677:                                 | a0 pointe sur 1er lgmot non nul
                   2678:         subw    d2,d3           | d3.w  contient de lgmots nuls
                   2679:         addw    d6,d3
                   2680:         subl    #12,a0          | a0 pointe sur resultat
                   2681:         movl    a0,a6@(-8)
                   2682:         movl    a0,a1           | a1 aussi
                   2683:         cmpb    #2,a6@(-4)
                   2684:         beq     7$              | si pas de copie faite
                   2685:                                 | ici rendre copie
                   2686:         movl    a6@(-12),a0
                   2687:         bsr     giv
                   2688: 7$:     moveq   #0,d0
                   2689:         movw    d3,d0
                   2690:         lsll    #2,d0           | d0.l = nb d'octets a 0 du result.
                   2691:         addl    d0,_avma        | mise a jour pile PARI(rendre d3 lgmot)
                   2692:         movl    a1,a0           | a0 pointe sur resultat final
                   2693:         movw    #0x200,a0@
                   2694:         subw    d3,d7
                   2695:         movw    d7,a0@(2)       | mise a jour 1er lgmot code resultat
                   2696:         lsll    #5,d3
                   2697:         movl    a0@(8),d0
                   2698:         bfffo   d0{#0:#0},d1    | d1.l contient nb de shifts=r
                   2699:         lsll    d1,d0           | normalisation 1er lgmot mantisse
                   2700:         addl    d1,d3
                   2701:         lsll    #2,d6
                   2702:         subl    d6,a2
                   2703:         movl    a2@(-4),d2
                   2704:         andl    #0xffffff,d2
                   2705:         subl    d3,d2
                   2706:         movl    d2,a0@(4)       | calcul et mise exposant resultat
                   2707:         movb    a2@(-4),a0@(4)  | mise signe resultat
                   2708:         tstb    d1
                   2709:         bne     8$              | si r <> 0
                   2710:         bra     9$              | si r = 0
                   2711: 8$:     moveq   #1,d6
                   2712:         lsll    d1,d6
                   2713:         subql   #1,d6           | masque de shift
                   2714:         addql   #8,a1
                   2715:         subqw   #3,d7           | d7.w  contient L-1
                   2716:         bra     10$
                   2717:                                 | boucle de shift vers la gauche
                   2718: 11$:    movl  a1@(4),d2
                   2719:         roll    d1,d2
                   2720:         movl    d2,d3
                   2721:         andl    d6,d3
                   2722:         subl    d3,d2
                   2723:         addl    d3,d0
                   2724:         movl    d0,a1@+
                   2725:         movl    d2,d0
                   2726: 10$:    dbra    d7,11$
                   2727:         movl    d0,a1@
                   2728: 9$:     bra     addrrf
                   2729:
                   2730:
                   2731:
                   2732:
                   2733:
                   2734: #*******************************************************************#
                   2735: #*******************************************************************#
                   2736: #**                                                               **#
                   2737: #**                     PROGRAMMES DE SOUSTRACTION                **#
                   2738: #**                                                               **#
                   2739: #*******************************************************************#
                   2740: #*******************************************************************#
                   2741:
                   2742:
                   2743:
                   2744:
                   2745:
                   2746: #===================================================================#
                   2747: #                                                                   #
                   2748: #                       Soustraction generale                       #
                   2749: #                                                                   #
                   2750: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   2751: #                a7@(8) pointe sur n1 de type I ou R                #
                   2752: #       sortie : d0 pointe sur n2 - n1 de type I ou R (zone creee)  #
                   2753: #       interdit : type S                                           #
                   2754: #                                                                   #
                   2755: #===================================================================#
                   2756:
                   2757: _mpsub: cmpb    #1,sp@(8)@
                   2758:         bne     1$
                   2759:         cmpb    #1,sp@(4)@
                   2760:         beq     _subii
                   2761:         bra     _subri
                   2762: 1$:     cmpb    #1,sp@(4)@
                   2763:         beq     _subir
                   2764:         bra     _subrr
                   2765:
                   2766: #===================================================================#
                   2767: #                                                                   #
                   2768: #                       Soustraction (par valeur)                   #
                   2769: #                                                                   #
                   2770: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   2771: #                a7@(8) pointe sur n1 de type I ou R                #
                   2772: #                a7@(12) pointe sur n3 de type I ou R               #
                   2773: #       sortie : la zone pointee par a7@(12) contient n2 - n1       #
                   2774: #       interdit : type S                                           #
                   2775: #                                                                   #
                   2776: #===================================================================#
                   2777:
                   2778: _mpsubz:lea     _mpsub,a0
                   2779:         bra     mpopz
                   2780:
                   2781:                                 | soustraction S-S=I ou R
                   2782:
                   2783: _subssz:lea     _subss,a0
                   2784:         bra     mpopz
                   2785:
                   2786:                                 | soustraction S-I=I ou R
                   2787:
                   2788: _subsiz:lea     _subsi,a0
                   2789:         bra     mpopz
                   2790:
                   2791:                                 | soustraction S-R=R sinon erreur
                   2792:
                   2793: _subsrz:lea     _subsr,a0
                   2794:         bra     mpopz
                   2795:
                   2796:                                 | soustraction I-S=I ou R
                   2797:
                   2798: _subisz:lea     _subis,a0
                   2799:         bra     mpopz
                   2800:
                   2801:                                 | soustraction I-I=I ou R
                   2802:
                   2803: _subiiz:lea     _subii,a0
                   2804:         bra     mpopz
                   2805:
                   2806:                                 | soustraction I-R=R sinon erreur
                   2807:
                   2808: _subirz:lea     _subir,a0
                   2809:         bra     mpopz
                   2810:
                   2811:                                 | soustraction R-S=R sinon erreur
                   2812:
                   2813: _subrsz:lea     _subrs,a0
                   2814:         bra     mpopz
                   2815:
                   2816:                                 | soustraction R-I=R sinon erreur
                   2817:
                   2818: _subriz:lea     _subri,a0
                   2819:         bra     mpopz
                   2820:
                   2821:                                 | soustraction R-R=R sinon erreur
                   2822:
                   2823: _subrrz:lea     _subrr,a0
                   2824:         bra     mpopz
                   2825:
                   2826: #===================================================================#
                   2827: #                                                                   #
                   2828: #       Soustraction : entier court - entier court = entier         #
                   2829: #                                                                   #
                   2830: #       entree : a7@(4) contient s2 de type S                       #
                   2831: #                a@7(8) contient s1 de type S                       #
                   2832: #       sortie : d0 pointe sur s2 - s1 de type I (zone creee)       #
                   2833: #       remarque : s2 - s1 = s0 est interdit                        #
                   2834: #                                                                   #
                   2835: #===================================================================#
                   2836:
                   2837: _subss: link    a6,#-12
                   2838:         movl    a6@(12),d1      | d1.l recoit s1
                   2839:         negl    d1              | d1.l recoit -s1
                   2840:         bvs     1$
                   2841:                                 | ici |s1| <= 2^31-1
                   2842:         movl    d1,sp@-         | empilage -s1
                   2843:         movl    a6@(8),sp@-     | empilage s2
                   2844:         bsr     _addss          | calcul se s2+(-s1)
                   2845:         bra     subssf
                   2846:                                 | ici s1 = -2^31
                   2847: 1$:     movl    #0x1000003,a6@(-12)
                   2848:         movl    #0x1000003,a6@(-8)
                   2849:         movl    #0x80000000,a6@(-4)| creation de 2^31 type entier
                   2850:         pea     a6@(-12)        | empilage adresse de 2^31
                   2851:         movl    a6@(8),sp@-     | empilage s2
                   2852:         bsr     _addsi
                   2853: subssf: unlk    a6
                   2854:         rts
                   2855:
                   2856: #===================================================================#
                   2857: #                                                                   #
                   2858: #               Soustraction : entier - entier = entier             #
                   2859: #                                                                   #
                   2860: #       entree : a7@(4) pointe sur i2 de type I                     #
                   2861: #                a7@(8) pointe sur i1 de type I                     #
                   2862: #       sortie : d0 pointe sur i2 - i1 de type I (zone creee)       #
                   2863: #                                                                   #
                   2864: #===================================================================#
                   2865:
                   2866: _subii: link    a6,#-4
                   2867:         movl    a6@(12),sp@-    | empilage adresse i1
                   2868:         movl    a6@(8),sp@-     | empilage adresse i2
                   2869:         movl    a6@(12),a0      | a0 pointe sur i1
                   2870:         negb    a0@(4)          | changer signe de i1
                   2871:         movl    a0,a6@(-4)
                   2872:         bsr     _addii
                   2873:         movl    a6@(-4),a0
                   2874:         negb    a0@(4)          | remettre signe de i1
                   2875:         unlk    a6
                   2876:         rts
                   2877:
                   2878: #===================================================================#
                   2879: #                                                                   #
                   2880: #               Soustraction : reel - reel = reel                   #
                   2881: #                                                                   #
                   2882: #       entree : a7@(4) pointe sur r2 de type R                     #
                   2883: #                a7@(8) pointe sur r1 de type R                     #
                   2884: #       sortie : d0 pointe sur r2 - r1 de type R (zone creee)       #
                   2885: #                                                                   #
                   2886: #===================================================================#
                   2887:
                   2888: _subrr: link    a6,#-4          | voir commentaires de _subii
                   2889:         movl    a6@(12),sp@-
                   2890:         movl    a6@(8),sp@-
                   2891:         movl    a6@(12),a0
                   2892:         negb    a0@(4)
                   2893:         movl    a0,a6@(-4)
                   2894:         bsr     _addrr
                   2895:         movl    a6@(-4),a0
                   2896:         negb    a0@(4)
                   2897:         unlk    a6
                   2898:         rts
                   2899:
                   2900: #===================================================================#
                   2901: #                                                                   #
                   2902: #       Soustraction : entier court - entier = entier               #
                   2903: #                                                                   #
                   2904: #       entree : a7@(4) contient s2 de type S                       #
                   2905: #                a7@(8) pointe sur i1 de type I                     #
                   2906: #       sortie : d0 pointe sur s2 - i1 de type I                    #
                   2907: #                                                                   #
                   2908: #===================================================================#
                   2909:
                   2910: _subsi: link    a6,#-4          | voir commentaires de _subii
                   2911:         movl    a6@(12),sp@-
                   2912:         movl    a6@(8),sp@-
                   2913:         movl    a6@(12),a0
                   2914:         negb    a0@(4)
                   2915:         movl    a0,a6@(-4)
                   2916:         bsr     _addsi
                   2917:         movl    a6@(-4),a0
                   2918:         negb    a0@(4)
                   2919:         unlk    a6
                   2920:         rts
                   2921:
                   2922: #===================================================================#
                   2923: #                                                                   #
                   2924: #               Soustraction : entier court - reel = reel           #
                   2925: #                                                                   #
                   2926: #       entree : a7@(4) contient s2 de type S                       #
                   2927: #                a7@(8) pointe sur r1 de type R                     #
                   2928: #       sortie : d0 pointe sur s2 - r1 de type R (zone creee)       #
                   2929: #                                                                   #
                   2930: #===================================================================#
                   2931:
                   2932: _subsr: link    a6,#-4          | voir commentaires de _subii
                   2933:         movl    a6@(12),sp@-
                   2934:         movl    a6@(8),sp@-
                   2935:         movl    a6@(12),a0
                   2936:         negb    a0@(4)
                   2937:         movl    a0,a6@(-4)
                   2938:         bsr     _addsr
                   2939:         movl    a6@(-4),a0
                   2940:         negb    a0@(4)
                   2941:         unlk    a6
                   2942:         rts
                   2943:
                   2944: #===================================================================#
                   2945: #                                                                   #
                   2946: #       Soustraction : entier - entier court = entier               #
                   2947: #                                                                   #
                   2948: #       entree : a7@(4) pointe sur i1 de type I                     #
                   2949: #                a7@(8) contient s2 de type S                       #
                   2950: #       sortie : d0 pointe sur i1 - s2 de type I (zone creee)       #
                   2951: #                                                                   #
                   2952: #===================================================================#
                   2953:
                   2954: _subis: link    a6,#-12         | voir commentaires de _subss
                   2955:         movl    a6@(8),sp@-
                   2956:         movl    a6@(12),d1
                   2957:         negl    d1
                   2958:         bvs     1$
                   2959:         movl    d1,sp@-
                   2960:         bsr     _addsi
                   2961:         bra     subisf
                   2962: 1$:     movl    #0x1000003,a6@(-12)
                   2963:         movl    #0x1000003,a6@(-8)
                   2964:         movl    #0x80000000,a6@(-4)
                   2965:         pea     a6@(-12)
                   2966:         bsr     _addii
                   2967: subisf: unlk    a6
                   2968:         rts
                   2969:
                   2970: #===================================================================#
                   2971: #                                                                   #
                   2972: #               Soustraction : entier - reel = reel                 #
                   2973: #                                                                   #
                   2974: #       entree : a7@(4) pointe sur i2 de type I                     #
                   2975: #                a7@(8) pointe sur r1 de type R                     #
                   2976: #       sortie : d0 pointe sur i2 - r1 de type R (zone creee)       #
                   2977: #                                                                   #
                   2978: #===================================================================#
                   2979:
                   2980: _subir: link    a6,#-4          | voir commentaires de _subii
                   2981:         movl    a6@(12),sp@-
                   2982:         movl    a6@(8),sp@-
                   2983:         movl    a6@(12),a0
                   2984:         negb    a0@(4)
                   2985:         movl    a0,a6@(-4)
                   2986:         bsr     _addir
                   2987:         movl    a6@(-4),a0
                   2988:         negb    a0@(4)
                   2989:         unlk    a6
                   2990:         rts
                   2991:
                   2992: #===================================================================#
                   2993: #                                                                   #
                   2994: #               Soustraction : reel - entier = reel                 #
                   2995: #                                                                   #
                   2996: #       entree : a7@(4) pointe sur r1 de type R                     #
                   2997: #                a7@(8) pointe sur i2 de type I                     #
                   2998: #       sortie : d0 pointe sur r2 - i1 de type R (zone creee)       #
                   2999: #                                                                   #
                   3000: #===================================================================#
                   3001:
                   3002: _subri: link    a6,#-4          | voir commentaires de _subii
                   3003:         movl    a6@(8),sp@-
                   3004:         movl    a6@(12),sp@-
                   3005:         movl    a6@(12),a0
                   3006:         negb    a0@(4)
                   3007:         movl    a0,a6@(-4)
                   3008:         bsr     _addir
                   3009:         movl    a6@(-4),a0
                   3010:         negb    a0@(4)
                   3011:         unlk    a6
                   3012:         rts
                   3013:
                   3014: #===================================================================#
                   3015: #                                                                   #
                   3016: #       Soustraction : reel - entier court = reel                   #
                   3017: #                                                                   #
                   3018: #       entree : a7@(4) pointe sur r2 de type R                     #
                   3019: #                a7@(8) contient s1 de type S                       #
                   3020: #       sortie : d0 pointe sur r2 - s1 de type R (zone creee)       #
                   3021: #                                                                   #
                   3022: #===================================================================#
                   3023:
                   3024: _subrs: link    a6,#-12         | voir commentaires de _subss
                   3025:         movl    a6@(8),sp@-
                   3026:         movl    a6@(12),d1
                   3027:         negl    d1
                   3028:         bvs     1$
                   3029:         movl    d1,sp@-
                   3030:         bsr     _addsr
                   3031:         bra     subsrf
                   3032: 1$:     movl    #0x1000003,a6@(-12)
                   3033:         movl    #0x1000003,a6@(-8)
                   3034:         movl    #0x80000000,a6@(-4)
                   3035:         pea     a6@(-12)
                   3036:         bsr     _addir
                   3037: subsrf: unlk    a6
                   3038:         rts
                   3039:
                   3040:
                   3041:
                   3042:
                   3043:
                   3044: #*******************************************************************#
                   3045: #*******************************************************************#
                   3046: #**                                                               **#
                   3047: #**                     PROGRAMMES DE MULTIPLICATION              **#
                   3048: #**                                                               **#
                   3049: #*******************************************************************#
                   3050: #*******************************************************************#
                   3051:
                   3052:
                   3053:
                   3054:
                   3055:
                   3056: #===================================================================#
                   3057: #                                                                   #
                   3058: #                       Multiplication generale                     #
                   3059: #                                                                   #
                   3060: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   3061: #                a7@(8) pointe sur n1 de type I ou R                #
                   3062: #       sortie : d0 pointe sur n2 * n1 de type I ou R (zone cree)   #
                   3063: #       interdit : type S                                           #
                   3064: #       precision : voir routines specialisees                      #
                   3065: #                                                                   #
                   3066: #===================================================================#
                   3067:
                   3068: _mpmul: movl    sp@(4),a0
                   3069:         movl    sp@(8),a1       | a1 et a0 pointent sur n1 et n2
                   3070:         movb    a0@,d0
                   3071:         movb    a1@,d1          | d1.b et d0.b contiennent T1 et T2
                   3072:         cmpb    d1,d0
                   3073:         ble     1$
                   3074:                                 | ici T2 > T1
                   3075:         exg     a1,a0
                   3076:         exg     d1,d0
                   3077:         movl    a0,sp@(4)
                   3078:         movl    a1,sp@(8)
                   3079:                                 | ici T2 <= T1
                   3080: 1$:     cmpb    #1,d1
                   3081:         beq     _asmmulii          | ici T1 = T2 = I
                   3082: 2$:     cmpb    #2,d0
                   3083:         beq     _mulrr          | ici T1 = T2 = R
                   3084:         bra     _mulir
                   3085:
                   3086: #===================================================================#
                   3087: #                                                                   #
                   3088: #               Multiplication (par valeur)                         #
                   3089: #                                                                   #
                   3090: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   3091: #                a7@(8) pointe sur n1 de type I ou R                #
                   3092: #                a7@(12) pointe sur n3 de type I ou R               #
                   3093: #       sortie : la zone pointee par a7@(12) contient n2*n1         #
                   3094: #       interdit : type S                                           #
                   3095: #                                                                   #
                   3096: #===================================================================#
                   3097:
                   3098: _mpmulz:lea     _mpmul,a0
                   3099:         bra     mpopz
                   3100:
                   3101:                                 | multiplication S*S=I ou R
                   3102:
                   3103: _mulssz:lea     _mulss,a0
                   3104:         bra     mpopz
                   3105:
                   3106:                                 | multiplication S*I=I ou R
                   3107:
                   3108: _mulsiz:lea     _mulsi,a0
                   3109:         bra     mpopz
                   3110:
                   3111:                                 | multiplication S*R=R sinon erreur
                   3112:
                   3113: _mulsrz:lea     _mulsr,a0
                   3114:         bra     mpopz
                   3115:
                   3116:                                 | multiplication I*I=I ou R
                   3117:
                   3118: _muliiz:lea     _asmmulii,a0
                   3119:         bra     mpopz
                   3120:
                   3121:                                 | multiplication I*R=R sinon erreur
                   3122:
                   3123: _mulirz:lea     _mulir,a0
                   3124:         bra     mpopz
                   3125:
                   3126:                                 | multiplication R*R=R sinon erreur
                   3127:
                   3128: _mulrrz:lea     _mulrr,a0
                   3129:         bra     mpopz
                   3130:
                   3131: #===================================================================#
                   3132: #                                                                   #
                   3133: #       Multiplication : entier court * entier court = entier       #
                   3134: #                                                                   #
                   3135: #       entree : a7@(4) contient s2 de type S                       #
                   3136: #                a7@(8) contient s1 de type S                       #
                   3137: #       sortie : d0 pointe sur s2 * s1 de type I (zone creee)       #
                   3138: #                                                                   #
                   3139: #===================================================================#
                   3140:
                   3141: _mulss: link    a6,#-2
                   3142:         moveml  d2-d4,sp@-
                   3143:         movl    a6@(8),d2       | d2.l contient s2
                   3144:         bne     1$
                   3145: 2$:     movl   _gzero,d0       | ici s2 ou s1 = 0
                   3146:         bra     mulssg
                   3147:                                 | ici s2 <> 0
                   3148: 1$:     movl    d2,d4
                   3149:         bpl     3$
                   3150:         negl    d2              | d2.l contient |s2|
                   3151: 3$:     movl    a6@(12),d1      | d1.l contient s1
                   3152:         beq     2$              | si s1=0
                   3153:         eorl    d1,d4
                   3154:         tstl    d1
                   3155:         bpl     4$
                   3156:         negl    d1              | d1.l contient |s1|
                   3157: 4$:     mulul   d1,d3:d2
                   3158:         movw    #4,d0
                   3159:         tstl    d3
                   3160:         bne     5$
                   3161:         movw    #3,d0           | d0 recoit 3 ou 4 pour allocation
                   3162: 5$:     bsr     geti
                   3163:         movw    a0@(2),a0@(6)   | met long effect.
                   3164:         movb    #1,a0@(4)       | met signe
                   3165:         tstl    d4
                   3166:         bpl     6$
                   3167:         negb    a0@(4)
                   3168: 6$:     tstl    d3
                   3169:         bne     7$
                   3170:         movl    d2,a0@(8)
                   3171:         bra     mulssf
                   3172: 7$:     movl    d3,a0@(8)
                   3173:         movl    d2,a0@(12)
                   3174: mulssf: movl    a0,d0
                   3175: mulssg: moveml  sp@+,d2-d4
                   3176:         unlk    a6
                   3177:         rts
                   3178:
                   3179: #===================================================================#
                   3180: #                                                                   #
                   3181: #       Multiplication : entier court * entier = entier             #
                   3182: #                                                                   #
                   3183: #       entree : a7@(4) contient s2 de type S                       #
                   3184: #                a7@(8) pointe sur i1 de type I                     #
                   3185: #       sortie : d0 pointe sur s2 * i1  de type I (zone creee)      #
                   3186: #                                                                   #
                   3187: #===================================================================#
                   3188:
                   3189: _mulsi: link    a6,#0
                   3190:         moveml  d2-d6/a2,sp@-
                   3191:         movl    a6@(8),d2       | d2.l contient s2
                   3192:         bne     1$
                   3193:                                 | ici s2 = 0 ou i1 = 0
                   3194: 2$:     movl   _gzero,d0
                   3195:         bra     mulsig
                   3196:                                 | ici s2 <> 0
                   3197: 1$:     bpl     6$
                   3198:         negl    d2              | d2 contient |s2|
                   3199: 6$:     movl    a6@(12),a1      | a1 pointe sur i1
                   3200:         tstb    a1@(4)
                   3201:         beq     2$              | si i1 = 0
                   3202:                                 | ici i1 <> 0 et s2 <> 0
                   3203:         movw    a1@(6),d0       | d0.w contient le1
                   3204:         bsr     geti
                   3205:         lea     a0@(0,d0:w:4),a2| a2 pointe apres resultat (i0)
                   3206:         lea     a1@(0,d0:w:4),a1| a1 pointe apres i1
                   3207:         subqw   #3,d0
                   3208:         moveq   #0,d6
                   3209:         moveq   #0,d5           | initialisation retenue
                   3210:                                 | debut boucle multiplication
                   3211: 3$:     movl    a1@-,d4
                   3212:         mulul   d2,d3:d4
                   3213:         addl    d5,d4
                   3214:         addxl   d6,d3
                   3215:         movl    d4,a2@-
                   3216:         movl    d3,d5
                   3217:         dbra    d0,3$
                   3218:         beq     5$
                   3219:                                 | ici retenue finale
                   3220:         movw    #1,d0
                   3221:         bsr     geti
                   3222:         movw    a0@(6),d0
                   3223:         addqw   #1,d0           | d0.w contient le(i0)
                   3224:         bvc     4$
                   3225:                                 | ici debordement
                   3226:         movl    #muler3,sp@-
                   3227:         jsr     _pari_err
                   3228: 4$:     movw    d0,a0@(2)       | mise longueur
                   3229:         movl    d5,a0@(8)       | mise retenue
                   3230: 5$:     movw    a0@(2),a0@(6)   | mise le(i0)
                   3231:         movb    a1@(-4),a0@(4)
                   3232:         tstl    a6@(8)
                   3233:         bpl     mulsif
                   3234:         negb    a0@(4)          | mise signe
                   3235: mulsif: movl    a0,d0
                   3236: mulsig: moveml  sp@+,d2-d6/a2
                   3237:         unlk    a6
                   3238:         rts
                   3239:
                   3240: #===================================================================#
                   3241: #                                                                   #
                   3242: #               Multiplication : entier court * reel = reel         #
                   3243: #                                                                   #
                   3244: #       entree : a7@(4) contient s2 de type S                       #
                   3245: #                a7@(8) pointe sur r1 de type R                     #
                   3246: #       sortie : d0 pointe sur s2 * r1 de type R                    #
                   3247: #                        de longueur L = L1 (zone creee)            #
                   3248: #                                                                   #
                   3249: #===================================================================#
                   3250:
                   3251: _mulsr: link    a6,#-4
                   3252:         moveml  d2-d6/a2,sp@-
                   3253:         movl    a6@(8),d2       | d2.l contient s2
                   3254:         bne     1$
                   3255:                                 | ici s2 = 0
                   3256:        movl    _gzero,d0
                   3257:         bra     mulsrf1
                   3258:                                 | ici s2 <> 0
                   3259: 1$:     movl    a6@(12),a1      | a1 pointe sur r1
                   3260:         tstb    a1@(4)
                   3261:         bne     2$
                   3262:                                 | ici r1 = 0
                   3263:         moveq   #3,d0
                   3264:         bsr     getr
                   3265:         tstl    d2
                   3266:         bpl     2$
                   3267:         negl    d2
                   3268:         bfffo   d2{#0:#0},d0
                   3269:         movl    a1@(4),d1
                   3270:         addl    #31,d1
                   3271:         subl    d0,d1
                   3272:         cmpl    #0x1000000,d1
                   3273:         bcc     11$
                   3274:         movl    d1,a0@(4)
                   3275:         clrl    a0@(8)
                   3276:         movl    a0,d0
                   3277:         bra     mulsrf1
                   3278: 2$:     movw    a1@(2),d0
                   3279:         bsr     getr            | allocation memoire pour resultat
                   3280:         movl    a0,a6@(-4)      | sauvegarde adr. resultat ds var.locale
                   3281:                                 | ici s2 et r1 <> 0
                   3282:         movl    d2,d4
                   3283:         bpl     3$
                   3284:         negl    d2              | d2.l contient |s2|
                   3285: 3$:     cmpl    #1,d2
                   3286:         bne     4$
                   3287:                                 | ici |s2| = 1
                   3288:         addql   #4,a0
                   3289:         addql   #4,a1
                   3290:         subqw   #2,d0
                   3291: 5$:     movl    a1@+,a0@+
                   3292:         dbra    d0,5$           | copie de r1 dans resultat
                   3293:         movl    a6@(-4),a0
                   3294:         tstl    d4
                   3295:         bpl     mulsrf
                   3296:         negb    a0@(4)          | mise signe
                   3297:         bra     mulsrf
                   3298:                                 | ici |s2| <> 1 et 0 , r1 <> 0
                   3299: 4$:     movb    a1@(4),a0@(4)
                   3300:         tstl    d4
                   3301:         bpl     6$
                   3302:         negb    a0@(4)          | mise signe
                   3303: 6$:     lea     a0@(0,d0:w:4),a0| a0 pointe apres resultat
                   3304:         lea     a1@(0,d0:w:4),a1| a1 pointe apres r1
                   3305:         subqw   #3,d0           | d0.w contient L1-1
                   3306:         movw    d0,d4           | d4.w idem
                   3307:         movw    d4,d6
                   3308:         moveq   #0,d1           | d1 a 0 pour les addx
                   3309:         moveq   #0,d0           | initialisation retenue d0
                   3310:                                 | boucle de multiplication :
                   3311: 7$:     movl    a1@-,d5
                   3312:         mulul   d2,d3:d5
                   3313:         addl    d0,d5
                   3314:         addxl   d1,d3
                   3315:         movl    d5,a0@-
                   3316:         movl    d3,d0           | nouvelle retenue d0
                   3317:         dbra    d6,7$
                   3318:         bfffo   d0{#0:#0},d1    | d1.l contient nb. de shifts
                   3319:         lsll    d1,d0           | normalisation de d0
                   3320:         moveq   #1,d6
                   3321:         lsll    d1,d6
                   3322:         subql   #1,d6           | masque de shift
                   3323:         negb    d1
                   3324:         addb    #32,d1
                   3325:                                 | boucle de shift
                   3326: 8$:     movl    a0@,d2
                   3327:         rorl    d1,d2
                   3328:         movl    d2,d3
                   3329:         andl    d6,d3
                   3330:         subl    d3,d2
                   3331:         addl    d3,d0
                   3332:         movl    d0,a0@+
                   3333:         movl    d2,d0
                   3334:         dbra    d4,8$
                   3335:         movl    a6@(-4),a0      | a0 pointe sur resultat
                   3336:         movl    a1@(-4),d0
                   3337:         andl    #0xffffff,d0    | d0.l contient fexp1
                   3338:         addl    d1,d0           | d0.l contient fexp resultat
                   3339:         btst    #24,d0
                   3340:         beq     9$
                   3341:                                 | ici debordement
                   3342: 11$:    movl    #muler2,sp@-
                   3343:         jsr     _pari_err
                   3344: 9$:     movw    d0,a0@(6)       | mise exposant
                   3345:         swap    d0
                   3346:         movb    d0,a0@(5)
                   3347: mulsrf: movl    a6@(-4),d0      | adresse du resultat
                   3348: mulsrf1:moveml  sp@+,d2-d6/a2
                   3349:         unlk    a6
                   3350:         rts
                   3351:
                   3352: #===================================================================#
                   3353: #                                                                   #
                   3354: #               Multiplication : entier * entier = entier           #
                   3355: #                                                                   #
                   3356: #       entree : a7@(4) pointe sur i2 de type I                     #
                   3357: #                a7@(8) pointe sur i1 de type I                     #
                   3358: #       sortie : d0 pointe sur i2 * i1 de type I (zone creee)       #
                   3359: #                                                                   #
                   3360: #===================================================================#
                   3361:
                   3362: _asmmulii: link    a6,#0
                   3363:         moveml  d2-d7/a2-a4,sp@-
                   3364:         movl    a6@(8),a1
                   3365:         movl    a6@(12),a2      | a1,a2 pointent sur i1,i2
                   3366:         movw    a1@(6),d1
                   3367:         movw    a2@(6),d2       | d1.w, d2.w contient l1,l2
                   3368:         cmpw    d1,d2
                   3369:         bcc     1$
                   3370:                                 | ici l1>l2 : echanger i1 et i2
                   3371:         exg     a1,a2
                   3372:         exg     d1,d2           | maintenant l1<=l2
                   3373: 1$:     subqw   #2,d1           | d1 recoit L1
                   3374:         bne     2$
                   3375:                                 | ici L1=0  <==> i1*i2 = 0
                   3376: 6$:     movl   _gzero,d0       | cree resultat nul de type I
                   3377:         bra     muliig
                   3378:                                 | maintenant 1<=L1<=L2
                   3379: 2$:     movw    d2,d0           | d0 recoit l2
                   3380:         addw    d1,d0           | d0 recoit l2 + L1 = L1 + L2 + 2
                   3381:         bvc     3$
                   3382:         movl    #muler1,sp@-
                   3383:         jsr     _pari_err            | debordement
                   3384:         bra     6$
                   3385: 3$:     bsr     geti            | allocation memoire pour resultat
                   3386:         movw    d0,a0@(6)       | met long effect. (peut-etre 1 de trop)
                   3387:         movb    a1@(4),d3
                   3388:         movb    a2@(4),d4
                   3389:         eorb    d4,d3
                   3390:         addqb   #1,d3
                   3391:         movb    d3,a0@(4)       | met signe du resultat
                   3392:         lea     a0@(0,d0:w:4),a4| a4 pointe apres fin resultat = z
                   3393:         lea     a1@(8,d1:w:4),a1| a1 pointe apres fin de i1 = y
                   3394:         lea     a2@(0,d2:w:4),a3| a3 pointe apres fin de i2 = x
                   3395:         subqw   #1,d1           | d1 recoit L1-1 compt bcl externe
                   3396:         subqw   #3,d2           | d2 recoit L2-1 compt bcl interne
                   3397:         movw    d2,d0           | sauvegarde compt interne dans d0
                   3398:         moveq   #0,d7           | registre d7 fixe a 0
                   3399:                                 | Boucles de multiplication I*I :
                   3400: | x=x1x2...xn multiplicande (x=i2,n=L2) pointe par a2 et a3
                   3401: | y=y1...ym multiplicateur (y=i1,m=L1) pointe par a1
                   3402: | z=z1z2...z(n+m) resultat pointe par a0 et a4
                   3403: | a0 et a2 sont decrementes par la boucle interne (les valeurs initiales
                   3404: | etant conservees dans a4 et a3)
                   3405: #...................................................................#
                   3406:                                 | 1re boucle interne:initialise resultat
                   3407:                                 | (z recoit x*ym)
                   3408:         movl    a3,a2           | a2 pointe apres xn
                   3409:         movl    a4,a0           | a0 pointe apres z(n+m)
                   3410:         movl    a1@-,d3         | d3 recoit ym
                   3411:        subl    d4,d4           | d4 retenue k et X initialise a 0
                   3412: m1:    movl    d4,d6           | nouvelle retenue dans d6
                   3413:        movl    d3,d5           | dupliquer le multiplicateur
                   3414:         mulul   a2@-,d4:d5      | d4:d5 recoit xi*ym (i=n,n-1,...,1)
                   3415:         addxl   d5,d6
                   3416:         addxl   d7,d4           | d4:d5 recoit xi*ym + k
                   3417:         movl    d6,a0@-         | range z(i+m)
                   3418:         dbra    d2,m1           | fin 1re bcl interne
                   3419:         bra     bclf            | brancher fin de boucle externe
                   3420: mext:   subql   #4,a4           | a4 pointe apres z(n+i)
                   3421:         movl    a3,a2           | a2 pointe apres xn
                   3422:         movl    a4,a0           | a0 pointe apres z(n+i)
                   3423:         movl    d0,d2           | d2 recoit n-1 compteur bcl interne
                   3424:         movl    a1@-,d3         | d3 recoit yj (j=m-1,m-2...1)
                   3425:        subl    d4,d4           | d4 retenue k et X initialise a 0
                   3426: mint:  movl    d4,d6           | nouvelle retenue dans d6
                   3427:        movl    d3,d5           | dupliquer le multiplicateur
                   3428:         mulul   a2@-,d4:d5      | d4:d5 recoit xi*yj (i=n,n-1,...,1)
                   3429:         addxl   d5,d6
                   3430:         addxl   d7,d4           | d4:d5 recoit xi*yj + k
                   3431:         addl    d6,a0@-         | range partie basse de xi*yj+z(i+j)+k
                   3432:         dbra    d2,mint         | fin de boucle interne
                   3433:        addxl   d7,d4
                   3434: bclf:   movl    d4,a0@-         | range derniere retenue
                   3435:         dbra    d1,mext         | fin bcl externe
                   3436: #...................................................................#
                   3437:                                 | derniere retenue = 0 ?
                   3438:         beq     4$
                   3439:         subql   #8,a0           | non : rien a faire
                   3440:                                 | a0 pointe sur resultat
                   3441:         bra     muliif
                   3442:                                 | ici pas de retenue finale
                   3443: 4$:     subqw   #1,a0@(-2)
                   3444:         subqw   #1,a0@(-6)      | rectifier longueurs
                   3445:         movl    a0@(-4),a0@     | deplacer mots codes
                   3446:         movl    a0@(-8),a0@-    | a0 pointe sur resultat
                   3447:         addl    #4,_avma
                   3448: muliif: movl    a0,d0
                   3449: muliig: moveml  sp@+,d2-d7/a2-a4
                   3450:         unlk    a6
                   3451:         rts
                   3452:
                   3453: #===================================================================#
                   3454: #                                                                   #
                   3455: #               Multiplication : reel * reel = reel                 #
                   3456: #                                                                   #
                   3457: #       entree : a7@(4) pointe sur r2 de type R                     #
                   3458: #                a7@(8) pointe sur r1 de type R                     #
                   3459: #       sortie : d0 pointe sur r2 * r1 de type R (zone creee)       #
                   3460: #                                                                   #
                   3461: #       precision : L = inf ( L1 , L2 )                             #
                   3462: #                                                                   #
                   3463: #===================================================================#
                   3464:
                   3465: _mulrr: link    a6,#-20          | variables locales pour murr aussi
                   3466:         moveml  d2-d7/a2-a4,sp@-
                   3467:         movl    a6@(8),a1       | a1 pointe sur r1
                   3468:         movl    a6@(12),a2      | a2 pointe sur r2
                   3469:         movb    a1@(4),d0
                   3470:         andb    a2@(4),d0
                   3471:         bne     munzr
                   3472:                                 | ici r1 ou r2 = 0
                   3473: muzr:   moveq   #3,d0
                   3474:         bsr     getr
                   3475:         movl    a0,a6@(-8)
                   3476:         movl    a1@(4),d1
                   3477:         andl    #0xffffff,d1    | exposant de x1
                   3478:         movl    a2@(4),d2
                   3479:         andl    #0xffffff,d2    | exposant de y
                   3480:         addl    d2,d1
                   3481:         subl    #0x800000,d1
                   3482:         cmpl    #0x1000000,d1
                   3483:         bcs     1$
                   3484:         movl    #muler4,sp@-    | debordement r*r
                   3485:         jsr     _pari_err
                   3486: 1$:     tstl    d1
                   3487:         bgt     2$
                   3488:         movl    #muler5,sp@-    | underflow r*r
                   3489:         jsr     _pari_err
                   3490: 2$:     movl    d1,a0@(4)
                   3491:         clrl    a0@(8)
                   3492:         bra     mulrrf
                   3493:
                   3494: munzr:  movw    a2@(2),d0
                   3495:        clrl    a6@(-12)        | Initialiser flag a 0
                   3496:         cmpw    a1@(2),d0
                   3497:         bls     1$
                   3498:         movw    a1@(2),d0       | d0.w contient L+2=inf(L1,L2)+2
                   3499:         exg     a1,a2           | a2 pointe sur le + court
                   3500:        bra     2$
                   3501: 1$:    bne     2$
                   3502:         lea     a1@(0,d0:w:4),a3 | a3 pointe sur x[L+1]
                   3503:        movl    a3,a6@(-12)     | longueurs egales: flag egal adresse
                   3504:        movl    a3@,a6@(-16)    | sauvegarde de x[L+1]
                   3505:        clrl    a3@
                   3506: 2$:     bsr     getr
                   3507:         movl    a0,a6@(-8)
                   3508:         bsr     murr            | effectuer la multiplication
                   3509:        tstl    a6@(-12)
                   3510:        beq     mulrrf
                   3511:        movl    a6@(-12),a3
                   3512:        movl    a6@(-16),a3@    | remettre x[L+1]
                   3513: mulrrf: movl    a6@(-8),d0      | adresse du resultat
                   3514:         moveml  sp@+,d2-d7/a2-a4
                   3515:         unlk    a6
                   3516:         rts
                   3517:
                   3518: #-------------------------------------------------------------------#
                   3519: #       module interne de multiplication r0=r1*r2                   #
                   3520: #               ( pour R*R et I*R)                                  #
                   3521: #       entree : a1 et a2 pointent sur 2 reels                      #
                   3522: #       r1,r2  non nuls avec L1>=L2=m                               #
                   3523: #                a0 pointe sur une zone reelle de long l1           #
                   3524: #       sortie : le produit r0 est mis a l'addresse a0              #
                   3525: #                                                                   #
                   3526: #-------------------------------------------------------------------#
                   3527:
                   3528: | notation : r1 = x = x1x2...xmx(m+1)...  multiplicande
                   3529: |            r2 = y = y1y2...ym           multiplicateur
                   3530: |       ( le lgmot x(m+1) peut ne pas exister ! ( le1 >= le2 = m ) )
                   3531: |             z = z0z1z2...zmz(m+1) resultat.
                   3532: |       ( z0=0 ou 1 et z(m+1) a jeter)
                   3533:
                   3534: murr:   movl    a1,a3
                   3535:         lea     a3@(12),a3      | a3 pointe sur x2 (2me lgmot mant.x)
                   3536: #       movw    a2@(2),d0       | d0.w=L2=m long commune des mantisses (mis a l'appel!)
                   3537:         lea     a2@(0,d0:w:4),a2| a2 pointe apres ym
                   3538:         lea     a0@(0,d0:w:4),a0| a0 pointe apres zm
                   3539:         movl    a0@,a6@(-4)     | on sauvegarde le lg mot suivant z
                   3540:         clrl    a0@+            | z(m+1) recoit 0,a0 pointe apres z(m+1)
                   3541:         subqw   #3,d0           | d0 recoit m-1
                   3542:         movl    d0,a6@(-20)     | sauvegarde m-1 compt. bcl externe
                   3543:         clrw    d3              | d3=0,val initiale compt bcl interne
                   3544:                                 | Boucles triangulaires mult. R*R
                   3545: #...................................................................#
                   3546: bext:   movl    a0,a4           | a4 pointe apres z(m+1)
                   3547:         movl    a3,a1           | a1 pointe sur x(j+1) (j=1,2...m)
                   3548:         movw    d3,d2           | d3 recoit m-j compt bcl interne
                   3549:         movl    a2@-,d4         | d4 recoit yj
                   3550:         movl    a3@+,d5         | d5 recoit x(j+1)
                   3551:        subl    d1,d1           | d1 a zero ainsi que bit X
                   3552:         mulul   d4,d7:d5        | init.retenue d7(ignorer poids faible)
                   3553: bint:   movl   d7,d6           | sauvegarder nouvelle retenue
                   3554:        movl    d4,d5           | dupliquer multiplicateur
                   3555:         mulul   a1@-,d7:d5      | d7:d5 recoit xi*yj
                   3556:         addxl   d5,d6
                   3557:         addxl   d1,d7           | d7:d5 recoit xi*yj + k
                   3558:         addl    d6,a4@-         | nouveau z(i+j)
                   3559:         dbra    d2,bint
                   3560:        addxl   d1,d7
                   3561:         movl    d7,a4@-         | range derniere retenue
                   3562:         addqw   #1,d3           | augmente de 1 long bcl interne
                   3563:         dbra    d0,bext         | fin bcl externe
                   3564: #...................................................................#
                   3565:         movl    a1@(-4),d1      | a1 pointe sur x1 (1er mot mant de x)
                   3566:         andl    #0xffffff,d1    | exposant de x1
                   3567:         movl    a2@(-4),d2      | a2 pointe sur y1
                   3568:         andl    #0xffffff,d2    | exposant de y
                   3569:         addl    d2,d1
                   3570:         subl    #0x800000,d1
                   3571:         tstl    a4@             | a4 pointe sur z1 : z normalise ?
                   3572:         bpl     1$
                   3573:         addl    #1,d1           | ici mantisse normalisee
                   3574:         bra     2$
                   3575:                                 | ici il faut shifter de 1 a gauche
                   3576: 1$:     movl    a0,a4           | a4 pointe apres z(m+1)
                   3577:         subqw   #2,a4
                   3578:        movl    a6@(-20),d0     | recuperer m-1
                   3579:         roxlw   a4@-            | initialise le carry
                   3580: 5$:     roxlw   a4@-            | shift par mots (d0 compteur=m-1)
                   3581:         roxlw   a4@-
                   3582:         dbra    d0,5$           | boucle de shift
                   3583: 2$:     cmpl    #0x1000000,d1
                   3584:         bcs     3$
                   3585:         movl    #muler4,sp@-    | debordement r*r
                   3586:         jsr     _pari_err
                   3587: 3$:     tstl    d1
                   3588:         bgt     4$
                   3589:         movl    #muler5,sp@-    | underflow r*r
                   3590:         jsr     _pari_err
                   3591: 4$:     movl    d1,a4@-         | range exposant
                   3592:         movb    a1@(-4),d1
                   3593:         movb    a2@(-4),d2      | signes
                   3594:         eorb    d2,d1
                   3595:         addqb   #1,d1
                   3596:         movb    d1,a4@          | range signe resultat
                   3597:         movl    a6@(-4),a0@(-4) | remet en place mot sous z(m+1)
                   3598: murrf:  rts
                   3599:
                   3600: #===================================================================#
                   3601: #                                                                   #
                   3602: #               Multiplication : entier * reel = reel               #
                   3603: #                                                                   #
                   3604: #       entree : a7@(4) pointe sur i2 de type I                     #
                   3605: #                a7@(8) pointe sur r1 de type R                     #
                   3606: #       sortie : d0 pointeur sur i2 * r1 de type R (zone creee)     #
                   3607: #                                                                   #
                   3608: #===================================================================#
                   3609:
                   3610: _mulir: link    a6,#-20
                   3611:         moveml  d2-d7/a2-a4,sp@-
                   3612:         movl    a6@(8),a2       | a2 pointe sur i2
                   3613:         tstb    a2@(4)
                   3614:         bne     1$
                   3615:                                 | ici i2 = 0
                   3616:        movl    _gzero,d0
                   3617:         bra     mulirf1
                   3618:                                 | ici i2 <> 0
                   3619: 1$:     movl    a6@(12),a1      | a1 pointe sur r1
                   3620:         tstb    a1@(4)
                   3621:         bne     2$
                   3622:                                 | ici r1 = 0
                   3623:         moveq   #3,d0
                   3624:         bsr     getr
                   3625:         movw    a2@(6),d0
                   3626:         lsll    #5,d0
                   3627:         bfffo   a2@(8){#0:#0},d1
                   3628:         subl    d1,d0
                   3629:         subl    #65,d0
                   3630:         addl    a1@(4),d0
                   3631:         cmpl    #0x1000000,d0
                   3632:         bcs     3$
                   3633:         movl    #muler6,sp@-    | overflow I*R, R = 0
                   3634:         jsr     _pari_err
                   3635: 3$:     movl    d0,a0@(4)
                   3636:         clrl    a0@(8)
                   3637:         movl    a0,d0
                   3638:         bra     mulirf1
                   3639:                                 | ici i2 <> 0 et r1<> 0
                   3640: 2$:     movw    a1@(2),d0
                   3641:         bsr     getr            | allocation memoire pour resultat
                   3642:         movl    a0,a6@(-8)      | sauvegarde adresse resultat
                   3643:        addqw   #1,d0
                   3644:         bsr     getr            | allocation mem pour conversion i2->r2
                   3645:         movl    a0,a7@-
                   3646:         movl    a2,a7@-
                   3647:         bsr     _affir
                   3648:         addql   #4,sp
                   3649:         movl    a7@,a2          | a2 recoit adr de r2=i2 (reste en pile)
                   3650:         movl    a6@(-8),a0      | a0 recoit addresse du resultat
                   3651:        exg     a1,a2           | Il faut que a2 soit le plus court!
                   3652:        movw    a2@(2),d0       | Mettre la plus petite longueur dans d0 pour murr
                   3653:         bsr     murr
                   3654:         movl    a7@+,a0
                   3655:         bsr     giv
                   3656: mulirf: movl    a6@(-8),d0
                   3657: mulirf1:moveml  sp@+,d2-d7/a2-a4
                   3658:         unlk    a6
                   3659:         rts
                   3660:
                   3661:
                   3662:
                   3663:
                   3664:
                   3665: #*******************************************************************#
                   3666: #*******************************************************************#
                   3667: #**                                                               **#
                   3668: #**             PROGRAMMES DE DIVISION AVEC RESTE                 **#
                   3669: #**                                                               **#
                   3670: #*******************************************************************#
                   3671: #*******************************************************************#
                   3672:
                   3673:
                   3674:
                   3675:
                   3676:
                   3677: #===================================================================#
                   3678: #                                                                   #
                   3679: #               Division avec reste (par valeur)                    #
                   3680: #                                                                   #
                   3681: #       entree : a7@(4) pointe sur n2 de type I                     #
                   3682: #                a7@(8) pointe sur n1 de type I                     #
                   3683: #                a7@(12) pointe sur n3 de type I                    #
                   3684: #                a7@(16) pointe sur n4 de type I                    #
                   3685: #       sortie : la zone pointee par a7@(12) contient n2 / n1       #
                   3686: #                la zone pointee par a7@(16) contient le reste (du  #
                   3687: #                signe du dividende)                                #
                   3688: #       interdit : type S et R                                      #
                   3689: #                                                                   #
                   3690: #===================================================================#
                   3691:
                   3692: _mpdvmdz:lea    _asmdvmdii,a0
                   3693:         bra     mpopii
                   3694:
                   3695:                                 | division avec reste S/S=(I et I)
                   3696:                                 | sinon erreur
                   3697:
                   3698: _dvmdssz:lea    _dvmdss,a0
                   3699:         bra     mpopii
                   3700:
                   3701:                                 | division avec reste S/I=(I et I)
                   3702:                                 | sinon erreur
                   3703:
                   3704: _dvmdsiz:lea    _dvmdsi,a0
                   3705:         bra     mpopii
                   3706:
                   3707:                                 | division avec reste I/S=(I et I)
                   3708:                                 | sinon erreur
                   3709:
                   3710: _dvmdisz:lea    _dvmdis,a0
                   3711:         bra     mpopii
                   3712:
                   3713:                                 | division avec reste I/I=(I et I)
                   3714:                                 | sinon erreur
                   3715:
                   3716: _dvmdiiz:lea    _asmdvmdii,a0
                   3717:         bra     mpopii
                   3718:
                   3719: #===================================================================#
                   3720: #                                                                   #
                   3721: #Division avec reste : entier court / entier court =(entier,entier) #
                   3722: #                                                                   #
                   3723: #       entree : a7@(4) contient s2 de type S                       #
                   3724: #                a7@(8) contient s1 de type S                       #
                   3725: #       sortie : a7@(12) pointe sur l'adresse du futur reste        #
                   3726: #                d0 pointe sur s2 div s1 de type I                  #
                   3727: #                le reste est du signe de s2 (zone creee)           #
                   3728: #                                                                   #
                   3729: #===================================================================#
                   3730:
                   3731: _dvmdss:link    a6,#0
                   3732:         movl    d2,sp@-
                   3733:         movl    a6@(12),sp@-    | empilage s1
                   3734:         movl    a6@(8),sp@-     | empilage s2
                   3735:         bsr     _divss
                   3736: dmd:    addql   #8,sp
                   3737:         tstl    d1
                   3738:         bne     1$
                   3739:                                 | ici reste nul
                   3740:        movl    _gzero,a0
                   3741:         bra     dvmdssf
                   3742:                                 | ici reste non nul
                   3743: 1$:     movl    d0,d2
                   3744:         moveq   #3,d0
                   3745:         bsr     geti
                   3746:         movl    #0x1000003,a0@(4)
                   3747:         tstl    d1
                   3748:         bpl     2$
                   3749:         negl    d1
                   3750:         movb    #-1,a0@(4)
                   3751: 2$:     movl    d1,a0@(8)
                   3752:         movl    d2,d0
                   3753: dvmdssf:movl    a6@(16),a1
                   3754:         movl    a0,a1@
                   3755:         movl    sp@,d2
                   3756:         unlk    a6
                   3757:         rts
                   3758:
                   3759: #===================================================================#
                   3760: #                                                                   #
                   3761: #   Division avec reste : entier court / entier = (entier,entier)   #
                   3762: #                                                                   #
                   3763: #       entree : a7@(4) contient s2 de type S                       #
                   3764: #                a7@(8) pointe sur i1 de type I                     #
                   3765: #                a7@(12) pointe sur l'adresse du futur reste        #
                   3766: #       sortie : d0 pointe sur s2 div i1 de type I ;                #
                   3767: #                reste du signe de s2 (zones creees)                #
                   3768: #                                                                   #
                   3769: #===================================================================#
                   3770:
                   3771: _dvmdsi:movl    a7@(8),sp@-
                   3772:         movl    a7@(8),sp@-
                   3773:         bsr     _divsi
                   3774: dmdi:   addql   #8,sp
                   3775:         tstl    d1
                   3776:         bne     1$
                   3777:                                 | ici reste nul
                   3778:        movl    _gzero,sp@(12)@
                   3779:        rts
                   3780:                                 | ici reste non nul
                   3781: 1$:     movl    d0,a1           | sauvegarde adresse quotient
                   3782:         moveq   #3,d0
                   3783:         bsr     geti
                   3784:         movl    #0x1000003,a0@(4)
                   3785:         tstl    d1
                   3786:         bpl     2$
                   3787:         negl    d1
                   3788:         movb    #-1,a0@(4)
                   3789: 2$:     movl    d1,a0@(8)
                   3790: 3$:     movl    a1,d0
                   3791:         movl    a0,sp@(12)@
                   3792:         rts
                   3793:
                   3794: #===================================================================#
                   3795: #                                                                   #
                   3796: #   Division avec reste : entier / entier court = (entier,entier)   #
                   3797: #                                                                   #
                   3798: #       entree : a7@(4) pointe sur i2 de type I                     #
                   3799: #                a7@(8) contient s1 de type S                       #
                   3800: #                a7@(12) pointe sur l'adresse du futur reste        #
                   3801: #       sortie : d0 pointe sur i2 div s1 de type I                  #
                   3802: #                reste de type I du signe de s1 (zones creees)      #
                   3803: #                                                                   #
                   3804: #===================================================================#
                   3805:
                   3806: _dvmdis:movl    a7@(8),sp@-
                   3807:         movl    a7@(8),sp@-
                   3808:         bsr     _divis
                   3809:         bra     dmdi
                   3810:
                   3811: #===================================================================#
                   3812: #                                                                   #
                   3813: #       Division avec reste : entier / entier = (entier,entier)     #
                   3814: #                                                                   #
                   3815: #       entree : a7@(4) pointe sur i2 de type I (dividende)         #
                   3816: #                a7@(8) pointe sur i1 de type I (diviseur)          #
                   3817: #                a7@(12) contient un pointeur sur le reste si l'on  #
                   3818: #                veut a la fois q et r, 0 si l'on ne veut que le    #
                   3819: #                quotient, -1 si l'on ne veut que le reste          #
                   3820: #       sortie : d0 pointe sur q si celui-ci est attendu, et sinon  #
                   3821: #                sur r. a7@(12) pointe sur r si q et r sont attendus#
                   3822: #                (toutes les zones sont creees)                     #
                   3823: #       remarque : il s'agit de la 'fausse division' ; le reste est #
                   3824: #                 du signe du dividende                             #
                   3825: #                                                                   #
                   3826: #                                                                   #
                   3827: #       variables locales (etat pile apres link):                   #
                   3828: #  -16 -14 -12 -10 -8  -6   -4    a6    4    8    12   16           #
                   3829: #  +---+---+---+---+---+---+------+----+----+----+----+----+        #
                   3830: #   n-m  k sgnq sgnr n   m  ad(q,r)      ret  i2   i1 ^r/0/-1       #
                   3831: #                                                                   #
                   3832: #===================================================================#
                   3833:
                   3834: _asmdvmdii:link    a6,#-32
                   3835:         moveml  d2-d7/a2-a4,sp@-
                   3836:         movl    a6@(12),a1      | a1 pointe sur le diviseur i1
                   3837:         movw    a1@(6),d1       | d1.w contient le1
                   3838:         cmpw    #2,d1
                   3839:         bne     dv1
                   3840:                                 | ici i1 = 0
                   3841:         movl    #dvmer1,sp@-
                   3842: dvmerr: jsr     _pari_err
                   3843:                                 | ici i1 <> 0
                   3844: dv1:    movl    a6@(8),a2       | a2 pointe sur dividende i2
                   3845:         movw    a2@(6),d2       | d2.w contient le2
                   3846:         cmpw    #2,d2
                   3847:         bne     dv3
                   3848:                                 | ici quotient=reste=0
                   3849: dv2:    movl    a6@(16),d3
                   3850:         cmpl    #-1,d3
                   3851:         beq     1$
                   3852:                                 | ici quotient attendu (q=0)
                   3853:        movl    _gzero,d0
                   3854: 1$:     tstl    d3
                   3855:         beq     dvmiif
                   3856:                                 | ici reste attendu (r=0)
                   3857:        movl    _gzero,a0
                   3858:         btst    #0,d3           | test si fonction mod
                   3859:         bne     2$
                   3860:         movl    d3,a1           | d3 pointe sur l'adr. du reste
                   3861:         movl    a0,a1@
                   3862:         bra     dvmiif
                   3863: 2$:     movl    a0,d0
                   3864:         bra     dvmiif
                   3865:                                 | ici i2 et i1 <> 0
                   3866: dv3:    movw    d2,d0           | le2
                   3867:         subw    d1,d0           | d0.w contient L2-L1
                   3868:         bcc     dv4
                   3869:                                 | ici q=0 , r=i2
                   3870:         movl    a6@(16),d3
                   3871:         cmpl    #-1,d3
                   3872:         beq     1$
                   3873:                                 | quotient attendu soit q=0
                   3874:        movl    _gzero,d0
                   3875: 1$:     tstl    d3
                   3876:         beq     dvmiif
                   3877:                                 | reste attendu soit r=i1
                   3878:         movl    d0,d1
                   3879:         movw    d2,d0
                   3880:         bsr     geti
                   3881:         movl    a0,a1
                   3882:         subqw   #2,d0
                   3883:         addql   #4,a0
                   3884:         addql   #4,a2
                   3885: 2$:     movl    a2@+,a0@+
                   3886:         dbra    d0,2$
                   3887:         cmpl    #-1,d3
                   3888:         beq     3$
                   3889:         movl    d3,a0
                   3890:         movl    a1,a0@
                   3891:         movl    d1,d0
                   3892:         bra     dvmiif
                   3893: 3$:     movl    a1,d0
                   3894:         bra     dvmiif
                   3895:                                 | ici L2 >= L1
                   3896: dv4:    movb    a1@(4),d3       | d3.b contient signe de i1
                   3897:         movb    a2@(4),d4       | d4.b contient signe de i2
                   3898:         eorb    d4,d3
                   3899:         addqb   #1,d3           | d4.b contient signe de q
                   3900:         movb    d3,a6@(-12)     | sauvegarde signe de q
                   3901:         movb    d4,a6@(-10)     | sauvegarde signe de r
                   3902:         movl    _avma,a6@(-20)  | sauvegarde _avma initial
                   3903:         movw    d2,d0           | d0 recoit l2
                   3904:         bsr     geti            | allocation memoire de travail :
                   3905:                                 | on va y former q0q1...q(n-m)r1r2...rm
                   3906:                                 | les memoires provisoires ne seront pas
                   3907:                                 | rendues par giv:on ecrase mot code
                   3908:         movl    a0,a6@(-4)      | sauvegarde addresse zone de travail
                   3909:         subqw   #2,d1
                   3910:         subqw   #2,d2
                   3911:         movw    d1,a6@(-6)      | sauvegarde L1 (=m)
                   3912:         movw    d2,a6@(-8)      | sauvegarde L2 (=n)
                   3913:         movw    d2,a6@(-16)
                   3914:         subw    d1,a6@(-16)     | n-m dans a6@(-16)
                   3915:         addql   #8,a2
                   3916:         addql   #8,a1
                   3917:         movl    a1@,d3          | d3.l=y1 (1er lgmot du diviseur i1)
                   3918:         subqw   #1,d2           | d2 recoit n-1
                   3919:         subqw   #1,d1           | d1 recoit m-1
                   3920:         bne     divlon
                   3921:                                 | ici division simple (m = 1)
                   3922: divsim: clrl    d4
                   3923: 1$:     movl    a2@+,d5
                   3924:         divul   d3,d4:d5
                   3925:         movl    d5,a0@+
                   3926:         dbra    d2,1$
                   3927:         movl    d4,a0@          | reste mis derriere quotient
                   3928:         movl    a0,a2           | a2 pointe sur reste
                   3929:         clrw    a6@(-14)        | on n'a pas fait de shift
                   3930:         bra     ranger
                   3931:                                 | ici division longue (m > 1)
                   3932: divlon: bfffo   d3{#0:#0},d4    | d4 recoit nb de shift pour normaliser
                   3933:         movw    d4,a6@(-14)     | sauvegarde du nb. de shifts = k
                   3934:         bne     1$
                   3935:                                 | ici pas de normalisation
                   3936:         movl    a0,a4
                   3937:         movl    #0,a4@+         | met a 0 1er lgmot soit x0
                   3938: 4$:     movl    a2@+,a4@+       | recopie x1x2...xn
                   3939:         dbra    d2,4$
                   3940:         movl    a0,a2           | a2 pointe sur x0,a4 pointe apres xn
                   3941:         lea     a1@(4,d1:w:4),a3| a1 pointe sur y1,a3 pointe apres ym
                   3942:         bra     nosh
                   3943:                                 | ici on normalise le diviseur i1=y
                   3944:                                 | et on decale autant le dividende:
                   3945: 1$:     lsll    d4,d3           | normalisation de y1
                   3946:         movw    a6@(-6),d0      | on demande m lgmots
                   3947:         bsr     geti            | allocation pour copie normalisee de y
                   3948:         moveq   #1,d6
                   3949:         lsll    d4,d6
                   3950:         subql   #1,d6           | masque de shift
                   3951:         movl    a0,a3
                   3952:         subqw   #1,d0           | d0 compt. mis a m-1
                   3953:         addql   #4,a1           | a1 pointe sur y2 2me lg mot diviseur
                   3954:         bra     3$
                   3955: 2$:     movl    a1@+,d1         | boucle shift vers la gauche ds copie
                   3956:         roll    d4,d1
                   3957:         movl    d1,d5
                   3958:         andl    d6,d1
                   3959:         addl    d1,d3
                   3960:         movl    d3,a3@+
                   3961:         subl    d1,d5
                   3962:         movl    d5,d3
                   3963: 3$:     dbra    d0,2$
                   3964:         movl    d3,a3@+
                   3965:         movl    a0,a1           | a1 pointe sur 1er lgmot y1 normalise
                   3966:                                 | a3 pointe apres ym
                   3967:                                 | transfert avec shift du dividende:
                   3968:         movl    a6@(-4),a4      | a4 pointe sur zone de travail
                   3969:         moveq   #0,d3
                   3970:         movw    a6@(-8),d0
                   3971:         subqw   #1,d0           | d0 recoit n-1 compteur
                   3972: 5$:     movl    a2@+,d1         | boucle de shift du dividende i2
                   3973:         roll    d4,d1           | sur place
                   3974:         movl    d1,d5
                   3975:         andl    d6,d1
                   3976:         addl    d1,d3
                   3977:         movl    d3,a4@+
                   3978:         subl    d1,d5
                   3979:         movl    d5,d3
                   3980:         dbra    d0,5$
                   3981:         movl    d3,a4@
                   3982:         movl    a6@(-4),a2      | a2 pointe sur x0 ;(a4 pointe sur xn)
                   3983: nosh:   movw    a6@(-6),d6      | d6 recoit m
                   3984:         lea     a2@(4,d6:w:4),a4| a4 pointe apres xm
                   3985:         subqw   #1,d6           | d6 recoit m-1 compteur bcls internes
                   3986:         movw    a6@(-16),d7     | d7 recoit n-m compteur bcl externe
                   3987: #-------------------------------------------------------------------#
                   3988:                                 | boucles de division I / I :
                   3989:         | a1 pointe sur y1, a3 pointe apres ym : diviseur y1y2...ym
                   3990:         | a2 pointe sur x0, a4 pointe apres xm : dividende x0x1...xn
                   3991:         | d7 contient n-m compt. boucle externe
                   3992:         | d6 contient m compt. boucles internes (n>=m>=2)
                   3993:         | la zone x0x1...xn recoit q0q1...q(n-m)r1r2...rm
                   3994:
                   3995: bclext: movl    a1@,d0          | d0 recoit y1 (1er lgmot diviseur)
                   3996:         cmpl    a2@,d0          | xi = y1 ? (i=0,1...n)
                   3997:         bne     1$
                   3998:         moveq   #-1,d1          | oui: essayer q=2^32-1
                   3999:         addl    a2@(4),d0       | calcul du reste
                   4000:                                 | r=xix(i+1) mod y1 = xi+x(i+1)
                   4001:         bcs     4$              | si r>=2^32 , q est ok
                   4002:         movl    d0,d2           | sinon d2 recoit r
                   4003:         bra 2$                  | rejoindre cas general
                   4004: 1$:     movl    a2@,d2          | si xi<y1 :
                   4005:         movl    a2@(4),d1       | d2:d1 recoit xix(i+1)
                   4006:         divul   d0,d2:d1        | d1 recoit q = xix(i+1) div y1
                   4007:                                 | d2 recoit r = xix(i+1) mod y1
                   4008: 2$:     movl    a1@(4),d3       | d3 recoit y2
                   4009:         mulul   d1,d4:d3        | d4:d3 recoit q*y2
                   4010:         subl    a2@(8),d3
                   4011:         subxl   d2,d4           | d4:d3 recoit q*y2-(r,x(i+2))
                   4012:         bls     4$              | si <= 0 alors q ok
                   4013: 3$:     subql   #1,d1           | sinon diminuer q
                   4014:         subl    a1@(4),d3       | corriger reste partiel:
                   4015:         subxl   d0,d4           | d3:d4 recoit d3:d4-y1y2
                   4016:         bhi     3$              | tant que q*y1y2>xix(i+1)x(i+2)
                   4017:                                 | recommencer q recoit q-1
                   4018:                                 | ici q*y1y2 <= xix(i+1)x(i+2)
                   4019:                                 | on va former le nouveau reste
                   4020:                                 | en remplacant x(i+1)...x(i+m) par
                   4021:                                 | x(i+1)...x(i+m) - q*y1...ym
                   4022: 4$:     movw    d6,d0           | d0 recoit m-1 compteur
                   4023:         movl    a3,a1           | a1 pointe apres ym
                   4024:         movl    a4,a2           | a2 pointe apres x(i+m)
                   4025:         moveq   #0,d2           | d2 fixe a 0 pour les addxl
                   4026:         subl    d3,d3           | d3 recoit k retenue initialisee a 0 et X=0
                   4027: 5$:     movl    a1@-,d5         | d5 recoit x(i+j) j=m,m-1,...,1
                   4028:         mulul   d1,d4:d5
                   4029:         addxl   d3,d5
                   4030:         addxl   d2,d4
                   4031:         subl    d5,a2@-         | nouvel x(i+j)
                   4032:         movl    d4,d3
                   4033:         dbra    d0,5$
                   4034:        addxl   d2,d3
                   4035:         subl    d3,a2@(-4)      | soustrait derniere retenue
                   4036:         bcc     6$              | si pas carry q=qi est definitif
                   4037:         subql   #1,d1           | sinon encore 1 de trop
                   4038:         movw    d6,d0           | repositionner compteur m-1
                   4039:         movl    a3,a1
                   4040:         movl    a4,a2           | repositionner pointeurs
                   4041: 7$:     addxl   a1@-,a2@-
                   4042:         dbra    d0,7$           | boucle de remise a jour du reste
                   4043:                                 | il y a forcement carry final a ignorer
                   4044: 6$:     movl    d1,a2@(-4)      | qi est range sur l'ancien xi
                   4045:         addql   #4,a4           | a4 pointe apres x(i+m+1)
                   4046:         dbra    d7,bclext       | boucler pour q0q1...q(n-m)
                   4047:                                 | fin des boucles de division I/I
                   4048:                                 | a2 pointe apres q(n-m),ie sur r1
                   4049: #-------------------------------------------------------------------#
                   4050:                                 | rangement des resultats
                   4051:
                   4052: ranger: clrl    a6@(-28)
                   4053:         clrl    a6@(-32)
                   4054:         movl    _avma,a6@(-24)  | actuel _avma
                   4055:         movl    a6@(-20),d7     | _avma initial
                   4056:         subl    _avma,d7        | nb d'octets memoire provisoires
                   4057:                                 | offset:ajouter aux addresses fournies
                   4058:         movl    a6@(16),d3
                   4059:         cmpl    #-1,d3
                   4060:         beq     rngres
                   4061:                                 | ici quotient attendu
                   4062:         movl    a6@(-4),a0      | a0 pointe sur q0
                   4063:         movw    a6@(-16),d0     | d0 recoit n-m
                   4064:         movw    d0,d1
                   4065:         addqw   #2,d0
                   4066:         tstl    a0@
                   4067:         beq     1$
                   4068:         addqw   #1,d0
                   4069: 1$:     bsr     geti            | allocation memoire pour quotient
                   4070:         movl    a0,a6@(-28)     | a6@(-28) recoit adr. provisoire de q
                   4071:         addl    d7,a6@(-28)     | ajoute offset memoires provisoires
                   4072:                                 | a6@(-28) contient adr definitive de q
                   4073:         lea     a0@(0,d0:w:4),a1
                   4074:         movl    a2,a3           | a2 et a3 pointe sur r1
                   4075: 2$:     movl    a3@-,a1@-       | recopie q0,q1...q(n-m)
                   4076:         dbra    d1,2$
                   4077:         movw    d0,a0@(6)       | met long effective de q
                   4078:         movb    a6@(-12),a0@(4) | met signe de q
                   4079:         cmpw    #2,d0
                   4080:         bne     rngres
                   4081:         clrb    a0@(4)          | rectifier signe lorsque q=0
                   4082: rngres: tstl    d3
                   4083:         beq     rendre
                   4084:                                 | ici reste attendu
                   4085:         movw    a6@(-6),d0
                   4086:         subqw   #1,d0           | d0 recoit m-1
                   4087: 4$:     tstl    a2@+
                   4088:         dbne    d0,4$           | chasse les zeros
                   4089:         bne     1$
                   4090:                                 | ici r=0 : ranger 0
                   4091:         movw    #2,d0
                   4092:         bsr     geti
                   4093:         movl    #2,a0@(4)
                   4094:         addl    d7,a0           | ajoute offset
                   4095:         movl    a0,a6@(-32)     | adr. definit. de r
                   4096:         bra     rendre
                   4097: 1$:     subql   #4,a2           | a2 pointe sur 1er ri non nul
                   4098:         movw    d0,d1
                   4099:         addqw   #3,d0
                   4100:         bsr     geti            | allocation memoire pour reste
                   4101:         movl    a0,a6@(-32)
                   4102:         addl    d7,a6@(-32)     | ajoute offset memoires provisoires
                   4103:         movb    a6@(-10),a0@(4) | met signe de r
                   4104:         movw    d0,a0@(6)       | met long effect provisoire (si shift)
                   4105:         addql   #8,a0
                   4106:         movw    a6@(-14),d3     | d3 recoit k nb de shifts
                   4107:         bne     2$
                   4108:                                 | ici k=0 pas de shift
                   4109: 5$:     movl    a2@+,a0@+
                   4110:         dbra    d1,5$           | recopie des ri effectifs
                   4111:         bra     rendre
                   4112: 2$:     moveq   #-1,d6          | ici shift de r
                   4113:         lsrl    d3,d6           | d6 recoit masque de shift
                   4114:         moveq   #0,d5
                   4115:         bset    d3,d5           | d5 recoit 2^k
                   4116:         moveq   #0,d2
                   4117:         cmpl    a2@,d5          | comparer 1er ri a 2^k
                   4118:         bls     3$
                   4119:         movl    a2@+,d2         | ici ri < 2^k  : le shifter
                   4120:         rorl    d3,d2
                   4121:         subqw   #1,d0           | et diminuer de 1 la long de la boucle
                   4122:         subqw   #1,a0@(-2)      | ainsi que la long effective de r
                   4123: 3$:     movl    a2@+,d5         | boucle de shift de r
                   4124:         rorl    d3,d5           | boucle jamais vide car r>=2^k
                   4125:         movl    d5,d4
                   4126:         andl    d6,d4
                   4127:         addl    d4,d2
                   4128:         movl    d2,a0@+
                   4129:         subl    d4,d5
                   4130:         movl    d5,d2
                   4131:         dbra    d1,3$
                   4132: rendre: movl    a6@(-20),a0     | rendre memoires provisoires
                   4133:         movl    a6@(-24),a1     | il faut rendre la zone entre a1 et a0
                   4134:         movl    a1,d0
                   4135:         subl    _avma,d0
                   4136:         lsrl    #2,d0           | nb de lgmots a deplacer
                   4137:         subqw   #1,d0
                   4138: 1$:     movl    a1@-,a0@-
                   4139:         dbra    d0,1$
                   4140:         movl    a0,_avma        | nouvel _avma
                   4141:         movl    a6@(-28),d0
                   4142:         bne     2$
                   4143:         movl    a6@(-32),d0
                   4144:         bra     dvmiif
                   4145: 2$:     tstl    a6@(-32)
                   4146:         beq     dvmiif
                   4147:         movl    a6@(16),a1
                   4148:         movl    a6@(-32),a1@
                   4149: dvmiif: moveml  sp@+,d2-d7/a2-a4
                   4150:         unlk    a6
                   4151:         rts
                   4152:
                   4153:
                   4154:
                   4155: #===================================================================#
                   4156: #                                                                   #
                   4157: #                       Divisibilite de i2 par i1                   #
                   4158: #                                                                   #
                   4159: #       entree : a7@(4) pointe sur n2 de type I                     #
                   4160: #                a7@(8) pointe sur n1 de type I                     #
                   4161: #                a7@(12) contient un pointeur ( pour quotient )     #
                   4162: #       sortie : d0 contient 1 si n1 divise n2                      #
                   4163: #                            0 sinon
                   4164: #       a7@(12) pointe sur n2 / n1 de type I  (zone creee)          #
                   4165: #       lorsque n1 divise n2,  sinon n'est pas affecte.             #
                   4166: #                                                                   #
                   4167: #===================================================================#
                   4168:
                   4169: _mpdivis:link a6,#-8
                   4170:         movl    _avma,a6@(-8)
                   4171:         pea     a6@(-4)
                   4172:         movl    a6@(12),sp@-
                   4173:         movl    a6@(8),sp@-
                   4174:         bsr     _asmdvmdii
                   4175:         lea     sp@(12),sp
                   4176:         tstb    a6@(-4)@(4)             | reste nul ?
                   4177:         beq     1$
                   4178:                                         | ici reste non nul
                   4179:         moveq   #0,d0
                   4180:         movl    a6@(-8),_avma           | desallouer q et r
                   4181:         bra     2$
                   4182:                                         | ici reste nul
                   4183: 1$:     movl    a6@(16),sp@-
                   4184:         movl    d0,sp@-                 | adresse du quotient
                   4185:         bsr     _affii
                   4186:         moveq   #1,d0
                   4187:         movl    a6@(-8),_avma                   | desallouer reste
                   4188: 2$:     unlk    a6
                   4189:         rts
                   4190:
                   4191:
                   4192: #===================================================================#
                   4193: #                                                                   #
                   4194: #               Flag de divisibilite de i2 par i1                   #
                   4195: #                                                                   #
                   4196: #       entree : a7@(4) pointe sur n2 de type I                     #
                   4197: #                a7@(8) pointe sur n1 de type I                     #
                   4198: #       sortie : d0 contient 1 si n1 divise n2                      #
                   4199: #                            0 sinon                                #
                   4200: #                                                                   #
                   4201: #===================================================================#
                   4202:
                   4203: _divise: movl   #-1,sp@-
                   4204:         movl    sp@(12),sp@-
                   4205:         movl    sp@(12),sp@-
                   4206:         bsr     _asmdvmdii
                   4207:         lea     sp@(12),sp
                   4208:         movl    d0,a0
                   4209:         moveq   #1,d0
                   4210:         tstb    a0@(4)                  | reste nul ?
                   4211:         beq     giv
                   4212:                                         | ici reste non nul
                   4213:         moveq   #0,d0
                   4214:         bra     giv
                   4215:
                   4216:
                   4217:
                   4218:
                   4219: #*******************************************************************#
                   4220: #*******************************************************************#
                   4221: #**                                                               **#
                   4222: #**                     PROGRAMMES DE DIVISION                    **#
                   4223: #**                                                               **#
                   4224: #*******************************************************************#
                   4225: #*******************************************************************#
                   4226:
                   4227:
                   4228:
                   4229:
                   4230:
                   4231: #===================================================================#
                   4232: #                                                                   #
                   4233: #                       Division generale                           #
                   4234: #                                                                   #
                   4235: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   4236: #                a7@(8) pointe sur n1 de type I ou R                #
                   4237: #       sortie : d0 pointe sur n2 / n1 de type I ou R (zone creee)  #
                   4238: #                Le reste est du signe du dividende                 #
                   4239: #       interdit : type S                                           #
                   4240: #       precision : voir routines specialisees                      #
                   4241: #                                                                   #
                   4242: #===================================================================#
                   4243:
                   4244: _mpdiv: cmpb    #1,sp@(8)@
                   4245:         bne     1$
                   4246:         cmpb    #1,sp@(4)@
                   4247:         beq     _divii
                   4248:         bra     _divri
                   4249: 1$:     cmpb    #1,sp@(4)@
                   4250:         beq     _divir
                   4251:         bra     _divrr
                   4252:
                   4253: #===================================================================#
                   4254: #                                                                   #
                   4255: #                       Division (par valeur)                       #
                   4256: #                                                                   #
                   4257: #       entree : a7@(4) pointe sur n2 de type I ou R                #
                   4258: #                a7@(8) pointe sur n1 de type I ou R                #
                   4259: #                a7@(12) pointe sur n3 de type I ou R               #
                   4260: #       sortie : la zone pointee par a7@(12) contient n2 / n1 de    #
                   4261: #                type le type de n3                                 #
                   4262: #       interdit : type S ainsi que les divisions suivantes :       #
                   4263: #                R/I=I , I/R=I ,R/R=I                               #
                   4264: #                                                                   #
                   4265: #===================================================================#
                   4266:
                   4267: _mpdivz:movl    a2,sp@-
                   4268:         movl    _avma,sp@-
                   4269:         movl    sp@(12),a1
                   4270:         movl    sp@(16),a0
                   4271:         movl    sp@(20),a2      | a0,a1,a2 pointent sur n1,n2,n3
                   4272:         cmpb    #1,a2@
                   4273:         bne     1$
                   4274:                                 | ici T3 = I
                   4275:         cmpb    #1,a1@
                   4276:         beq     2$
                   4277:                                 | ici T3 = I et (T2 = R ou T1 = R)
                   4278: 3$:     movl    #divzer1,sp@-
                   4279:         jsr     _pari_err
                   4280:                                 | ici T3 = I et T2 = I
                   4281: 2$:     cmpb    #1,a0@
                   4282:         bne     3$
                   4283:                                 | ici T3 = T2 = T1 = I
                   4284:         movl    a0,sp@-
                   4285:         movl    a1,sp@-
                   4286:         bsr     _divii
                   4287:         movl    a2,sp@(4)
                   4288:         movl    d0,sp@
                   4289:         bsr     _affii
                   4290:         addql   #8,sp
                   4291:         bra     divzf
                   4292:                                 | ici T3 = R
                   4293: 1$:     movl    a0,sp@-
                   4294:         cmpb    #1,a0@
                   4295:         beq     4$
                   4296:                                 | ici T3 = R et T1 = R
                   4297:         movl    a1,sp@-
                   4298:         cmpb    #1,a1@
                   4299:         beq     5$
                   4300:                                 | ici T3 =T2 = T1 = R
                   4301:         bsr     _divrr
                   4302:         bra     6$
                   4303:                                 | ici T3 = T1 = R et T2 = I
                   4304: 5$:     bsr     _divir
                   4305:         bra     6$
                   4306:                                 | ici T3 = R et T1 = I
                   4307: 4$:     cmpb    #1,a1@
                   4308:         beq     7$
                   4309:                                 | ici T3 = T2 = R et T1 = I
                   4310:         movl    a1,sp@-
                   4311:         bsr     _divri
                   4312:         bra     6$
                   4313:                                 | ici T3 = R et T2 = T1 = I
                   4314: 7$:     movw    a2@(2),d0
                   4315:         addqw   #1,d0
                   4316:         bsr     getr
                   4317:         movl    a0,sp@-
                   4318:         movl    a1,sp@-
                   4319:         bsr     _affir
                   4320:        addql   #4,sp
                   4321:         bsr     _divri
                   4322: 6$:     movl    a2,sp@(4)
                   4323:         movl    d0,sp@
                   4324:         bsr     _affrr
                   4325:         addql   #8,sp
                   4326: divzf:  movl    sp@+,_avma
                   4327:         movl    sp@+,a2
                   4328:         rts
                   4329:
                   4330:                                 | division S/R=R sinon erreur
                   4331:
                   4332: _divsrz:lea     _divsr,a0
                   4333:         bra     mpopz
                   4334:
                   4335:                                 | division R/S=R sinon erreur
                   4336:
                   4337: _divrsz:lea     _divrs,a0
                   4338:         bra     mpopz
                   4339:
                   4340:                                 | division I/R=R sinon erreur
                   4341:
                   4342: _divirz:lea     _divir,a0
                   4343:         bra     mpopz
                   4344:
                   4345:                                 | division R/I=R sinon erreur
                   4346:
                   4347: _divriz:lea     _divri,a0
                   4348:         bra     mpopz
                   4349:
                   4350:                                 | division R/R=R sinon erreur
                   4351:
                   4352: _divrrz:lea     _divrr,a0
                   4353:         bra     mpopz
                   4354: #===================================================================#
                   4355: #                                                                   #
                   4356: #       Division par valeur : entier / entier = entier ou reel      #
                   4357: #                                                                   #
                   4358: #       entree : a7@(4) contient i2 de type S                       #
                   4359: #                a7@(8) contient i1 de type S                       #
                   4360: #                a7@(12) pointe sur i3 ou r3 de type I ou R         #
                   4361: #       sortie : a7@(12) pointe sur i2 / i1 de type I ou R          #
                   4362: #                                                                   #
                   4363: #===================================================================#
                   4364:
                   4365: _divssz:cmpb    #1,sp@(12)@
                   4366:         bne     divssr
                   4367: divssi: movl    sp@(8),sp@-
                   4368:         movl    sp@(8),sp@-
                   4369:         bsr     _divss
                   4370:         movl    sp@(20),sp@(4)
                   4371:         movl    d0,sp@
                   4372:         bsr     _affii
                   4373:         movl    sp@,a0
                   4374:         addql   #8,sp
                   4375:         bra     giv
                   4376: divssr: movl    _avma,sp@-
                   4377:         movw    sp@(16)@(2),d0
                   4378:         bsr     getr
                   4379:         movl    a0,sp@-
                   4380:         movl    sp@(12),sp@-
                   4381:         bsr     _affsr          | conversion dividende en R
                   4382:         movl    sp@(4),sp@      | dividende converti
                   4383:         movl    sp@(20),sp@(4)  | diviseur (type S)
                   4384:         bsr     _divrs
                   4385:         movl    sp@(24),sp@(4)
                   4386:         movl    d0,sp@
                   4387:         bsr     _affrr
                   4388:         addql   #8,sp
                   4389:         movl    sp@+,_avma
                   4390:         rts
                   4391:
                   4392: #===================================================================#
                   4393: #                                                                   #
                   4394: #       Division par valeur : S / I = entier ou reel                #
                   4395: #                                                                   #
                   4396: #       entree : a7@(4) contien i2 de type S                        #
                   4397: #                a7@(8) pointe sur i1 de type I                     #
                   4398: #                a7@(12) pointe sur i3 ou r3 de type I ou R         #
                   4399: #       sortie : a7@(12) pointe sur i2 / i1 de type I ou R          #
                   4400: #                                                                   #
                   4401: #===================================================================#
                   4402:
                   4403: _divsiz:link    a6,#0
                   4404:         moveml  a2-a4,sp@-
                   4405:         movl    a6@(16),a3
                   4406:         cmpb    #1,a3@
                   4407:         bne     divsir
                   4408: divsii: movl    a6@(12),sp@-
                   4409:         movl    a6@(8),sp@-
                   4410:         bsr     _divsi
                   4411:         movl    a6@(16),sp@(4)
                   4412:         movl    d0,sp@
                   4413:         bsr     _affii
                   4414:         movl    sp@,a0
                   4415:         addql   #8,sp
                   4416:         bsr     giv
                   4417: divsizf:moveml  sp@+,a2-a4
                   4418:         unlk    a6
                   4419:         rts
                   4420: divsir: movl    _avma,a2
                   4421:         movw    a3@(2),d0
                   4422:         addqw   #1,d0
                   4423:         bsr     getr
                   4424:         movl    a0,a4
                   4425:         movl    a0,sp@-
                   4426:         movl    a6@(8),sp@-
                   4427:         bsr     _affsr          | conversion dividende en R
                   4428:         addql   #2,d0
                   4429:         bsr     getr
                   4430:         movl    a0,sp@(4)
                   4431:         movl    a6@(12),sp@
                   4432:         bsr     _affir          | conversion diviseur en R
                   4433:         movl    a4,sp@
                   4434:         bsr     _divrr
                   4435:         movl    a3,sp@(4)
                   4436:         movl    d0,sp@
                   4437:         bsr     _affrr
                   4438:         addql   #8,sp
                   4439:         movl    a2,_avma
                   4440:         bra     divsizf
                   4441:
                   4442: #===================================================================#
                   4443: #                                                                   #
                   4444: #       Division par valeur : I / S = entier ou reel                #
                   4445: #                                                                   #
                   4446: #       entree : a7@(4) pointe sur i2 de type I                     #
                   4447: #                a7@(8) contient i1 de type S                       #
                   4448: #                a7@(12) pointe sur i3 ou r3 de type I ou R         #
                   4449: #       sortie : a7@(12) pointe sur i2 / i1 de type I ou R          #
                   4450: #                                                                   #
                   4451: #===================================================================#
                   4452:
                   4453: _divisz:cmpb    #1,sp@(12)@
                   4454:         bne     divisr
                   4455: divisi: movl    sp@(8),sp@-
                   4456:         movl    sp@(8),sp@-
                   4457:         bsr     _divis
                   4458:         movl    sp@(20),sp@(4)
                   4459:         movl    d0,sp@
                   4460:         bsr     _affii
                   4461:         movl    sp@,a0
                   4462:         addql   #8,sp
                   4463:         bra     giv
                   4464: divisr: movl    _avma,sp@-
                   4465:         movw    sp@(16)@(2),d0
                   4466:         bsr     getr
                   4467:         movl    a0,sp@-
                   4468:         movl    sp@(12),sp@-
                   4469:         bsr     _affir          | conversion dividende en R
                   4470:         movl    sp@(4),sp@      | dividende converti
                   4471:         movl    sp@(20),sp@(4)  | diviseur (type S)
                   4472:         bsr     _divrs
                   4473:         movl    sp@(24),sp@(4)
                   4474:         movl    d0,sp@
                   4475:         bsr     _affrr
                   4476:         addql   #8,sp
                   4477:         movl    sp@+,_avma
                   4478:         rts
                   4479:
                   4480: #===================================================================#
                   4481: #                                                                   #
                   4482: #       Division par valeur : entier / entier = entier ou reel      #
                   4483: #                                                                   #
                   4484: #       entree : a7@(4) pointe sur i2 de type I                     #
                   4485: #                a7@(8) pointe sur i1 de type I                     #
                   4486: #                a7@(12) pointe sur i3 ou r3 de type I ou R         #
                   4487: #       sortie : a7@(12) pointe sur i2 / i1 de type I ou R          #
                   4488: #                                                                   #
                   4489: #===================================================================#
                   4490:
                   4491: _diviiz:link    a6,#0
                   4492:         moveml  a2-a4,sp@-
                   4493:         movl    a6@(16),a3
                   4494:         cmpb    #1,a3@
                   4495:         bne     diviir
                   4496: diviii: movl    a6@(12),sp@-
                   4497:         movl    a6@(8),sp@-
                   4498:         bsr     _divii
                   4499:         movl    a6@(16),sp@(4)
                   4500:         movl    d0,sp@
                   4501:         bsr     _affii
                   4502:         movl    sp@,a0
                   4503:         addql   #8,sp
                   4504:         bsr     giv
                   4505: diviizf:moveml  sp@+,a2-a4
                   4506:         unlk    a6
                   4507:         rts
                   4508: diviir: movl    _avma,a2
                   4509:         movw    a3@(2),d0
                   4510:         bsr     getr
                   4511:         movl    a0,a4
                   4512:         movl    a0,sp@-
                   4513:         movl    a6@(8),sp@-
                   4514:         bsr     _affir          | conversion dividende en R
                   4515:         addql   #2,d0
                   4516:         bsr     getr
                   4517:         movl    a0,sp@(4)
                   4518:         movl    a6@(12),sp@
                   4519:         bsr     _affir          | conversion diviseur en R
                   4520:         movl    a4,sp@
                   4521:         bsr     _divrr
                   4522:         movl    a3,sp@(4)
                   4523:         movl    d0,sp@
                   4524:         bsr     _affrr
                   4525:         addql   #8,sp
                   4526:         movl    a2,_avma
                   4527:         bra     diviizf
                   4528:
                   4529:
                   4530: #===================================================================#
                   4531: #                                                                   #
                   4532: #               Division : entier court / entier court = entier     #
                   4533: #                                                                   #
                   4534: #       entree : a7@(4) contient s2 de type S                       #
                   4535: #                a7@(8) contient s1 de type S                       #
                   4536: #       sortie : d0 pointe sur s2 div s1 de type I (zone creee)     #
                   4537: #                d1.l contient le reste(du signe du dividende)      #
                   4538: #                                                                   #
                   4539: #===================================================================#
                   4540:
                   4541: _divss: link    a6,#0
                   4542:         moveml  d2-d3,sp@-
                   4543:        moveq   #0,d3
                   4544:         movl    a6@(12),d1      | d1.l recoit s1
                   4545:         bne     1$
                   4546:                                 | ici s1 = 0
                   4547:         movl    #diver1,sp@-
                   4548:         jsr     _pari_err
                   4549:                                 | ici s1 <> 0
                   4550: 1$:     movl    a6@(8),d2       | d2.l recoit s2
                   4551:        bpl     9$
                   4552:        moveq   #-1,d3
                   4553: 9$:     divsll  d1,d3:d2
                   4554:         bne     2$
                   4555:                                 | ici quotient nul
                   4556: 3$:     movl   _gzero,d0
                   4557:         movl    d3,d1
                   4558:         bra     divssg
                   4559:                                 | ici quotient non nul
                   4560: 2$:     moveq   #3,d0
                   4561:         bsr     geti
                   4562:         movl    #0x1000003,a0@(4)
                   4563:         tstl    d2
                   4564:         bpl     4$
                   4565:         negl    d2
                   4566:         movb    #-1,a0@(4)
                   4567: 4$:     movl    d2,a0@(8)
                   4568:         movl    d3,d1
                   4569: divssf: movl    a0,d0
                   4570: divssg: moveml  sp@+,d2-d3
                   4571:         unlk    a6
                   4572:         rts
                   4573:
                   4574: #===================================================================#
                   4575: #                                                                   #
                   4576: #               Division : entier court / entier = entier           #
                   4577: #                                                                   #
                   4578: #       entree : a7@(4) contient s2 de type S                       #
                   4579: #                a7@(8) contient i1 de type I                       #
                   4580: #       sortie : d0 pointe sur s2 div i1 de type I (zone creee)     #
                   4581: #                d1.l contient le reste (du signe du dividende)     #
                   4582: #                                                                   #
                   4583: #===================================================================#
                   4584:
                   4585: _divsi: link    a6,#0
                   4586:         moveml  d2-d4,sp@-
                   4587:         movl    a6@(12),a1      | a1 pointe sur le diviseur i1
                   4588:         tstb    a1@(4)
                   4589:         bne     1$
                   4590:                                 | ici i1 = 0
                   4591:         movl    #diver2,sp@-
                   4592:         jsr     _pari_err
                   4593:                                 | ici i1 <> 0
                   4594: 1$:     movl    a6@(8),d2       | d2.l contient le dividende s2
                   4595:         bne     3$
                   4596:                                 | ici quotient et reste nuls
                   4597: 2$:     movl   _gzero,d0
                   4598:         moveq   #0,d1
                   4599:         bra     divsig
                   4600:                                 | ici i1 et s2 <> 0
                   4601: 3$:     movw    a1@(6),d1       | d1.w contient le1
                   4602:         cmpw    #3,d1
                   4603:         beq     4$
                   4604:                                 | ici quotient nul et reste=s2
                   4605: 6$:     movl   _gzero,a0
                   4606:         movl    d2,d1
                   4607:         bra     divsif
                   4608:                                 | ici L1 = 1
                   4609: 4$:     movl    a1@(8),d1       | d1.l contient |i1|
                   4610:         movl    d2,d3           | d3.l contient s2
                   4611:         bpl     5$
                   4612:         negl    d3              | d3.l contient |s2|
                   4613: 5$:     moveq   #0,d4
                   4614:         divul   d1,d4:d3
                   4615:         beq     6$
                   4616:         moveq   #3,d0
                   4617:         bsr     geti
                   4618:         movl    d3,a0@(8)       | ranger mantisse
                   4619:         movl    a1@(4),a0@(4)
                   4620:         tstl    d2
                   4621:         bpl     7$
                   4622:         movb    #-1,a0@(4)      | mise a jour du signe
                   4623: 7$:     movl    d4,d1
                   4624:         tstb    a1@(4)
                   4625:         bpl     divsif
                   4626:         negl    d1              | mise a jour reste
                   4627: divsif: movl    a0,d0
                   4628: divsig: moveml  sp@+,d2-d4
                   4629:         unlk    a6
                   4630:         movl   d1,_hiremainder
                   4631:         rts
                   4632:
                   4633: #===================================================================#
                   4634: #                                                                   #
                   4635: #               Division : entier court / reel = reel               #
                   4636: #                                                                   #
                   4637: #       entree : a7@(4) contient s2 de type S                       #
                   4638: #                a7@(8) pointe sur r1 de type R                     #
                   4639: #       sortie : d0 pointe sur s2 / r1 de type R (zone creee)       #
                   4640: #                                                                   #
                   4641: #===================================================================#
                   4642:
                   4643: _divsr: link    a6,#-32
                   4644:         moveml  d2/a2-a4,sp@-
                   4645:         movl    a6@(12),a1      | a1 pointe sur r1
                   4646:         tstb    a1@(4)
                   4647:         bne     2$
                   4648:                                 | ici r1 = 0
                   4649:         movl    #diver3,sp@-
                   4650:         jsr     _pari_err
                   4651:                                 | ici r1 <> 0
                   4652: 2$:     tstl    a6@(8)
                   4653:         bne     1$
                   4654:                                 | ici s2 = 0
                   4655:        movl    _gzero,d0
                   4656:         bra     divsrf
                   4657:                                 | ici s2 et r1 <> 0
                   4658: 1$:     moveq   #0,d0
                   4659:         movw    a1@(2),d0
                   4660:         bsr     getr            | allocation pour resultat
                   4661:         movl    a6@(8),d2       | d2.l recoit s2
                   4662:         movl    a0,a4
                   4663:         addqw   #1,d0
                   4664:         bsr     getr
                   4665:         movl    a0,sp@-         | sauvegarde adr. copie
                   4666:         movl    d2,sp@-
                   4667:         bsr     _affsr
                   4668:         addql   #4,sp
                   4669:         movl    a0,a2           | a2 pointe sur copie s2
                   4670:         movl    a4,a0           | a0 pointe sur resultat
                   4671:         bsr     dvrr
                   4672:         movl    sp@+,a0
                   4673:         bsr     giv             | desallouer copie
                   4674:         movl    a4,d0
                   4675: divsrf: moveml  sp@+,d2/a2-a4
                   4676:         unlk    a6
                   4677:         rts
                   4678:
                   4679: #===================================================================#
                   4680: #                                                                   #
                   4681: #               Division : entier / entier court = entier           #
                   4682: #                                                                   #
                   4683: #       entree : a7@(4) pointe sur i2 de type I                     #
                   4684: #                a7@(8) contient s1 de type S                       #
                   4685: #       sortie : d0 pointe sur i2 / s1 de type I (zone creee)       #
                   4686: #               le reste est dans d1.l (du signe du dividende)      #
                   4687: #                                                                   #
                   4688: #===================================================================#
                   4689:
                   4690: _divis: link    a6,#0
                   4691:         moveml  d2-d6/a2,sp@-
                   4692:         movl    a6@(12),d1      | d1 recoit s1 diviseur
                   4693:         bne     1$
                   4694:         movl    #diver4,sp@-
                   4695:         jsr     _pari_err
                   4696: 1$:     bpl     2$
                   4697:         negl    d1
                   4698:                                 | ici d1 contient |s1|
                   4699: 2$:     movl    a6@(8),a2       | a2 pointe sur i2 dividende
                   4700:         movw    a2@(6),d2       | d2 recoit le2
                   4701:         movw    a2@(4),d5       | signe de i2
                   4702:         bne     4$
                   4703:                                 | ici i2=0 : q=0 , r=0
                   4704: 3$:     movl   _gzero,d0
                   4705:         moveq   #0,d1           | reste nul
                   4706:         bra     divisg
                   4707:                                 | ici i2 et s1 <>0
                   4708: 4$:     movw    d2,d0           | d0 recoit le2
                   4709:         addql   #8,a2
                   4710:         movl    a2@+,d4
                   4711:        moveq   #0,d3
                   4712:         divull  d1,d3:d4        | calcul de q0
                   4713:         bne     5$
                   4714:                                 | ici q0 = 0
                   4715:         subqw   #1,d0           | diminuer long. effective
                   4716:         cmpw    #2,d0
                   4717:         bne     5$
                   4718:                                 | ici q=0 , reste dans d3
                   4719:        movl    _gzero,a0
                   4720:         bra     10$
                   4721:                                 | ici q <> 0
                   4722: 5$:     bsr     geti
                   4723:         movl    a0,a1
                   4724:         movw    d0,a0@(6)       | met long. effect.
                   4725:         movb    #1,a0@(4)
                   4726:         movw    a6@(12),d6      | 'signe de s1'
                   4727:         eorw    d5,d6
                   4728:         bpl     6$              | si de meme signe
                   4729:         movb    #-1,a0@(4)      | si de signes contraires
                   4730: 6$:     addql   #8,a1
                   4731:         tstl    d4              | q0 = 0 ?
                   4732:         beq     7$
                   4733:         movl    d4,a1@+         | non: ranger q0
                   4734: 7$:     subqw   #3,d2           | d2 recoit L1 -1 compteur
                   4735:         bra     9$
                   4736: 8$:     movl    a2@+,d4         | boucle de division
                   4737:         divul   d1,d3:d4
                   4738:         movl    d4,a1@+
                   4739: 9$:     dbra    d2,8$
                   4740: 10$:    movl    d3,d1           | le reste est mis dans d1
                   4741:         tstw    d5              | i1 > 0 ?
                   4742:         bpl     divisf
                   4743:         negl    d1              | non : changer signe de r
                   4744: divisf: movl    a0,d0           | met addresse resultat
                   4745: divisg: moveml  sp@+,d2-d6/a2
                   4746:         unlk a6
                   4747:         movl   d1,_hiremainder
                   4748:         rts
                   4749:
                   4750: #===================================================================#
                   4751: #                                                                   #
                   4752: #               Division : entier / entier = entier                 #
                   4753: #                                                                   #
                   4754: #       entree : a7@(4) pointe sur i2 de type I                     #
                   4755: #                a7@(8) pointe sur i1 de type I                     #
                   4756: #       sortie : d0 pointe sur i2 / i1 de type I (zone creee)       #
                   4757: #                Le reste est du signe du dividende                 #
                   4758: #                                                                   #
                   4759: #===================================================================#
                   4760:
                   4761: _divii: clrl    sp@-
                   4762:         movl    sp@(12),sp@-    | empilage de i1
                   4763:         movl    sp@(12),sp@-    | empilage de i2
                   4764:         bsr     _asmdvmdii
                   4765:         lea     sp@(12),sp      | depilage
                   4766:         rts
                   4767:
                   4768: #===================================================================#
                   4769: #                                                                   #
                   4770: #               Division : entier / reel = reel                     #
                   4771: #                                                                   #
                   4772: #       entree : a7@(4) pointe sur i2 de type I                     #
                   4773: #                a7@(8) pointe sur r1 de type R                     #
                   4774: #       sortie : d0 pointe sur i2 / r1 de type R (zone creee)       #
                   4775: #                                                                   #
                   4776: #===================================================================#
                   4777:
                   4778: _divir: link    a6,#-32         | var. locales pour appel dvrr
                   4779:         moveml  a2-a3,sp@-
                   4780:         movl    a6@(12),a1      | a1 pointe sur r1
                   4781:         tstb    a1@(4)
                   4782:         bne     1$
                   4783:                                 | ici r1 = 0
                   4784:         movl    #diver5,sp@-
                   4785:         jsr     _pari_err
                   4786:                                 | ici r1 <> 0
                   4787: 1$:     movl    a6@(8),a2       | a2 pointe sur i2
                   4788:         tstb    a2@(4)
                   4789:         bne     2$
                   4790:                                 | ici i2 = 0
                   4791:        movl    _gzero,d0
                   4792:         bra     divirf
                   4793: 2$:     moveq   #0,d0           | ici i2 et r1 <> 0
                   4794:         movw    a1@(2),d0       | d0.w contient l1
                   4795:         bsr     getr            | allocation pour resultat
                   4796:         movl    a0,a3
                   4797:         addqw   #1,d0
                   4798:         bsr     getr            | allocation pour conversion i2 type R
                   4799:         movl    a0,a6@(-16)     | sauvegarde adr. du transforme i2'
                   4800:         movl    a0,sp@-
                   4801:         movl    a2,sp@-
                   4802:         bsr     _affir
                   4803:         addql   #8,sp
                   4804:         movl    a0,a2           | a2 pointe sur i2'
                   4805:         movl    a3,a0           | a0 pointe sur resultat
                   4806:         bsr     dvrr
                   4807:         movl    a6@(-16),a0
                   4808:         bsr     giv             | desallouer i2'
                   4809:         movl    a3,d0
                   4810: divirf: moveml  sp@+,a2-a3
                   4811:         unlk    a6
                   4812:         rts
                   4813:
                   4814: #===================================================================#
                   4815: #                                                                   #
                   4816: #               Division : reel / entier court = reel               #
                   4817: #                                                                   #
                   4818: #       entree : a7@(4) pointe sur r2 de type R                     #
                   4819: #                a7@(8) pointe sur s1 de type S                     #
                   4820: #       sortie : d0 pointe sur r2 / s1 de type R (zone creee)       #
                   4821: #                                                                   #
                   4822: #===================================================================#
                   4823:
                   4824: _divrs: link    a6,#0
                   4825:         moveml  d2-d6/a2,sp@-
                   4826:         movl    a6@(12),d1      | d1 recoit s1 diviseur
                   4827:         bne     1$
                   4828:                                 | ici s1 = 0
                   4829:         movl    #diver6,sp@-
                   4830:         jsr     _pari_err
                   4831:                                 | ici diviseur s1 <> 0
                   4832: 1$:     movl    a6@(8),a2       | a2 pointe sur r2 dividende
                   4833:         tstb    a2@(4)
                   4834:         bne     2$
                   4835:                                 | ici r2 = 0
                   4836:         moveq   #3,d0
                   4837:         bsr     getr
                   4838:         tstl    d1
                   4839:         bpl     11$
                   4840:         negl    d1
                   4841: 11$:    bfffo   d1{#0:#0},d0
                   4842:         addl    a2@(4),d0
                   4843:         subl    #31,d0
                   4844:         bmi     9$
                   4845:         movl    d0,a0@(4)
                   4846:         clrl    a0@(8)
                   4847:         bra     divrsf
                   4848:                                 | ici r2 et s1 <> 0
                   4849: 2$:     movw    a2@(2),d0       | d0 recoit l2
                   4850:         bsr     getr            | allocation pour resultat
                   4851:         movb    a2@(4),a0@(4)   | signe de r2
                   4852:         tstl    d1
                   4853:         bpl     3$
                   4854:         negl    d1              | d1 recoit |s1| <= 2^31
                   4855:                                 | s1 est tjrs <= 1er mot mantisse
                   4856:                                 | le 1er quotient partiel est non nul
                   4857:         negb    a0@(4)
                   4858: 3$:     movl    a0,a1
                   4859:         addql   #8,a1
                   4860:         addql   #8,a2
                   4861:         subqw   #3,d0           | d0 recoit L2-1 compteur
                   4862:         movl    d0,d2           | conserve dans d2
                   4863:         moveq   #0,d3           | 1er reste
                   4864: 4$:     movl    a2@+,d4
                   4865:         divul   d1,d3:d4
                   4866:         movl    d4,a1@+
                   4867:         dbra    d0,4$           | boucle de division
                   4868:
                   4869:         movl    a0@(8),d0       | resultat normalise ?
                   4870:         bpl     10$
                   4871:         moveq   #0,d1           | ici normalise ; nb shift = 0
                   4872:         bra     5$
                   4873:                                 | ici il faut normaliser
                   4874:
                   4875: 10$:    moveq   #0,d4
                   4876:         divul   d1,d3:d4        | traite dernier reste: quotient
                   4877:                                 | a recuperer par le shift
                   4878:         bfffo   d0{#0:#0},d1    | nb de shift dans d1
                   4879:         lsll    d1,d0           | shift 1er lg mot d0
                   4880:         movl    a0,a1
                   4881:         addql   #8,a1
                   4882:         moveq   #1,d6
                   4883:         lsll    d1,d6
                   4884:         subql   #1,d6           | d6 masque de shift
                   4885:         bra     7$
                   4886: 6$:     movl    a1@(4),d3
                   4887:         roll    d1,d3
                   4888:         movl    d3,d5
                   4889:         andl    d6,d3
                   4890:         addl    d3,d0
                   4891:         movl    d0,a1@+
                   4892:         subl    d3,d5
                   4893:         movl    d5,d0
                   4894: 7$:     dbra    d2,6$
                   4895:         roll    d1,d4           | shifter dernier quotient
                   4896:         andl    d6,d4
                   4897:         addl    d4,d0
                   4898:         movl    d0,a1@
                   4899: 5$:     movl    a6@(8),a2       | a2 pointe sur r2 dividende
                   4900:         movl    a2@(4),d2
                   4901:         andl    #0xffffff,d2    | exposant biaise de r2
                   4902:         subl    d1,d2           | exposant resultat
                   4903:         bpl     8$
                   4904:                                 | ici underflow
                   4905: 9$:     movl    #diver7,sp@-
                   4906:         jsr     _pari_err
                   4907: 8$:     movw    d2,a0@(6)
                   4908:         swap    d2
                   4909:         movb    d2,a0@(5)       | range exposant
                   4910: divrsf: movl    a0,d0
                   4911:         moveml  sp@+,d2-d6/a2
                   4912:         unlk    a6
                   4913:         rts
                   4914:
                   4915:
                   4916: #===================================================================#
                   4917: #                                                                   #
                   4918: #               Division : reel / entier = reel                     #
                   4919: #                                                                   #
                   4920: #       entree : a7@(4) pointe sur r2 de type R                     #
                   4921: #                a7@(8) pointe sur i1 de type I                     #
                   4922: #       sortie : d0 pointe sur r2 / i1 de type R (zone creee)       #
                   4923: #                                                                   #
                   4924: #===================================================================#
                   4925:
                   4926: _divri: link    a6,#-32         | var. locales pour appel dvrr
                   4927:         moveml  d2-d3/a2-a3,sp@-
                   4928:         movl    a6@(12),a1      | a1 pointe sur le diviseur i1
                   4929:         tstb    a1@(4)
                   4930:         bne     1$
                   4931:                                 | ici i1 = 0
                   4932:         movl    #diver8,sp@-
                   4933:         jsr     _pari_err
                   4934:                                 | ici i1 <> 0
                   4935: 1$:     movl    a6@(8),a2       | a2 pointe sur le dividende r2
                   4936:         tstb    a2@(4)
                   4937:         bne     2$
                   4938:                                 | ici r2 = 0
                   4939:         moveq   #3,d0
                   4940:         bsr     getr
                   4941:         movw    a1@(6),d0
                   4942:         lsll    #5,d0
                   4943:         bfffo   a1@(8){#0:#0},d1
                   4944:         addl    a2@(4),d1
                   4945:         addl    #65,d1
                   4946:         subl    d0,d1
                   4947:         bpl     3$
                   4948:         movl    #diver12,sp@-   | underflow R/I avec R = 0
                   4949:         jsr     _pari_err
                   4950: 3$:     movl    d1,a0@(4)
                   4951:         clrl    a0@(8)
                   4952:         movl    a0,d0
                   4953:         bra     divrif
                   4954:                                 | ici r2 et i1 <> 0
                   4955: 2$:     moveq   #0,d0
                   4956:         movw    a2@(2),d0
                   4957:         bsr     getr            | allocation pour resultat
                   4958:        movl    _avma,a3        | eviter le chevauchement.
                   4959:        subql   #8,a3
                   4960:        movl    a3,_avma
                   4961:        movl    #2,a3@          | Hack pour que giv rende ceci
                   4962:         movl    a0,a3           | sauvegarde adr. resultat
                   4963:         addqw   #1,d0
                   4964:         bsr     getr            | allocation pour conversion i1 type R
                   4965:         movl    a0,a6@(-16)     | sauvegarde adr. copie
                   4966:         movl    a0,sp@-
                   4967:         movl    a1,sp@-
                   4968:         bsr     _affir
                   4969:         addql   #8,sp
                   4970:         movl    a0,a1           | a1 pointe sur copie i1
                   4971:         movl    a3,a0           | a0 pointe sur resultat
                   4972:         bsr     dvrr
                   4973:         movl    a6@(-16),a0
                   4974:         bsr     giv             | desallouer copie
                   4975:         movl    a3,d0
                   4976: divrif: moveml  sp@+,d2-d3/a2-a3
                   4977:         unlk    a6
                   4978:         rts
                   4979:
                   4980: #===================================================================#
                   4981: #                                                                   #
                   4982: #               Division : reel / reel = reel                       #
                   4983: #                                                                   #
                   4984: #       entree : a7@(4) pointe sur r2 de type R                     #
                   4985: #                a7@(8) pointe sur r1 de type R                     #
                   4986: #       sortie : d0 pointe sur r2 / r1 de type R (zone creee)       #
                   4987: #       precision : L = inf ( L1 , L2 )                             #
                   4988: #                                                                   #
                   4989: #===================================================================#
                   4990:
                   4991: _divrr: link    a6,#-32         | var. locales pour appel dvrr
                   4992:         movl    a2,sp@-
                   4993:         movl    a6@(12),a1      | a1 pointe sur r1=y diviseur
                   4994:         movl    a6@(8),a2       | a2 pointe sur r2=x dividende
                   4995:         tstb    a1@(4)          | r1 = 0 ?
                   4996:         bne     1$
                   4997:                                 | ici r1 = 0
                   4998:         movl    #diver9,sp@-
                   4999:         jsr     _pari_err
                   5000: 1$:     tstb    a2@(4)          | r2 = 0 ?
                   5001:         bne     3$
                   5002:                                 | ici r2=0, r1<>0 : resultat nul
                   5003:         moveq   #3,d0
                   5004:         bsr     getr
                   5005:         movl    a1@(4),d0
                   5006:         andl    #0xffffff,d0    | exposant de r1
                   5007:         subl    a2@(4),d0
                   5008:         negl    d0
                   5009:         addl    #0x800000,d0
                   5010:         cmpl    #0x1000000,d0
                   5011:         bcs     4$
                   5012:         movl    #diver11,sp@-   | debordement r/r
                   5013:         jsr     _pari_err
                   5014: 4$:     tstl    d0
                   5015:         bgt     5$
                   5016:         movl    #diver10,sp@-   | underflow r/r
                   5017:         jsr     _pari_err
                   5018: 5$:     movl    d0,a0@(4)
                   5019:         clrl    a0@(8)
                   5020:         bra     divrrf
                   5021: 3$:     movw    a1@(2),d0
                   5022:         cmpw    a2@(2),d0
                   5023:         bls     2$
                   5024:         movw    a2@(2),d0       | d0 recoit l=inf(l1,l2)
                   5025: 2$:     bsr     getr
                   5026:         bsr     dvrr            | effectuer la division !
                   5027: divrrf: movl    a0,d0
                   5028:         movl    sp@,a2
                   5029:         unlk    a6
                   5030:         rts
                   5031:
                   5032: #===================================================================#
                   5033: #                                                                   #
                   5034: #       module interne de division r/r (pour R/R,R/I,I/R et S/R)    #
                   5035: #       --------------------------------------------------------    #
                   5036: #       entree : a1 et a2 pointent sur 2 reels r1 et r2             #
                   5037: #       tous 2 non nuls.                                            #
                   5038: #       a0 pointe sur un type reel de longueur l=inf(l1,l2)         #
                   5039: #       ce module a besoin de variables locales reservees et        #
                   5040: #       pointees par a6 dans le programme appelant.                 #
                   5041: #       sortie : le quotient r2/r1 est mis a l'addresse initiale a0 #
                   5042: #       (qui n'est pas affectee)                                    #
                   5043: #===================================================================#
                   5044:
                   5045: dvrr:   moveml  d2-d7/a2-a4,sp@-
                   5046:         movb    a1@(4),d1       | signe de r1
                   5047:         movb    a2@(4),d2       | signe de r2
                   5048:         eorb    d2,d1
                   5049:         addqb   #1,d1
                   5050:         movb    d1,a6@(-2)      | sauvegarde signe resultat
                   5051:         movl    a2@(4),d2
                   5052:         andl    #0xffffff,d2
                   5053:         movl    a1@(4),d1
                   5054:         andl    #0xffffff,d1
                   5055:         subl    d1,d2
                   5056:         addl    #0x800000,d2   | exposant provisoire avec offset
                   5057:         movl    d2,a6@(-6)      | sauvegarde
                   5058:
                   5059:         movw    a0@(2),d0       | d0.w recoit longueur resultat ( inf(l1,l2) )
                   5060:         movw    a1@(2),d1
                   5061:        cmpw    #3,d1           | diviseur de longeur 3 ?
                   5062:        bne     5$
                   5063:        movl    a1@(8),d1
                   5064:        movl    a2@(8),d3
                   5065:        clrl    d2
                   5066:        cmpw    #3,a2@(2)
                   5067:        beq     7$
                   5068:        movl    a2@(12),d2
                   5069: 7$:    cmpl    d3,d1
                   5070:        bls     6$
                   5071:        divul   d1,d3:d2
                   5072:        movl    d2,a0@(8)
                   5073:        movl    a6@(-6),d0      | ici mantisse correcte, soustraire 1 a l'exposant
                   5074:        subql   #1,d0
                   5075:        bra     comd2
                   5076: 6$:    lsrl    #1,d3
                   5077:        roxrl   #1,d2           | shifter de 1 a droite le quadword
                   5078:        divul   d1,d3:d2
                   5079:        movl    d2,a0@(8)
                   5080:        movl    a6@(-6),d0      | exposant correct
                   5081:        bra     comd2
                   5082: 5$:     subw    d0,d1           | flag nombre de mots du diviseur
                   5083:         movw    d1,a6@(-28)     | a sauvegarder.
                   5084:         subqw   #2,d0
                   5085:         movw    d0,d7           | d0 et d7 recoit m=inf(l1,l2)-2
                   5086:         movw    d7,a6@(-12)     | d7 sera compt boucle externe
                   5087:         movl    a0@,a6@(-10)    | sauvegarde 1er lg mot code resultat
                   5088:                                 | (on a besoin de toute la place)
                   5089:        movw    a2@(2),d6
                   5090:        subqw   #2,d6           | sauvegarde l2-2
                   5091:         addql   #8,a2           | a2 pointe sur y1 (1er mot dividende
                   5092:                                 | on note y=y1y2...ym le dividende
                   5093:         movl    a0,a4
                   5094:         clrl    a4@+
                   5095: 1$:     movl    a2@+,a4@+       | on recopie m+1 lgmots mantisse de y
                   5096:         dbra    d0,1$           | precede par un zero
                   5097:        cmpw    d7,d6           | l2>l1 ?
                   5098:        bgt     4$
                   5099:        clrl    a4@(-4)         | Si l2<=l1, y(m+1) n'existe pas
                   5100:                                 | a4 pointe apres y(m+1)
                   5101: 4$:     movl    a0,a2           | a2 pointe sur y0=0 1er mot dividende
                   5102:         addql   #8,a1           | a1 pointe sur x1 1er mot diviseur
                   5103:         lea     a1@(8,d7:w:4),a3| a3 pointe apres x(m+2)
                   5104:         movl    a3,a6@(-32)
                   5105:         movw    a6@(-28),d6     | (peut etre n'importe quoi mais va etre
                   5106:         bne     2$              | corrige)
                   5107:         movl    a3@(-8),a6@(-20)
                   5108:         clrl    a3@(-8)
                   5109: 2$:     subqw   #1,d6
                   5110:         bgt     3$
                   5111:         movl    a3@(-4),a6@(-24)
                   5112:         clrl    a3@(-4)
                   5113: 3$:     moveq   #0,d6           | d6 recoit 0 pour les addx
                   5114:
                   5115:                                 | Boucles de division R/R
                   5116:                                 | d7 compt bcl externe initialise a m
                   5117:                                 | pour trouver q0q1...qm
                   5118:                                 | d0 compt bcl interne initialise
                   5119:                                 | par d7 a chaque tour
                   5120: #...................................................................#
                   5121: dext:   movl    a1@,d0          | d0 recoit x1 (1er mot diviseur)
                   5122:         cmpl    a2@,d0          | compare a yi
                   5123:         bne     1$
                   5124:         movl    #-1,d1          | essayer q=2^32-1
                   5125:         addl    a2@(4),d0
                   5126:         bcs     4$
                   5127:         movl    d0,d2
                   5128:         bra     2$
                   5129: 1$:     bcc    9$
                   5130:
                   5131:        moveml  a3-a4/d7,sp@-   | le quotient precedent etait trop faible
                   5132:        addql   #4,a3
                   5133:        subxl   a3@-,a4@-
                   5134: 10$:   subxl   a3@-,a4@-
                   5135:        dbra    d7,10$
                   5136: 11$:   addql   #1,a4@-
                   5137:        beq     11$
                   5138:        moveml  sp@+,a3-a4/d7
                   5139:
                   5140: 9$:    movl    a2@,d2          | d2 recoit yi
                   5141:         movl    a2@(4),d1       | d2:d1 recoit yiy(i+1)
                   5142:         divul   d0,d2:d1        | d1 recoit q = yiy(i+1) div x1
                   5143:                                 | d2 recoit r = yiy(i+1) mod x1
                   5144: 2$:     movl    a1@(4),d3       | d3 recoit x2
                   5145:         mulul   d1,d4:d3        | d4:d3 recoit q*x2
                   5146:         subl    a2@(8),d3
                   5147:         subxl   d2,d4           | d4:d3 recoit q*x2-(r,y(i+2))
                   5148:         bls     4$
                   5149:
                   5150: 3$:     subql   #1,d1           | ici q est trop grand : q-1
                   5151:         subl    a1@(4),d3
                   5152:         subxl   d0,d4           | correction du reste partiel
                   5153:         bhi     3$              | boucler tant que trop
                   5154:                                 | ici q =yiy(i+1)y(i+2) div x1x2 correct
                   5155:                                 | on va calculer le reste partiel
                   5156: 4$:     movw    d7,d0           | d0  recoit m-i compteur
                   5157:         movl    a3,a1           | a3,a1 pointent apres y(m+2-i)
                   5158:         movl    a4,a2           | a4,a2 pointent apres y(m+1)
                   5159:         movl    a1@-,d2
                   5160:         mulul   d1,d3:d2        | initialise retenue d3 par
                   5161:         subl    d2,d2           | poids fort de q*y(m+2-i). d2 et X a 0
                   5162: 5$:     movl    a1@-,d5
                   5163:         mulul   d1,d4:d5        | boucle interne de multiplication et
                   5164:         addxl   d3,d5           | soustraction :
                   5165:         addxl   d2,d4           | yi...y(m+1) recoit yi...y(m+1)-
                   5166:         subl    d5,a2@-         |      q*x1...x(m+1-i)
                   5167:         movl    d4,d3
                   5168:         dbra    d0,5$
                   5169:         addxl   d2,d3
                   5170:         subl    d3,a2@(-4)
                   5171:         bcc     6$
                   5172:                                 | ici carry: q encore 1 de trop
                   5173:         subql   #1,d1
                   5174:         movw    d7,d0
                   5175:         movl    a3,a1
                   5176:         movl    a4,a2
                   5177:         subql   #4,a1           | correction sur a1 (car on avait prevu
                   5178:                                 | d'initialiser la retenue)
                   5179: 7$:     addxl   a1@-,a2@-
                   5180:         dbra    d0,7$           | boucle de readdition(met reste a jour)
                   5181: 6$:     movl    d1,a2@(-4)      | qi correct ! ranger a la place de xi
                   5182:         subql   #4,a3           | a3 p. un mot de moins pour bcle suiv.
                   5183:                                 | a3 pointe sur x(m-i+1)
                   5184: bcdf:   dbra    d7,dext         | fin de boucle externe de division
                   5185: #...................................................................#
                   5186:        movl    a6@(-32),a3
                   5187:         movw    a6@(-28),d5     | remise eventuelle de xm+1 et xm+2
                   5188:         bne     7$
                   5189:         movl    a6@(-20),a3@(-8)
                   5190: 7$:     subqw   #1,d5
                   5191:         bgt     8$
                   5192:         movl    a6@(-24),a3@(-4)
                   5193: 8$:     movw    a6@(-12),d5
                   5194:         movw    d5,d4           | d4 recoit m
                   5195: 6$:     movl    a2@-,a2@(4)
                   5196:         dbra    d5,6$
                   5197:         movl    a6@(-10),a2@+   | 1er lg mot code;a2 pointe sur q1
                   5198:         movl    a6@(-6),d0      | exposant biaise
                   5199:         movl    a2@,d1          | d1 recoit q0=0 ou 1
                   5200:         bne     1$
                   5201:                                 | ici q0=0 : mantisse correcte
                   5202:         subql   #1,d0           | retrancher 1 a l'exposant
                   5203:         bra     comd2
                   5204: 1$:     addql   #4,a2           | ici q0=1 : shifter de 1 a droite
                   5205:         subqw   #1,d4           | d4 recoit m-1
                   5206:         asrw    #1,d1           | met carry flag
                   5207: 5$:     roxrw   a2@+
                   5208:         roxrw   a2@+
                   5209:         dbra    d4,5$           | boucle de normalisation
                   5210: comd2:  cmpl    #0x1000000,d0
                   5211:         ble     3$
                   5212:         movl    #diver10,sp@-   | underflow
                   5213:         jsr     _pari_err
                   5214: 3$:     bcs     4$
                   5215:         movl    #diver11,sp@-   | overflow
                   5216:         jsr     _pari_err
                   5217: 4$:     movl    d0,a0@(4)       | range exposant
                   5218:         movb    a6@(-2),a0@(4)  | range signe
                   5219:         moveml  sp@+,d2-d7/a2-a4
                   5220: dvrrf:  rts
                   5221:
                   5222:
                   5223:
                   5224:
                   5225: #*******************************************************************#
                   5226: #*******************************************************************#
                   5227: #**                                                               **#
                   5228: #**                     PROGRAMMES D ' INVERSION                  **#
                   5229: #**             ( programmes par valeurs : le resultat est        **#
                   5230: #*                      mis dans un REEL existant deja  )         **#
                   5231: #**                                                               **#
                   5232: #*******************************************************************#
                   5233: #*******************************************************************#
                   5234:
                   5235:
                   5236: _mpinvsr:movl   sp@(8),sp@-
                   5237:         movl    sp@(8),sp@-
                   5238:         pea     1
                   5239:         bsr     divssr
                   5240:         lea     sp@(12),sp
                   5241:         rts
                   5242:
                   5243: _mpinvz:cmpb    #1,sp@(4)@
                   5244:         bne     _mpinvrr
                   5245:
                   5246: _mpinvir:movl   sp@(8),sp@-
                   5247:         movl    sp@(8),sp@-
                   5248:         pea     1
                   5249:         bsr     _divsiz
                   5250:         lea     sp@(12),sp
                   5251:         rts
                   5252:
                   5253: _mpinvrr:movl   sp@(8),sp@-
                   5254:         movl    sp@(8),sp@-
                   5255:         pea     1
                   5256:         bsr     _divsrz
                   5257:         lea     sp@(12),sp
                   5258:         rts
                   5259:
                   5260:
                   5261:
                   5262: #*******************************************************************#
                   5263: #*******************************************************************#
                   5264: #**                                                               **#
                   5265: #**                     PROGRAMMES MODULO                         **#
                   5266: #**                                                               **#
                   5267: #*******************************************************************#
                   5268: #*******************************************************************#
                   5269:
                   5270:
                   5271:
                   5272:
                   5273:
                   5274:
                   5275: #===================================================================#
                   5276: #                                                                   #
                   5277: #                       Modulo (par valeur)                         #
                   5278: #                                                                   #
                   5279: #       entree : a7@(4) pointe sur n2 de type I                     #
                   5280: #                a7@(8) pointe sur n1 de type I                     #
                   5281: #                a7@(12) pointe sur n3 de type I                    #
                   5282: #       sortie : la zone pointee par a7@(12) contient le reste de   #
                   5283: #                la division de n2 par n1                           #
                   5284: #                compris entre 0 et abs(n1)-1                       #
                   5285: #       interdit : type S et R                                      #
                   5286: #                                                                   #
                   5287: #===================================================================#
                   5288:
                   5289: _mpmodz:lea     _modii,a0
                   5290:         bra     mpopi
                   5291:
                   5292:                                 | modulo S mod S = I sinon erreur
                   5293:
                   5294: _modssz:lea     _modss,a0
                   5295:         bra     mpopi
                   5296:
                   5297:                                 | modulo S mod I = I sinon erreur
                   5298:
                   5299: _modsiz:lea     _modsi,a0
                   5300:         bra     mpopi
                   5301:
                   5302:                                 | modulo I mod S = I sinon erreur
                   5303:
                   5304: _modisz:lea     _modis,a0
                   5305:         bra     mpopi
                   5306:
                   5307:                                 | modulo I mod I = I sinon erreur
                   5308:
                   5309: _modiiz:lea     _modii,a0
                   5310:         bra     mpopi
                   5311:
                   5312: #===================================================================#
                   5313: #                                                                   #
                   5314: #               entier court Modulo entier court = entier           #
                   5315: #                                                                   #
                   5316: #       entree : a7@(4) contient s2 de type S                       #
                   5317: #                a7@(8) contient s1 de type S                       #
                   5318: #       sortie : d0 pointe sur s2 mod s1 de type I (zone creee)     #
                   5319: #                compris entre 0 et abs(s1)-1                       #
                   5320: #                                                                   #
                   5321: #===================================================================#
                   5322:
                   5323: _modss: link    a6,#0
                   5324:         moveml  d2-d3,sp@-
                   5325:        moveq   #0,d3
                   5326:         movl    a6@(12),d1      | d1.l contient s1
                   5327:         bne     1$
                   5328:                                 | ici s1 = 0
                   5329:         movl    #moder1,sp@-
                   5330:         jsr     _pari_err
                   5331:                                 | ici s1 <> 0
                   5332: 1$:     movl    a6@(8),d2       | d2.l contient s2
                   5333:        bpl     9$
                   5334:        moveq   #-1,d3
                   5335: 9$:     divsll  d1,d3:d2
                   5336:         tstl    d3
                   5337:         bne     2$
                   5338:                                 | ici reste nul
                   5339: 3$:     movl   _gzero,d0
                   5340:         bra     modssf
                   5341:                                 | ici reste non nul
                   5342: 2$:     bmi     5$
                   5343:                                 | ici reste > 0
                   5344:         moveq   #3,d0
                   5345:         bsr     geti
                   5346:         movl    #0x1000003,a0@(4)
                   5347:         movl    d3,a0@(8)
                   5348:         bra 7$
                   5349:                                 | ici reste < 0
                   5350: 5$:     movl    a6@(12),sp@-
                   5351:         movl    d3,sp@-
                   5352:         tstl    d1
                   5353:         bpl     6$
                   5354:                                 | ici s1 < 0
                   5355:         bsr     _subss
                   5356:         addql   #8,sp
                   5357:         bra     modssf
                   5358:                                 | ici s1 > 0
                   5359: 6$:     bsr     _addss
                   5360:         addql   #8,sp
                   5361:         bra     modssf
                   5362: 7$:     movl    a0,d0
                   5363: modssf: moveml  sp@+,d2-d3
                   5364:         unlk    a6
                   5365:         rts
                   5366:
                   5367: #===================================================================#
                   5368: #                                                                   #
                   5369: #               entier court Modulo entier = entier                 #
                   5370: #                                                                   #
                   5371: #       entree : a7@(4) contient s2 de type S                       #
                   5372: #                a7@(8) ppinte sur i1 de type I                     #
                   5373: #       sortie : d0 pointe sur s2 mod i1 de type I (zone creee)     #
                   5374: #                compris entre 0 et abs(i1)-1                       #
                   5375: #                                                                   #
                   5376: #===================================================================#
                   5377:
                   5378: _modsi: link    a6,#0
                   5379:         moveml  d2-d3,sp@-
                   5380:         movl    a6@(12),sp@-
                   5381:         movl    a6@(8),sp@-
                   5382:         bsr     _divsi
                   5383:         addql   #8,sp
                   5384:         movl    d0,a0
                   5385:         bsr     giv             | desallouer memoire provisoire
                   5386:         tstl    d1              | tester le reste
                   5387:         bne     1$
                   5388:                                 | ici reste nul
                   5389:         movl   _gzero,d0
                   5390:         bra     modsif
                   5391:                                 | ici reste non nul
                   5392: 1$:     bmi     3$
                   5393:                                 | ici reste > 0
                   5394:         movl    d1,d3           | d3.l recoit le reste
                   5395:         moveq   #3,d0
                   5396:         bsr     geti
                   5397:         movl    #0x1000003,a0@(4)
                   5398:         movl    d3,a0@(8)
                   5399:         bra     2$
                   5400:                                 | ici reste < 0
                   5401: 3$:     movl    a6@(12),sp@-
                   5402:         movl    d1,sp@-
                   5403:         movl    a6@(12),a1      | a1 pointe sur i1
                   5404:         tstb    a1@(4)
                   5405:         bpl     5$
                   5406:                                 | ici i1 < 0
                   5407:         bsr     _subsi
                   5408:         bra     6$
                   5409:                                 | ici i1 > 0
                   5410: 5$:     bsr     _addsi
                   5411: 6$:     addql   #8,sp
                   5412:         bra     modsif
                   5413: 2$:     movl    a0,d0
                   5414: modsif: moveml  sp@+,d2-d3
                   5415:         unlk    a6
                   5416:         rts
                   5417:
                   5418: #===================================================================#
                   5419: #                                                                   #
                   5420: #               entier Modulo entier court = entier                 #
                   5421: #                                                                   #
                   5422: #       entree : a7@(4) pointe sur i2 de type I                     #
                   5423: #                a7@(8) contient s1 de type S                       #
                   5424: #       sortie : d0 pointe sur i2 mod s1 de type I (zone creee)     #
                   5425: #                compris entre 0 et abs(s1)-1                       #
                   5426: #                                                                   #
                   5427: #===================================================================#
                   5428:
                   5429: _modis: link    a6,#0
                   5430:         moveml  d2-d3,sp@-
                   5431:         movl    a6@(12),sp@-
                   5432:         movl    a6@(8),sp@-
                   5433:         bsr     _divis
                   5434:         addql   #8,sp
                   5435:         movl    d0,a0
                   5436:         bsr     giv
                   5437:         tstl    d1
                   5438:         bne     1$
                   5439:                                 | ici reste nul
                   5440:        movl    _gzero,d0
                   5441:         bra     modisf
                   5442:                                 | ici reste non nul
                   5443: 1$:     bmi     3$
                   5444:                                 | ici reste > 0
                   5445:         movl    d1,d3
                   5446:         moveq   #3,d0
                   5447:         bsr     geti
                   5448:         movl    #0x1000003,a0@(4)
                   5449:         movl    d3,a0@(8)
                   5450:         bra     2$
                   5451:                                 | ici reste < 0
                   5452: 3$:     movl    a6@(12),sp@-
                   5453:         movl    d1,sp@-
                   5454:         movl    a6@(12),d1      | d1.l contient s1
                   5455:         bpl     5$
                   5456:         bsr     _subss
                   5457:         bra     6$
                   5458: 5$:     bsr     _addss
                   5459: 6$:     addql   #8,sp
                   5460:         bra     modisf
                   5461: 2$:     movl    a0,d0
                   5462: modisf: moveml  sp@+,d2-d3
                   5463:         unlk    a6
                   5464:         rts
                   5465:
                   5466: #===================================================================#
                   5467: #                                                                   #
                   5468: #               entier Modulo entier = entier                       #
                   5469: #                                                                   #
                   5470: #       entree : a7@(4) pointe sur i2 de type I                     #
                   5471: #                a7@(8) pointe sur i1 de type I                     #
                   5472: #       sortie : d0 pointe sur i2 mod i1 de type I                  #
                   5473: #                compris entre 0 et abs(i1)-1(zone creee)           #
                   5474: #                                                                   #
                   5475: #===================================================================#
                   5476:
                   5477: _modii: link    a6,#-4
                   5478:         movl    #-1,sp@-
                   5479:         movl    a6@(12),sp@-    | empilage adresse i1
                   5480:         movl    a6@(8),sp@-     | empilage adresse i2
                   5481:         movl    _avma,a6@(-4)   | sauvegarde adr. tete pile PARI
                   5482:         bsr     _asmdvmdii
                   5483:         movl    d0,a1           | a1 pointe sur resultat
                   5484:         tstb    a1@(4)
                   5485:         bpl     modiif
                   5486:                                 | ici reste negatif
                   5487:         movl    a1,sp@          | empilage adr. du reste
                   5488:         tstb    a6@(12)@(4)     | test signe du modulo
                   5489:         bpl     1$
                   5490:         bsr     _subii
                   5491:         bra     2$
                   5492: 1$:     bsr     _addii
                   5493: 2$:     movl    sp@+,a1
                   5494:         movl    _avma,a0
                   5495:         movw    a0@(2),d0
                   5496:         subqw   #1,d0
                   5497:         movl    a6@(-4),a0      | a0 pointe sur pile initiale
                   5498: 3$:     movl    a1@-,a0@-
                   5499:         dbra    d0,3$           | ecraser resultat intermediaire
                   5500:         movl    a0,_avma
                   5501:         movl    a0,d0           | nouvelle adresse resultat
                   5502: modiif: unlk    a6
                   5503:         rts
                   5504:
                   5505:
                   5506:
                   5507:
                   5508:
                   5509: #*******************************************************************#
                   5510: #*******************************************************************#
                   5511: #**                                                               **#
                   5512: #**     PROGRAMMES DE RESTE DES DIVISIONS ENTIERES                **#
                   5513: #**                                                               **#
                   5514: #*******************************************************************#
                   5515: #*******************************************************************#
                   5516:
                   5517:
                   5518:
                   5519:
                   5520:
                   5521: #===================================================================#
                   5522: #                                                                   #
                   5523: #                       Reste (par valeur)                          #
                   5524: #                                                                   #
                   5525: #       entree : a7@(4) pointe sur n2 de type I                     #
                   5526: #                a7@(8) pointe sur n1 de type I                     #
                   5527: #                a7@(12) pointe sur n3 de type I                    #
                   5528: #       sortie : la zone pointee par a7@(12) contient le reste de   #
                   5529: #                la division de n2 par n1 (du signe du dividende)   #
                   5530: #       interdit : type S et R                                      #
                   5531: #                                                                   #
                   5532: #===================================================================#
                   5533:
                   5534: _mpresz:lea     _resii,a0
                   5535:         bra     mpopi
                   5536:
                   5537:                                 | reste de S/S = I sinon erreur
                   5538:
                   5539: _resssz:lea     _resss,a0
                   5540:         bra     mpopi
                   5541:
                   5542:                                 | reste de S/I = I sinon erreur
                   5543:
                   5544: _ressiz:lea     _ressi,a0
                   5545:         bra     mpopi
                   5546:
                   5547:                                 | reste de I/S = I sinon erreur
                   5548:
                   5549: _resisz:lea     _resis,a0
                   5550:         bra     mpopi
                   5551:
                   5552:                                 | reste de I/I = I sinon erreur
                   5553:
                   5554: _resiiz:lea     _resii,a0
                   5555:         bra     mpopi
                   5556:
                   5557: #===================================================================#
                   5558: #                                                                   #
                   5559: #               Reste : entier court / entier court = entier        #
                   5560: #                                                                   #
                   5561: #       entree : a7@(4) contient s2 de type S                       #
                   5562: #                a7@(8) contient s1 de type S                       #
                   5563: #       sortie : d0 pointe sur le reste de la division s2 / s1      #
                   5564: #                de type I (zone creee)                             #
                   5565: #                Le reste est du signe du dividende                 #
                   5566: #                                                                   #
                   5567: #===================================================================#
                   5568:
                   5569: _resss: link    a6,#0
                   5570:         moveml  d2-d3,sp@-
                   5571:        moveq   #0,d3
                   5572:         movl    a6@(12),d1      | d1.l contient le diviseur s1
                   5573:         bne     1$
                   5574:                                 | ici s1 = 0
                   5575:         movl    #reser1,sp@-
                   5576:         jsr     _pari_err
                   5577:                                 | ici s1 <> 0
                   5578: 1$:     movl    a6@(8),d2       | d2.l contient s2
                   5579:        bpl     9$
                   5580:        moveq   #-1,d3
                   5581: 9$:     divsll  d1,d3:d2
                   5582:         tstl    d3
                   5583:         bne     2$
                   5584:                                 | ici reste nul
                   5585:        movl    _gzero,d0
                   5586:         bra     resssg
                   5587:                                 | ici reste non nul
                   5588: 2$:     moveq   #3,d0
                   5589:         bsr     geti
                   5590:         movl    #0x1000003,a0@(4)
                   5591:         tstl    d3
                   5592:         bpl     3$
                   5593:         negl    d3
                   5594:         movb    #-1,a0@(4)
                   5595: 3$:     movl    d3,a0@(8)
                   5596: resssf: movl    a0,d0
                   5597: resssg: moveml  sp@+,d2-d3
                   5598:         unlk    a6
                   5599:         rts
                   5600:
                   5601: #===================================================================#
                   5602: #                                                                   #
                   5603: #               Reste : entier court / entier = entier              #
                   5604: #                                                                   #
                   5605: #       entree : a7@(4) contient s2 de type S                       #
                   5606: #                a7@(8) pointe sur i1 de type I                     #
                   5607: #       sortie : d0 pointe sur le reste de la division s2 / i1      #
                   5608: #                de type I (zone creee)                             #
                   5609: #                Le reste est du signe du dividende                 #
                   5610: #                                                                   #
                   5611: #===================================================================#
                   5612:
                   5613: _ressi: movl    sp@(8),sp@-     | empilage adr. i1
                   5614:         movl    sp@(8),sp@-     | empilage s2
                   5615:         bsr     _divsi
                   5616:         movl    d0,a0           | a0 pointe sur resultat prov.
                   5617:         bsr     giv
                   5618:         tstl    d1              | d1.l contient le reste
                   5619:         bne     1$
                   5620:                                 | ici reste nul
                   5621:        movl    _gzero,d0
                   5622:         bra     ressig
                   5623:                                 | ici reste non nul
                   5624: 1$:     moveq   #3,d0
                   5625:         bsr     geti
                   5626:         movl    #0x1000003,a0@(4)
                   5627:         tstl    d1
                   5628:         bpl     2$
                   5629:         negl    d1
                   5630:         movb    #-1,a0@(4)
                   5631: 2$:     movl    d1,a0@(8)
                   5632: ressif: movl    a0,d0
                   5633: ressig: addql   #8,sp
                   5634:         rts
                   5635:
                   5636: #===================================================================#
                   5637: #                                                                   #
                   5638: #               Reste : entier / entier court = entier              #
                   5639: #                                                                   #
                   5640: #       entree : a7@(4) pointe sur i2 de type I                     #
                   5641: #                a7@(8) contient s1 de type S                       #
                   5642: #       sortie : d0 pointe sur le reste de la division i2 / s1      #
                   5643: #                (zone creee)                                       #
                   5644: #                Le reste est du signe du dividende                 #
                   5645: #                                                                   #
                   5646: #===================================================================#
                   5647:
                   5648: _resis: movl    sp@(8),sp@-     | empilage s1
                   5649:         movl    sp@(8),sp@-     | empilage adr.i2
                   5650:         bsr     _divis
                   5651:         movl    d0,a0
                   5652:         bsr     giv             | desallouer memoire provisoire
                   5653:         tstl    d1              | le reste est dans d1.l
                   5654:         bne     1$
                   5655:                                 | ici reste nul
                   5656:        movl    _gzero,d0
                   5657:         bra     resisg
                   5658:                                 | ici reste non nul
                   5659: 1$:     moveq   #3,d0
                   5660:         bsr     geti
                   5661:         movl    #0x1000003,a0@(4)
                   5662:         tstl    d1
                   5663:         bpl     2$
                   5664:         negl    d1
                   5665:         movb    #-1,a0@(4)
                   5666: 2$:     movl    d1,a0@(8)
                   5667: resisf: movl    a0,d0
                   5668: resisg: addql   #8,sp
                   5669:         rts
                   5670:
                   5671: #===================================================================#
                   5672: #                                                                   #
                   5673: #               Reste : entier / entier = entier                    #
                   5674: #                                                                   #
                   5675: #       entree : a7@(4) pointe sur i2 de type I                     #
                   5676: #                a7@(8) pointe sur i1 de type I                     #
                   5677: #       sortie : d0 pointe sur le reste de la division i2 / i1      #
                   5678: #                de type I (zone creee)                             #
                   5679: #                ( du signe du dividende)                           #
                   5680: #                                                                   #
                   5681: #===================================================================#
                   5682:
                   5683: _resii: movl    #-1,sp@-
                   5684:         movl    sp@(12),sp@-
                   5685:         movl    sp@(12),sp@-
                   5686:         bsr     _asmdvmdii
                   5687:         lea     sp@(12),sp
                   5688:         rts
                   5689:
                   5690: #===================================================================#
                   5691: #                                                                   #
                   5692: #                       Operations par valeur                       #
                   5693: #                                                                   #
                   5694: #       entree : a7@(4) contient n2 de type S ou pointe sur n2      #
                   5695: #                de type I ou R                                     #
                   5696: #                a7@(8) contient n1 de type S ou pointe sur n1      #
                   5697: #                de type I ou R                                     #
                   5698: #                a7@(12) pointe sur n3 de type I ou R               #
                   5699: #       sortie : la zone pointee par a7@(12) contient n2 op n1      #
                   5700: #       remarque : les erreurs de type sont detectees dans l'       #
                   5701: #                  affectation du resultat                          #
                   5702: #                                                                   #
                   5703: #===================================================================#
                   5704:
                   5705:                                 | operation a trois operandes
                   5706:                                 | les trois operandes sont de type I
                   5707:
                   5708: mpariz: movb    sp@(12)@,d0
                   5709:         addb    sp@(8)@,d0
                   5710:         addb    sp@(4)@,d0
                   5711:         cmpb    #3,d0
                   5712:         beq     mpopz
                   5713:         movl    #arier1,sp@-
                   5714:         jsr     _pari_err
                   5715:
                   5716:                                 | le troisieme operande est de type I
                   5717:
                   5718: mpopi:  cmpb    #1,sp@(12)@
                   5719:         beq     mpopz
                   5720:         movl    #arier2,sp@-
                   5721:         jsr     _pari_err
                   5722:                                 | operation quelconque
                   5723:
                   5724: mpopz:  movl    sp@(8),sp@-     | 2eme operande
                   5725:         movl    sp@(8),sp@-     | 1er operande
                   5726:         jsr     a0@
                   5727:         movl    sp@(20),sp@(4)  | 3eme operande
                   5728:         movl    d0,sp@          | resultat operation
                   5729:         jsr     _mpaff
                   5730:         addql   #8,sp
                   5731:         movl    d0,a0
                   5732:         bra     giv
                   5733:
                   5734:                                 | operation a quatre operandes
                   5735:                                 | avec deux resultats de type I
                   5736:
                   5737: mpopii: movb    sp@(16)@,d0
                   5738:         addb    sp@(12)@,d0
                   5739:         cmpb    #2,d0
                   5740:         beq     mpopz2
                   5741:         movl    #arier2,sp@-
                   5742:         jsr     _pari_err
                   5743:
                   5744:                                 | operation a quatre operande
                   5745:
                   5746: mpopz2: link    a6,#-8
                   5747:         movl    _avma,a6@(-8)
                   5748:         pea     a6@(-4)
                   5749:         movl    a6@(12),sp@-    | 2eme operande
                   5750:         movl    a6@(8),sp@-     | 1er operande
                   5751:         jsr     a0@
                   5752:         addql   #4,sp
                   5753:         movl    a6@(-4),sp@
                   5754:         movl    a6@(20),sp@(4)
                   5755:         bsr     _mpaff          | rangement 2 eme resultat
                   5756:         movl    d0,sp@
                   5757:         movl    a6@(16),sp@(4)
                   5758:         bsr     _mpaff          | rangement 1 er resultat
                   5759:         addql   #8,sp
                   5760:         movl    a6@(-8),_avma
                   5761:         unlk    a6
                   5762:         rts
                   5763:
                   5764:
                   5765:
                   5766:
                   5767:
                   5768: #*******************************************************************#
                   5769: #*******************************************************************#
                   5770: #**                                                               **#
                   5771: #**     PROGRAMMES PAR VALEUR UTILISES POUR LA LECTURE-ECRITURE   **#
                   5772: #**                                                               **#
                   5773: #*******************************************************************#
                   5774: #*******************************************************************#
                   5775:
                   5776:
                   5777:
                   5778:
                   5779:
                   5780: #===================================================================#
                   5781: #                                                                   #
                   5782: #       Multiplication par valeur : entier court * entier = entier  #
                   5783: #                                                                   #
                   5784: #       entree : a7@(4) contient s2 de type S                       #
                   5785: #                a7@(8) pointe sur i1 de type I                     #
                   5786: #                a7@(12) pointe sur i3 de type I                    #
                   5787: #       sortie : i3 pointe sur s2 * i1                              #
                   5788: #                                                                   #
                   5789: #===================================================================#
                   5790:
                   5791: _mulsii:movl    sp@(8),sp@-
                   5792:         movl    sp@(8),sp@-
                   5793:         bsr     _mulsi
                   5794:         movl    sp@(20),sp@(4)
                   5795:         movl    d0,sp@
                   5796:         bsr     _affii
                   5797:         movl    sp@,a0
                   5798:         addql   #8,sp
                   5799:         bra     giv
                   5800:
                   5801: #===================================================================#
                   5802: #                                                                   #
                   5803: #       Addition par valeur : entier court + entier = entier        #
                   5804: #                                                                   #
                   5805: #       entree : a7@(4) contient s2 de type S                       #
                   5806: #                a7@(8) pointe sur i1 de type I                     #
                   5807: #                a7@(12) pointe sur i3 de type I                    #
                   5808: #       sortie : i3 pointe sur s2 + i1                              #
                   5809: #                                                                   #
                   5810: #===================================================================#
                   5811:
                   5812: _addsii:movl    sp@(8),sp@-
                   5813:         movl    sp@(8),sp@-
                   5814:         bsr     _addsi
                   5815:         movl    sp@(20),sp@(4)
                   5816:         movl    d0,sp@
                   5817:         bsr     _affii
                   5818:         movl    sp@,a0
                   5819:         addql   #8,sp
                   5820:         bra     giv
                   5821:
                   5822: #===================================================================#
                   5823: #                                                                   #
                   5824: #                       division I / S = I                          #
                   5825: #                                                                   #
                   5826: #       entree: a7@(4) pointe sur i2, a7@(8) contient s1            #
                   5827: #               a7@(12) pointe sur un type I                        #
                   5828: #       sortie: a7@(12) pointe sur i2 div s1                        #
                   5829: #               d1 contient i2 mod s1                               #
                   5830: #                                                                   #
                   5831: #===================================================================#
                   5832:
                   5833: _divisii:movl   sp@(8),sp@-
                   5834:         movl    sp@(8),sp@-
                   5835:         bsr     _divis
                   5836:         movl    sp@(20),sp@(4)
                   5837:         movl    d0,sp@
                   5838:         bsr     _affii
                   5839:         movl    sp@,a0
                   5840:         addql   #8,sp
                   5841:         bra     giv

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>