Welcome, Guest. Please login or register.


Author Topic: Spectrum programok átírása (Read 144502 times)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Spectrum programok átírása
« on: 2006.June.08. 10:50:33 »
Quote from: "MrPrise"

Quote from: "Zozosoft"
Tartsak a Spectrum verzió átírásáról is beszámolót? :-)

Ez nem is lehet kérdés! :-)


Akkor közkívánatra, tessék :-)

Az SpV cikksorozatát a témáról ugye mindenki ismeri, aki mégse az egyrészt letöltheti az összes SpV-t a sinclair.hu-ról, másrészt Gafz elkezdte az átírás cikkeket felpakolni htmlben az oldalára :)

Ahogy a cikkben is írva van, az elsõ lépés a program fájljainak megszerzése.
A cikkben leírt program anno bekerült a Spectrum Emulátor ROM-jába is, SCOPY néven.
Viszont manapság nem túl valószínû, hogy valaki tényleg kazettáról akarna Spectrum programot beolvasni :-) sokkal valószínübb, hogy a netrõl szerzi be az ember a Spectrum progit, .TAP vagy .TZX formában.
Ezért a nemrég elkészült 4.1-es verziójú Emulátor ROM nem csak betudja tölteni ezeket, hanem az SCOPY is ki lett egészítve ezeknek a kezelésével, így néz ki a Bumpy szétszedése:

Mint az Emulátoron való futtatáshoz, itt is célszerübb a .TAP verzió választása, ez mentes a spéci betöltõktõl és egyébb trükkös védelmektõl :)

Spectrumon a legtöbb játék egy BASIC betöltõvel kezdõdik, így van ez jelen esetben is. Tehát elsõ lépésben ennek tartalmát kell megtudnunk.
Erre is kitünõen használható az Emulátor, a programot MERGE "" paranccsal töltsük be, így nem indul el egybõl, ki lehet listázni:

Ezután már tudjuk a program betöltési címét (25000) és indítási címét (43900)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #1 on: 2006.June.08. 13:01:19 »
Ezután jön a betöltõ megszerkesztése, ismét a már jól ismert betöltõmet használtam fel. A memória lefoglalás, ennek függvényében videócím kiszámítás, a rendszerhez való visszatérést biztosító HIBA eljárás a szokásos, "100% EXOS kompatibilis" :-)
Amit most megemlítenék, hogy az elmúlt félórában tovább fejlesztettem memóriakezelést, így most már nemcsak, hogy EXOS 2.0 kompatibilis, hanem RAM bõvítés nélküli EP64-en is fut a program!
Gyakorlati értelme nincs sok, de szeretem a kihívásokat, a vajon hogyan lehetne megoldani problémákat :-)
De hátha majd elõkerül a világból egy EP64 tulajdonos, és nagyon fog örülni, hogy végre egy játék ami az õ gépén is fut. :)
Gyakorlatilag a hivatalosan kiadott néhány játékon kívül nincs egyetlen program se ami menne EP64-en.
Egyik ok, a közvetlen szegmenscímek használata, ami megakadályozza azt is, hogy felbõvített EP64-en fussanak a programok (kivéve, ha F8-FB címeken is van bõvítés).
Másik ok, hogy nincs elég RAM egy 64K-s gépben :) ami elsõ hallásra elég furcsa, hiszen egy 48K-s program miért ne férne el egy 64K-s gépben?
Egy átlag Spectrum átírat 4 szegmenst használ: egy videó szegmens az alsó 16K Spectrum memóriának, amiben található a képernyõ memória is. Két másik szegmenst a felsõ 32K Spectrum memóriának, és kell még egy videó szegmens az LPT tábla számára.
Viszont egy 64K-s gépen csak 2 szabad szegmens van... a másik kettõ a nullás lap ill. a rendszerszegmens céljára van felhasználva.
Azt már eddig is tudta a betöltõm, hogy az LPT tábla akár lehet megosztott szegmensben is, tehát ha van elég hely benne, a rendszerszegmens elejére kerül az LPT tábla, így máris megspóroltunk egy szegmenst.
De még mindig kéne egy...
Egyszerû a megoldás: a nullás lapról tegyük át az EXOS cuccait, no meg a saját programunkat a rendszerszegmensbe, állítsuk be a rendszerszegmenst nullás lapnak, és máris miénk az eddigi nullás lap szegmens!
Gyakorlatban így mûködik ez a fejlesztett betöltõ:
-lefoglal egy videószegmenst, ami majd az 1-es lapra kerül mint alsó 16K Spectrum RAM, ha nem sikerül, akkor HIBA rutinon át kilépés
-lefoglal egy akármilyen szegmenst a 2-es lapra, ha nem sikerül, HIBA...
-megpróbál lefoglalni egy akármilyen szegmenst a 3. lapra, ha nem sikerül, akkor jön az EP64 probléma...
-megpróbál lefoglalni egy videószegmenst az LPT táblának, ez lehet megosztott is, ha van benne elég hely (EXOS felhasználói határ beállítással ellenõrizve)

