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

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #120 dnia: 2015.05.06, 08:54:18 »
.. a do obsługi bitplanów trzeba coś więcej niż procka. Do Amigi, w którym jest organizacja bitplanowa, dobudowano blitter, którzy operacje na grafice znacznie przyspiesza. ale dość offtopów ;)

Wracając do pytania o usuwanie pixeli. Jak zwykle możliwości jest wiele.

Najszybsza to zapamiętanie adresu pamięci oraz bajtu reprezentującego pixel. To co trzeba zrobić to operacje AND między komórka pamięci a odwróconymi bitami dla pixala (poczytaj o instrukcji CPL).  Można od razu przechowywać wartość dla AND.

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #121 dnia: 2015.05.08, 12:45:18 »
Znowu ugrzęzłem, tym razem na operacjach logicznych.
Wypróbowałem, podpowiedź Tygrysa, ale to nie to.
Bajty w komórkach pamięci, po operacji logicznej,  mają mieć
te ustawione bity które również są ustawione w każdej z komórek.
Po analizie wyszło mi że realizować to powinna funkcja OR.
Ale nie robi tego. Kod testowy poniżej
org 40000

ld a,32
ld (50000),a
ld a,4
ld (50006),a
;-------------
ld a,(50000)
ld b,(50006)
or b
ld (50008),a

;----monitor
ld a,(50000)
ld(16896),a
ld a,(50006)
ld(17408),a
ld a,(50008)
ld(17920),a
ld hl,22528
ld a,120
ld(hl),a

ret

end 40000


W kodzie istotna jest tylko relacja między rejestrem a i b,
reszta to otoczka i minimonitor stanu rejestrów.
 
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ź #122 dnia: 2015.05.08, 14:00:41 »
Nic z tego nie rozumiem  :)

To znaczy kod rozumiem - bierzesz wartości z dwóch komórek robisz na nich OR i wynik zapisujesz do trzeciej komórki. Po czym przerzucasz te 3 bajty na ekran. I co w tym jest nie tak?

I drobna rada trochę z innego obszaru nikt w prawdziwych programach tak nie pisze że coś zapisujemy do komórki 50000 a coś do 50002.

Jest coś takiego jak etykiety. Możesz napisać:

LD A,(LiczbaZyc)
DEC A
LD (LiczbaZyc),A
RET

LiczbaZyc .BYTE 3

i wtedy nawet nie wiesz  dokładnie pod jakim adresem jest przechowywana ta liczba żyć w grze ale nie musisz tego wiedzieć bo program po prostu działa.

Ewentualnie na końcu swojego kodu możesz sobie zrobić blok danych pod określonym adresem

ORG 50000
PixelX .BYTE 128
PixelY .BYTE  96
....

To bardzo ułatwia życie. Jak będziesz miał więcej parametrów przechowywanych pod różnymi adresami to nie będziesz w stanie zapamiętać co dokładnie jest pod 50008 a co pod 46573. A po nazwach będziesz od razu wiedział.





Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #123 dnia: 2015.05.08, 14:02:31 »
Tak na pierwszy rzut oka, to nie możesz zrobić LD B,(adres). Tak można zrobić tylko z A.
Jak chcesz do B załadować dane z pamięci, to musisz to robić poprzez HL lub IX/IY:

   LD B,(HL)

   LD B,(IX+10)
   LD B,(IY-20)

A to, o czym pisałem o kasowaniu punktu na ekranie, gdzie masz zapamiętany adres pamięci oraz pixel, powinno wyglądać mniej więcej tak (piszę z pamięci, bez testów):

  LD IX,adres_tablicy_danych
   LD L,(IX+0) ; zaladowanie mlodszego bajtu adresu
   LD H,(IX+1) ; zaladowanie starszego bajtu adresu
   LD A,(IX+2) ; zaladowanie punktu np %00100000
   CPL ; stworzenie maski, wynik: %11011111
   LD B,A ; przekazanie maski do rejestru pomocniczego B
   LD A,(HL) ; załadowanie danej z komórki pamięci
   AND B ; usunięcie zbędnego punktu, pozostałe punkty pozostają
   LD (HL),A ; zapisanie wyniku do pamięci

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #124 dnia: 2015.05.08, 14:18:01 »
Dzęki Tygrys, w tym był właśnie był problem.
Przyzwyczaiłem się że pasmo daje komunikat gdy jest zła składnia,
tym razem tego nie było.

