Odpovídáte na názor k článku Práce s klávesnicí na ZX Spectru. Názory mohou přidávat pouze registrovaní uživatelé. Nově přidané názory se na webu objeví až po schválení redakcí.
Diky za clanek! Jeste jsem to nedocetl, ale nedalo mi ukazat u tretiho prikladu maly trik.
To ze jsi to dal do maker, je asi prehlednejsi co to ma delat, ale ne jak to dela a pak ti snadno uniknou optimalizace.
Takhle to vypada kdyz provedu makra:
next_key:
srl a ; přesunout kód stisku klávesy do příznaku carry
jr nc, key_pressed ; test stisku klávesy
ld (hl), WHITE_COLOR << 3
inc hl
jr next ; test další klávesy
key_pressed:
ld (hl), INTENSITY_BIT | (RED_COLOR << 3)
inc hl
next:
djnz next_key ; opakovat celou smyčku 5x
1 bajt usetrim kdyz zamenim dvoubajtove "srl a" za treba "rra", pokud me zajima jen carry.
1 bajt usetrim kdyz si uvedomim, ze obe vetve provadi spolecny kod "inc hl"
next_key:
rra ; přesunout kód stisku klávesy do příznaku carry
jr nc, key_pressed ; test stisku klávesy
ld (hl), WHITE_COLOR << 3
jr next ; test další klávesy
key_pressed:
ld (hl), INTENSITY_BIT | (RED_COLOR << 3)
next:
inc hl
djnz next_key ; opakovat celou smyčku 5x
Tim jsem se dostal do situace, kdy obe vetve maji jen 2 bajty a tak lze proves jeste dalsi optimalizaci a usetrit jeden bajt tim, ze zamenim "jr next" za 3 bajtovy jp. Trik je v tom, ze nastavim priznaky tak, ze se nikdy neprovede a adresa skoku bude kod druhe vetve. Podobneho efektu lze docilit ze si zaspinim nejaky dvouregistr napr "ld DE,xxxx", ale tady mam jasne definovany stav priznaku takze to jde udelat ciste.
next_key:
rra ; přesunout kód stisku klávesy do příznaku carry
jr nc, key_pressed ; test stisku klávesy
ld (hl), WHITE_COLOR << 3
db 0xD2 ; jp nc,nn
key_pressed:
ld (hl), INTENSITY_BIT | (RED_COLOR << 3)
next:
inc hl
djnz next_key ; opakovat celou smyčku 5x
Tohle by se dalo jeste prepsat, ze zrusim uplne to "jr nc" a "jp" a umistim za prvni vetev, ktera se vykona vzdy opacny priznak, aby se druha vetev vykonala jen kdyz ma. Tim by se usetril dalsi bajt.
next_key:
rra ; přesunout kód stisku klávesy do příznaku carry
ld (hl), WHITE_COLOR << 3
jr c, next ; test stisku klávesy
ld (hl), INTENSITY_BIT | (RED_COLOR << 3)
next:
inc hl
djnz next_key ; opakovat celou smyčku 5x
Tohle ma ale hacek! Bude to videt, protoze sahame do atributove pameti v nahodnem case a nekdy trefime paprsek a tak se nam muze u zobrazeni objevit bila cara. Bude se to chvet. Udelame 3 barvy v jednom znaku, kdybychom to spravne sesynchronizovali s paprskem.