Ha a 3. szegmens lefoglalásánál EP64 problémával találkozik, akkor a következõ történik:
-ellenõrzi, hogy ez a 3. szegmens megosztott, és van-e benne elég hely a nullás lap eleje+LPT tábla számára, ha nincs akkor HIBA...
-ha van elég hely, akkor jön a trükk: a nullás lap elsõ 800H bájtja (ebbe benne van az EXOS rutinja a lap elején, plusz a 100H-tól kezdõdõ programunk) át lesz másolva megosztott szegmens elejére, természetesen az felhasználói határ ennek megfelelõen lesz beállítva, hogy EXOS ne tudjon lefele terjeszkedéssel bajt okozni. Átmásolás után a rendszerszegmens BFFC címén átállítjuk a nullás lap számát. Az eredeti szám természetesen el lesz tárolva. Ezután a felszabadult nullás lap szegmens kerül a 3. lapon felhasználásra. Az új nulláslap szegmens száma kerül majd bejegyzésre az LPT szegmensnek is.
Az LPT készítõ rutin számára pedig bejegyezzük, hogy 800H-tól készítse majd a szegmensben az LPT-t.
Ennek megfelelõen módosult egy kicsit az LPT készítõ rutin is, hogy az elõre megadott címen kezdje készíteni az LPT szegmensben az LPT-t. Ez normál esetben nulla, ha EP64 módban fut a program akkor lesz 800H. Természetesen ezzel módosult egy kicsit az LPT cím kiadása is a NICK-nek, hiszen így a 8-11-es címbitekkel is kell foglalkozni.

A HIBA eljárás is bõvítve lett, ha lett eltárolva nulláslap szegmensszám, akkor kilépés elött helyreállítja azt, visszamásolva az elsõ 800H bájtot. Ily módon még EP64 módban futva is megõriztük a rendszer teljes épségét, töltési hiba, vagy meleg reset esetén szépen kilép az EP logóhoz a program!
Kisebb módosítások voltak az EXOS 2.0 kompatibilitáshoz (Amit már a CPC betöltõmben is megcsináltam), a kép alján lévõ státuszsor az EXOS-tól lesz átvéve, ill kilépéskor a rendszerszegmensbõl lesz kiolvasva a visszaállítandó EXOS LPT címe.

Offline gafz

  • EP lover
  • *
  • Posts: 703
  • Country: hu
    • View Profile
    • http://gafz.atw.hu
Re: Spectrum programok átírása
« Reply #2 on: 2006.June.08. 13:15:39 »
Azért nem felesleges az EP64 kompatibilitás, a ködös Albionban (meg gondolom máshol is) eladtak egy adagot belõle... Hátha ott is fújják még a tüzet... :)

