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

@Don_Adan, post #60

Tez kiedys myslalem, ze addq.w dla rejestru adresowego jest szybsze niz addq.l, ale nie jest. Szybsze jest tylko dla rejestru danych.

Jakieś dowody na to? Przecież rejestr Ax tak samo, jak Dx ma 32-bity i w przypadku rozmiaru ".L" procesor musi sprawdzić, czy nie nastąpiło przepełnienie starszych 16-bitów, co zajmuje dodatkowe cykle, które w przypadku rozmiaru ".W" powinny być zaoszczędzone.

Ostatnia aktualizacja: 22.02.2022 18:43:27 przez RomanWorkshop
[#62] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@RomanWorkshop, post #61

Ale jakie Ty chcesz dowody? addq.w i addq.l dla rejestru adresowego dziala tak samo czyli ma taka sama szybkosc, bodaj 6 lub 8 cykli, zalezy od uzycia. W przypadku rejestru danych addq.w jest szybsze niz addq.l o 2 lub 4 cykle. Bylo o tym sporo na EAB, Toni o tym pisal. Ja teraz nie mam dostepu do Amigi, zeby to samemu sprawdzic jakas procedura testujaca szybkosc. Opis byl dosc logiczny, dlaczego tak jest.
[#63] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@RomanWorkshop, post #61

Zarówno addq.w #n,an jak i addq.l #n,an zajmuje 8 cykli. Według mnie wynika to właśnie z tego że nawet jeśli operujesz na słowie to i tak znak jest rozszerzany do 32 bitów ale to nie jest za darmo w cyklach.
[#64] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@asman, post #63

Faktycznie tak jest, nawet po latach dowiedziałem się czegoś nowego.

Tu są dwie strony, które podają liczbę cykli potrzebnych na wykonanie instrukcji: link, link.

Ostatnia aktualizacja: 22.02.2022 21:59:59 przez RomanWorkshop
[#65] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@RomanWorkshop, post #64

Jest jeszcze 68kcounter
1
[#66] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@sq7bti, post #65

jej sq7, chyba jednak zmusze sie do vsc :) swietny plugin
[#67] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@RomanWorkshop, post #64

Wrocilem do ASM 68K po przerwie, mam sporo niejasnosci, jednym z nich jest ten przyklad:

Mam tablice w ktorej mam nazwy etykiet, do ktorych bedziemy mogli skoczyc zaleznie jaki numer poziomu bedzie w zmiennej robiacej jako index do tej tablicy.
Przyklad pierwszy to LEV_TBL(PC),A0 i o ile nie wykonam dodania wartosci indexu to skok pod (A0) skacze bezproblemowo pod etykiete LoadLEV000. Natomiast dodanie indexu (pomnozonego 4x) juz powoduje problem.

Przyklad 2 dziala, ale nie rozumiem gdzie jest powod :) Gdy najpierw przeniose adres PC do A0 uzywajac LEA LEV_TBL(PC),A0 to potem przeciez ingeruje w A0 wykonujac MOVE.L 0(A0,D0.L),A0 - czy wykonujac pierwszy LEA mam gdzies jakis znacznik w CPU ustawiony i gdy drugi raz wykonam MOVE.L z dodanym A0 do D0 mam dopiero odpowiedni adres pod (A0)...

Mam nadzieje, ze moje pokrecone pytanie bedzie zrozumiale szeroki uśmiech Chcialbym zrozumiec roznice i dlaczego tak sie dzieje.

MOVE.L	#$00,D0			; czyszcze calosc rejestru
	MOVE.B	LEV_NR,D0		; laduje zmienna 1-bajtowa z numerem poziomow 000-255, bedzie robic jako rejestr indexowy

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

	LEA	LEV_TBL(PC),A0		; nie dziala
	ASL.L	#2,D0			; musze pomnozyc 4x wartosc z LEV_NR poniewaz tablice mam co 4 bajty (LONG WORD)
	ADD.L	D0,A0			; dodaje index do adresu w A0 tablicy odczytanej z PC.
	JMP	(A0)

;;;;;;

	LEA	LEV_TBL(PC),A0		; dziala
	ASL.L	#2,D0
	MOVE.L	0(A0,D0.L),A0
	JMP	(A0)



LEV_TBL:

	DC.L LoadLEV000,LoadLEV001,LoadLEV002,LoadLEV003,LoadLEV004,LoadLEV005,LoadLEV006,LoadLEV007
	DC.L LoadLEV008,LoadLEV009,LoadLEV010,LoadLEV011,LoadLEV012,LoadLEV013,LoadLEV014,LoadLEV015
	DC.L LoadLEV016,LoadLEV017,LoadLEV018,LoadLEV019,LoadLEV020,LoadLEV021,LoadLEV022,LoadLEV023
	DC.L LoadLEV024,LoadLEV025,LoadLEV026,LoadLEV027,LoadLEV028,LoadLEV029,LoadLEV030,LoadLEV031
	DC.L LoadLEV032,LoadLEV033,LoadLEV034,LoadLEV035,LoadLEV036,LoadLEV037,LoadLEV038,LoadLEV039
	DC.L LoadLEV040,LoadLEV041,LoadLEV042,LoadLEV043,LoadLEV044,LoadLEV045,LoadLEV046,LoadLEV047
	DC.L LoadLEV048,LoadLEV049,LoadLEV050,LoadLEV051,LoadLEV052,LoadLEV053,LoadLEV054,LoadLEV055
	DC.L LoadLEV056,LoadLEV057,LoadLEV058,LoadLEV059,LoadLEV060,LoadLEV061,LoadLEV062,LoadLEV063
	DC.L LoadLEV064,LoadLEV065,LoadLEV066,LoadLEV067,LoadLEV068,LoadLEV069,LoadLEV070,LoadLEV071
	DC.L LoadLEV072,LoadLEV073,LoadLEV074,LoadLEV075,LoadLEV076,LoadLEV077,LoadLEV078,LoadLEV079
	DC.L LoadLEV080,LoadLEV081,LoadLEV082,LoadLEV083,LoadLEV084,LoadLEV085,LoadLEV086,LoadLEV087
	DC.L LoadLEV088,LoadLEV089,LoadLEV090,LoadLEV091,LoadLEV092,LoadLEV093,LoadLEV094,LoadLEV095
	DC.L LoadLEV096,LoadLEV097,LoadLEV098,LoadLEV099,LoadLEV100,LoadLEV101,LoadLEV102,LoadLEV103
	DC.L LoadLEV104,LoadLEV105,LoadLEV106,LoadLEV107,LoadLEV108,LoadLEV109,LoadLEV110,LoadLEV111
	DC.L LoadLEV112,LoadLEV113,LoadLEV114,LoadLEV115,LoadLEV116,LoadLEV117,LoadLEV118,LoadLEV119
	DC.L LoadLEV120,LoadLEV121,LoadLEV122,LoadLEV123,LoadLEV124,LoadLEV125,LoadLEV126,LoadLEV127
	DC.L LoadLEV128,LoadLEV129,LoadLEV130,LoadLEV131,LoadLEV132,LoadLEV133,LoadLEV134,LoadLEV135
	DC.L LoadLEV136,LoadLEV137,LoadLEV138,LoadLEV139,LoadLEV140,LoadLEV141,LoadLEV142,LoadLEV143
	DC.L LoadLEV144,LoadLEV145,LoadLEV146,LoadLEV147,LoadLEV148,LoadLEV149,LoadLEV150,LoadLEV151
	DC.L LoadLEV152,LoadLEV153,LoadLEV154,LoadLEV155,LoadLEV156,LoadLEV157,LoadLEV158,LoadLEV159
	DC.L LoadLEV160,LoadLEV161,LoadLEV162,LoadLEV163,LoadLEV164,LoadLEV165,LoadLEV166,LoadLEV167
	DC.L LoadLEV168,LoadLEV169,LoadLEV170,LoadLEV171,LoadLEV172,LoadLEV173,LoadLEV174,LoadLEV175
	DC.L LoadLEV176,LoadLEV177,LoadLEV178,LoadLEV179,LoadLEV180,LoadLEV181,LoadLEV182,LoadLEV183
	DC.L LoadLEV184,LoadLEV185,LoadLEV186,LoadLEV187,LoadLEV188,LoadLEV189,LoadLEV190,LoadLEV191
	DC.L LoadLEV192,LoadLEV193,LoadLEV194,LoadLEV195,LoadLEV196,LoadLEV197,LoadLEV198,LoadLEV199
	DC.L LoadLEV200,LoadLEV201,LoadLEV202,LoadLEV203,LoadLEV204,LoadLEV205,LoadLEV206,LoadLEV207
	DC.L LoadLEV208,LoadLEV209,LoadLEV210,LoadLEV211,LoadLEV212,LoadLEV213,LoadLEV214,LoadLEV215
	DC.L LoadLEV216,LoadLEV217,LoadLEV218,LoadLEV219,LoadLEV220,LoadLEV221,LoadLEV222,LoadLEV223
	DC.L LoadLEV224,LoadLEV225,LoadLEV226,LoadLEV227,LoadLEV228,LoadLEV229,LoadLEV230,LoadLEV231
	DC.L LoadLEV232,LoadLEV233,LoadLEV234,LoadLEV235,LoadLEV236,LoadLEV237,LoadLEV238,LoadLEV239
	DC.L LoadLEV240,LoadLEV241,LoadLEV242,LoadLEV243,LoadLEV244,LoadLEV245,LoadLEV246,LoadLEV247
	DC.L LoadLEV248,LoadLEV249,LoadLEV250,LoadLEV251,LoadLEV252,LoadLEV253,LoadLEV254,LoadLEV255


Ostatnia aktualizacja: 01.11.2022 20:00:37 przez sdm
[#68] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@sdm, post #67

w drugim przykladzie nie tylko przeskakujesz po mapie, ale wyciagasz wartosc z (a0) do a0. w pierwszym tego nie robisz, wylacznie przesuwasz sie po mapie
[#69] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@sdm, post #67

Ogolnie jest tak jak napisal Juen. W pierwszym przykladzie ustawiasz rejestr A0 na poczatku tabeli z 256 procedurami. Pozniej wybierasz, pod ktory level ma skoczyc. Potem dodajesz do A0, czyli poczatku tabeli ten level*4. Czyli A0 jest na ktoryms z tych LoadLEVxxx. I pozniej skaczesz pod te A0. Ale A0 nie wskazuje zadnego kodu tylko jest na adresie pod ktorym jest dopiero kod, ktory chcesz wywolac. Zeby to zadzialalo to musisz dodac przed JMP (A0) komende MOVE.L (A0),A0. Czyli ladujesz do A0, ktorys z adresow LoadLEVxxx.
[#70] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #68

Dzieki. O to mi chodzilo. W 6502 to samo rozwiazanie bylo bardziej banalne, a tu mnie nieco zaskoczylo.
Ogolnie to jestem pod wrazeniem jak dobrym 68K jest procesorem, jest jeszcze sporo nie do konca zrozumialych aspektow, ale naprawde programuje sie niesamowicie przyjemnie.

Jeszcze zwlekam ze sprobowaniem napisania czegos na Amige, trzeba bedzie poczytac o architekturze np. wyswietlanie grafiki itd. Ale juz pierwsze "cosie" zrobilem na Sega Mega Drive, moze nic specjalnego, bo przepisane moje demka z 6502/Z80, ale juz obecny poziom wiedzy o asemblerze 68K na takie cos pozwala:

https://www.youtube.com/watch?v=zwvWTNM1U9Q
https://www.youtube.com/watch?v=XUKBS3SV-JU

Prosic o tutoriale na temat 68K ASM juz nie musze, bo mam tego sporo, ale juz jakies moze "hello worldy" napisane w ASM (najlepiej ze zrodlami) na Amidze to by sie przydaly, albo jakis tutorial o generowaniu grafiki?
[#71] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@sdm, post #70

Tutaj cały tutorial na youtube od znanego scenowca. Mi, jako raczkującemu w asm, bardzo pomógł.

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

@mastaszek, post #71

Super. Dzięki.
A czy są jakieś opcje kompilowania pod Windows? Wiadomo do testu WinUAE wymagany, ale wolałbym pisać i kompilować pod windowsem.
[#73] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@sdm, post #72

na windows, linux i macOS jest Vasm - Kross-assembler dla Motoroli 68k. używam i polecam.
poza tym...
na bazie tutoriali Photona/Scoopex, które podlinkował mastaszek zrobiłem swoje pierwsze demko na Amigę.
Tutaj link https://www.pouet.net/prod.php?which=66497
W całości napisane w asm po obejrzeniu tych tutoriali Photona. znajdziesz tam nie tylko ustawianie bitmap za pomocą coppera, ale także ustawianie sprajów i odgrywanie muzyki. polecam.
2
[#74] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@sdm, post #70

Skoro dopiero zaczynasz to mam jedna rade, moze skorzystasz, moze nie, nim nabierzesz nawykow. Nie uzywaj komendy ASL do indeksowania, uzywaj LSL. Osobie z zewnatrz (przegladajacej Twoj kod) to zawsze sugeruje, ze to moze byc tez przesuwana wartosc ujemna. Przynajmniej ja tak mam i mnie to razi. Choc w przypadku przesuniecia liczby/wartosci w lewo znak nigdy nie ma znaczenia, bo to moga byc tylko wartosci dodatnie. Ale juz w przypadku ASR i LSR ma to znaczenie bo wtedy od razu wiadomo czy chodzi tylko o liczbe/wartosc dodatnia czy tez ujemna. ASR sugeruje, ze moze to byc tez wartosc ujemna, a LSR ze to zawsze dodatnia wartosc jest. Latwiej jest tez wtedy zrozumiec kod.
[#75] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@c64portal, post #73

Visual studio code z pluginem 68k asm zawiera narzędzia do kompilacji kodu, to może być wygodne. Kod może być automatycznie odpalany w winuae i debugowany

Więcej nie powiem, bo ja wciąż używam asmone pod amiga...

Ostatnia aktualizacja: 03.11.2022 06:04:37 przez juen
1
[#76] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #74

Chyba najszybciej nauczyłem sie 68K podczas przepisywania mojego starego kodu z 6502/Z80 pod 68K testując i szukając identycznie działających rozwiązań. Dlatego nie skupiałem się na innych aspektach niż odpowiedniki 1:1.

Dopiero teraz zaczną się schody i trzeba będzie nieco pogłówkować.
Nie za bardzo przepadam za maszynami, które za dużo "wtrącają" się w programowaniu poprzez BIOS'y, ROM'y i inne takie, wiec dopytam jak ma się to w Amidze i programowaniu NDOS ? Ma to sens, jest niepopularne? Czy rozwiązania "BIOS'owo-ROM'owe" pomagają niż przeszkadzają?
[#77] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@sdm, post #76

NDOS to obecnie tylko wiecej miejsca na dane na dyskietce, prawie cala dyskietke mozna uzyc na dane (czyli 901120 bajty). A w formacie MFM/longtrack jeszcze wiecej. Oraz oczywiscie ubicie systemu. Obecnie najpopularniejsze dla 68000 jest ubicie systemu prosto z normalnego pliku exe, czasami tez przywracanie systemu po wyjsciu z programu (zalezy ile jest wolnej pamieci, a ile wolnego jest wymagane przez gre/demo).
[#78] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@Don_Adan, post #77

a jak działa ubicie systemu przy grach wieloplikowych, da się doczytywać w trakcie czy takie gry od razu ładują całość?
[#79] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@michal_zukowski, post #78

zasadniczo nie musisz ubijac calego systemu to raz, a po drugie nic nie stoi na przeszkodzie przywrocic go w celu doczytania/zapisania pliku przy uzyciu dos.library :)
[#80] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@michal_zukowski, post #78

Da sie. W zasadzie jest tak jak pisze Juen, ale najprosciej jest wczytac wszystko do pamieci przed ubiciem systemu.
[#81] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@siudym, post #1

Podepnę się pod temat, bo mam takie pytanko odnośnie asemblera.

Czym się różni JSR od BSR? Zarówno jednego jak i drugiego mogę używać naprzemiennie, a powrót i tu i tu działa poprzez RTS. Czy to jest podobnie, jak w przypadku JMP i BRA? Może przy JSR i JMP nie jest sprawdzany rejestr PC?
[#82] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@tukinem, post #81

bsr kosztuje mniej, wiec jesli skok jest w jego zasiegu to nalezy go uzyc w pierwszej kolejnosci. przy duzym kodzie zbytnio sie nad tym nie zastanawiam - uzywam bsr, a asm-one sam mnie poinformuje, ze nalezy uzyc jsr.

prostym przykladem jest wywolanie funkcji z bibilioteki, gdzie pewne jest, ze bsr go nie dosiegnie, a jsr tak
1
[#83] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@tukinem, post #81

BSR ma tylko adresowanie względne - możesz skoczyć w zakresie <-128,+127> bajtów względem aktualnego PC. Tu adres skoku zajmuje więc 1 bajt. Chyba, że mówimy o BSR.W czy BSR.L.
1
[#84] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@kar78787878, post #83

przez wzgledne rozumiemy, ze adres zostaje dodany/odjety od aktualnego, a nie zaadresowany w calosci, stad roznica w wielkosci rozkazu i szybkosci wykonania
1
[#85] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #84

Właśnie to napisałem wyżej.
[#86] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #84

czyli rozumiem, że pisząc sobie jakiś podprogram mogę spokojnie używać BSR, ale np. zrobić skok z pętli głównej gdzieś na koniec kodu, to lepiej użyć JSR, np.
MAINLOOP
JSR RAMKA
BRA MAINLOOP

...
;dlugi kod
...

RAMKA
CMP.b #$ff,$dff006
BNE.b RAMKA
RTS
[#87] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@tukinem, post #86

Używaj wszędzie bsr, a jak wyskoczy błąd to wtedy zmień na jsr.
1
[#88] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@cholok, post #87

Błąd w Blitzu może inaczej wyglądać niż w AsmONE, no ale ok będę tak używać. Dziękuję za pomoc i wyjaśnienie.
[#89] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@tukinem, post #88

W blitzie powinien wyskoczyć błąd: illegal displacement.
1
[#90] Re: Pierwsze kroki - Asembler 68000 - Pytania początkującego..

@juen, post #82

Różnica w cyklach to nie wszystko. Najważniejsze jest to że BSR robi skok względem licznika rozkazów (PC) i dzięki temu można tworzyć relokowalny kod programu. JSR z adresem podanym w longword na sztywno odwołuje się do konkretnego miejsca w pamięci i takiego kodu nie da się uruchomić jeśli zostanie umieszczony pod innym adresem pamięci niż w momencie asemblacji. Kod z odwołaniami względem PC możesz sobie wczytać z dysku już po uruchomieniu programu i umieścić w pamięci gdzie chcesz.

Jeśli chcesz przyspieszyć wywoływanie podprocedur możesz zastosować następującą optymalizację:
Do rejestru adresowego wpisujesz adres powrotu z funkcji. Warunkiem jest oczywiście to żeby podprocedura nie zniszczyła jego zawartości. Na końcu procedury wykonujesz instrukcję skoku pod ten adres.

move.l #POWROT, a6
jmp PODPROCEDURA
POWROT:

.......

PODPROCEDURA:
...
jmp (a6)


Taka kombinacja jest szybsza niż zestaw jsr / rts


Ostatnia aktualizacja: 16.08.2023 08:56:50 przez Kefir_Union
1
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