Autor Wątek: Wyzwanie dla programistów #5  (Przeczytany 4309 razy)

ZX Freeq

  • *****
  • Wiadomości: 1533
  • Miejsce pobytu:
    Warszawa
Odp: Wyzwanie dla programistów #5
« Odpowiedź #30 dnia: 2018.10.07, 18:10:22 »
....najwyżej będę spóźniony.

Jak obiecałem, tak zrobiłem. Jestem spóźniony. Jak w tym powiedzonku "Kochanie, jak mówiłem, że naprawię zmywarkę, to zrobię to. Nie musisz co pół roku przypominać" ;)
Ponieważ się spóźniłem to trochę opiszę więcej.

Niestety nie udało się we wrześniu znaleźć zbyt wiele czasu na Spectrumowe hobby. Nauczyłem się kilku rzeczy przez ten czas:
- jak coś planujesz, zrób od razu do końca. Trudno, że już 4 nad ranem ;)
- jeśli planujesz coś stworzyć tylko w ASM na przykład w notatniku (czyt. zx spin), to komentarze jakby dobre nie były, to po przerwie nawet dwudniowej nic nie mówią
- ...
- a na serio, nauczyłem się jak obliczać adres w pamięci na podstawie dwóch współrzędnych. Pewnie zawodowcy o tym doskonale wiedzą, ja nie wiedziałem, a w adresie całkiem fajnie to jest zakodowane jak spojrzeć na adres w postaci binarnej (a zawsze się zastanawiałem jak do ASM przenieść długie pętle napisane w basicu).
- fajnie, że ld hl, (adres) pobiera od razu 2 bajty spod adresu - mi się przydaje, gdy w "zmiennej" adres zapisuję sobie jakiś adres ekranu
- rejestr R można wykorzystać do generowania liczb pseudo-losowych. Chyba nie doczytałem jak we własnym programie wykorzystać procedurę w ROM: RANDOMIZE.


Do tematu gwiazdek chciałem podejść inaczej. Zainspirowany filmem Interstellar, miałem ochotę zrobić animowaną gwiazdę pożeraną przez Gargantuę. Idea w obrazku w załączniku. Nie bardzo wiedziałem jak do tego się zabrać. Czy w PCetowym programie 3d stworzyć animacje i wyeksportować jako bitmapy i ładnie zapętlić? A może oprogramować? Większość obrazka i tak byłaby statyczna, a jedynie pierścień animować? Zadanie mnie przerosło.
Skoro konkurs był ogłoszony w sierpniu -  czas kiedy widać na niebie perseidy - postanowiłem zrobić "mrygające" niebo i spadające gwiazdy. Na początku nie szło zbyt dobrze - patrz drugi obrazek w załączniku. :D Koniec końców, z braku czasu, zrobiłem wersję uproszczoną, gwiazda spada zawsze w tę samą stronę. Losowo generowane są pozycje gwiazd, częstotliwość ich mrygania oraz odstęp czasowy pomiędzy kolejnymi perseidami. Skromnie, ale jestem zadowolony, że sam od początku do końca udało mi się coś w ASM napisać. (ok, ok, procedurę putpixel pobrałem z internetu, ale za to dzisiaj dokładnie rozumiem jak działa).
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega|QL+QIDE|JS128|Timex 2048+2040 Printer|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

trojacek

  • *****
  • Wiadomości: 4403
  • Miejsce pobytu:
    Warszawa
Odp: Wyzwanie dla programistów #5
« Odpowiedź #31 dnia: 2018.10.07, 18:41:25 »
- jeśli planujesz coś stworzyć tylko w ASM na przykład w notatniku (czyt. zx spin), to komentarze jakby dobre nie były, to po przerwie nawet dwudniowej nic nie mówią

No tak, czasami wracam do swoich asm-owych wypocin sprzed lat i... ni w ząb ich nie rozumiem :) Dlatego narzucam sobie pewien rygor, gdy mam coś napisać - wyniesiony przede wszystkim z programowania w javie:

• Dziel kod na logiczne bloki - procedury/funkcje, nie dłuższe niż 20-30 linii, bo dłuższych się łatwo nie przeanalizuje.
• Każdy taki wydzielony blok rozpoczynaj blokiem komentarzy, co dany kod robi, jakie są parametry wejściowe i wyjściowe.
• Dodawaj komentarze in-line (po rozkazie), nawet jeśli działanie jest trywialne, ale występuje wartość specyficzna.
• Używaj pustych linii nawet wewnątrz jednego bloku kodu, jeśli poszczególne fragmenty kodu są wykonywane warunkowo.