Ja, és már elõkerült egy EP64 tulajdonos: The Spider...  :wink:
Enterprise Forever

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #3 on: 2006.June.08. 13:21:56 »
Quote from: "gafz"
Ja, és már elõkerült egy EP64 tulajdonos: The Spider...  :wink:

Neki EP64-e van?! Ide vele, adok érte két 128-at :-)

Offline gafz

  • EP lover
  • *
  • Posts: 703
  • Country: hu
    • View Profile
    • http://gafz.atw.hu
Re: Spectrum programok átírása
« Reply #4 on: 2006.June.08. 13:25:28 »
Ha jól emlékszem az Index-es fórumról, akkor igen.
Enterprise Forever

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #5 on: 2006.June.08. 13:53:38 »
Az EP64-es kitérõ után vissza a betöltõhöz.
Miután sikerült a szükséges memóriát megszerezni, elkészíti az LPT táblát (részletesen lásd az SpV cikkben), majd betölti az SCR fájlt, ami az SCOPY-s kicsomagolás után kapott BUMPY.3FF átnevezésével készült. A kép betöltése után átkonvertája az attribútum terület minden egyes bájtját EP formátumra. Egy bájt konvertálása a következõ módon történik: egy 256 elemû táblázatra rácímezve (H a cím felsõ 8 bitje, L a konvertálandó attributum) kiolvasható a Spectrumos attribútum bájt EP-s megfelelõje, amire le lesz cserélve az adott bájt.
Ez a táblázat az Emulátor új ROM-jának fejlesztésekor készült, ebben benne van az is, hogy az elvileg villogó kombinációk inverzek legyenek, legalább így különbözve a flash nélküli  azonos kombinációtól. Az Emulátor eredeti programja, meg sok átírat nem foglalkozik ezzel a problémával, így akad jó pár játék, ahol nem tudni, hol áll a menüben a kurzor, mert az eredetileg villogna... ezzel a módszerrel inverz lesz a kurzor, és így már használható lesz :-)

Hogy a táblázatra címezni tudjunk, annak xx00H címen kell kezdõdni. Eredetileg úgy mûködött a betöltõm, hogy a programban lévõ táblázatot 1000H címre másolta induláskor, és itt volt használva. Most az EP64 kompatibilitás miatt helyspórolás okán lekerült 100H-ra. Így viszont induláskor hiányzik az elsõ három bájt, mivel ott a táblázatott átugró JP található, így ez a 3 bájt az elsõ konvertálás elött lesz kitöltve.

Miután a betöltõ kép attribútumai át lettek konvertálva, átkapcsolunk a Spectrumos LPT-re, ezután következik a PRG betöltése (ami eredetileg a BUMPY.5FF fájl volt). A sikeres betöltés után jön még egy nagyon fontos dolog :-)
Mivel a letöltött TAP fájl mellett rögtön ott volt egy örökélet POKE is, így ezt is beletettem, hátha valaki élni akar ezzel a lehetõséggel :-)
A kérdést a státuszsorba kiírva tesszük fel, majd az Y és N billentyûk figyelése következik végtelen ciklusban. Y válasz esetén elvégezzük a POKE-t, és ezután jöhet a program indítása.
(Melesleg ennek a kérdésnek az is a mellékhatása, hogy floppyról töltve is meg lehet nézni alaposan a betöltõ képet, nem tünik el egybõl. Ezért más programoknál ha nincs is ilyen kérdés, akkor is be szoktam rakni egy billentyûre várakozást.)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #6 on: 2006.June.08. 18:13:33 »
Úgy látom Gafz ma az SpV-k begépelésével tölti az idõt :) Már az 5. rész is fent van. Rögtön lenne is egy megjegyzésem, amit amúgy is említeni akartam:
Quote
Az ASMON-ban a gépi kódú programok betöltésére az "R", kimentésére az "S" parancs szolgál. Mindkettõ rákérdez a start és a végcímre, valamint a betöltendõ file nevére. A SPECTRUM programok átírásánál gondot okoz, hogy SPECTRUM-on a RAM terület 4000H és FFFFH között helyezkedik el, míg az ASMON csak 0801H-tól 0BFFFH-ig tud file-okat betölteni. A probléma abból származik, hogy ilyen felállásban az abszolút címhivatkozások nem érvényesek, nehezebb megtalálni az egyes szubrutinokat.

