move.w #$700,d0 trap #1
<=>
OSSetSR(0x700);
clr.w d0 trap #1
<=>
OSSetSR(0);
move.w #$700,d0 trap #1
clr.w d0 trap #1
Creation_freq:
move.w #$FFFF,d2
clr.w d3
clr.w d0
Recherche_Freq:
move.w 0(a0,d0.w),d4 ;nb de freq
tst.w d4 ;nb==0 ?
beq Plus_petite
cmp.w d4,d2 ;d4<=d2 ?
bls Plus_petite
move.w d0,d3 ;on enregistre le no de caract
move.w d4,d2 ;on enregistre ce max
Plus_petite:
addq.w #2,d0 ;d0+=2 : au suivant
cmp.w #$200,d0 ;512 : on a tout comparer ?
bne Recherche_Freq ;non
tst.w 0(a0,d3.w) ;le max est à 0 ?
beq Fin_de_Creation_Freq ;fini
clr.b (a1)+ ;premier byte=0
move.w d3,d4
lsr.w #1,d4 ;d4/=2
move.b d4,(a1)+ ;on ecrit le no du caract
move.w 0(a0,d3.w),(a1)+ ;on ecrit sa freq
clr.w 0(a0,d3.w) ;on l'efface
bra Creation_freq
Fin_de_Creation_Freq:
Fin_de_Creation_Freq:
move.w tab_handle2(PC),-(a7)
jsr doorsos::HeapFree
move.l #$3FC,-(a7)
jsr doorsos::HeapAlloc ;alloue 1020 octets
addq.l #6,a7
move.w d0,-(a7)
jsr doorsos::HeapLock
addq.l #2,a7
move.w d0,noeuds_h
doorsos::DEREF d0,a1
move.l a1,noeuds_a
clr.l d6 ;d6 = arbre en construction
move.w nLenght,d7 ;d7 = nombre de branches -1
move.l freq_a,a0
cmp.w #2,d7 ;deux caract différents seulement ?
beq bi_octet
subq.w #1,d7 ;d7--
Creation_des_noeuds:
move.w (a0)+,(a1)+ ;copie du no de caract ;prend les deux plus gd ?????
move.w (a0)+,d0 ;copie de sa freq
move.w (a0),(a1)+ ;copie du no de caract suivant
add.w 2(a0),d0 ;somme leur freq
subq.b #1,d7 ;d7--
clr.b d2
clr.w d3
Rang_Boucle:
cmp.w 6(a0,d3.w),d0 ;compare freq suivant avec freq1+freq2
bls Bien_ranger ;elle est <=
move.l 4(a0,d3.w),0(a0,d3.w) ;copie de no+freq ;retrie: déplace le suivant vers le début
addq.b #1,d2 ;no du l'étage
addq.w #4,d3 ;adrr
cmp.b d2,d7 ; >= ; .B ?
bhi Rang_Boucle ;on va plus loin encore
Bien_ranger:
move.w d6,0(a0,d3.w) ;met un no du noeud
bset.w #15,0(a0,d3.w) ;met le bit de poid fort à 1
move.w d0,2(a0,d3.w) ;met la freq
add.w #1,d6 ;noeud++
cmp.w #1,d7 ;encore des caract ?
bne Creation_des_noeuds ; d6 = nb de noeuds