zrobiłem:
ld a,(50000)
ld b,a
ld a,(50006)
or b
ld (50008),a

i zadziałało, mogę posuwać się dalej.

kod ciekawy, oczywiście przeanalizuje.

@RafałM - dziękuje za uwagi, zapewne jak trochę dojrzeje programistycznie,
zacznę się stosować do takich reguł.
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: Pierwsze kroki w Pasmo
« Odpowiedź #125 dnia: 2015.05.12, 12:13:14 »
Przyzwyczaiłem się że pasmo daje komunikat gdy jest zła składnia, tym razem tego nie było.

Z ciekawości przyjrzałem się co tak na prawdę się u ciebie stało... Okazuje się, że z jakiegoś nie do końca zrozumiałego powodu pasmo w wypadku niektórych konstrukcji (np. użycie niedostępnych rozkazów w trybie assemblacji 8080) - w tym w wypadku adresowania pośredniego - zamiast przerwać assemblację z błędem wyrzuca tylko ostrzeżenie i assembluje jakieś głupoty. W wypadku twojego kodu ostrzeżenie wygląda tak:
WARNING: looks like a non existent instruction on line 9 of file tdu.asm

Twoja instrukcja...
ld b,(50006)
...generuje zaś ciąg $06 $56, który odpowiada rozkazowi
ld b,$56

Wygląda tak, jakby parser wyrzucał ostrzeżenie a następnie pomijał nawiasy i zera i generował bzdurny kod.

Zajrzałem w kod, ale nie bardzo mam czas i zacięcie, żeby się wgryzać głębiej w C i to, co udało mi się uzyskać to wyrzucanie błędu w miejscu napotkania niepoprawnej konstrukcji i... błąd gdzieś "wyżej" w kodzie, który mówi, żeby zgłosić błąd do autora ;)

Opisałem problem i wysłałem zgłoszenie mailem - może w następnej wersji już tego błędu nie będzie :)

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #126 dnia: 2015.05.12, 13:15:57 »
No właśnie kod był długi i to strzeżenie tylko mignęło, a na końcu nic nie było.
Czyli wygenerował jakieś bzdury.

Chociaż nie wiem czemu w tym krótkim kodzie testowym nie zauważyłem ostrzeżenia.
W końcu pisze tam jak wół "non existent instruction on line 5"

ps.dalej walczę z kodem, przesuwanie i odtwarzanie lewo prawo już działa, ale jak doszło
góra dół, to się trochę zaplątałem z adresowaniem. Musze to sobie rozrysować i wtedy do tego dojdę.
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: Pierwsze kroki w Pasmo
« Odpowiedź #127 dnia: 2015.05.12, 15:53:46 »
No i już dostałem odpowiedź... Takie a nie inne działanie pasmo jest jak najbardziej prawidłowe - chodzi o to, że pasmo pozwala na używanie wyrażeń arytmetycznych włączając w to używanie nawiasów. Stąd też użycie ld b,(50006) jest traktowane po prostu jako wyrażenie arytmetyczne, które jest obliczane i używane jako argument. A, że program wie, że nawiasy mogą powodować dwuznaczność stąd ostrzeżenie. A to, że w wynikowym kodzie dostajemy ld b,$56 to nie kwestia parsera tylko tego, że 50006=$c356 i w związku z ośmiobitową instrukcją program bierze po prostu młodszy bajt wyniku.

Żeby uniknąć takich sytuacji pasmo ma dodatkowy tryb pracy włączany parametrem -B (--bracket) - po dodaniu takiego parametru wszystkie "okrągłe" nawiasy są traktowane jako część wyrażeń a adresowanie pośrednie oznacza się używając nawiasów kwadratowych. W naszym wypadku problematyczny rozkaz wyglądałby wtedy tak:
ld b,[50006]
Próba zaś assemblowania takiego kodu daje taki wynik:
pasmo -B --tapbas tdu.asm tdu.tap

ERROR on line 9 of file tdu.asm
ERROR: Expected ']' but 'C356' found

I nie zostawia tym samym wątpliwości co zrobiliśmy nie tak :)