Talán nem véletlen, hogy Moonlight-ék úgy alkották meg a FENAS-t, hogy 4000h-FFFFh-ig szabad a memória :) Így erre a célra sokkal alkalmasabb a FENAS-t használni, hiszen így az eredeti helyére tölthetõek a program darabok. A disassembler rész is sokkal használhatóbb, mivel nem egy gyorsan elszaladó listát látunk, hanem a fel/le gombokkal tudunk mozogni a programban.
(SpV mentségére, a cikk születésének idején még nem létezett a FENAS :) )

Offline gafz

  • EP lover
  • *
  • Posts: 703
  • Country: hu
    • View Profile
    • http://gafz.atw.hu
Re: Spectrum programok átírása
« Reply #7 on: 2006.June.08. 18:32:06 »
Gépeli a nyavalya... :) Van itt egy feltört Omnipage... :) Mondjuk az OCR korrektúrával el lehet bíbelõdni...  :oops:
Enterprise Forever

Offline MrPrise

  • Administrator
  • EP addict
  • *
  • Posts: 2465
  • Country: hu
    • View Profile
    • Enterprise Forever
Re: Spectrum programok átírása
« Reply #8 on: 2006.June.08. 18:34:18 »
Quote from: "gafz"
Gépeli a nyavalya... :) Van itt egy feltört Omnipage... :) Mondjuk az OCR korrektúrával el lehet bíbelõdni...  :oops:

Nem akartam offolni azért írtam üzenetet ;-) De most már mindegy :-D
Anno én is próbálkoztam OCR-rel, de valahogy sosem azt látta amit én ;-)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #9 on: 2006.June.09. 10:34:12 »
A cikk felkerült 6. részéhez megjegyzés: itt az egyik randa sajtóhiba, az EP billentyû mátrixban a C és a V fel lett cserélve.

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #10 on: 2006.June.09. 11:09:46 »
Visszatérve a Bumpy átírásához: miután van remek betöltõnk, el is indul a program, persze a menü kiírásánál többet nem igen csinál, hiszen nincs még billentyûfigyelés se...
A CPC programoknál azt láthatjuk, hogy leginkább ROM hívásokat használnak, ami nem véletlen, hiszen elég bonyolultan lehet közvetlenül programozni a CPC hw-t (pl a billentyûzetlekérdezés is hasonlóan bonyolult, mint ahogy a hangchip regisztereit lehet kezelni).
Spectrumon jóval egyszerübben kezelhetõ a hw, így a játékok nagy része ezt a módszert alkalmazza billentyû, joystick lekérdezésre, hang generálásra.
Így nem mûködik az a módszer, amit a Popup esetén láttunk, hogy a btöltõben elkészítve a megfelelõ ROM rutinok szimulációját, gyakorlatilag az eredeti program fájlokhoz hozzá se nyúlva mûködõképes lesz a program.
Meg kell keresni, és át kell írni az ilyen közvetlen HW hívatkozásokat.
Kezdjük az irányítással, ehhez a FEH prot olvasásokat kell megtalálnuk (részletesen kifejtve az SpV cikk 6. részében).
Mint tegnap említettem a keresgélést FENAS-ban célszerû végezni, így a helyére tölthetõ a PRG fájl, Bumpy.prg esetén az 61A8H-F8D3H területet jelent.
A program az AB7CH címen indul. Szerencsére ezesetben nincsenek olyan trükkös átkódolós védelmek, mint az Spv-ben ismertetett  Moon Cresta esetén. (Persze más programnél simán bele lehet futni ilyesmibe :-) ) Így egybõl lehet a lényegre koncentrálni.
FEH portolvasást egy helyen találni:

