Oh, le hack d'origine est probablement venu du monde de la 92.
AMS a pas mal changé entre les 92 d'origines et les premiere 89 et 92+
Pen^2 (./59) :Si, mais le souci est de trouver une zone inutilisée qu'on peut écraser, parce que le format d'exécutable est assez complexe et changer la taille n'est pas trivial. Mais j'ai une solution qui devrait marcher, même si elle est un peu crade.
Tu ne peux pas faire un jsr sur un bout de code qui s'occupe de faire le patch, ajouté à la fin de l'exe compressé, puis un rts pour démarrer la version décompressée ?
Zerosquare (./64) :Ah oui, tiens.
Et surtout, ce n'est pas parce que tu ajoutes des octets à la fin du fichier qu'ils seront chargés en mémoire
Godzil (./71) :Oué mais pour ça faudrait injecter du code quelque part, donc...
Après tu peux ouvrir l'exe pour récupérer les octets
@asm_86_readmem_word proc near
cmp ax,4000h
jb a86rmw_rom0
cmp ax,8000h
jb a86rmw_pageA
cmp ax,0c000h
jb a86rmw_pageB
and eax,03fffh
add eax,_ram
mov ax,word ptr [eax]
bswap eax
shr eax,16
ret
Godzil (./79) :À la rigueur osef du 64 bits pour ce que c'est
(aka pas compilable en 64bit tel que)
Godzil (./82) :Certes mais si c'est un enfer et qu'en l'occurrence ça n'apporte rien... Mais si tu es motivé, je préfère aussi
Sur un OS moderne tu veux compiler en 64bit
et ca permet de supprimer des bugs.Mmm ?
Godzil (./82) :S'il avait été écrit en JAVA on n'aurait pas été ennuyé
tu veux pouvoir le faire trouner sous Linux
Godzil (./82) :... quel os inférieur
si ton Lirnux est 64bit(e) tu n'as pas le choix.
Pen^2 (./83) :et ca permet de supprimer des bugs.Mmm ?
[quote]Folco (./85) :
A mon avis c'est pour ça qu'il dit que porter le code vers une compatibilité 64 bits, ça supprime des bugs, parce que ça supprime des hacks qui pèteront sur une archi 64b.
void op_e000(void) /* ASR */
{
ULONG srcreg = imm8_table[((opcode >> 9) & 7)];
ULONG dstreg = opcode & 7;
{{ ULONG cnt = srcreg;
{ BYTE data = regs.d[dstreg].D;
{ UBYTE val = data;
ULONG cmask = 0x80;
ULONG sign = cmask & val;
cnt &= 63;
CLEARFLGS;
if (!cnt) { CFLG = 0; } else {
if (cnt >= 8) {
val = sign ? 0xff : 0;
CFLG=regs.x= sign ? 1 : 0;
} else {
CFLG=regs.x=(val >> (cnt-1)) & 1;
val >>= cnt;
if (sign) val |= 0xff << (8 - cnt);
}}
regs.d[dstreg].B.l = val;
NFLG = sign != 0;
ZFLG = val == 0;
}}}}}
for (i=0;i<0x10000;i++)
garbageMem[i]=0x14;
MC68000_Reset();
regs.pc=initialPC;
contrast=16;
ram128=0;
memprotect=0;
kbmask=0xff;
for (i=0;i<10;i++) kbmatrix[i]=0xff;
ramWrap=0; memAnd=0x3ffff;
onheld=1; lcdBase=0x4c00;
for (i=0;i<6;i++) oldScreenBase[i]=lcdBase;
timer=0; timerInit=0xb2; int0Count=0;
transflag=0; recvflag=0;
transnotready=0;
lcdRefresh=0;