[#1] Pierwsze kroki - Asembler 68000 - Pytania początkującego..
Robię pierwsze kroki w ASM 68K. Dosłownie dopiero dziś przez kilka chwil pogrzebałem w necie aby ugryźć temat. Napisałem kilka prostych funkcji, ale nie mam pojęcia czy jest to poprawnie wykonane - proszę speców o analizę itd:

;-------------------------------------------

- prosta funkcja, ktora ma byc uruchomiona poprzez zapalenie bit0 zmiennej "FLAGI" (lub wylaczenie gdy bit0 zgaszony) :

FUNKCJA:

	MOVE.B	FLAGI,D0
	ANDI.B	#%00000001,D0
	BEQ.S	FUNKCJA_no			; BEQ.S oznacza Short czyli krotki skok warunkowy (7-bitowy, ~128 bajty +/-)
						; BEQ.W oznacza Wide czuli dlugi skok warunkowy (15-bitowy, do ~32KB +/-)
	; jakis kod

FUNKCJA_no:
	RTS


;-------------------------------------------

- ladujemy wartosc "zmienna", wykonujemy zgaszenie LSB bitow oraz zapalamy bit0 a na koncu zapisujemy wszystko znowu do "zmienna" :

MOVE.B	zmienna,D0
	ANDI.B 	#%11110000,D0
	ORI.B	#%00000001,D0
	MOVE.B	D0,zmienna

;-------------------------------------------

- wykonujemy zwiekszenie o jeden wartosci "zmienna" :

MOVE.B	zmienna,D0
	ADDI.B	#$01,D0					; o jeden
	MOVE.B	D0,zmienna

	MOVE.B	zmienna,D0
	ADDI.B	#$04,D0					; zwiekszamy zmienna o 4
	MOVE.B	D0,zmienna

;-------------------------------------------

- wykonyjemy dwa skoki zaleznie czy wartosc "zmienna" jest wieksza czy mniejsza niz 128 (porownanie na dwie polowy) :

SPRAWDZPOLOWKI:

	MOVE.B	zmienna,D0
	CMPI.B	#$80,D0
	BCC.S	wieksze					; skocz gdy zmienna wieksza niz CMP (mozna uzyc BHI.S ?)
	BCS.S	mniejsze				; skocz gdy zmienna mniejsza niz CMP (mozna uzyc BLS.S ?)

; tu pytanie czy uzywajac BCC/BCS musze miec RTS czy oba skoki MUSZA SIE WYKONAC (i jaka sutuacja bedzie gdy uzyje BHI i BLS czy musze ustawic RTS ?)

wieksze:
	RTS
mniejsze:
	RTS

;-------------------------------------------

- kilka pytanek zwiazanych z CLR bo nie bardzo doczytalem:

CLR.B	D0		; skasuje bajt znajdujacy sie w rejestrze D0

	CLR.W	(A4)		; to skasuje slowo 2-bajtowe znajdujace sie pod adresem WSKAZANYM w rejestrze adresowym A4 (np.jest tam adres $FF00)

	CLR.L	$1C(A2)		; to znalazlem ale jako czesc kodu, nie mam pojecia co robi te $1C w tym przypadku?????

wiem, ze nie mozna tak wyczyscic rejestru adresowego, musze wykonac np.:

	CLR.W	D0
	MOVE.W	D0,A0		; dopiro teraz mozna wyczyscic rejestr adresowy uzywajac CLR

;-------------------------------------------

- prosta petla kopiujaca np. 4096 bajtów ($1000) z adresu zaczynajacego sie np. $8000 do adresu $C000 :

MOVE.W	$8000,A0			; ustaw adres $8000 w A0
	MOVE.W	$C000,A1			; ustaw adres $C000 w A1
	MOVE.W	#$1000,D0			; zaladuj wartosc $1000 do rejestru D0 aby dzialal jako licznik
LOOP:
	MOVE.B	(A0)+,(A1)+			; skopiuj bajt z A0 ($8000) do A1 ($C000) i zwieksz adres o jeden
	SUBI.W	#$01,D0				; odejmij jeden od D0 i wykonaj loop az bedzie miec wartosc zerowa.... 
	BNE.S	LOOP

- tu nie mam pojecia jak maja sie sprawy z wszelkimi petlami

Ostatnia aktualizacja: 20.02.2022 19:20:14 przez siudym
[#2] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #1

Ogolnie jak na poczatkujacego moze byc, choc pare bledow jest.
Zwiekszenie zawartosci to lepiej zrobic w ten sposob:

addq.b #1,zmienna

i

addq.b #4, zmienna

add quick byte, quick jest przydatne bo krotsze i szybsze niz addi, dziala dla wartosci od 1 do 8

Jak robisz takie sprawdzanie polowek to wystarczy jeden branch tylko, bo logiczne ze jak branch jest niewykonany to jest wtedy tylko druga mozliwa wersja, chyba ze bardziej skomplikowane sprawdzanie uzywasz. RTS zawsze gdzies musi byc, ale nie musi byc akurat na zakonczeniu tych skokow. Dopoki nie bedzie RTS to nastepna instrukcja bedzie wykonywana.

clr.l $1c(a2) to czysci dlugie slowo (czyli 4 bajty) znajdujace sie pod adresem zawartym w rejestrze A2 plus $1C, czyli jesli np. w A2 jest $10000, to bedzie czyscilo 4 bajty pod adresem $1001C

move.w D0,A0 tu masz blad, w Twoim przypadku to wyczysci rejestr A0, czyli bedziesz mial A0=0, jak chcesz wyczyscic zawartosc wskazywana przez rejestr A0 to musisz uzyc
move.w D0,(A0)

Move.w $8000,a0 i move.w $c000,a1 to masz podwojny blad w kazdej z tych instrukcji.
uzyj
lea $8000,a0 i lea $c000,a1
albo
move.l #$8000,a0 i move.l #$c000,a1
[#3] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #1

Przykład 3. Zapomniałeś o przypadku gdy zmienna jest równa 128. W Twoim kodzie wtedy zadziała warunek BCC, czyli BCC to warunek "większe, lub równe".
[#4] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Krashan, post #3

Zapomniałem dopisać czy istnieje rozkaz aby zwiększyć od razu zmienna bez kombinacji coś jak INC zmienna w 6502 :) Jest to bardzo cieszy.

Co do move.w D0,A0 - to właśnie chodzi o wyczyszczenie samego rejestru, nie danych przez niego wskazanych bo np. widze, że CLR.W A0 nie działa.

Co do:
lea $8000,a0 i lea $c000,a1
move.l #$8000,a0 i move.l #$c000,a1

- teraz jak wykonać pętle aby skopiowało np. 4096 bajtów od 8000-8FFF do C000-CFFF ?

Zauważyłem też stosowanie np. nazw zmiennych w nawiasie - jaki ma to cel? Np.:

lea (zmienna).l,a0

Ostatnia aktualizacja: 20.02.2022 21:02:11 przez siudym
[#5] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Krashan, post #3

operacja sprawdzenia najmłodszego bitu gdzie ignorujesz resztę myślę, że powinna jednak wyglądać tak

FUNKCJA:

	MOVE.B	FLAGI,D0
	btst	#0,D0
	BEQ.S	FUNKCJA_no

FUNKCJA_no:
	RTS
[#6] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #4

sub.l a0, a0 - ale to się robi w specyficznych warunkach, z reguły wiesz jaki adres chcesz tam ustawić..

nawiasem wskazujesz adres zawarty w zmiennej, a bez nawiasu adres zmiennej.

move.l #200, D0
wynik będzie ten sam gdy:
move.l ADR,d0
adr: dc. l 200



do kopiowaną w pętli poczytaj o dbf i dbra - dekrementuja rejestr i wykonują skok

Ostatnia aktualizacja: 20.02.2022 21:10:52 przez juen
[#7] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #4

Raczej nie uzywaj na razie komend typu move.w D0,A0, bo to juz jest troche wyzszy poziom asemblera, i kod jest wtedy mniej zrozumialy. Musisz pamietac, ze rejestry adresowe A0-A7 sa 32 bitowe, i jak tam przeslesz wartosc 16 bitowa to zostanie ona rozszerzona (ze znakiem) do 32 bitow. Takie komendy jak move.w do rejestru adresowego zwykle uzywa sie zwykle do roznych sztuczek.

Jak chcesz wyzerowac rejestr A0 to opcji jest duzo, zalezy co wolisz, tutaj jest pare przykladowych:

sub.l A0,A0

moveq #0,Dx
move.l Dx,A0

lea 0, A0

move.l #0,A0

Ja zwykle uzywam sub.l A0,A0, chyba, ze mam juz jakis rejestr wyzerowany wczesniej to wtedy move.l Dx,A0.
[#8] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #4

Uzywanie lea nazwa,a0 ma taki cel, ze program jest relokowany w pamieci Amigi.
I wtedy taka "nazwa" jest zamieniana na adres w pamieci. np. $50000 czy $12345678.
[#9] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #4

Przykladowa petla moze byc taka:
lea $8000,A0
 lea $c000,A1
 move.w #4096-1,D0
copy
 move.b (A0)+,(A1)+
 dbf D0,copy
[#10] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #1

Tutaj są moje materiały, które zrobiłem gdy uczyłem się asemblera 68000: link oraz podstawowe procedury konwersji danych: link (podobne dla 6502: link). Zawsze optymalizowałem procedury najpierw pod kątem rozmiaru kodu, a w drugiej kolejności liczby cykli zegarowych potrzebnych na jego wykonanie (spis instrukcji z tymi danymi jest w pierwszym linku). Ogólnie asembler 68000 daje dużą swobodę w działaniu i możliwość realizowania danego zadania na kilka sposobów. Pisałem w różnych asemblerach (6502, AVR, x86) i stwierdzam, że asembler 68000 jest najwygodniejszym i najbardziej przejrzystym jaki znam.
1
[#11] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #4

Zauważyłem też stosowanie np. nazw zmiennych w nawiasie - jaki ma to cel? Np.:

lea (zmienna).l,a0


W tym przypadku etykieta zmienna zostanie zmieniona na adres, który zajmie 4 bajty, nawet jeśli wartość mieści się w pierwszych 64 kb. Czyli jeśli mamy taki przykładzik

org $1000 ; organizuj kod od adresu $1000

start: lea (zmienna).l,a0   
         rts
 org $2000 ; teraz organizuj kod od $2000
zmienna: dc.l 0


Zostanie to zamienione na następujące ciągi bajtów.

$00001000 $41f9 <--- kod lea (xxxx).l,a0
$00001002 $0000 $2000 <--- zmienna

W tym przypadku możesz też użyć rozkazu lea (zmienna).w,a0 który zostanie zamieniony na

$00001000 $41f8
$00001002 $2000

Sam format zapisu jest to nowy typ składni dla 680x0 (new syntax style). Możesz też zapisać te instrukcje w starym stylu

lea zmienna.w,a0
lea zmienna.l,a0

bądź co jest najczęściej używane

lea zmienna,a0 ;co oznacza to samo co lea zmienna.l,a0

Na przykład Asm-One może wygenerować błąd 'relative mode error' w przypadku gdy na przykład lea zmienna.w,a0 nie mieści się w pierwszych 64 kb (co jest pomocne).

Ja przeważnie używam starego stylu, bo większość asemblerów nie ma z tym problemu. Oczywiście są też inne style jak styl (MIT) używany przez asembler gcc, który dla mnie osobiście jest bardzo nieczytelny.

Ostatnia aktualizacja: 21.02.2022 09:46:25 przez asman
[#12] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@RomanWorkshop, post #10

Dzięki za info. Już po krótkim czasie z ASM68K widzę, że to fajny procesor do programowania. Kupiłem książkę "Amiga 500-4000 Kurs Asemblera - Adam Doligalski" - bo innych o 68K w PL nie widzę, pewnie jedyna?
[#13] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #12

Jeśli chodzi o kursy dla Amigi, to pewnie jedyna. W sieci znajdziesz kilka pozycji w stylu "opis proca i lista rozkazów" itp. czyli takie bardziej suche technicznie książki (być może niektóre w księgarniach albo na allegro jeszcze do dostania).

Ja jeszcze przeglądałem takie coś:
https://www.yumpu.com/xx/document/view/37116724/programowanie-m68k-w-jazyku-asemblera

A z "papierowych" miałęm kiedyś coś takiego (być może jeszcze mam zagrzebane gdzieś w niezbadanych czeluściach lochów pod mieszkaniem):
Kostrzewski J., Motorola 68000 - lista rozkazów mikroprocesora, Elektronik, 1988.
[#14] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Satanael, post #13

Zajrzyj tutaj .
1
[#15] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@jimiche, post #14

Zajrzyj tutaj .


Dzięki! Na bogato...
Nawet jest już przetłumaczona (chyba, pierwsze kilkadziesiąt stron na to wskazuje) "Amiga Hardware Reference Manual" (pod polskim tytułem "Vademecum programisty").
[#16] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Satanael, post #15

Jeszcze poszukaj chomika TJAHZI tam też coś jest.
[#17] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@jimiche, post #16

Czy w tym przypadku D0 działac moze jako rejestr indexowy (jak np. X w 6502) :
- chce zwiekszyc o jeden zawartosc ZMIENNA, ale adres zwiekszony o wartosc D0 (czyli o 08)

MOVE.B	$08,D0
MOVE.W	ZMIENNA,A0                        ;zapisz adres 16-bitowy ZMIENNEJ do A0
ADDQ.B	$01,(A0,D0,B)


będzie odpowiednikiem w 6502:

LDX	$08
LDA $01
STA	ZMIENNA,X


?

Ostatnia aktualizacja: 21.02.2022 11:59:51 przez siudym
[#18] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #17

1)
zapominasz o #..
move.b $8,d0 -> wsadz bajt znajdujacy sie w pamieci pod adresem 8..
move.b #8,d0 -> ustaw na pozycji bajta w d0 wartosc 8

2)
skoro nie uzywasz lea to wskaznikiem jest #zmienna, a nie zmienna...

3) kazda linijka ma blad :)

poprawny kod:
move.w #8,d0 ;moveq #0,d0 - szybciej
lea zmienna,a0 ;dla czytelnosci zawsze lea
addq.b #1,(a0,d0.w) ;dodaj 1 pod adresem a0 z przesunieciem o wartosc worda z d0

4) jesli zmienna jest w tej samej sekcji to szybsze bedzie relatywne: lea zmienna(pc),a0

Ostatnia aktualizacja: 21.02.2022 12:06:26 przez juen
[#19] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@jimiche, post #14

Dzięki! OK
[#20] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #12

Jest jeszcze "Amiga bez tajemnic - książka niezbędna dla każdego kodera - zrób własne demo" (tłumaczenie Amiga Hardware Reference Manual), 2-tomowa "Vademecum Programisty - Amiga" Grzegorza Miechowskiego oraz kurs asemblera w Magazynie Amiga 11/1995 - 11/1997.
[#21] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #18

To może tak w pigułce:

Przykładowo w 6502:

LDA #stala		; ladujemy stala
LDA zmienna		; ladujemy zmienna
LDA #128		; ladujemy dec
LDA #$80		; ladujemy hex
LDA $40			; ladujemy zawartosc wskazanego adresu (1 bajtowy wiec ZP)

Jak bedzie w 68K? Czy tak?

MOVE.B	$40,A0		; ladujemy zawartosc wskazanego adresu do A0 (ale nie pod adres wskazany przez A0)
MOVE.B	$40,(A0)	; ladujemy zawartosc wskazanego adresu pod adres wskazany w A0
MOVE.B	#$40,A0		; ladujemy wartosc hex do A0
MOVE.B	#40,A0		; ladujemy wartosc dec do A0
MOVE.B	#zmienna,A0	; ladujemy wartosc jaka znajduje sie w zmiennej do A0
MOVE.B	#zmienna,(A0)	; ladujemy wartosc jaka znajdyje sie w zmiennej pod adres wskazany w A0

- a jak w przypadku stałej?

- rozumiem, ze w/w przypadki dla D0 beda podobne poza oczywiscie zapisem (D0) bo to nie jest rejestr adresowy.





Ostatnia aktualizacja: 21.02.2022 13:11:31 przez siudym
[#22] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #21

move.l #$40,A0 i move.l #zmienna,A0, nie ma instrukcji move.b do rejestru adresowego
[#23] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #21

z hashami jest odwrotnie przy adresie niz przy wartosci
00000000: zmienna: dc.l 123
00000004: zmienna2: dc.l 124
00000008: move.l #123,d0 ;d0=123
(..)      move.l #123,a0 ;a0=123
(..)      move.l zmienna,d0 ;d0=123
(..)      move.l #zmienna,d0; d0=#00000000
(..)      move.l #zmienna2,d0; d0=#00000004
(..)      move.l 4,d0; d0=124



Ostatnia aktualizacja: 21.02.2022 13:20:15 przez juen

Ostatnia aktualizacja: 21.02.2022 13:21:02 przez juen
[#24] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #22

Skoro nie ma move.b do Ax to rozumiem 68k nie posiada czegoś takiego jak jakaś szybsza strona zerowa czy coś podobnego w RAM?
[#25] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #17

Ogolnie co chcialbys kodowac w 68000? Bo jezeli interesuje Ciebie pisanie zgodne z systemem, to przy obecnym stylu (absolutne adresowanie) kodowania, bedziesz mial same crashe po wyjsciu z programu albo i wczesniej.
Wszystkie rejestry adresowe Ax sa 32 bitowe, a nie 16 bitowe.
Wiec nie uzywaj NIGDY move.w do rejestru adresowego, chyba ze wiesz co robisz ale to nie jest raczej wiedza potrzebna poczatkujacemu.
Ogolnie napisze, ze po uzyciu:
move.w #$8000,A0
to w A0 bedziesz mial $FFFF8000, a nie #$00008000. A to jest roznica.
[#26] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #24

Nie, nie posiada. Do tego chip ram w Amidze jest dosc wolny. Wiec lepiej tam kodu nie trzymac, chyba ze to jest do czegos konieczne.
[#27] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #26

Troche zle sie wyrazilem, jest cos takiego jak szybszy dostep do pierwszych 32KB pamieci.
Zamiast

move.l D0, $4000
mozna uzyc
move.l D0,$4000.W

ta druga wersja jest o 2 bajty krotsza i szybsza, ale tylko dla 68000, o ile dobrze pamietam.
Ale tak raczej nikt juz nie programuje na Amidze, o ile czegos nie patchuje.
[#28] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #27

no jednak przydaje sie wciaz do move.l 4.w,a6

ps: raczej szybsza niz krotsza?

Ostatnia aktualizacja: 21.02.2022 13:53:16 przez juen
[#29] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #21

Musisz odrobinę zmienić podejście. W 6502 masz tandem lda sta (ldy sty, ldx stx) a w 68k załatwiasz to jednym rozkazem (lda #10, sta adres => move.b #10,adres). Przewalanie oddzielnie lda na mnemonik 68k w niektórych przypadkach jest nieefektywne na 68k.

Gdy przerabiałem kod z NES na 68k to wyszło mi coś takiego (pewnie można to jeszcze przyspieszyć).

unrle:
	moveq	#0,d0
	lea	src(pc),a0
	lea	dst(pc),a1
	move.b	(a0)+,d0
.1	move.b	(a0)+,d1
	cmp.b	d0,d1
	beq.b	.2
	move.b	d1,(a1)+
	move.b	d1,d2		;rle_byte
	bra.b	.1
.2
	moveq	#0,d3
	move.b	(a0)+,d3
	beq.b	.4
	subq.b	#1,d3
.loop	move.b	d2,(a1)+
	dbf	d3,.loop
	bra.b	.1
.4	rts

;;_vram_unrle:
;
;	tay
;	stx <RLE_HIGH
;	lda #0
;	sta <RLE_LOW
;	lda (RLE_LOW),y		;pobranie bajtu i zapis go na rle_tag
;	sta <RLE_TAG
;	iny
;	bne @1
;	inc <RLE_HIGH
;@1:
;	lda (RLE_LOW),y
;	iny
;	bne @11
;	inc <RLE_HIGH
;@11:
;	cmp <RLE_TAG
;	beq @2
;	sta PPU_DATA
;	sta <RLE_BYTE
;	bne @1
;@2:
;	lda (RLE_LOW),y
;	beq @4
;	iny
;	bne @21
;	inc <RLE_HIGH
;@21:
;	tax
;	lda <RLE_BYTE
;@3:
;	sta PPU_DATA
;	dex
;	bne @3
;	beq @1
;@4:
;	rts 
;
[#30] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #25

Spokojnie :) Ja nawet sensownie niczego nie zacząłem czytać, pytania są bardziej przez pryzmat mojego wcześniejszego doświadczenia z 6502 ;)

move.w #$8000,A0
to w A0 bedziesz mial $FFFF8000, a nie #$00008000. A to jest roznica


Ale jak będę chciał ustawić włąsnie taki 16-bitowy adres w A0, nawet jak będzie tam wisieć FFFF8000 to gdy odczytany będzie jako 16-bitowy (0000-FFFF) to nie będzie to działać? Przykładowo Sega Genesis może mieć na początku mapy pamięci albo ROM albo RAM - jak będę chciał zrobić coś nieprzekraczającego FFFF zarówno dla ROM jak i RAM to nie można ustawiać wartości 2-bajtowych w A0 ? (jakiś prosty ROM nieprzekraczający wielkość 64KB).


Tu sie pogubiłem:

00000000: zmienna: dc.l 123
00000004: zmienna2: dc.l 124
00000008: move.l #123,d0 ;d0=123
(..)      move.l #123,a0 ;a0=123
(..)      move.l zmienna,d0 ;d0=123
(..)      move.l #zmienna,d0; d0=#00000000
(..)      move.l #zmienna2,d0; d0=#00000004
(..)      move.l 4,d0; d0=124


to "zmienna" może być zarówno zmienną jak i stałą zależnie jak zostanie odzcytane? odczytując move.l zmienna odczytał stałą, odczytując #zmienna odczytam zmienną?

Spotkałem się z takim zapisem:

move.w #stała, zmienna - "stała była ustawiona jako DC wartość, a zmienna jako RAM. Czyli wartość określona w "stała" przenosimy do zmiennej w ram.




Ostatnia aktualizacja: 21.02.2022 15:00:54 przez siudym
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem