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

@juen, post #28

Oprócz podanej przez Ciebie konstrukcji, istnieje dodatkowe zastosowanie dla rejestrów adresowych z wartością o rozmiarze słowa (16 bitów).

Otóż możemy używać rejestru adresowego jako indeksu w trybach adresowania z indeksem. Rozmiar indeksu to słowo lub długie słowo.

Znak indeksu odgrywa wtedy rolę i jest dodawany do finalnego adresu.

Zatem załadowanie rejestru adresowego wartością 16-bitową czasami jest przydatne.

Przykład:

Ładujemy do rejestru adresowego liczbę -512. Tego rejestru używamy następnie jako indeksu. Finalnie w najmłodszym bajcie d0 znajdzie się bajt z miejsca wskazywanego przez rejestr a1 z dodaną do adresu wartością rejestru a0 (czyli liczbą -512).

; Przykład:
	movea.w	#-512,a0
	move.b	(a1,a0.w),d0


Ostatnia aktualizacja: 21.02.2022 15:12:40 przez Hexmage960
[#32] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #28

To jest raczej tylko wyjatek o 2 bajty krotszy, ale bodaj nie jest to szybsze na 68020+ bo dostep do chipu jest wolny. Rownie dobrze mozna tez $68.W itp uzywac o ile VBR jest nie zmieniony. Dlatego sie pytalem co by chcial robic. Bo jezeli chce napisac jakies bootro co ma sie zmiescic w bootblocku gry/dema NDOS to ok, to moze tak robic. Ale jezeli cokolwiek innego chce robic to raczej taka wiedza mu jest teraz niepotrzebna. Ogolnie dobrze napisany program w pelni lub prawie w pelni PC relative, bedzie raczej zawsze szybszy od adresowanego do obszaru pierwszych 32 KB chipu.
Do tego uzywanie adresowania .W moze byc problematyczne. Kiedys koderzy z Atari ST bardzo czesto uzywali tego typu adresowania (typu lea $8000.W,A0), bo Atari ma rejestry na koncu 24 bitowego obszaru. I wszystko jest ok na 68000 (ktora adresuje tylko 24 bity), ale potem im wyszedl Falcon z 68030 i nic nie dzialalo, bo 68030 adresuje 32 bity.
To samo SMC (samo modyfikujacego kodu) w sumie nie widzialem jeszcze procedury, ktora bylaby szybsza niz wersja uzywajaca samych rejestrow. 68k ma tyle rejestrow (minimum 16, a w zasadzie 17), ze to raczej do wszystkiego powinno wystarczyc.
[#33] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #32

Jeszcze sporo musze doczytać i przeanalizować źródła 68K. Jedno jest pewne - pierwsze demko czegokolwiek nie powstanie na Amidze, ale na Sega Genesis - bo będzie prościej. Nie będę musiał teraz ogarniać amigowych niuansów systemowych.

Fajnie, że wszystkie rejestry są aż 32-bitowe. W Z80 trzeba było kombinować z parowaniem rejestrów aby uzyskać 2-bajtowe wartości. Tu wszystko fajnie zaprojektowane.
[#34] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #30

Kazdy 16 bitowy adres (slowo) w przypadku 68k jest zamieniany na 32 bitowy adres (dlugie slowo). Bit z pozycji 15 jest wtedy kopiowany w pozycje bitow 16-31. Mozesz ustawiac 16 bitowy adres w postaci worda jak chcesz, ale bedzie to dzialac tylko dla pierwszych 32KB (bez 1 bajta) pamieci. Maksymalna wartosc to $7FFF.
move.l 4,A6
i move.l 4.W,A6
robia dokladnie to samo, tylko wersja z .W jest krotsza o 2 bajty.
Co do SEGI to ona miala malo pamieci wiec programy korzystaly z adresowania typu .W bo bylo krotsze, choc dobrze napisany PC relative program bedzie tak samo krotki albo i krotszy.
Jak piszesz jakies demo czy gre NDOS to mozesz uzywac adresowana typu .W.
Obecnie adresowania typu .W sie uzywa w normalnym kodzie (oprocz dostepu do exec base i VBR) tylko w celu przyspieszenia dzialania jakis procedur, gdzie rejestry adresowe sa uzywane jako rejestry danych. np

lea $200.W,A0

a pozniej np.

sub.l A0,D7

btw, musisz wiedziec, ze kazda instrukcja 68000 ma parzysta dlugosc. 2,4,6,8 lub10 bajty.
[#35] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #32

pytałem bo wydawało mi się że obie zajmą tyle samo tylko różnica bedzie w prędkości. sam nie używam zasadniczo tego :)

co do zmiennej - nie ma czegoś takiego w assemblerze. jest po prostu dana która jest pod jakimś adresem pamięci więc mamy jej adres i to co jest pod jej adresem i do rozróżnienia tego używamy #
[#36] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #33

Skoro to ma byc SEGA i 68000 to adresowanie typu .W jest jeszcze mniej przydatne bo to ROM, czyli tylko do odczytu, nic tam nie zapiszesz. Nie wiem czy SEGA na koncu 24 bitowego obszaru pamieci ma jakies rejestry albo obszary pamieci RAM, wtedy mozna by ostatnie 32KB tez tak adresowac.
[#37] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #35

Jesli chodzi o 68000 to wersja .W bedzie, krotsza o 2 bajty i przez to szybsza o 4 cykle niz wersja .L
[#38] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #37

robiłem dwa execi i zajęły tyle samo ale musiałem coś poj...
[#39] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #38

To allocate uninitialized storage for variables, use

ds.b N ;allocate N bytes of uninitialized storage
ds.w N ;allocate N words (2N bytes)
ds.l N ;allocate N longwords (4N bytes)

To place particular initial values in memory (constants or initialized variables), use

dc.b value,value,... ;Each value occupies 1 byte
dc.w value,value,... ;Each value occupies 2 bytes
dc.l value,value,... ;Each value occupies 4 bytes
dc.b 'characters..' ;Each ascii character occupies a byte

przykładowo:

constant:		equ $80			; zdefiniowana stała o wartości #$80
constant:		dc.b	1,$80		; zdefiniowana stała 1 bajt o wartości #$80	
variable:		ds.b	1		; zdefiniowana zmienna 1 bajt w RAM
initialized variable:	dc.b	1,$80		; zdefiniowana zmienna 1 bajt w RAM o wartości #$80 (lub stała)


Nigdy wcześniej nie spotkałem sie z pojęciem "zainicjowanej zmiennej" o określonej wartości na starcie.
Rozumiem, że taką zmienną można odczytać jako "stałą" o określonej wartości (jaka została zainicjowana),
jak i używać jej jako zmiennej ? Nie wiem czy dobrze to zrozumiałem...

Ostatnia aktualizacja: 21.02.2022 19:30:06 przez siudym
[#40] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #39

equ to komenda dla assemblera. podczas asemblacji po prostu podmienia wartość. samo w sobie nie jest rozkazem cpu.

a dc.b w i l to nic innego jak zapisywanie danych w pamieci

np program z jednym rozkazem rts to dokładnie to samo co program z dc.w $4e75

dc.b 0 będzie jednoznaczne z ds.b 1 bo pierwsze mówi wstaw tu bajt z wartością zero a drugie mówi wstaw tu jeden bajt

ps:powtórzę - dla mnie nie ma czegoś takiego jak zmienne... a equ to funkcje pomocnicze programów do asemblacji tak samo jak dc

jak pamiętasz Basica to dc to nic innego jak jego komenda data

Ostatnia aktualizacja: 21.02.2022 19:46:00 przez juen
1
[#41] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #35

co do zmiennej - nie ma czegoś takiego w assemblerze. jest po prostu dana która jest pod jakimś adresem pamięci więc mamy jej adres i to co jest pod jej adresem i do rozróżnienia tego używamy #

W gruncie rzeczy w Asemblerze nie ma zmiennych, chociaż można tworzyć aliasy do rejestrów i liczb za pomocą odpowiednio EQUR i EQU.

Przykład: Tworzymy alias do parametru w rejestrze.

score	equr	d0

; d0.w: score
check_score:
	cmp.w	hiscore(pc),score
	ble.s	.skip

	move.w	score,hiscore
.skip:
	rts
hiscore:
	dc.w	0

Ja korzystam rzadko, ale czasami aliasy mogą być bardzo przydatne (jak w przypadku procedury pakującej obrazy w formacie IFF ILBM).

Podobnie makra. Przykład makra strlen wyliczającego długość ciągu (stosuje aliasy) i print wypisującego ciąg znaków. Może to skrócić program.

string	equr	a0
len	equr	d0

strlen	macro
	moveq	#-1,len
\@next_char:
	addq.l	#1,len
	tst.b	(string)+
	bne.s	\@next_char
	endm

print	macro
	move.l	stdout(pc),d1
	move.l	string,d2
	move.l	len,d3
	movea.l	dosbase(pc),a6
	jsr	_LVOWrite(a6)
	endm

program:
	lea	text(pc),string
	strlen
	print	
	lea	text2(pc),string
	strlen
	print	
	rts

dosbase:
	dc.l	0
stdout:	dc.l	0
text:	dc.b	"Hello world",0
text2:	dc.b	"Mój program w asemblerze!",0

Generalnie ja preferuję wstawki asemblerowe do jakiegoś kodu wyższego poziomu.

@Siudym

Różnica pomiędzy DC i DS jest taka, że DC załącza dane do pliku wykonywalnego, zaś DS tego nie robi.

Dyrektywa DC pozwala załączyć wybrane dane do pliku. Z kolei DS daje przestrzeń na dane, alokowaną podczas uruchamiania programu, która zazwyczaj jest inicjowana zerami. Ta przestrzeń może być wykorzystana przez program do jakichś dynamicznych tablic i tym podobnych rzeczy.

Poczytaj sobie o sekcjach CODE, DATA i BSS.

Ostatnia aktualizacja: 21.02.2022 19:48:54 przez Hexmage960
[#42] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Hexmage960, post #41

a mix polecenia dc i ds to blk :D
a ds. w zadziała prawidłowo tylko w sekcji bss inaczej będzie traktowane jak dc przy czym wartości będą zerami
[#43] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #42

Słusznie, dzięki za sprostowanie. Rzeczywiście tylko sekcja BSS nie będzie załączona do pliku wykonywalnego, Tam jest dozwolone raczej tylko DS.
[#44] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Hexmage960, post #41

Oczywiście wiem, że EQU to tylko informacja dla mnie kompilatora jaką wartość będzie mieć etykieta. Ja to zawsze nazywałem "STAŁĄ". To samo definiowanie "ZMIENNEJ" w RAM - to ułatwienie sprawy mi i informacja dla kompilatora, ze "ta" dana nazwa to "ten" adres w ram.

Każdy nowy procesor i asembler to nieco inaczej zastosowane rozwiązania - oczywiście sens ten sam, ale często trzeba to ogarnąć aby ustawić sobie w głowie (zwlaszcza jak odczytac taka etykiete, czy to Z "#" czy BEZ itd itd)

Analizując źródła - przykład zdefuniowania dwoch zmiennych 2-bajtowych (akurat ASM68K)

	RSSET 0x00FF0000			; Map from start of RAM
ram_sprite_pos_x		rs.w 1	; Sprite x pos (word)
ram_sprite_pos_y		rs.w 1	; Sprite y pos (word)




Ostatnia aktualizacja: 21.02.2022 20:38:02 przez siudym
[#45] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #42

Od siebie dodam że zamiast starego blk można używać dcb, przynajmniej ja tak używam.
1
[#46] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #44

w tym przypadku rs.w 1 to to samo co każde z tych:
ds.w 1
ds.b 2
dc.b 0,0
dc.w 0
blk.b 2
[#47] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #46

Hej, jesteś pewien? RS.W nie rezerwuje pamięci tylko zwiększa licznik RS. Służy do tworzenia definicji struktur.

To znaczy jak napiszemy:

rsreset
val: rs.w 1
val2: rs.w 2
size: rs.w 0

To wówczas val przyjmie wartość 0, val2 przyjmie wartość 2, zaś size przyjmie wartość 6. Przynajmniej tak mi się wydaje.

@Asman

Dzięki, zapomniałem o BLK, a szczególnie o DCB zupełnie, mimo że używałem często.

Ostatnia aktualizacja: 21.02.2022 21:08:51 przez Hexmage960
1
[#48] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #38

move.l 4,A6 ma 6 bajtow
a
move.l 4.W,A6 ma 4 bajty

jesli w tych exekach to bylo uzyte tylko raz to mozesz nie miec roznicy, bo exeki sa zawsze podzielne przez 4.

Zasembluj

move.l 4,A6
rts

i
move.l 4.W,A6
rts

W obu exekach to bedzie 32 (poczatek) bajty plus 8 bajtow (kod) plus 4 bajty (koniec).
Z tym, ze w drugim przypadku beda wstawione 2 bajty do exeka jako wyrownanie.
1
[#49] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #39

Dawno nie kodowalem, ale dla mnie dc.b 1,$80 to to samo co dc.w $0180.
Ogolnie jestem leniwy to korzystam zwykle tylko z:
dc.l.
dc.w
dc.b
ds.b (zamiast ilus tam zer)
incbin ram:tabela (zamiast wstawiania ilus tam roznych dc.l)
[#50] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Hexmage960, post #47

oczywiscie masz racje :)
[#51] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Hexmage960, post #47

Służy do tworzenia definicji struktur.


Dodam (na marginesie), że jeśli ktoś chce być bardzo koszerny, to może definiować struktury za pomocą makr w exec/types.i, które to za pomocą dyrektyw equ i set, tworzą odpowiednie przesunięcia. To chyba jest łatwiejsze dla zwolenników języka C.

Dyrektywa rs jest bardzo elastyczna. W przykładzie z postu #44 mamy użyty rsset, dzięki temu możemy zdefiniować adres (który to jest tak po prawdzie przesunięciem :D ). W naszych amigowych warunkach możemy sami sobie zrobić na przykład coś takiego.

RSSET $dff000

bltddat	rs.w	1
dmaconr	rs.w	1

start
	move.w	dmaconr,d0

;wynik --> move.w $dff002,d0


Info niekoniecznie dla początkujących.
Rs bardzo się przydają gdy chcemy pozbyć się najwolniejszego adresowania xxxx.l, kosztem rejestru ax. Smażymy wtedy dwie pieczenie przy jednym ogniu. Pozbywamy się wtedy wpisu do tablicy relokacji i kod jest krótszy i szybszy (to w sumie trzy pieczenie :), ale gdy mamy więcej rozkazów typu xxxx.l ). Przykładzik


rsset 0
screen: rs.l 1
copper: rs.l 1
sizeOf: rs.b 0 ; koniec

lea dt,a4
; oczywiście trzeba zainicjować (move.l #$20000,screen(a4), move.l #$10000,copper(a4)
move.l screen(a4),a0 ; zamiast move.l screen,a0
movel copper(a4),$dff080 ; zamiast move.l copper,$dff080
rts
SECTION dane,BSS_P
dt: ds.b sizeOf
[#52] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@asman, post #51

Dyrektywa rs jest bardzo elastyczna. W przykładzie z postu #44 mamy użyty rsset, dzięki temu możemy zdefiniować adres (który to jest tak po prawdzie przesunięciem :D ). W naszych amigowych warunkach możemy sami sobie zrobić na przykład coś takiego.

Zgoda. Przy czym zauważ, że efektywniej będzie zrobić RSRESET, zdefiniować strukturę za pomocą RS i załadować $DFF000 do rejestru adresowego, aniżeli RSSET $DFF000.

Przyda się to, jeżeli korzystamy z tego adresu wielokrotnie.

Zresztą jest to zgodne z tym, co napisałeś w trzecim akapicie.

Przykład:
lea $dff000,a4
move.w dmaconr(a4),d0

Dodam (na marginesie), że jeśli ktoś chce być bardzo koszerny, to może definiować struktury za pomocą makr w exec/types.i, które to za pomocą dyrektyw equ i set, tworzą odpowiednie przesunięcia. To chyba jest łatwiejsze dla zwolenników języka C.

Tak. Te makra pozwalają na pewną spójność nazewnictwa w OS. Tak więc mamy tam nawet takie typy jak APTR (wskaźnik), ULONG, UWORD itp.
[#53] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@asman, post #51

Potrzebuje przykładowego kodu, który skopiuje plik bin o wielkości 2Kb (2048 bajty / $0800) do pamięci np. w zakresie $00FF8000-$00FF8FFFF (zakres $1000)
ale musi zapisać te 2KB "rozciągnięte" do 4KB - czyli każdy bajt z pliku bin będzie zapisany w CO DRUGI BAJT W RAM (licząc startowo od drugiego)
czyli pierwszy bajt z bin -> leci do $00FF8001, drugi bajt z bin -> do $00FF8003 ... itd itd

.INCBIN "2048byte.bin"
[#54] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #53

;---
 lea plik(pc),a0
 move.l #$00FF8000,a1
 move.w #2048-1,d0
loop:
 move.b (a0)+,(a1)
 addq.w #2,a1
 dbf d0,loop
 rts
plik: incbin "df0:plik.bin"


skoro umiesz pisac w assemblerze dla innych cpu to to zadanie powinno byc juz dla Ciebie banalne... sporo o tym tez juz tu pisalismy :)


Ostatnia aktualizacja: 22.02.2022 12:00:52 przez juen
[#55] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #53

Nie wiem czy chcesz tak jak juen $xx00,$yy00, ..., $zz00. Czy też tak $00xx, $00yy, ..., $00zz.
Wtedy masz coś takiego (przerobiłem trochę juena kod :) )

lea plik(pc),a0
 move.l #$00FF8000,a1
 move.w #2048-1,d0
 moveq #0,d1
loop:
move.b (a0)+,d1
move.w d1,(a1)+
 dbf d0,loop
 rts

plik: incbin "df0:plik.bin"


Ostatnia aktualizacja: 22.02.2022 12:10:38 przez asman
[#56] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@asman, post #55

nie doczytalem, ze zaczynajac od drugiego, ale po co robic sobie pod gorke:

;---
 lea plik(pc),a0
 move.l #$00FF8000+1,a1 ;<--
 move.w #2048-1,d0
loop:
 move.b (a0)+,(a1)
 addq.w #2,a1
 dbf d0,loop
 rts
plik: incbin "df0:plik.bin"
[#57] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #1

Bardzo fajny wątek - czytam z ciekawością, bo sam przychodzę ze świata 6502, ale i udało mi się popełnić 2 produkcje na Amidze (1 w całości w asm, druga częściowo), a tu cały czas dowiaduję się czegoś nowego.
Tego RS na przykład, nie znałem.

Żeby coś wnieść do tematu to podpowiem, że testuję moje assemblerowe procedurki w ASMOne albo w ASMPro na Amidze. Pozwala szybko napisać kod i debugować instrukcja po instrukcji i podglądać stan rejestrów. Super ułatwia pisanie i testowanie takich wprawek jak te powyżej np od Juen'a - polecam.

Polecam też tutorialne Photona/Scoopex na Youtube. Mega dokładnie wytłumaczone podstawy pisania pod sprzęt amigowy w assemblerze.

ps. a te $ff800 to nie są czasem jakieś rejestry w Atari ST ;) ?

Ostatnia aktualizacja: 22.02.2022 15:26:59 przez c64portal
1
[#58] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #53

Skoro jestes na 68000, to ja bym uzyl czegos takiego. To jest zmodyfikowany kod Asmana:

lea plik(pc),a0
 move.l #$00FF8000,a1
 move.w #2048/4-1,d0
loop:
move.l (a0)+,d1
movep.l d1,1(a1)
addq.l #8,A1
 dbf d0,loop
 rts

plik: incbin "df0:plik.bin"

Mam nadzieje, ze nie ma bledow, ta wersja powinna byc najszybsza.
[#59] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #58

addq.w #8, a1 :)

ale na tym etapie nauki unikałbym movep :D

Ostatnia aktualizacja: 22.02.2022 17:12:51 przez juen
[#60] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #59

Akurat addq.w #8,A1 czy addq.l #8,A1 to bez roznicy, dziala tak samo, ta sama dlugosc, ta sama szybkosc. Tez kiedys myslalem, ze addq.w dla rejestru adresowego jest szybsze niz addq.l, ale nie jest. Szybsze jest tylko dla rejestru danych. Wiec uzywam od tego czasu addq.l.
Niech sie uczy, i movep mu sie chyba na SEGA przyda, bo tam chyba sa dosc czeste takie przypadki, odczytu/zapisu co drugiego bajtu.

No i zamiast
move.l #$00FF8000,a1
moglby uzyc swoje ulubione move.w, czyli
move.w #$8000,A1
to powinien miec wtedy w A1 $FFFF8000, a poniewaz to jest 68000 to bedzie uzywane tylko $FF8000. 2 bajty krotszy kod i 4 cykle szybszy.
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