A rutin elsõ része sorban lekérdezi az összes billentyû sort, és eltárolja. A ciklus után van még egy igen érdekes IN A,(0DFH)!
Ilyen port elvileg nem is létezik Spectrumon :) a megfejtés: A legtöbb Spectrum hw nem alkalmaz teljes címdekódolást (így meg lehet pár IC-t spórolni), ezért az egyes I/O portok több címen is láthatóak. Pl az ULA 0FEH portja az összes páros címû porton... Jelen esetben a Kempston típusú joystick illesztõ lekérdezésrõl van szó, ami normál esetben az 1FH porton történik.
Még szerencse, hogy közvetlenül a billentyû lekérdezés mellett van, különben órákig lehetett volna keresgélni, hogy hol is kérdezi le, amikor nincs 1FH port hívatkozás :-)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #11 on: 2006.June.09. 13:48:13 »
A program módosításához már készen állnak a betöltõben a kész rutinok, az elv hasonló az SpV-ben leírtakhoz. A fontos rutinok címeit én a nem használt RST rutin belépési pontokra teszem, így 3 bájtos CALL helyett elég egy bájtos RST utasítás a meghíváshoz, így mindenhova befér :-)
Jelen esetben minket a PORTFE rutin érdekel elsõként, ezt szint a Spectrum Emulátor új ROM-jához fejlesztettem ki eredetileg. Ez nemcsak a FEH port olvasását tudja emulálni, hanem annak írását is, azaz a hang generálást, ill. a keretszín (konvertált tehát színhelyes beállítását is).
Paraméterként felhasználja az RST utasítás utáni bájtot is, 0DBH jelenti az IN A-t, 0D3H az OUT A-t, 0EDH az IN A,(C)-t, de szükség esetén más kombináciok is legyárthatók (IN B,(C), stb)
Beolvasásnál a megadott sor(okat) olvassa be, és adja vissza, teljesen Spectrumos módon. A szám billentyûknél be van keverve a dologba az Internal+ALT is, a Sinclar joystick illesztõt szimulálva. Az Emulátoros verzióban az External joy-ok is itt voltak bekeverve, az átírásos verzióban azokat a Kempston illesztõ szimulálására tartogatjuk, JOY névre hallgató rutinban.
Bumpy indulásakor a PORTFE az RST 28H-ra kerül a betöltõben, a JOY pedig az RST 8-ra.
Így csak annyit kell tenni, hogy B423H címen található IN A,(0FEH) utasítást kicseréljük:
B423 EF     RST 28H
B424 DB    DB 0DBH


A joystick olvasó IN A,(0DFH)-t pedig:
B42B CF     RST 08H
B42C 00     NOP

Ezekután már lehet is játszani, csak hang nincs még, és itt-ott színhibás a program :)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #12 on: 2006.June.09. 14:49:28 »
Következik a hang: erre sajnos nem túl sok szót vesztegettek a SpV cikkben. A Moon Cresta a Spectrum ROM hangrutinját használta, amelynek EP-re modosított változatát berakták a betöltõbe BEEP néven. És annyival elintézték az ügyet, hogy a ROM rutin hívását cseréljük ki ennek a rutinnak a hívására.
Elöször is itt volt egy nagyon csúnya nyomdahiba!!! Az ott közölt rutinban az 0A7H portra küldik ki az adatot, ami teljesen értelmetlen! A helyes az 0A8H vagy 0ACH! (0-ás hangcsatorna bal ill. jobb hangerõ)
Ennek a nyomdahibának köszönhetõen elég sok néma átírat került forgalomba, mivel a hibás 0A7H címet használták... jó pár ilyet ki is javítottam már.

