[#1] [amos] kopiowanie pamięci
Hej. Kopiuję fragment pamięci w inne miejsce za pomocą amosowego

copy source_start,source_end to destination

Pytanie: Wie ktoś, czy da się to robić jakoś szybciej? Może da się zrobić jakąś wstawkę assemblera, a jeśli tak, to jak?

PS. Czy w blitzbasicu jest komenda szybko kopiująca fragmenty pamięci?

PS2. Czy może dać se spokój i zacząć się wreszcie uczyć języka C?
[#2] Re: [amos] kopiowanie pamięci

@mastaszek, post #1

W necie znalazłem coś takiego:
https://www.ultimateamiga.co.uk/HostedProjects/AMOSFactory/AMOSProManual/14/1412.html
[#3] Re: [amos] kopiowanie pamięci

@Ocelot, post #2

Dzięki, obadam temat.
[#4] Re: [amos] kopiowanie pamięci

@mastaszek, post #1

To niestety jest najszybciej. Jedyne co mogę zasugerować to zamiast używać start(nr banku) w polecenia lepiej używać zmiennej. Np. Nazwa_banku=start(nr banku) i dopiero ta zmienną podawać jako adres początkowy. Sam biorę się za sprawdzenie wstawek w ASM. Jak znajdę chwilę czasu dam namiar na jedyny artykuł jaki znalazłem o tym.
[#5] Re: [amos] kopiowanie pamięci

@jimiche, post #4

tutaj na stronie 58, artykuł pod tytułem Amos: Getting into Assembly pochodzi on Australian Commodore Amiga Review.


Jeszcze jak mogę coś zasugerować bo to klika moich przemyśleń z pracy w amosie:
-jeżeli istnieje jakaś komenda w zewnętrznych rozszerzeniach zastępująca komendę z oryginalnego Amosa to lepiej używać komendy z rozszerzenia (Amcaf nie gryzie:)), oczywiście czasami rozszerzenie może być niestabilne ale mnie może to raz się zdarzyło,
-w sieci jest dużo artykułów o optymalizacji kodu w amosie. niestety czasami sobie zaprzeczają więc dobrze sprawdzać samemu jak dane warianty działają,
-wiele razy czytałem że używanie rejestrów danych procesora (komenda Dreg()) jako zmiennych przyspiesza działanie programu, ja niestety zauważyłem tylko spowolnienie i to znaczne, nie wiem czy to nie wynika z samej budowy nowszych wersji amos.library,
- to samo dotyczy się instrukcji deek, leek, poke, loke etc. ich działanie i korzystanie z banków jest i tak szybsze niż korzystanie z tablic, ale gdzieś wyczytałem że ze względu na konstrukcje AmosPro korzystanie z operacji na komórkach i tak jest spowalniane, możliwe że komenda copy jest w podobny sposób potraktowana,

Jeżeli ktoś chce więcej materiałów o Amosie to proszę na priv.
Mam też prośbę do kolegów z forum którzy może sami mają już praktykę w używaniu wstawek assemblerowych w Amosie aby dali kilka porad. Bo sam biorę się za to jak pies do jeże od kilku miesięcy ale coś tak... nie wiem sam jak do końca zacząć.
[#6] Re: [amos] kopiowanie pamięci

@jimiche, post #5

Komenda dreg/areg nie używa rejestrów danych procesora w taki sposób jak myślisz. Służy do przekazywania danych i kopiuje dane do zwykłej pamięci. Stamtąd jest przekazywana do rejestrów w momencie wywoływania np. call.

Amos pozwala na wstawki assemblerowe tylko w postaci skompilowanych procedur w zewnętrznym kompilatorze. Więc musisz napisać sobie procedurę w np. asmpro, skompilować, zapisać jako program, wgrać do amosa przez pload, ustawić parametry dreg/areg, wywołać call. Można też zapisać w asmie jako bin i wgrać do amosa jako bank data (pload używa chip), ale procedura musi być już zrelokowana.

Co do pamięci, można użyć systemowego copymem (execall) spatchowanego jakąś łatką.
1
[#7] Re: [amos] kopiowanie pamięci

@cholok, post #6

Co do dreg() to nie wiedziałem że może to tak pokrętne działać. W przypadku drugiej część to mniej więcej wiem jak to zrobić. Bardziej mnie zastanawia jak kompiluje się relokowalny kod w Asmpro czy asmone, jak przekazać wstawcie asemblerowej adresy kilku banków i kilku zmiennych(np. żeby zmienna czasu mogła być przekazana...) nie tylko to co możesz umieścić w 4 rejestrach jak piszę w instrukcji.
Co do tego czy pload używa chipram to muszę sprawdzić. Trochę bez sensu... Tym bardziej że jedyne banki które muszą być w chipram to bank ikon, bobów i spritów Amos nawet spakowane ekrany może umieszczać w fastram. Więc trochę mnie dziwi ze program w chip ram.
[#8] Re: [amos] kopiowanie pamięci

@mastaszek, post #1

PS2. Czy może dać se spokój i zacząć się wreszcie uczyć języka C?
Zdecydowanie najlepsze rozwiązanie.
1
[#9] Re: [amos] kopiowanie pamięci

@jimiche, post #7

Masz 8 rejestrów danych i 4 adresowe jako parametry wejściowe. To powinno wystarczyć. Można przekazać adres tablicy. Można wykorzystać stos.

Asmpro robi standardowo kod relokowalny. Nic nie trzeba kombinować.
[#10] Re: [amos] kopiowanie pamięci

@jimiche, post #5

Dzięki za info. Optymalizacje opisane przez Ciebie już stosowałem, ale i tak jest zbyt wolno. Niestety (a może na szczęście) zrobiłem w programowaniu niesławnego 'Blasku' rzecz dla mnie najtrudniejszą - zaakceptowałem fakt, że w amosie to mogę kupę napisać, a nie wolfensteina.

@Cholok: Czyli i tak musiałbym sobie w asmie napisać program, skompilować go i wywoływać w amosie... Poddaję się i pójdę za radą Krashana.

@Krashan: i tak właśnie zrobię. Skaczę na główkę w nieznane. Dzięki!
1
[#11] Re: [amos] kopiowanie pamięci

@cholok, post #9

Faktycznie można korzystać z wszystkich ośmiu rejestrów danych.. gdzieś sobie wkręciłem że tylko 3 rejestry danych i jeden adresowy. Dobra w sumie mam tydzień opieki to spróbuje coś w tym asm zrobić jak by co to będę pisać :) tutaj.
Mam nadzieje że pomożecie Panowie.
[#12] Re: [amos] kopiowanie pamięci

@mastaszek, post #10

Wiadomość dnia! :D
1
[#13] Re: [amos] kopiowanie pamięci

@mastaszek, post #10

Uwazam ze wiedza ktora posiadles programujac w AMOSie nie pojdzie na marne.
I wykozystasz ja z pewnoscia przechodzac na inny jezyk.
Tak wiec, powodzenia
1
[#14] Re: [amos] kopiowanie pamięci

@Phibrizzo, post #13

Ja tam uważam że ogólnie Basic to fajny język do nauki programowania. Ja tak zaczynałem na ZX Spectrum. Dodatkowo AMOS to po prostu fajny Basic ale... Coś się kończy, coś się zaczyna.. Może rzeczywiście czas już zmienić na C np. (albo wersja bardziej hardcorowa czyli AmigaE, kto nie próbował w tym używać liczb zmiennoprzecinkowych ten nie stracił ostatnich włosów z głowy ) ASMa to bym sobie na koniec zostawił.

PS. A faktycznie użycie z Execa CopyMem czy CopyMemQuick nie jest możliwe/nie pomaga? Bo szybciej to pewnie się nie da. Tylko blitterem chyba jeśli dane muszą być w chipie przerzucane.

Ostatnia aktualizacja: 09.05.2021 22:31:25 przez pisklak
[#15] Re: [amos] kopiowanie pamięci

@pisklak, post #14

Wiesz może jak użyć CopyMem w amosie? Jest komenda Exec, ale po wypróbowaniu Exec "CopyMem (source, dest, size)" nic się nie dzieje. W książce do amosa stoi, że wywoływana komenda (czyli chyba chodzi o CopyMem) powinna się znajdować w katalogu C, ale skąd ją wziąć żeby ją przekopiować do tego katalogu?

To jest komenda z exec.library, czy exec library już siedzi w romie, czy trzeba ją też gdzieś umieścić?

PS Wybacz infantylne pytania, który być może nie mają sensu. Żółtodziobem jestem.

Ostatnia aktualizacja: 10.05.2021 00:05:44 przez mastaszek
[#16] Re: [amos] kopiowanie pamięci

@mastaszek, post #15

CopyMem to funkcja exec.library. Ta biblioteka jest zawsze otwarta. Żeby ją wywołać z poziomu AMOSa możesz napisać:

AREG(0)=START(0)
AREG(1)=START(1)
DREG(0)=size

EXECALL(LVO("CopyMem"))

Najpierw ładujemy argumenty tej funkcji do rejestrów procesora - w przykładzie są adresy banków pamięci AMOSa do rejestrów adresowych oraz rozmiar w bajtach do rejestru danych wymaganych przez tę funkcję.

Sporo więcej informacji znajdziesz w podręczniku do AMOSa:

http://www.classicamiga.com/images/stories/jreviews/software/A/manuals/AmosPro.pdf

W języku C nie musisz się martwić o to, do jakich rejestrów trzeba podawać parametry i pisze się po prostu:

CopyMem(source, dest, size);


Ostatnia aktualizacja: 10.05.2021 05:16:34 przez Hexmage960
2
[#17] Re: [amos] kopiowanie pamięci

@Hexmage960, post #16

Dzięki! OK
[#18] Re: [amos] kopiowanie pamięci

@Hexmage960, post #16

Sprawdziłem i niestety CopyMem wywoływany amosem działa wolniej niż amosowe Copy :( No cóż, za rok wrócę z jakąś gierką w napisną w C ;)
1
[#19] Re: [amos] kopiowanie pamięci

@mastaszek, post #18

Również polecam język C.

Jest jeszcze funkcja CopyMemQuick() - szybkie kopiowanie, ale ona wymaga dosunięcia (tzw. align) danych do 32-bitowych słów (4 bajty). Zatem dużo lepiej wywołać ją z poziomu języka C.

Serdecznie życzę Ci powodzenia. Na pewno przygotujesz grę szybciej niż ja Magazyn.
2
[#20] Re: [amos] kopiowanie pamięci

@mastaszek, post #18

Hej cieszę się że skorzystałeś z rady kolegi Hexmage960 i dałeś CopyMem szansę Jeśli rzeczywiście amosowa procedura działa szybciej to być może dane w pamięci są wyrównane i można CopyMemQuick spróbować... Ale jeśli tak jest to po prostu szybciej nie będzie niż to co Amos wyciąga. Jeśli kopiujesz banki pamięci które oba znajdują się w chipramie to można próbować blitterem. Na gołej A500 będzie szybciej niż biedną 68000. Tylko nie mam pojęcia jak to Amosem zrobić.
A i powodzenia w nauce C. Niech Ci Guru łaskawym będzie szeroki uśmiech

PS. Ja tam lubię AmigaE pomimo jego dziwactw
1
[#21] Re: [amos] kopiowanie pamięci

@mastaszek, post #18

Jak masz potrzebę zrobić kopię banku np1 do banku 2 sprawdź z amcaf'ową instrukcję BANK COPY. Może to jest to co potrzebujesz. Tutaj instrukcja w HTML .
Osobiście nie sprawdzałem tego rozkazu czy działa szybciej ani nie wiem jak jest konfiguracja docelowa twojej gry.
[#22] Re: [amos] kopiowanie pamięci

@mastaszek, post #18

No cóż, za rok wrócę z jakąś gierką w napisną w C ;)


Brawo.

A będziesz to robił na Ami za pomocą dostępnych kompilatorów (SAS C, GCC albo inne) czy skrośne kompilował na Windowsie (na przykład za pomocą vbcc ) ?
[#23] Re: [amos] kopiowanie pamięci

@pisklak, post #20

Nie znam Amosa na tyle żeby zgadywać ale być może da się 'wyblittować' do banku. Coś w stylu blittowania normalnego BOBa tylko nie na ekran a do banku, który jest w chipramie. Być może pomoże biednej A500
[#24] Re: [amos] kopiowanie pamięci

@asman, post #22

Wydaje mi się, że na amidze (pod winuae). Ale jeszcze się nie znam, więc decyzja może ulec zmianie. Postawię sobie wypasioną amigę pod winuae i będę udawał, że to naprawdę :)

@pisklak: już nie będę cudował w amosie. Kilka lat walki z wiatrakami wystarczy ;)
[#25] Re: [amos] kopiowanie pamięci

@mastaszek, post #1

Odgrzeje temat - być może komuś się przyda... Zainspirowany tym wątkiem napisałem prosty tester szybkości kopiowania pamięci w AMOSie. Dwa banki po 65535 bajtów. Kopiuje jeden bank do drugiego określoną ilość razy. Funkcja AMOSa rzeczywiście jest zauważalnie szybsza niż CopyMem z exec.library. Posprawdzałem szybkości dla różnych ilości powtórzeń. Po chwili zabawy powiększyłem wielkość banków do pełnych 64kB i - CZAS KOPIOWANIA ZMNIEJSZYŁ SIĘ O JAKIEŚ 50%! Zarówno dla jednej, jaki i drugiej funkcji! Wygląda na to, że długość banku powinna być wyrównana do wspomnianych wcześniej czterech bajtów - a resztę ogarnia AMOS.
2
[#26] Re: [amos] kopiowanie pamięci

@Ocelot, post #25

Dobra wiadomość! Jak widać da się jeszcze trochę koledze Mataszkowi wcisnąć z AMOSa. Tylko zapotrzebowanie na pamięć może wzrosnąć... OK
[#27] Re: [amos] kopiowanie pamięci

@Ocelot, post #25

Dobra wiadomość! Jak widać da się jeszcze trochę koledze Mastaszkowi wycisnąć z AMOSa. Tylko zapotrzebowanie na pamięć może wzrosnąć... OK

PS. Ups nie wiem jakim cudem wyszedł podwójny post... Upraszam moderację o skasowanie tego powyżej...



Ostatnia aktualizacja: 12.05.2021 11:32:14 przez pisklak
[#28] Re: [amos] kopiowanie pamięci

@Ocelot, post #25

Patrząc w źródła amosa widać, że kopiowanie jest trochę zoptymalizowane, ale używa 4x move.l. Systemowe CopyMemQuick używa movem co jednak powinno być szybsze.
2
[#29] Re: [amos] kopiowanie pamięci

@cholok, post #28

Wywołując z poziomu AMOSa nie ma żadnej różnicy pomiędzy CopyMem a CopyMemQuick. Próbowałem do 2000000 iteracji. Myślę, że więcej nie ma sensu sprawdzać.

Ostatnia aktualizacja: 12.05.2021 20:57:10 przez Ocelot
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