Autor Wątek: Procedura scrollująca ekran  (Przeczytany 8274 razy)

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Procedura scrollująca ekran
« dnia: 2015.06.16, 11:50:51 »
Wracając do Twojego pytania: napisałem procedurę przewijającą linię z adresu zapisanego w HL i kopiującą znikający pixel. Wynik: 27 bajtów. :D

EDIT: Kolejne 15 minut główkowania i udało się zejść do 20 bajtów! :D

No to całkiem nieźle :)

Mnie tak z głowy wyszło 17 :) Ale stawiam na to, że da się to jeszcze zoptymalizować ;)

scroll_line
        push hl           ; zapamiętujemy adres początku, żeby potem odtworzyć ostatni bit
        ld b,31           ; długość pętli
        ld a,(hl)         ; pobieramy pierwszy bajt
        rra               ; i najstarszy bit z niego wysuwamy do CY
        inc l             ; przeskakujemy o bajt  a następnie w pętli...
scroll_line1
        ld a,(hl)         ; pobieramy kolejny bajt
        rra               ; przesuwamy bit w prawo równocześnie wsuwając z CY poprzedni
        ld (hl),a         ; odkładamy przesunięty bajt
        inc l             ; przeskakujemy do następnego
        djnz scroll_line1 ; i zamykamy pętlę
        pop hl            ; podnosimy adres pierwszego bajtu - w CY mamy ostatnio wysunięty bit z prawej strony
        ld a,(hl)         ; pobieramy pierwszy bajt
        rra               ; przesuwamy wsuwając z CY zapętlony bit
        ld (hl),a         ; odkładamy
        ret               ; i kończymy

A poza tym to gratulacje dla tych (zwłaszcza początkujących), którym się chciało i mieli czas/zapał :) U mnie jak często ostatnio zabrakło tych dwóch ostatnich bo chęć miałem ;)
« Ostatnia zmiana: 2015.06.16, 11:58:10 wysłana przez matofesi »

ZX Freeq

  • *****
  • Wiadomości: 1835
  • Miejsce pobytu:
    Warszawa
Odp: Procedura scrollująca ekran
« Odpowiedź #1 dnia: 2015.06.16, 11:51:54 »
Jak napisałeś to pochwal się rozwiązaniem.


Przewija o jeden pixel wiersz wskazany przez HL, uciekający pixel kopiuje na początek.
Pierwsza linia LD HL, 16384 wlasciwie do usunięcia, (bo potrzebna mi byla do testów), więc rozwiązanie ma 17 bajtów. :)
Czy da się zejść niżej z liczbą bajtów?

Pozdro.
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

ZX Freeq

  • *****
  • Wiadomości: 1835
  • Miejsce pobytu:
    Warszawa
Odp: Procedura scrollująca ekran
« Odpowiedź #2 dnia: 2015.06.16, 12:02:09 »

Mnie tak z głowy wyszło 17 :) Ale stawiam na to, że da się to jeszcze zoptymalizować ;)


 :o Też mam 17! (czytaj powyżej)

 Niestety moja wiedza co do instrukcji Z80 się kończy, nie wiem jak to bardziej upakować.
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Procedura scrollująca ekran
« Odpowiedź #3 dnia: 2015.06.16, 12:07:51 »
No tak, na pewne rzeczy trzeba po prostu wpaść,
cały czas wydawało mi się że ten bit trzeba gdzieś zapamiętać,
ale wygląda na to że najlepszą pamięcią dla niego jest właśnie ekran. :)
ZX81/ZX 48k/Zx48k+/ZX +2/ZX +2A/+3/TC2048/FDD3000/FDD5000/3"/3,5'/5,25'/Beta 48k Apina/D+/GP50s/DIVIDE CF/Masterface/Polbasic SamCoupe QL CPC6128/N100 MSX-SVI738  MSX2-VG8235

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Procedura scrollująca ekran
« Odpowiedź #4 dnia: 2015.06.16, 12:11:54 »
:o Też mam 17! (czytaj powyżej)