De mi is a helyzet a közvetlen port piszkálással történõ zenéléssel Spectrumon? Hiszen a legtöbb játék ezt használja.
Itt szintén a 0FEH port kap szerepet, ezuttal OUT utasítással kezelve.
Az ide írt adat 0-2 bitje a keretszínt határozza meg. A 3. bit a megnókimenetre vonatkozik, ez minket nem érdekel :) a 4. bit jelképezi pedig a ZX Spectrum összes zenei képességét 1 bites D/A kimenet formájában :-)
Elöször tehát meg kell keresnünk az összes 0FEH portra vonatkozó utasítást, és utána kezdeni velük valamit :-)
A betöltõ induláskor D/A módba kapcsolja a DAVE 0-ás hangcsatornáját, ezután az elöbb emlegetett portok segítségével tudunk hangot generálni.
Sok átíratban egyszerûen csak kicserélik az OUT (0FEH),A utasításokat OUT (0A8H),A-ra (vagy 0ACH-ra) ami végülis mûködõ megoldás, de van 1-2 probléma vele. Egyrészt nem foglalkozik a keretszín problémájával, másrészt mivel csak az egyik hangerõt állítja a DAVE-ben, így ha sztereó kimeneten át hallgatjuk kedvenc EP-nket, akkor csak az egyik oldal fog szólni, ami elég zavaró, esetleg a programozásban kevésbé jártas felhasználó elkezdi keresni a kontaktos kábelt, hogy miért nem szól a másik oldal :-)
A már emlegetett PORTFE rutinunk mivel a Spectrum Emulátorhoz készült, OUT esetén természetesen kezeli a keretszín problémáját is, iés persze a hangot is mindkét oldalra adja ki.
Egyetlen probléma, hogy ez így elég sok utasításból áll, ami intenzívebb hangpiszkálásnál észrevehetõ lassulást okozhat.
Köztes megoldásként készült a CSAKOUT nevû rutin, ami egyrészt nincs beágyazva az általános PORTFE rutinba, így már egy csomó utasítást megspóroltunk, másrészt a keretszínnel se foglalkozik. Magyarán egy OUT (0A8H) és egy OUT (0ACH) utasítás az egész :-)
A Bumpy esetén elöször az általános rutint alkalmaztam, majd úgy találtam nem az igazi a hang, viszont a keret mindig fekete, így végül a CSAKOUT módszer lett a végleges.
OUT (0FEH) utasítás a következõ címeken volt a Bumpy-ban: B485H, EC4AH, ED1BH, EF34H, F514H, F525H, F53BH, F550H, F569H, F59CH
Itt mindenütt az OUT (0FEH),A helyett:
C7   RST 00H
00    NOP
utasításokra lett átírva.
Ezután már hang is van. A Bumpy-val idáig eljutni a .TAP letöltésétõl számítva kb 10 perc volt :-)

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #13 on: 2006.June.13. 11:24:05 »
Az átírás utolsó fázisa pedig az attribútumok kijavítása... ez a legnehezebb, legidõigényesebb mûvelet.
Itt nincs semmilyen általános módszer, minden programban más és más módszert alkalmaznak. A felderítésre a SpV cikk 9. része ad útmutatást. A lényeg az, hogy az 5800H-5AFFH közti memória területekre irányúló mûveleteket kell figyelni.
Ahol fix érték beírását találjuk, ott kinézzük a konvertáló táblánkból (ami a betöltõ forrászszövegének elején található) a megfelelõ értéket, és kijavítjuk.
Ennél sokkal gyakoribb, az amikor egy regiszterben megkapott érték kerül beírásra, leggyakrabban egy LD (HL),A utasítás formájában. Itt a legegyszerübb kicserélni ezt az utasítást egy olyan rutin meghívására, ami már a konvertált értéket írja be. Erre szolgál a KONV nevezetû rutin a betöltõben, ami RST 10H-re kerül, tehát a megtalált ilyen LD (HL),A utasításokat RST 10H-ra kell cserélni.
Az adott programtól függõen persze más módszerek is elõfordulnak, a KONV alapján könnyen legyárthatóak. Pl. a BUMPY esetén elõfordul LD (HL),C variáció, ez KONV2 néven található meg a betöltõben, és az RST18H-ra kerül.
Szintén nagyon gyakori, még az LDIR, LDI (néha LDDR, LDD) alkalmazása, általában akkor amikor a játék valamely elõre elkészített grafikai eleme (falak, tárgyak,stb) kerül a képernyõ memóriába másolásra.
Bumpy esetén LDI fordul elõ, ez KONV4 néven kerül megvalósításra, ez az RST 20H-ra kerül. Ha a KONV4-ben a kipontosveszõzött JR utasítást visszatesszük, akkor LDIR-t kapunk, az INC HL, INC DE utasítások DEC-re cseréjével pedig az LDD, LDDR állítható elõ.
Konkrétan:
B471   LD A,07H
B473   LD HL,5800H
B476   LD DE,5801H
B479   LD BC,2FFH
B47C   LD (HL),A
B47D   LDIR

