76

Na C64 nie mają wyjścia - ekran zwęża się z 40 do 38 znaków, a my mamy displaylist i obszar 4kB.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

77

Przepraszam Panowie, ale ja czegoś nie czaję. W przykładzie Tebego zakomentowałem linijkę:

sta text+48-256,x

i scroll jak działał tak dalej działa. Gdzie tu czegoś nie rozumiem?

grzybson/SSG^NG

78 Ostatnio edytowany przez tebe (2015-01-04 23:10:31)

dopisz trochę więcej tekstu, jakieś znaczki bardziej rzucające się w oczy i odczekaj 256 bajtów, będzie różnica

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

79 Ostatnio edytowany przez grzybson (2015-01-05 10:34:31)

Racja - wydłużyłem trochę tekst i jest różnica. Dzięki. Najwyraźniej muszę jeszcze trochę pokminić nad tym przykładem.

EDIT:
Jeszcze jedno pytanie - dlaczego w przykładzie SCREEN_WIDTH == 48? Ekran w $02 ma 40 wierszy, domyślam się, że trzeba trochę nadłożyć, ale dlaczego akurat tyle?

grzybson/SSG^NG

80

mono napisał/a:

Na C64 nie mają wyjścia - ekran zwęża się z 40 do 38 znaków, a my mamy displaylist i obszar 4kB.

VIC ma tyle bug-ów że myślę że nie muszą wcale przepisywać... niektóre tricki zadziwiają...

http://codebase64.org/doku.php?id=base:vic

niby nie mają display-list ale zobacz np. to:

http://youtu.be/2Ui-hEN2HdA

81 Ostatnio edytowany przez mono (2015-01-05 20:22:45)

@seban: FLD znam :) ładny efekt chyba jeszcze z '90. Ciekawi mnie tylko czy mogą sobie tak dowolnie, jak my zmieniać co linię skanningową/tekstową adres pamięci ekranu (co do bajta, bo to pomocne przy skrolu poziomym). Bo zdaje się pamięć ekranu leży sztywno w konkretnym wybranym banku RAM.
@grzybson: kiedy włączasz skrol poziomy w dlist, wtedy linia ma rozmiar 48 bajtów lub 24 bajty (tryby tekstowe podwójnej szerokości) choć na ekranie wyświetlana jest tylko część określana szerokością ekranu, adresem w lms i hscrollem.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

82 Ostatnio edytowany przez tebe (2015-01-06 12:09:52)

efekt znany ze starych dem, Seban pewnie pamięta, XXL wykorzystał to przy pewnej konwersji gry

co się stanie kiedy jako pamięć obrazu ustawimy adres zestawu znaków + N, gdzie N = <0..height>