Ale widzisz jaka była kolejność postów? ;)
Jak pisałem swój to u ciebie było 20 ;)

No tak, na pewne rzeczy trzeba po prostu wpaść,
cały czas wydawało mi się że ten bit trzeba gdzieś zapamiętać,
ale wygląda na to że najlepszą pamięcią dla niego jest właśnie ekran. :)

Nawet nie ekran - czasem trzeba zwrócić uwagę jakie flagi procesora są modyfikowane przez poszczególne rozkazy. CY jest modyfikowane w zasadzie wyłącznie przez przesunięcia i arytmetykę. Proste inc/dec go nie ruszają i czasem jest to bardzo przydatne :)

edit: A w ogóle to 15 ;)

zamiast
ld a,(hl)
rra
ld (hl),a

można użyć
rr (hl)
« Ostatnia zmiana: 2015.06.16, 12:22:32 wysłana przez matofesi »

ZX Freeq

  • *****
  • Wiadomości: 1835
  • Miejsce pobytu:
    Warszawa
Odp: Procedura scrollująca ekran
« Odpowiedź #5 dnia: 2015.06.16, 12:27:12 »
14 bajtów. :D

Matofesi, dzięki za podpowiedź z rr (hl).

;prosta procedura dla tdu
;da sie skrocic na pewno :)
org 32768
init:
;ld hl, 16384 ;ustawmy hl na poczatek odpowiedniego wiersza; linia do usuniecia jesli przed wywolaniem procedury HL jest juz ustawione!!!!
push hl ;odkladamy na stos
ld b, 32 ;ustawiamy b, potrzebne do wykonania petli 32 rqazy
loop1:
rr (hl) ;przesun bajt ekranu w prawo o 1 pixel
inc l ;przejdz do nastepnego bajtu; nie wplywa na flage C
djnz loop1 ;zapetlamy; nie wplywa na flage C
pop hl ;przywroc hl
jr nc, koniec ;jesli pixel "nie wyszedl", konczymy
set 7, (hl) ;zapalamy pierwszy bit
koniec:
ret

ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Konkurs #2 - demo w stylu 'oldschool'.
« Odpowiedź #6 dnia: 2015.06.16, 12:31:02 »
No widzisz... To jeszcze zrób...
ret nc
set 7,(hl)
ret

I będziesz miał 13 ;)

Tylko właśnie zauważyłem, że chyba popełniasz jeden błąd... Przed pierwszym RR (HL) nie masz gwarancji stanu CY, co może powodować, że ci się będzie wsuwać na pierwszy bit coś, co nie powinno się wsuwać. Wymuszenie CY na zero to przynajmniej jeden bajt extra (np. OR A) więc w sumie będzie 14.

ZX Freeq

  • *****
  • Wiadomości: 1835
  • Miejsce pobytu:
    Warszawa
Odp: Procedura scrollująca ekran
« Odpowiedź #7 dnia: 2015.06.16, 12:42:20 »
Faktycznie....  :-[

ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega/Next|QL+QIDE|JS128|Timex 2048+2040|UK2086|FDD3000+3.5''|AY|ZX HD|Divide2k11/2k14|DivMMC/PicoDivSD|BetaDisk 128|Opus|Masakrator FM|If 1/2/Microdrv|Multiface 1|+2A\B SDI-1|SJS 1/2|ZX Printer|TZXDuino|+3 HxC USB|ZXUno|Omni
Z88|A500/600|PC200|Ent128

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Procedura scrollująca ekran
« Odpowiedź #8 dnia: 2015.06.16, 12:54:45 »
Z ciekawości policzyłem sobie też czasy wykonania twojego kodu i mojego. U mnie wychodzi 1055 taktów, a u ciebie 1062 albo 1081 (zależnie od stanu ostatniego bitu) po uwzględnieniu OR A na początku procedury. W krótszym przypadku u ciebie mniej czasu zajmuje to, co poza pętlą, ale dorzuca ci czasu dodatkowy przebieg pętli (dodatkowe 32 takty).

Dochodzi też różnica czasów, która w ekstremalnej sytuacji - gdybyś liczył takty do jakiegoś multicolora albo czegoś w tym stylu - może powodować rozjazd wykonania i trudności z synchronizacją. Choć oczywiście w takiej sytuacji raczej odpuściłbym sobie pętlę i zrobił całość w jednym długim ciągu ;)


tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Procedura scrollująca ekran
« Odpowiedź #9 dnia: 2015.06.16, 13:18:45 »
No i jaka fajna dyskusja się rozwinęła, i jaka pouczająca.
Parę zdań i można się wiele nauczyć.

Ja bym proponował, stworzenie banku takich prostych procedur
z komentarzami do różnych typowych zastosowań.




ZX81/ZX 48k/Zx48k+/ZX +2/ZX +2A/+3/TC2048/FDD3000/FDD5000/3"/3,5'/5,25'/Beta 48k Apina/D+/GP50s/DIVIDE CF/Masterface/Polbasic SamCoupe QL CPC6128/N100 MSX-SVI738  MSX2-VG8235

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Procedura scrollująca ekran
« Odpowiedź #10 dnia: 2015.06.16, 13:24:54 »
Już to kiedyś dyskutowaliśmy ;)

Wniosek był taki, że ci, którym się chce nie mają zacięcia, żeby tworzyć "bank". Ale jest Wiki więc nie widzę powodu, żebyś nie miał się tym zająć ;)

Ja ze swojej strony chętnie odpowiem na konkretnie postawione - tak jak w tym wypadku - pytanie techniczne, ale składać tego w coś większego na pewno mi się nie będzie chciało ;)

Phonex

  • *****
  • Wiadomości: 1261
  • Miejsce pobytu:
    Warszawa
Odp: Procedura scrollująca ekran
« Odpowiedź #11 dnia: 2015.06.16, 13:28:10 »
Bez instrukcji warunkowych, a więc z równym czasem wykonania, można zrobić tak.
Przy okazji: skoro nie zmienia się H, to nie trzeba zapamiętywać pary HL :)
Długość: 14, czas: 1066 taktów.
        LD C, L                 ; 4Ts
        XOR A                   ; 4Ts
        LD B, 32                ; 7Ts
L1      RR (HL)                 ; 15Ts
        INC L                   ; 4Ts
        DJNZ L1                 ; 8/13Ts
        LD L, C                 ; 4Ts
        RRA                     ; 4Ts
        OR (HL)                 ; 7Ts
        LD (HL), A              ; 7Ts
        RET                     ; 10Ts

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Procedura scrollująca ekran
« Odpowiedź #12 dnia: 2015.06.16, 13:31:57 »
O. I to jest chyba najładniejsza procedurka. A w każdym razie mnie się najbardziej podoba :)

A jak u siebie zastąpię push/pop użyciem c to oszczędzam jeszcze 13 taktów ;)
« Ostatnia zmiana: 2015.06.16, 13:40:41 wysłana przez matofesi »

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Procedura scrollująca ekran
« Odpowiedź #13 dnia: 2015.06.16, 18:51:42 »
Dziękuje za tyle ciekawych pomysłów i wypowiedzi.
Zastosuje to w moim demie, zobaczę na ile przyśpieszy swoje działanie.
ZX81/ZX 48k/Zx48k+/ZX +2/ZX +2A/+3/TC2048/FDD3000/FDD5000/3"/3,5'/5,25'/Beta 48k Apina/D+/GP50s/DIVIDE CF/Masterface/Polbasic SamCoupe QL CPC6128/N100 MSX-SVI738  MSX2-VG8235