Taki kawałek mojego kodu:
; kopiowanie nazwy pliku/katalogu (hl) -> (de).
; WY: DE wskazuje kolejna pozycje w buforze sortowania
FILETOBUFFER LD A,(HL)
CP "."
JR Z,NORM_END ; .. -> kopiujemy i tyle
PUSH DE
PUSH HL
LD HL,FILENAME
LD A,32
LD B,12
FILEBUFCLR LD (HL),A
INC HL
DJNZ FILEBUFCLR
POP HL
LD DE,FILENAME
LD B,12
NORM_L LD A,(HL) ; szukamy terminatora
INC HL
OR A
JR Z,NORM_L1 ; terminator
CP "."
JR NZ,NORM_EXT_P ; nie kropka? to kopiujemy dalej
LD DE,FILENAME+9 ; ustawiamy na odp. pole w nazwie
LD A,(HL) ; bierzemy pierwszy znak po kropce
INC HL
LD B,3 ; nowa dlugosc
NORM_EXT_P LD (DE),A ; kopiujemy nazwe
INC DE
DJNZ NORM_L
INC HL
NORM_L1 LD DE,FILETIME ; HL = pierwszy bajt po zerze
LD BC,8
LDIR ; kopiujemy parametry
; gotowe
POP DE
LD HL,FILENAME
NORM_END LD BC,20
LDIR ; kopiujemy gotowa nazwe i parametry do bufora sortowania
RET


I jak poszło ze zmywarką? W mojej padła grzałka, poświęciłem sporo czasu na poszukiwanie nowej, w końcu dostałem - i jak się wziąłem za montaż, to się okazało, że tylko spaliła się kostka zasilania grzałki...:D

ZX Freeq

  • *****
  • Wiadomości: 1533
  • Miejsce pobytu:
    Warszawa
Odp: Wyzwanie dla programistów #5
« Odpowiedź #32 dnia: 2018.10.07, 18:47:01 »
Hmmm poznaję, styl pisania chyba skopiowałeś z Bajtka ;D ;D ;D
Uwagi cenne i właściwie je stosuję, różnie z regularnością bywa :)
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega|QL+QIDE|JS128|Timex 2048+2040 Printer|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

trojacek

  • *****
  • Wiadomości: 4403
  • Miejsce pobytu:
    Warszawa
Odp: Wyzwanie dla programistów #5
« Odpowiedź #33 dnia: 2018.10.07, 18:48:49 »
Hmm, może i skopiowałem skądś styl, bo kod pisany od zera jakiś miesiąc temu ;)

Dalthon

  • ***
  • Wiadomości: 223
  • Miejsce pobytu:
    TriCity
Odp: Wyzwanie dla programistów #5
« Odpowiedź #34 dnia: 2018.10.07, 23:57:43 »
Mam rozgrzebany swój "starfield" ale dzisiaj musiałem odpocząć od m68 i vectoryzacji i zrobiłem małą pchełkę: starfield w 50 bajtach :)

ps. jakby ustawianie PAPER, INK i CLS wrzucić do loadera, to sam kod miałby 39 bajtów :D
« Ostatnia zmiana: 2018.10.08, 00:41:20 wysłana przez Dalthon »

Klaud

  • *****
  • Wiadomości: 3663
  • Miejsce pobytu:
    trzecia planeta od Słońca
  • Mordimer Madderdin
Odp: Wyzwanie dla programistów #5
« Odpowiedź #35 dnia: 2018.10.08, 00:18:04 »
:) Niezłe :)
KL
-----
Poszukuję TS1500, TK95 oraz C=116.

ZX Freeq

  • *****
  • Wiadomości: 1533
  • Miejsce pobytu:
    Warszawa
Odp: Wyzwanie dla programistów #5
« Odpowiedź #36 dnia: 2018.10.08, 09:04:38 »
OR A
RL (HL)

Fajne, a ja zawsze na około...
ZX80|ZX81+16kB+PandAY|ZX 48k/+/128k+/+2/+2A/+3/Vega|QL+QIDE|JS128|Timex 2048+2040 Printer|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

Tygrys

  • Administrator
  • *****
  • Wiadomości: 3832
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Wyzwanie dla programistów #5
« Odpowiedź #37 dnia: 2018.10.08, 11:40:48 »
Ważne aby swoje wyzwania kończyć, bo dzięki temu osiąga się cel, a i uczy wielu rzeczy ;)