dl dta $70,$70
   :208 dta $4f,a(fnt+#)
   dta $41,a(dl)

otrzymamy kolumny znaków  <0..height/8>, przesunięte o linię względem każdej kolejnej kolumny, w każdej kolumnie te same znaki przesunięte o linię w górę, teraz wystarczy zmodyfikować te height/8 znaków aby otrzymać efekt ruchu na całym ekranie, w sumie maksymalnie modyfikujemy do 256 bajtów pamięci, spokojnie mieścimy się w ramce

w załączniku przykład wykorzystania takiej organizacji pamięci, w pętli tworzony jest wzór 8 bajtowy znaku, następnie przepisywany pod kolejny adres w zestawie znaków, i tak 30 razy

Post's attachments

dot_carpet.zip 3.01 kb, liczba pobrań: 25 (od 2015-01-06) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

83 Ostatnio edytowany przez seban (2015-01-06 15:37:14)

Hej!

Nie znałem tej metody, gdy bawiłem się w moje "fly dots", robiłem to metodą dość prymitywną i brutalną... smarowałem wszystko co się dało na ekranie graficznym... czyściłem ekran również metodą "brute force" :P ... pierwsze próby bez żadnych optymalizacji o dziwo "wyrabiały się w ramce", jednak efekt wizualny jaki osiągnąłem nie zachwycał mnie zbytnio... sprawę więc szybko porzuciłem nie mając pomysłu jak to wykorzystać... niby chciałem zrobić  z tego scroll-a... zamieniając po drodze grafikę na "fonty", ale jakoś chęci i motywacji zabrakło... wspominajac to wszystko, zajrzałem nawet do bardzo starych dyskietek z QA, które o dziwo się przeczytały... więc pozwalam sobie załączyć te wypociny... jednak darujcie zanęcanie się nade mną za "jakość" i "szybkość" tego kodu ;-) to naprawdę stary kod (z czasów Code3, czyli wczesne lata '90), do tego wszystkiego jestem prawie pewien że miałem jeszcze ten sam kod właśnie wzbogacony o scrolling (na grafice) zamiast "samych latających kropek", ale nie mogę tego znaleźć... tak czy inaczej można to napisać o wiele efektywniej, nawet wykorzystując ekran graficzny :) więc jeżeli ktoś zechce sobie zrobić z tego oldschool-owy scroll, czemu nie :]

Format QA, z użyciem "dta c' ' oraz Atari control-characters", a więc skompiluje to chyba tylko QA. A może ktoś popełnił konwerter? ;) Do obejrzenia źródeł na PC w formacie ATASCII proponuję użyć: Memopad ( http://joyfulcoder.com/memopad/ )

Tego typu "concept idea" czy inne efekty w tamtych czasach pisałem i testowałem bezpośrednio pod QA, asemblując do pamięci oraz uruchamiając z poziomu QA. W tym wypadku wystarczy zmienić OPT na %00010101 i do tego ustawić "MemHi" na $A000 i RUN na $480. Po czym wykonujemy assembly a następnie RUN... efekt uruchamia się bez problemu bezpośrednio z poziomu QA.

Na koniec pliki o których była mowa wyżej:

1) plik ATR zawierający DOS II+, QA oraz źródła i plik .OBJ dostępne tutaj: fly_dots.atr
2) źródło do wglądu (format QA, ATASCII -> na PeCe użyć MemoPad R9 do podglądu) tutaj: fly_dots.asm
3) do kompletu jak ktoś na szybko chce sobie to uruchomić pod emulatorem plik XEX tutaj: fly_dots.xex

ps1) koncepcja względnej szybkości tego efektu polegała jedynie na tym że de-facto nie tam tam żadnej procedury PLOT, a stawiania pixela odbywa się jedynie przy pomocy jednego STA. Założenie jest takie że zawsze zapalony jest tylko jeden bit w obrębie bajtu i ruch punktu odbywa się jedynie w obrębie tego bajtu, w zależności od wartości zapisywanej na ekran (ustawiony tylko jeden z bitów) zmieniamy pozycję poziomą pixela z zakresie 0..7. Ruch w pionie odbywa sie na podstawie tablic adresów. A rysowanie każdego pixela z osobna polega za zapisywaniu innego bajtu z wykorzystaniem trybu indeksowego sta (adr),y gdzie rej. Y zawiera tak naprawdę nr. bajtu (w tym wypadku również pixela). Całości dopełniają dwie pre-kalkulowane wcześniej (Turbo Basic XL) tablice sinusów, dzięki którym uzyskujemy ciekawy wizualnie kształt poruszania się pixeli. To tak w wielkim uproszczeniu.

ps2) poszukam jeszcze jakichś źródeł logo-scrolla z użyciem ring-buffer. Jak coś sensownego znajdę to zamieszczę również tutaj.

84 Ostatnio edytowany przez seban (2015-01-09 01:34:38)

Hej!

Ze starych dysków wygrzebałem źródło logo-scrolla zrealizowanego z użyciem bufora pierścieniowego, to też dość stary kod, myślę że to okolice '92 roku, ale sądzę że jest dość czytelny i minimalistyczny (pomijając tą sieczkę związaną z dta c'...')

Fonty użyte w scroll-u pochodzą z tej produkcji "Our5oft's part of UNITY Project". Ponieważ te fonty bardzo mi się spodobały, byłem na tyle bezczelny że "wyciąłem" sobie te fonty i postanowiłem zrobić własny logo scroll na nich bazujący, a następnie wykorzystać to we własnej produkcji, ale o tym na końcu.

