Odpověď na názor

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í.

  • Článek je starý, nové názory již nelze přidávat.
  • 18. 5. 2023 3:26

    _dw

    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.