Autor Wątek: Pierwsze kroki w Pasmo  (Przeczytany 106261 razy)

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #30 dnia: 2015.04.17, 20:18:53 »
  LD BC,500
Loop:
  DEC BC
  LD A,B
  OR C
  JP NZ,Loop

Poeksperymentuj i dobierz sobie BC odpowiednie do twoich potrzeb

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #31 dnia: 2015.04.17, 21:35:06 »
Dzięki, działa.
Bez tego opóźnienia za szybko działa i efekty pracy uciekają.
Miałem bardzo podobnie tylko zamiast DEC dałem INC i nie chciało działać.
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

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #32 dnia: 2015.04.17, 21:43:59 »
Taka wprawka, udało się zatrzymać pasy na boderze.

org 40000
   
petla ld a,2
out (254),a

call time

ld a,6
out (254),a

call time

jp petla

ret


time
   LD BC,1435
   Loop
   DEC BC
   LD A,B
   OR C
   JP NZ,Loop
   ret


end 40000
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

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #33 dnia: 2015.04.17, 23:17:52 »
A co to ma być? Bo 100ms do 'testowej pętli' na czuja ma się niestety nijak.

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #34 dnia: 2015.04.17, 23:29:11 »
To tylko zabawa z borderem żeby przetestować opóźniacz.
Na razie się uczę i to wszystko takie proste programiki dla nauki.

A w tym opóźniaczu da się uzyskać 1ms i 100, a pewnie i więcej da radę.

Mam jeszcze kilka innych ale nie będę was zanudzał takimi prymitywnymi rzeczami.
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

trojacek

  • *****
  • Wiadomości: 6831
  • Miejsce pobytu:
    Warszawa
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #35 dnia: 2015.04.17, 23:34:04 »
Border jest "rysowany" co 20 ms, więc po co Ci takie duże opóźnienie? :D

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #36 dnia: 2015.04.17, 23:34:51 »
Temat opóźnienia czasowego jest w sumie dość ciekawy temat, a i w miarę łatwy do wyliczenia.

Inną sprawą jest zabawa borderem i multicolorem. Tu raczej nie operujemy czasem wyrażonym w (mikro/mili)sekundach, lecz w taktach procesora, a przynajmniej w ten sposób podawane są wszelkie opóźnienia i czasy trwania/przebiegów rastra.

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #37 dnia: 2015.04.17, 23:44:30 »
Jako parametr opóźnienia do rejestrów BC musiałem wpisać 1435.
Dało to stojący border.

A procedura jest uniwersalna, można ją do wszystkiego 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

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #38 dnia: 2015.04.18, 10:27:15 »
100 ms (rozmiem że milisekund) czyli 0,1 sekundy to na pewno nie jest.

Spectrum wyświetla 50 ramek na sekundę a ty zmieniasz jeszcze w każdej ramce kilka razy kolor bordera więc powiedzmy robisz 50*5=250 zmian na sekundę. Czyli opóźnienie byłoby około 1000/250=4 milisekundy.

Ale jak słusznie powiedziano nikt w takich sytuacjach nie posługuje się milisekundami tylko czymś co u nas nazywa się taktami a po angielsku T-states.

Oczywiście można nie mieć pojęcia o taktach a i tak uzyskać metodą eksperymentowania efekt, co właśnie udowodniłeś :)

Osobiście odradzałbym ci teraz wchodzenie w multicolory, to nie są najlepsze zagadnienia na początek nauki. Zaraz zderzysz się z liczeniem taktów dla każdej instrukcji, przerwaniami, różnymi modelami Spectrum itp.

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #39 dnia: 2015.04.18, 11:52:51 »
To była tylko wprawka, w zadne bardziej zaawansowane sprawy na razie nie wejdę.

Na razie utknąłem w takim miejscu:

ld c,10

petla

dec c
ld a,c
cp a
jp nz,petla

ret

petla ma sie wykonac 10 razy i z niej wyjsc
według mnie to po 10 dekrementacji gdy c osiągnie 0 powinna wyjsc
a nie wychodzi.
gdzie jest błąd?

takie cos stworzylem:
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

pear

  • *****
  • Wiadomości: 5509
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #40 dnia: 2015.04.18, 12:11:27 »
Trochę przedobrzyłeś :)

Rozkaz dekrementacji rejestru 8-bitowego sam zmienia stan znacznika Z, więc jeśli do niczego innego jak tylko do sprawdzenia stanu rejestru C nie jest potrzebna zawartość akumulatora, to fragment
ld a,c
cp a
jest zupełnie niepotrzebny.
Znacznik Z będzie ustawiony, gdy C będzie równe 0 od razu po DEC C.

A błąd tkwi w tym, że CP A zawsze daje Z=1, bo A zawsze jest równe A.
ZX/Enterprise/CPC/Robotron/C128D

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #41 dnia: 2015.04.18, 12:40:47 »
Niestety pewne rzeczy w asemblerze Z80 są nieintuicjne.

Taka np instrukcja DEC BC nie zmienia w ogóle flagi zero.

Stąd ta cała dziwaczna konstrukcja:

DEC BC
LD A,B
OR C   ; ustawia zero tylko gdy B=0 i C=0 czyli gdy BC=0
JP NZ,nnnn

Natomiast instrukcje na jednym rejestrze ustawiają flagę zero więc wystarczy

DEC C ;ustawia flagę zero na tak gdy C=0
JP NZ,nnnn

Poszukaj sobie w sieci listy instrukcji Z80 i zobacz jaki mają wpływ na flagi. Na początek wystarczą ci flagi zera i przeniesienia - to ich się używa w ponad 90% przypadków.

A CP N działa tak: od rejestru A odejmuje "na niby" rejestr N, patrzy jaki jest wynik i odpowiednio ustawia flagi. Samego wyniku odejmowania nigdzie nie zapisuje. Robiłeś CP A czyli "odejmij A od A" czego wynik jest zawsze zerem.

pear

  • *****
  • Wiadomości: 5509
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #42 dnia: 2015.04.18, 12:43:42 »
Nie wiem, czy Tygrys już naszą Wiki upublicznił, ale aż szkoda, żeby się marnowało.
http://speccy.pl/wiki/index.php?title=Lista_rozkaz%C3%B3w_-_alfabetycznie
ZX/Enterprise/CPC/Robotron/C128D

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #43 dnia: 2015.04.18, 14:50:03 »
Dziękuje za wyczerpującą odpowiedź. Będę zaraz testował.

Jedna rzecz rzuciła mi się w oczy, w komentarzu Rafała

LD A,B
OR C   ; ustawia zero tylko gdy B=0 i C=0 czyli gdy BC=0

funkcja logiczna OR to jest po polsku "lub",
a "i" to jest AND

Na chłopski rozum to powinno być:

LD A,B
AND C

więć albo w programie błąd, albo w komentarzu.

No ale program przecież działa ...
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

pear

  • *****
  • Wiadomości: 5509
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #44 dnia: 2015.04.18, 15:09:22 »
Jest dobrze.
Suma logiczna OR daje w wyniku 0, jeśli oba argumenty są zerem i 1 jeśli dowolny z argumentów jest jedynką.
Iloczyn logiczny AND daje w wyniku 1, jeśli oba argumenty są jedynkami i 0 jeśli dowolny z argumentów jest zerem.
Ty chcesz wiedzieć, czy WSZYSTKIE sprawdzane bity są ZERAMI, więc potrzebujesz wynik z ich SUMY.
ZX/Enterprise/CPC/Robotron/C128D