Źródła jak zwykle w QA, do oglądania na PC należy użyć np. Memopad o którym pisałem wyżej. Kompiluje się tylko z użyciem QA (jak zwykle dane trzymam w formie dta c'...' / tak, tak... miałem do tego konwerter :P /

1) plik ATR zawierający DOS II+, QA oraz źródła i plik .OBJ dostępne tutaj: scroll.atr
2) źródło do wglądu (format QA, ATASCII, EOL $9B) tutaj: scroll.asm
3) do kompletu jak ktoś na szybko chce sobie to uruchomić pod emulatorem plik XEX tutaj: scroll.xex

Oczywiście ten przykład można skompilować do pamięci i uruchomić bezpośrednio z QA (Run $480, MemHI $a000), Assembly a potem RUN.

Cała procedura scrolla znajduje się od etykiety "scr". Procedura zapisu buforów od etykiety "pupa".

Tablice przechowujące znaki z których składają sie litery logo scrolla t0...t7.

Ponieważ szerokości liter są różne (głownie 4 fonty, tylko "M" i "W" mają szerokość 6 znaków, a także "!" oraz " o szerokości 3 znaków) wyboru szerokości litery dokonuje się bez tablicy, zakładając domyślną szerokość na 4 znaki i potem uwzględniając wyjątki dla M,W,!," ... ten kod widać od etykiety "OK". W kodzie zaszyta jest jeszcze tablica translacji nazwana "tt", dokonująca konwersji znaków w scrollu (dta d' ' / ANTIC codes) na odpowiednie indeksy w tablicach t0..t7


PS) gdyby to kogokolwiek interesowało to jest to jakaś wstępna wersja scrolla pochodzaca, z nigdy nie puszczonego dema zawierającego 256KB samlowanych fragmentów z utworu Another Day in Paradise - Phila Collinsa. Do kompletu dołożone było parę "digitalizowanych" obrazków z teledysku do tego utworu. Demo nigdy nie zostało puszczone ponieważ mało kto w tamtym czasie dysponował takim rozszerzeniem pamięci, i do kompletu z czystego lenistwa (było tworzone jako "concept idea") zostało umieszczone na dysku w formacie 720KB (wymagana stacja TOMS720) ... w takiej formie pozostało porzucone i nigdy nie ujrzało światła dziennego. Na własne uszy słyszał to chyba tylko Miker. Gdy już sensowne stało się wypuszczenie tej produkcji, dysk je zawierający przepadł w odmętach wieczności :P teraz grzebiąc po starych dyskach odnalazłem jakąś pierwszą wersję tego scrolla.

85

Jaskier kiedys napisal konwerter QA >X-asm: Converter.zip

86 Ostatnio edytowany przez tebe (2015-05-04 12:19:18)

ciekawe sposoby optymalizacji operacji mnożenia poprzez sumowanie tablic logarytmów, oraz inne sposoby optymalizacji obliczeń dla 6502

http://realtimecollisiondetection.net/blog/?p=21

a tutaj jak można błądzić http://everything2.com/title/Fast+6502+multiplication

w sumie to w paczce z mads-em jest fast_mul bodaj od Fox-a, który załatwia temat, ale skąd co się wzięło warto wiedzieć


a tutaj na temat rotacji bitmapy:

http://www.drdobbs.com/architecture-and … /184416337

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

87

dzięki za linki TeBe. Tak po ich obejrzeniu, o ile mnie pamięć nie myli to chyba gra "Mercenary - Escape from Targ" całą arytmetykę miała opartą o mnożenie na tablicach log/exp. Wtedy gdy patrzyłem w kod nie bardzo mogłem to zrozumieć bo moja wiedza matematyczna była znikoma.

Mnożenie oparte o właśnie metodę z tablicą kwadratów, tzn:

f(x) = x*x/4 
f(a+b) - f(a-b) = a*b

Wykorzystałem w Invitro do SV2K11 przy początkowej części gdzie smaruje 3d star-field wraz z korekcją perspektywy, i to nawet "wchodzące w ramkę". Gwiazdek mało to na ich tle smaruje się jeszcze slow-motion sprite-scroller :P

88

jak zyskać cykle CPU, zastępując przerwanie DLI poprzez IRQ

http://www.atari.org.pl/forum/viewtopic … 18#p208218

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

89

dojrzewający następca ACTION, własne IDE, działająca już kompilacja do XEX-a

http://atariage.com/forums/topic/223277 … try3223308

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

90

I niedziałające x=x+5. :)

