Přejít na obsah
ARCHIVEKArchiv e-mailových konferencí o 8bitových počítačích Archiv Pandory 1999 až 2013

Zpět na zprávu

Celé vlákno · 4 zprávy

[SharpMZ] Adolf z Interkarate+

Michal Hucik - ORDOZ <ordoz@[doména skryta]> SHARP MZ-800

Ahoj,

nedavno jsem do SVN poslal upravu emulatoru ve ktere se uz otrocky nevykonava kazdy takt 1M1 hodin (zdroj pro CTC0). Kratce na to mi Jirka Cervinka reportoval, ze mu s touto upravou obcas nefunguje nahravani vicedilne verze Interkarate+.

Poprve jsem se tedy pustil do analyzy tohoto loaderu, hrabal jste se v nem uz nekdy nekdo? Hned na jeho zacatku mam pocit, ze jeho fungovani je zalozeno na hazardnim vztahu. Pro zajimavost to posilam sem:

1. Start programu je na 0x14f3, nasleduje pomerne kratky kod ve kterem si na adrese 0038 pripravime rutinu interruptu:

0x0038:
ld b,xx (xx na adrese 0x0039 se bude prepisovat na 0x83)
djnz -2
ei
reti

Do regA ulozime 0x83. Tuto hodnotu zapiseme i na (0x0039). Nasledne se nastavi IM 1, v PIOZ80 se povoli interrupt od VBLN a v HALTu cekame na prichod interruptu.

2. Prijde interrupt, na 0x0038 si odkroutime ty DJNZ, pak do regR ulozime obsah regA a zpet precteme do regA - vykonaly se 2 optokody, takze regA se tim zvednul na hodnotu 0x85.

3. Nasleduje prvni kratky decryptovaci blok, ktery provadi XOR (HL). Vzdy pred XOR se do regA nacte obsah z regR. Decryptuje se od 0x1534 do 0x1561.

4. Jsme na adrese 0x1534, kde se nachazi jiz dekryptovany kod. Prvni instrukci je HALT. Tedy cekame na prichod nasledujiciho VBLN interruptu od PIOZ80. Ve chvili, kdy jsme vstoupili na 0x1534 byla hodnota regR = 0x98. S kazdym vykonanym HALT se nam regR zvysi o 1. Po prichodu interruptu si odskocime opet na 0x0038.

5. Po navratu z interruptu jsme na adrese 0x1535 a hodnota regR je 0xb7, nebo 0xb6 - coz je ten hazard o kterem jsem psal v uvodu. Myslim si, ze duvodem toho rozdilu je ten fakt, ze i kdyz mezi jednotlivymi VBLN je konstantni pocet taktu, tak diky tomu, ze nelze vyvolat interrupt uprostred instrukce, tak se obcas muze stat, ze se pocet vykonanych optokodu o jeden lisi.

6. Skocime na 0x1558. nastavime regHL=0x15b6.

7. Na adrese 0x155b: regA = regR, zapiseme jej do (HL=0x15b6) a snizime HL. V nekonecne smycce skaceme z 0x155f: JR 0xfa zpet na 0x155b a se zapisem po jednom bajtu postupujeme az k neodvratnemu prepisu adresy 0x1560, cimz se zmeni parametr toho JR.

8a. V pripade, ze jsme v bode 6 meli v regR hodnotu 0xb7, tak na 0x1560 zapiseme 0xe9, coz znamena 0x155f: JR 0x154a. Tam je LDIR, ktery 0x0300 bajtu z 0x1200 nakopiruje do 0x0000. Program zije.

8b. V pripade, ze jsme v bode 6 meli v regR hodnotu 0xb6, tak na 0x1560 zapiseme 0xe9, coz znamena 0x155f: JR 0x1549. Tam je RST 0x00. Za "normalnich" okolnosti, kdy je pocitac ciste nastartovan a ma implicitni obsah RAM, tak se zde nachazi 0x0000: RST 0x38.