Könnyen felismerhetõ, hogy ez egy attribútum terület törlés, ráadássul 7-es értékkel, ami EP-n is 7-es, így ezzel nincs további dolgunk.

B4F8   LD HL,5800H
B4FB   LD B,18H
B4FD   PUSH BC
B4FE    LD (HL),06H
B500    INC HL
B501   PUSH HL
B502   POP DE
B503   INC DE
B504   LD (HL),A
B505   LD BC,1CH
B508   LDIR

Az LD (HL),06H szintén maradhat, viszont az LD (HL),A-t ki kell cserélni egy RST10H-ra

B6F1-en meg van egy LD DE,5803H és utána egy nagy rakás LDI, amit most lusta vagyok ide bemásolni :) ezeket mind RST 20H-ra kellett kicserélni.
F0D8-on pedig szintén egy attributum terület törlés megadott értékkel, itt az F0E4-en lévõ LD (HL),A-t kell RST 10H-ra cserélni.

E799   LD DE,5800H
E79C   ADD HL,DE
E79D   LD (HL),C

Ezt az LD (HL),C-t kell RST 18H-ra cserélni, E7A8-on ven még egy.

E2E4-en van még egy LD DE,5800H, ADD HL,DE címû rész, amihez végül E30E címen tartozik egy LD (HL),06H. 6-os attributum tehát lehet békén hagyni...

Offline Zozosoft

  • EP addict
  • *
  • Posts: 13081
  • Country: hu
    • View Profile
    • http://enterprise.iko.hu/
Re: Spectrum programok átírása
« Reply #14 on: 2006.June.13. 11:36:03 »
Ezekután már egész jól ment a program, csak a felvehetõ tárgyak voltak makacsul világoszöld alapúak...
Itt kezdõdött kb 3-4 órás szívás amíg probáltam újabb helyeket találni, amik az attributum területeket piszkálják...
Végül rájöttem, hogy az elöbb átugrott E30EH címen lévõ LD (HL),n utasítás a bûnös!
Igaz, hogy ott alapban 6-van amit nem kell bántani, de itt látható egy szép példája a Neumanni elvek alkalmazásának, miszerint a program és adat ugyanabban a memóriában tárolodik. Jelesül, hogy itt egy önmagát módosító programról van szó!
E2E4 LD DE,5800H
E2E7 ADD HL,DE
E2E8 LD A,C
E2E9 LD (0E30FH),A
....
E30E LD (HL),06H
Na itt a bûnös! Az E2E9H-en lévõ utasítás írja át az E30EH címen lévõ LD paraméterét!
Ennek megvalósítására készült  egy E30F nevû rutin a betöltõben, amely szabad RST hiányában az 0005H címre kerül, és az E2E9H az LD utasítás CALL 0005H utasításra lett cserélve.


Menü szöveg átírása már rutin munka, és kész is volt a Bumpy :)