Metoda populară folosea un Spectrum Loader care avea la început niște locații rezervate pentru adresa de încărcare a codului salvat cu NMI, lungimea lui, adresa de (re)start din BASIC și adresa stivei la momentul NMI. Afară de astea, Loader-ul mai încarcă registrul I cu $3F, IY cu $5C3A și fixează modul de întreruperi IM 1, plecînd de la ipoteza stupidă că astea ar fi valori „universal valabile” cu care ar trebui „să meargă”. S-a mers pe principiul comodității și vitezei, trebuind completate doar cele 4 valori pe 16 biți de la început ale codului deja asamblat, înainte de a-l alipi pur și simplu în fața codului aplicației salvate cu NMI. Că bineînțeles treaba trebuia făcută cît mai repede ca să meargă vînzarea de „soft” cît mai rentabil. Afară de asta, cine a scris bucata asta de cod a făcut un OUT la adresa de port a registrului de stare 8272, care nu poate fi scris, ci numai citit (!!). Plus că LD A,$00 de la linia 017A este total inutil din moment ce, două linii mai sus, XOR A deja a făcut același lucru. Sună a caz clasic de scriere de cod sub influența lipsei de neuroni...
|
CP/M Loader-ul folosit de mine trebuie folosit în conjuncție cu o altă rutină, pe care am denumit-o CPU RESTORE. Ea reface complet starea procesorului la NMI și trebuie inserată manual într-un spațiu liber din aplicația „crăcuită”, care spațiu liber trebuie mai întîi găsit. Loader-ul nu încearcă să restaureze nici un registru procesor cu valoarea de la momentul NMI, ci doar păstrează în HL adresa de start din BASIC, care trebuie mai întîi determinată după găsirea unui spațiu liber în codul aplicației unde CPU RESTORE poate fi introdusă, care la rîndul ei restaurează complet starea procesor. Problema e că e o metodă mai muncitorească, deci mai lentă, întrucît codul CPU RESTORE (cu valorile corespunzătoare completate) trebuie introdus manual în spațiul liber respectiv al aplicației „crăcuite”. Dar șansele de restaurare corectă a aplicației Spectrum sînt mult mai mari.
|