Prozatim se mi moc nechtelo dal zkoumat, co se deje dal za bodem 8b. Je zrejme, ze nez k necemu takovemu dojde, tak program nemanipuluje se zasobnikem (tedy nevyuziva vedome moznosti projit pres RETI a zbrchat se) a ani nenastavuje zadny vlastni obsah na adrese 0x0000.
V pripade, ze jsem uz jednou Interkarate loader nacetl spravne a dam reset. Pak znova nahraju zavadec Interkarate, tak je obsah na adrese 0x0000 natolik destruktivni, ze je program vetsinou uiplne v haji.
V pripade,  ze program projde pres RETI, tak se zda, ze nejakou nahodou, ktera mozna sekundarne trochu souvisi s nejakou operaci s CTC dojde ke zbrchani vykolejeneho zavadece a program nacte s drobnymi deformacemi screen, ktery nasleduje v dalsim CMT bloku.

Zkusim to jeste dale zkoumat, protoze je taky dost mozne, ze ten hazardni stav nastava jen v emulatoru a pak by bylo potreba pustit se znova do pruzkumu spravneho chovani obvodu PIOZ80 :(

Michal

Re: [SharpMZ] Adolf z Interkarate+

<zdeneka@[doména skryta]> SHARP MZ-800

Michale,

někdo už se v tom určitě hrabal  :-D Více méně jsem dospěl k tomu samému co 
Ty. Navzdory veškeré teorii mám ale pocit, že na skutečném železe to chodí 
naprosto spolehlivě :-) A co víc, oproti mému emulátoru ten loader přímo na 
Sharpovi zkousnul myslím i rychlost 3600 Bd.

Zdeněk



Zobrazit citovaný text (94 řádků)
From: Michal Hucik - ORDOZ
Sent: Wednesday, October 26, 2016 2:05 PM
To: Počítače SHARP MZ a jejich emulátory
Subject: [SharpMZ] Adolf z Interkarate+


Ahoj,

nedavno jsem do SVN poslal upravu emulatoru ve ktere se uz otrocky 
nevykonava kazdy takt 1M1 hodin (zdroj pro CTC0). Kratce na to mi Jirka 
Cervinka reportoval, ze mu s touto upravou obcas nefunguje nahravani 
vicedilne verze Interkarate+.

Poprve jsem se tedy pustil do analyzy tohoto loaderu, hrabal jste se v nem 
uz nekdy nekdo? Hned na jeho zacatku mam pocit, ze jeho fungovani je 
zalozeno na hazardnim vztahu. Pro zajimavost to posilam sem:


1. Start programu je na 0x14f3, nasleduje pomerne kratky kod ve kterem si na 
adrese 0038 pripravime rutinu interruptu:

0x0038:
ld b,xx (xx na adrese 0x0039 se bude prepisovat na 0x83)
djnz -2
ei
reti


Do regA ulozime 0x83. Tuto hodnotu zapiseme i na (0x0039). Nasledne se 
nastavi IM 1, v PIOZ80 se povoli interrupt od VBLN a v HALTu cekame na 
prichod interruptu.

2. Prijde interrupt, na 0x0038 si odkroutime ty DJNZ, pak do regR ulozime 
obsah regA a zpet precteme do regA - vykonaly se 2 optokody, takze regA se 
tim zvednul na hodnotu 0x85.

3. Nasleduje prvni kratky decryptovaci blok, ktery provadi XOR (HL). Vzdy 
pred XOR se do regA nacte obsah z regR. Decryptuje se od 0x1534 do 0x1561.

4. Jsme na adrese 0x1534, kde se nachazi jiz dekryptovany kod. Prvni 
instrukci je HALT. Tedy cekame na prichod nasledujiciho VBLN interruptu od 
PIOZ80. Ve chvili, kdy jsme vstoupili na 0x1534 byla hodnota regR = 0x98. S 
kazdym vykonanym HALT se nam regR zvysi o 1. Po prichodu interruptu si 
odskocime opet na 0x0038.

5. Po navratu z interruptu jsme na adrese 0x1535 a hodnota regR je 0xb7, 
nebo 0xb6 - coz je ten hazard o kterem jsem psal v uvodu. Myslim si, ze 
duvodem toho rozdilu je ten fakt, ze i kdyz mezi jednotlivymi VBLN je 
konstantni pocet taktu, tak diky tomu, ze nelze vyvolat interrupt uprostred 
instrukce, tak se obcas muze stat, ze se pocet vykonanych optokodu o jeden 
lisi.

