Calcule la taille d'une application flash
J'ai mis pas mal de temps à programmer cette fonction, car j'ai dû faire pas mal
de tests à l'éditeur hexa pour comprendre comment ça marchait (j'avais pas de
doc sur les certificats)
Je l'ai essayé sur toutes les applications flash que j'ai trouvées, et ma
routine m'a toujours donné la bonne réponse :)
Attention, il faut que le certificat soit valide, sinon, il y a des chances de
tomber sur une boucle infinie
Si vous les utilisez, mettez quand même mon nom quelque part, merci :)
OO_apps_size_certif:
;<- a0.l ptr vers certificat
movem.l d1-d3/a0,-(a7)
moveq #4,d0
bra OO_apps_size_0
OO_apps_size:
movem.l d1-d3/a0,-(a7)
bsr deref
move.l a0,d0
btst #0,d0
bne OO_apps_size_no_sub
moveq #4,d0
move.l 16(a0),a0
move.l a0,d1
beq OO_apps_size_no_sub
OO_apps_size_0:
bsr OO_size_sub
tst.b d3
beq OO_apps_size_no_sub
bsr OO_size_sub
OO_apps_size_no_sub:
movem.l (a7)+,a0/d1-d3
rts
OO_size_sub:
moveq #1,d3
moveq #0,d1
move.b (a0)+,d1
cmp.b #$FF,d1
bne OO_size_sub_2nd
cmp.b #$FF,(a0)
beq OO_size_sub_end_2
addq.l #1,a0
OO_size_sub_2nd:
moveq #0,d1
move.b (a0)+,d2
andi.b #$F,d2
cmp.b #$F,d2
beq OO_size_32
cmp.b #$E,d2
beq OO_size_16
cmp.b #$D,d2
beq OO_size_8
move.b d2,d1
moveq #0,d3
OO_size_sub_end:
add.l d1,d0
add.l d1,a0
rts
OO_size_sub_end_2:
moveq #0,d3
rts
OO_size_32:
addq.l #4,d0
move.b (a0)+,d1
lsl.l #8,d1
move.b (a0)+,d1
lsl.l #8,d1
move.b (a0)+,d1
lsl.l #8,d1
move.b (a0)+,d1
bra OO_size_sub_end
OO_size_16:
addq.l #2,d0
move.b (a0)+,d1
lsl.l #8,d1
move.b (a0)+,d1
bra OO_size_sub_end
OO_size_8:
addq.l #1,d0
move.b (a0)+,d1
bra OO_size_sub_end
|