edit : Żeby było śmiesznie właśnie znalazłem kawałek dokumentacji pasmo pod nagłówkeim Bugs:
Cytuj
Pasmo emits a warning when using a expression that looks line a non existent z80 instruction, such as 'ld b, (nn)', but the simplified way used to detect that also warns in cases like 'ld b,(i1+i2)*(i3+i4)'.
A way to avoid the warning in that case is to prefix the expression with parenthesis with '+' or '0 +'.
Using the bracket only mode the problem does not exist, in that case the parenthesis are always taken as expresssions (and the programmer is supposed to know that), thus the warning is not emitted.

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #128 dnia: 2015.05.12, 17:21:27 »
No i wszystko jasne. Odpowiedź błyskawiczna.

A teraz z innej beczki, jak zatrzymać pracę programu
w określonym miejscu żeby odczytać rejestry.

Używam Spectaculatora, tylko nie wiem jak dojść
w debuggerze do interesującego mnie miejsca.
Chyba najlepiej by było w programie ustawić coś
żeby się zatrzymał, jakiś stop czy halt,
nie mogę tego znaleźć.
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: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #129 dnia: 2015.05.12, 21:20:48 »
To zależy od sytuacji, w której potrzebujesz danych o rejestrach. Ja najczęściej używam konstrukcji:

   DI
   HALT

Skutecznie zatrzymuje kod w wybranym miejscu, a w debuggerze można zobaczyć wartości rejestrów. Niektóre też potrafią ponownie włączyć przerwania i kontynuować program, do kolejnego wystąpienia DI:HALT

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #130 dnia: 2015.05.12, 22:00:21 »
Dzięki działa.
Żeby odczytać akumuator musiałem wcześniej go do c przepisać.
Debugger pokazuje af, nie potrafiłem z tego a wydzielić.

Ale, ale, teraz wpadłem na pomysł, jak się przełączy na hex
to starszy bajt to będzie a, młodszy to flagi.
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ź #131 dnia: 2015.05.13, 09:06:54 »
DI HALT umieściłem w pętli programu.
Jak przeskoczyć przez niego do następnego wystąpienia ?
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: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #132 dnia: 2015.05.13, 09:13:32 »
Program zatrzymał się na HALT. Trzeba go przeskoczyć, włączyć przerwania (to pewnie jakiś checkbox w debuggerze lub rejestrach kontrolnych) i odpalić program dalej. Tyle, że to w takim przypadku jest niewygodne. Dla pętli lepiej użyć breakpointów.

Nie używam Spectaculatora bo jego debugger nie spełnia moich oczekiwań, aczkolwiek wiem że breakpointy są.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #133 dnia: 2015.05.13, 09:15:07 »
DI HALT umieściłem w pętli programu.
Jak przeskoczyć przez niego do następnego wystąpienia ?

Nijak ;)
DI/HALT zatrzymuje procesor i jedyna metoda na przerwanie tego stanu to reset albo wywołanie NMI. W emulatorze to, co jest ci potrzebne to nie DI/HALT tylko ustawianie pułapek. Zwykle jest do tego w sekcji debuggera stosowny przycisk - odnajdujesz w disassemblerze punkt, w którym chcesz zbadać stan procesora/programu, klikasz przycisk ustawiania pułapki i puszczasz program dalej. Jak dojdzie do pułapki to emulator się zatrzyma i wskoczy do debuggera. Jak się dokładnie ustawia pułapki zależy od używanego emulatora - przycisk na pasku, kliknięcie w lewy margines okna debuggera przy zadanej instrukcji, wprowadzenie stosownego rozkazu w linii poleceń debuggera. Musisz sobie znaleźć w emulatorze, którego używasz.

A jak już znajdziesz to poszukaj też przycisków do wykonywania krokowego, przeskakiwania wywołań, powrotu z wywołań itp. Większość emulatorów z debuggerami ma takie opcje. A do tego też na przykład pułapki warunkowe - "przerwij wykonanie programu w tym miejscu pod warunkiem, że rejestr zawiera konkretną wartość, pamięć zawiera konkretne informacje itp."

A w emulatorze przeskoczenie za HALT można zrealizować zmieniając zawartość rejestru PC ;)

tdu

  • *****
  • Wiadomości: 926
  • Miejsce pobytu:
    Gdansk
    • Nasze Wędrowanie
Odp: Pierwsze kroki w Pasmo
« Odpowiedź #134 dnia: 2015.05.13, 10:02:26 »
Tygrys piszesz o breakpointach, Matofesi o pułapkach,
czy to to samo ?

Jeśli debugger Spectaculatora, nie jest dobry,
to jaki emulator (debugger) polecacie ?

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