6. Skocime na 0x1558. nastavime regHL=0x15b6.

7. Na adrese 0x155b: regA = regR, zapiseme jej do (HL=0x15b6) a snizime HL. 
V nekonecne smycce skaceme z 0x155f: JR 0xfa zpet na 0x155b a se zapisem po 
jednom bajtu postupujeme az k neodvratnemu prepisu adresy 0x1560, cimz se 
zmeni parametr toho JR.

8a. V pripade, ze jsme v bode 6 meli v regR hodnotu 0xb7, tak na 0x1560 
zapiseme 0xe9, coz znamena 0x155f: JR 0x154a. Tam je LDIR, ktery 0x0300 
bajtu z 0x1200 nakopiruje do 0x0000. Program zije.

8b. V pripade, ze jsme v bode 6 meli v regR hodnotu 0xb6, tak na 0x1560 
zapiseme 0xe9, coz znamena 0x155f: JR 0x1549. Tam je RST 0x00. Za 
"normalnich" okolnosti, kdy je pocitac ciste nastartovan a ma implicitni 
obsah RAM, tak se zde nachazi 0x0000: RST 0x38.


Prozatim se mi moc nechtelo dal zkoumat, co se deje dal za bodem 8b. Je 
zrejme, ze nez k necemu takovemu dojde, tak program nemanipuluje se 
zasobnikem (tedy nevyuziva vedome moznosti projit pres RETI a zbrchat se) a 
ani nenastavuje zadny vlastni obsah na adrese 0x0000.
V pripade, ze jsem uz jednou Interkarate loader nacetl spravne a dam reset. 
Pak znova nahraju zavadec Interkarate, tak je obsah na adrese 0x0000 natolik 
destruktivni, ze je program vetsinou uiplne v haji.
V pripade,  ze program projde pres RETI, tak se zda, ze nejakou nahodou, 
ktera mozna sekundarne trochu souvisi s nejakou operaci s CTC dojde ke 
zbrchani vykolejeneho zavadece a program nacte s drobnymi deformacemi 
screen, ktery nasleduje v dalsim CMT bloku.

Zkusim to jeste dale zkoumat, protoze je taky dost mozne, ze ten hazardni 
stav nastava jen v emulatoru a pak by bylo potreba pustit se znova do 
pruzkumu spravneho chovani obvodu PIOZ80 :(

Michal



_______________________________________________
SharpMZ mailing list
SharpMZmail.ordoz.com
http://mail.ordoz.com/mailman/listinfo/sharpmz 

Re: [SharpMZ] Adolf z Interkarate+

Michal Hucik - ORDOZ <ordoz@[doména skryta]> SHARP MZ-800

Ahoj Zdenku,

tak jsem schvalne zkusil 3600 Bd a bez potizi se to nacte jak v te 
otrocke, tak i v te rychle verzi ... tedy samozrejme pokud pred tim 
nedojde k tomu zminenemu hazardu.

Nicmene - rika se, ze dobre polozena otazka je nekdy pro tazatele 
zaroven cestou odpovedi :) V tomto pripade spise jen castecne, ale uz 
asi vim, kde hledat. Zkusil jsem si nakompilovat otrockou - pomalou - 
verzi, ktera odpovida tomu co je vydano jako rev. 1.0.3. Zkusil jsem cca 
30x po sobe nahrat zavadec Interkarate+ a naprosto ve vsech pripadech 
jsem pri prhodu na adresu 0x1535 mel v regR hodnotu 0xb7 - program se 
vzdy nacetl spravne.

Nasledne jsem se pokusil o to same s tim, ze jsem si nakompiloval 
rychlou verzi CTC0 a zkousel jsem nahodnym nahravanim loaderu 
zreprodukovat na te adrese chybu s tou hodnotou 0xb6 ... Nekdy se mi ji 
povedlo dosahnout hned napoprve. Nekdy az na 12 pokus.