Hitler, Stalin, totalniak, SSman, NKWDzista, kaczor dyktator, za długo byłem w ChRL, wypowiadam się afektywnie.

91

Oj tam, grunt, że tablica symboli pewno większa.

KMK
? HEX$(6670358)

92

czołem, od kilku dni pracuję nad twirlem na c64, moja metoda jest inna niż podana na stronie Tebe, wyliczam oddzielnie tablice kolejnych kręgów i zapisuję w którym bajcie i w którym pixlu bajtu ma być pixel, druga tablica to pixele w danych okręgach. Procedura rysująca na stronie zerowej zapisuje pixel z przesunięciem z tablicy pixeli danego okręgu w danym znaku na ekranie. Z racji tego, że c64 ma 256 znaków w zestawie starczyło to na 4x4 pixle po 4 kolory każdy w znaku.
Mam jeszcze pytanie- jak shadow uzyskał taką dużą prędkość twirla  w demie "triple threat"? czyżby rozpętlony kod dla każdego bajtu?
https://www.youtube.com/watch?v=64UNE482PZ4

93 Ostatnio edytowany przez tebe (2017-08-19 21:03:17)

skoro metoda jest inna niż ta na stronie Tebe, tzn. że robisz to źle ;)

p.s.
autorem tej metody jest Konop/Shadows, a rozpętlenie kodu jest jest Twoim świętym obowiązkiem

p.s. #2
kiedyś disasemblowałem jakieś intro 512b na C64, efekt końcowy to ~8KB rozpętlonego kodu

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

94 Ostatnio edytowany przez gorgh (2017-08-19 21:20:37)

moja metoda jest o tyle dobra, że autorska, co do rozpętlenia kodu to pewnie by to przyspieszyło, ale mam opory przed łatwizną :)
edit:
P.S. nie sądzę, żeby moja metoda była gorsza, to co opisane na Twojej stronie wydaje się wolniejsze bez rozpętlenia.

95

Ja czasem rozpętlam połowicznie - tzn, mam osobny kod dla każdego wiersza. A pixle/bajty w wierszu jadę w pętli.
Wszystko zależy od tego, ile masz czasu procesora, pamięci, itd...

Rozpętlanie to niekoniecznie jest łatwizna. Wtedy trzeba bardzo ostro upakować logikę efektu w kilka rozkazów asemblera. To nie zawsze jest proste.

96 Ostatnio edytowany przez Nitro (2017-08-21 18:13:50)

gorgh: unroll to podstawa szybkich efektów, a nie łatwizna, szczególnie na C64 który prędkością nie powala.

Pomijając sam algorytm na twirla polecam zmienić tryb na 4x4 FLI, co pozwoli albo na 16 kolorów/pixel albo 16 ditherowanych odcieni/pixel robiąc na znakach, drugi tryb można naprawdę kreatywnie wykorzystać, przykład tutaj:
http://codebase64.org/doku.php?id=base: … _of_colors

97 Ostatnio edytowany przez gorgh (2017-08-21 18:29:18)

o dzięki.
co do hektaru kodu to mam opory przed stosowaniem tego, ale faktycznie może nieodzowne czasami
edit
swój kod do stawiania pixli optymalizowałem chyba 10 krotnie, obecnie pętla rysująca wygląda tak:

loop000
 lda $ffff,y
 bmi byte8
 beq byte

 sta byte2+2
 sta byte5+2

byte8
 ldx $ffff,y

byte
 lda $ffff,y
byte6
 and $ffff,y
byte5
 ora $ff00,x
byte2
 sta $ff00,x
 dey

 bne loop000

i efekt działa w 4 ramkach
co do speedcodu to niestey tojest trochę tak, że myśleć nad tym trzeba 4 razy mniej.

98

To chyba znacie ? zebrane w jednym miejscu zaawansowane techniki programowania XE/XL.
Ktoś z Lamersów jakiś czas temu potrzebował pomocy przy HIP-ie

https://atariwiki.org/wiki/Wiki.jsp?pag … an%20Atari

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

99

niektore z artkow po rozwinieciu moglyby sie znalezc jako dodatki do ksiazek wydawanych przez Duddiego :-)

http://atari.pl/hsc/ad.php?i=1.

100

dla 9++ rozwinięcie można odnaleźć w 'Altirra Hardware Reference Manual' dołączonym do Altirry

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C