Kdyby to chtel nekdo nekdy upravovat, protoze zjistil ze chybi nejake cool instrukce(napriklad zjistit jak je to s tim BIT,SET,RES a nedefinovanym bitem vlajky), nebo jen reprodukovat, tak prikladam pouzite asm soubory a how.txt soubor s nejakymi popisky triku s awkem.
Output obsahuje txt soubory ktere jsou "vyzdimane" z fuse a nelze je snadno ziskat.
Nejsou tam vsechny, ty co se tvori nejak jinak a snadno pomoci prikazu jsem tam nedal.
Jen prohozenim nekterych souboru se stane ze se vymeni to vybrane reseni, protoze ma stejny pocet taktu i bajtu, jen proste pouziva jinou kombinaci instrukci.
Bylo by pekne kdyby nekdo overil na tech testovacich tapkach ze to fakt funguje na realnem zeleze, nebo jinem emulatoru.
Asm soubory jdou vygenerovat skriptem "make_test.sh", takze to muzete upravit i pro jiny osmibit co ma Z80.
Krome nacteni ty programy trvaji 0.19 vteriny, protoze to neni nijak extremne zasmyckovane.
"Nacte AF" a ulozi jeho hodnotu na zasobnik (protoze to stoji jen bajt navic k tem cca 5 bajtum pro kazde cislo a stejne se to tam musi dat).
Na konci se to taha ze zasobniku uz ve smycce a protoze jsou ty hodnoty serazene, tak to pri nacitani pekne klesa o jedna a lze to tak snadno porovnavat.
V tom testu neresim ze jsem udelal neco spatne a je to zavisle na predchozi hodnote.
Takze netestuji pro ruzne hodnoty AF stejny kod.
To doufam ze mam spravne.
Je tam vlastne 7 metod.
xor A : ... (other_flag.asm)
or 0xFF : ... (or_FF.asm)
ld A, const : or A : ... (or_n.asm)
ld A, const : and A : ... (and_n.asm)
ld A, const : add A, const : ... (add_flag.asm)
ld A, const : sub const : ... (sub_flag.asm)
ld A, const : cp const : ... (cp_flag.asm)
Pokud puvodni "ld A, const" je "ld A, 0" tak se to nahradi za "xor A".
tak necekam ze jsem zacatek pokazil a ze kod ovlivnuje prechozi nastaveni.
A v tech teckach se skryva
Kód:
db 0x00 ; nop ; ---- ----
db 0x07 ; rlca ; --50 3-0C
db 0x0F ; rrca ; --50 3-0C
db 0x17 ; rla ; --50 3-0C
db 0x1F ; rra ; --50 3-0C
db 0x27 ; daa ; SZ5H 3P-C adjusting the A register by a value which is dependent upon the value of the A register, the Carry flag, Half-Carry flag (carry from bit 3 to 4), and the N-flag (which defines whether the last operation was an add or subtract)
db 0x2F ; cpl ; --51 3-1-
db 0x37 ; scf ; --50 3-01
db 0x3F ; ccf ; --5H 3-0C H=previous Carry
db 0x3C ; inc a ; SZ5H 3V0- V=1 only inc 0x7F -> 3 = 1
db 0x3D ; dec a ; SZ5H 3V1- V=1 only dec 0x80 -> 3 = 0
db 0x87 ; add a,a ; SZ5H 3V0C V=oVerflow (O similar to 0?)
db 0x8F ; adc a,a ; SZ5H 3V0C V=oVerflow (O similar to 0?)
db 0x97 ; sub a ; SZ5H 3V1C V=oVerflow (O similar to 0?)
db 0x9F ; sbc a,a ; SZ5H 3V1C V=oVerflow (O similar to 0?)
db 0xA7 ; and a ; SZ51 3P00
db 0xB7 ; or a ; SZ50 3P00 = xor
db 0xBF ; cp a ; SZ5H 3P1C P=overflow
Kde "nop" vlastne zkracuje pocet pouzitych instrukci.
PS: Soubory jsou uz nastaveny na oddelovac ":" misto "/".
PPS: V te tabulce jsou uvedeny ld_a_$.. i ld_A_$.. varianty pokud to budete zpracovavat hromadne.
PPPS: Nemyslim si ze na to nekdo bude sahat, ale pokud jo tak napiste jak jste dopadli.