Je to tedy spise jen takova pocitova statistika, ale vse smeruje k tomu, 
ze i kdyz program na CTC0 nesaha, tak je jim ovlivnen - resp. je jim 
ovlivneno chovani emulovaneho PIOZ80. Pokud by sis nahodou vzpomnel, zda 
tve experimenty dospely ke stejne pricine zboreni programu - tedy 
promenliva delka trvani bloku, ktery ceka na Interrupt, tak jsme zrejme 
oba v te pocitane verzi CTC zapomneli na neco, co v otrocke variante CTC 
ovlivnuje chovani obvodu PyjusZ80.

Michal

Dne 26.10.2016 v 14:10 zdeneka[doména skryta] napsal(a):
Zobrazit citovaný text (110 řádků)
> Michale,
>
> někdo už se v tom určitě hrabal  :-D Více méně jsem dospěl k tomu samému co
> Ty. Navzdory veškeré teorii mám ale pocit, že na skutečném železe to chodí
> naprosto spolehlivě :-) A co víc, oproti mému emulátoru ten loader přímo na
> Sharpovi zkousnul myslím i rychlost 3600 Bd.
>
> Zdeněk
>
>
>
> From: Michal Hucik - ORDOZ
> Sent: Wednesday, October 26, 2016 2:05 PM
> To: Počítače SHARP MZ a jejich emulátory
> Subject: [SharpMZ] Adolf z Interkarate+
>
>
> Ahoj,
>
> nedavno jsem do SVN poslal upravu emulatoru ve ktere se uz otrocky
> nevykonava kazdy takt 1M1 hodin (zdroj pro CTC0). Kratce na to mi Jirka
> Cervinka reportoval, ze mu s touto upravou obcas nefunguje nahravani
> vicedilne verze Interkarate+.
>
> Poprve jsem se tedy pustil do analyzy tohoto loaderu, hrabal jste se v nem
> uz nekdy nekdo? Hned na jeho zacatku mam pocit, ze jeho fungovani je
> zalozeno na hazardnim vztahu. Pro zajimavost to posilam sem:
>
>
> 1. Start programu je na 0x14f3, nasleduje pomerne kratky kod ve kterem si na
> adrese 0038 pripravime rutinu interruptu:
>
> 0x0038:
> ld b,xx (xx na adrese 0x0039 se bude prepisovat na 0x83)
> djnz -2
> ei
> reti
>
>
> Do regA ulozime 0x83. Tuto hodnotu zapiseme i na (0x0039). Nasledne se
> nastavi IM 1, v PIOZ80 se povoli interrupt od VBLN a v HALTu cekame na
> prichod interruptu.
>
> 2. Prijde interrupt, na 0x0038 si odkroutime ty DJNZ, pak do regR ulozime
> obsah regA a zpet precteme do regA - vykonaly se 2 optokody, takze regA se
> tim zvednul na hodnotu 0x85.
>
> 3. Nasleduje prvni kratky decryptovaci blok, ktery provadi XOR (HL). Vzdy
> pred XOR se do regA nacte obsah z regR. Decryptuje se od 0x1534 do 0x1561.
>
> 4. Jsme na adrese 0x1534, kde se nachazi jiz dekryptovany kod. Prvni
> instrukci je HALT. Tedy cekame na prichod nasledujiciho VBLN interruptu od
> PIOZ80. Ve chvili, kdy jsme vstoupili na 0x1534 byla hodnota regR = 0x98. S
> kazdym vykonanym HALT se nam regR zvysi o 1. Po prichodu interruptu si
> odskocime opet na 0x0038.
>
> 5. Po navratu z interruptu jsme na adrese 0x1535 a hodnota regR je 0xb7,
> nebo 0xb6 - coz je ten hazard o kterem jsem psal v uvodu. Myslim si, ze
> duvodem toho rozdilu je ten fakt, ze i kdyz mezi jednotlivymi VBLN je
> konstantni pocet taktu, tak diky tomu, ze nelze vyvolat interrupt uprostred
> instrukce, tak se obcas muze stat, ze se pocet vykonanych optokodu o jeden
> lisi.
>
> 6. Skocime na 0x1558. nastavime regHL=0x15b6.
>
> 7. Na adrese 0x155b: regA = regR, zapiseme jej do (HL=0x15b6) a snizime HL.
> V nekonecne smycce skaceme z 0x155f: JR 0xfa zpet na 0x155b a se zapisem po
> jednom bajtu postupujeme az k neodvratnemu prepisu adresy 0x1560, cimz se
> zmeni parametr toho JR.
>
> 8a. V pripade, ze jsme v bode 6 meli v regR hodnotu 0xb7, tak na 0x1560
> zapiseme 0xe9, coz znamena 0x155f: JR 0x154a. Tam je LDIR, ktery 0x0300
> bajtu z 0x1200 nakopiruje do 0x0000. Program zije.
>
> 8b. V pripade, ze jsme v bode 6 meli v regR hodnotu 0xb6, tak na 0x1560
> zapiseme 0xe9, coz znamena 0x155f: JR 0x1549. Tam je RST 0x00. Za
> "normalnich" okolnosti, kdy je pocitac ciste nastartovan a ma implicitni
> obsah RAM, tak se zde nachazi 0x0000: RST 0x38.
>
>
> Prozatim se mi moc nechtelo dal zkoumat, co se deje dal za bodem 8b. Je
> zrejme, ze nez k necemu takovemu dojde, tak program nemanipuluje se
> zasobnikem (tedy nevyuziva vedome moznosti projit pres RETI a zbrchat se) a
> ani nenastavuje zadny vlastni obsah na adrese 0x0000.
> V pripade, ze jsem uz jednou Interkarate loader nacetl spravne a dam reset.
> Pak znova nahraju zavadec Interkarate, tak je obsah na adrese 0x0000 natolik
> destruktivni, ze je program vetsinou uiplne v haji.
> V pripade,  ze program projde pres RETI, tak se zda, ze nejakou nahodou,
> ktera mozna sekundarne trochu souvisi s nejakou operaci s CTC dojde ke
> zbrchani vykolejeneho zavadece a program nacte s drobnymi deformacemi
> screen, ktery nasleduje v dalsim CMT bloku.
>
> Zkusim to jeste dale zkoumat, protoze je taky dost mozne, ze ten hazardni
> stav nastava jen v emulatoru a pak by bylo potreba pustit se znova do
> pruzkumu spravneho chovani obvodu PIOZ80 :(
>
> Michal
>
>
>
> _______________________________________________
> SharpMZ mailing list
> SharpMZmail.ordoz.com
> http://mail.ordoz.com/mailman/listinfo/sharpmz
>
> _______________________________________________
> SharpMZ mailing list
> SharpMZmail.ordoz.com
> http://mail.ordoz.com/mailman/listinfo/sharpmz
>

Re: [SharpMZ] Adolf z Interkarate+

Michal Hucik - ORDOZ <ordoz@[doména skryta]> SHARP MZ-800

Na novy rok jsem se po dlouhe dobe dostal k Sharpu a vrhnul jsem se na 
resty ... nebylo moc casu, ale aspon jsem opravil jednu drobnou chybku v 
breakpointech (debugger - ale v svn to jeste neni) a napsal jsem si 
drobny testik - viz prilozeny mzf

Projede se v nem pres par HALT a na adrese 0x5000 se ulozi vysledek z 
regR, ktery je pri kazdem preruseni vynulovan  ... Ukazalo se, ze 
Zdenkuv emu se v tomto pripade zrejme shoduje se skutecnym HW, narozdil 
od meho emu ... KOMU TOHLE PROSPEJE? ;) Nicmene verim, ze Zdenkovi jsem 
tak alespon udelal do Noveho roku radost ...

Mam tedy opet na stole Sharp a snad se brzy dostanu i k testum, ktere 
odhali to, proc na Sharpu je vysledkem vzdy 6 delsich cyklu a po nich 
nasleduje jeden kratky, zatimco v mem emu je to zatim jakesi posahane a 
strida se mi to proste jinak... Nic to vsak doposud nemeni na mem 
nazoru, ze jsem bud neco prehlednul, nebo, ze fungovani zavadece 
Interkarate+ je zalozeno na hazardu a "kratky" cyklus, ktery je 
statisticky castejsi muze zpusobit kolabs programu.

Michal

Přílohy

  • test.mzf
    application/octet-stream · 337 B