76

(89 odpowiedzi, napisanych Programowanie - 8 bit)

jellonek napisał/a:

probe: nie czaje kto ci broni najpierw przemnozyc m1, m4, m7 przez x, po czym m2, ... przez y, i to samo dla z... w sumie 6x bys oszczedzal na ladowaniu danej 16bit

dodawanie wykonalbys na koncu...

ehh... zobacz jeszcze raz moj post #60 w tym topicu, to nic nie da! i tak trzeba ustawiac wszystkie tablice od nowa (bo ustawienie tablic zalezy od M1,M4,M7itp a nie od X,Y czy Z!) X/Y/Z wczytujesz poporstu ldy Xlo ldx Xhi i to wszystko wiedz tutaj nic to nie przyszpieszy...

77

(89 odpowiedzi, napisanych Programowanie - 8 bit)

hehe laoo ;)
niezle, nawet bardzo, przy duzej ilosci punktow zysk bedzie znaczacy,
tylko trzeba by bylo aktualna procke mnozenia przerobic tak aby korzystala ze wskaznikow do tablic na stronie zerowej, ale to raczej nie problem

78

(89 odpowiedzi, napisanych Programowanie - 8 bit)

bo:

obrot punktu (w 3d)
x'=x*M1 + y*M2 + z*M3
y'=x*M4 + y*M5 + z*M6
z'=x*M7 + y*M8 + z*M9

x,y,z - wartosci 16bitowe
M1..M9 - wartosci 8bitowe

ustawiamy tablice tutaj:

    lda :1 ; A
    eor #$80
    sta zcl
    sta zch
    sta ial+1
    sta iah+1
    eor #$ff
    sta ibl+1
    sta ibh+1
    sta zdl
    sta zdh

A jest inne dla kazdego z 9 mnozen, wiedz przy kazdym mnozeniu musimy ustawic za kazdym razem te wskazniki do tablic od nowa...

lda :3
eor #$80
tax ; b-hi
...
ldy :2 ; b-lo

w B mamy wartosc x,y albo z (i tylko te wartosci sie powtarzaja)
wiedz jedyne co mozemy tutaj zrobic, to tylko raz wyliczyc "lda :3 eor #$80" a potem zamiast "lda :3 eor #$80 tax" dac samo "ldx costam"

jak by te 8bitowe wartosci sie powtarzaly to oczywiscie mozna by bylo zamiast 9 razy ustawiac tablice zrobic to tylko 3 razy, niestety wartosci ktore sie powtarzaja sa 16bitowe...

79

(89 odpowiedzi, napisanych Programowanie - 8 bit)

Sc0rpi0 napisał/a:

clc
bpl skok
opcode { ldy q}
skok ldy #00

8 lub 7 cykli :)

niezle ;)
jesli dobrze licze to mamy juz 107..118cykli ;)

80

(89 odpowiedzi, napisanych Programowanie - 8 bit)

no fakt myslalem ,ze tam jest A*BHi, wtedy by to dalo gwarancje ,ze po bpl bedzie C wyzerowany...

81

(89 odpowiedzi, napisanych Programowanie - 8 bit)

jellonek napisał/a:

prawdopodobnie chodzi o grafike 3d, tak wiec bedzie mnozenie jakichs tam zbitkow 3 wspolrzednych -> 3 mnozenia pod rzad - pewnie bedzie sie to jakos dalo polaczyc, np. mnozenie 3 wspolrzednych przez ta sama wartosc - odciecie paru cykli na jej kolejne ladowanie do zp, itp.

przy mnozeniu 8x8 ten trick oczywiscie dziala i jest powszechnie uzywany, i dzieki czemu zyskujemy bardzo duzo cykli (dokladnie 19)
ale przy 16x8 niestety tego nie mozna zastosowac...

eru napisał/a:

Oj, coś źle wczoraj w nocy policzyłem cykle, w aktualnej wersji wychodzi mi minimum 107, maksimum 119... no ale i tak sporo lepiej niż poprzednio...

no... teraz 105..117

103..117

w rzeczywistosci to 106..120, bo oczywiscie nie bedziemy mnozyc stalych tylko zmienne ;)

dzieki Eru, wlasnie o taka optymalizacje mi chodzilo ;)


    lda (zch),y
    adc (zdh),y
    ldy #0
    cmp #$80
    bcc *+4
    ; A*Blo is negative
    dey
    clc
ial    adc tal,x

ten kod da sie jeszcze zoptymalizowac o 2 cykle, korzystajac z tricku z instruckja "bit":

ldy #0, cmp #$80,bcc*+4 => 7cykli
ldy #0, cmp #$80,bcc*+4,dey,clc => 10cykli

    lda (zch),y
    adc (zdh),y
    bpl skok
    ldy #$ff
    clc
    dta #{bit $1000}
skok    ldy #0
ial    adc tal,x

bpl skok,ldy #0 <- 5cykli (2 cykle zysku)
bpl skok,ldy #$ff,clc,bit XXXX <- 10 cykli

wiedz uzywjac tego tricku mamy wersje, ktora dziala w 104..120 cykli ;)

82

(89 odpowiedzi, napisanych Programowanie - 8 bit)

laoo->co do ilosci pamieci na tablice, to im mniej tym lepiej, mysle ,ze rozsadna wielkosc to max 16k, tablicowanie wszystkich mozliwych wynikow:
unsigned*signed: 256*256*WORD=128k, unsigned*unsigned: 256*256*WORD=128k, razem=256k hehehehehe
oczywiscie tablice unsigned*signed mozna olac i korzystac z tablicy unsigned*unsigned (ale wtedy trzeba by bylo zmieniac znak jak bedziemy mnozyc unsigned*signed), 256k na tablice mnozenia to "lekki" HARDCORE =0), pozatym watpie zeby to bylo duzo szybsze... (tablica 32k(128*128*WORD) nie starcza aby pomnozyc 16bit*8bit bo mlodszy bajt trzeba traktowac jako UNSIGNED a nie signed, min to tablica 64k(256*128*WORD), ale przy takiej tablicy mysle ,ze szybkosc bedzie porownywalna z wersja na tablicach kwadratow, poniewaz trzeba w niektorych wypadkach odwracac zarowno A jak i B)

eru->zapytac sie Fox'a to dobra idea, on ma w tej dziedzinie chyba najwieksze doswiadczenie ;)

Sc0rpi0->szczerze to nie wiem jak to dziala, ale jesli jest 2-2,5 razy wolniejsza to w moim przypadku sie raczej nie przyda ;)

83

(89 odpowiedzi, napisanych Programowanie - 8 bit)

Sc0rpi0 napisał/a:

clc lda int4+3, bpl dodatnia,
lda #$01, sbc int4 sta int4
lda #$00 sbc int4+1...
lda #$00, sbc int4+3, sta int4+3
dodatnia: ... C=0

no jesli zalozyc ,ze zawsze po operacji mnozenia bedzie sie dodawac to zyskamy 2 cykle, jesli B jest ujemna, zawsze cos ;)

laoo/ng napisał/a:

A mnie ciekawi dlaczego wymagana jest taka dokladnosc, ze wynik musi byc 24-bitowy. Dlaczegoby nie olac najmlodszych 8 bitow wyniku?

oczywiscie mnozenie bedzie uzywane do obrotow punktow:

X'=(M1*X + M2*Y + M3*Z) / 128

dzielnie liczby 24bitowej przez 128 to tylko 15cykli (niezaleznie od tego czy jest ujemna czy nie! - przy 16bitowej liczbie trzeba by bylo to sprawdzac...), jesli by olac ostatnie 8bitow to bysmy mieli dzielnie przez 256 i mniejsza dokladnosc (w wysokiej rozdzielczosci to tak nie przeszkadza ale w rozdzilczosci powiedzmy 80x48 cos takiego jest bardzo widoczne bo obiekt przy obrocie trzesie sie jak galareta)

84

(89 odpowiedzi, napisanych Programowanie - 8 bit)

http://manta.univ.gda.pl/~pwisnie/math.zip - tutaj jest przyklad.

Dodam jeszcze ,ze tablice to funkcje f(x) = (x*x)/4, a format liczb znak/modul jest inny niz standardowy! tzn liczba $81 to jest $1, $92 to $12, $01 = -2 (dlatego robimy operacje eor #$80), jest to pomysl FOX'a, dzieki takiej reprezentacji nie bedziemy mieli przepelnienia mnozac liczbe np. 128*63, bez eor #$80 i uzywajac zwyklych tablicach tzn ,takich ze f(81) = (-127*-127)/4, jesli (a+b)>127 lub (a+b)<-128 to otrzymamy bledny wynik...

85

(89 odpowiedzi, napisanych Programowanie - 8 bit)

Jeśli używasz makro to czemu stosujesz adresowanie lda (zp),y - chba mniej eleganckim choć szybszym sposobem byłoby zastosowanie kodu samomodyfikującego się np.

sta tu1 ; ssqrl1


lda $8000,y
tu1 equ *-2

zyskasz 1 cykl na kazdej takiej operacji

troche zle policzyles cykle, bo zysk bedzie zerowy "sta adres" zjada 4cykle a nie 3(chyba ,ze procka by byla na stronie zerowej co raczej odpada bo trzeba by bylo korzystac z jsr/rts co zjada 12cykli ;>), "lda $8000,y" jest o jeden cykl szybsza niz "lda ($00),y" ale ten 1 cykl zysku traci sie po przez "sta adres16" zamiast "sta adres8"

z usunieciem eor #$80 / eor #$ff i zrobieniem dodatkowych tablic to dobry pomysl ;)
ale z "lda :1 eor #$80 tay" chyba juz nie bedzie tak latwo, aby to zastapic samym "ldy :1"

zastosować mnożenie dodatnie i osobno ujemne - tutaj przy rozpisaniu tablic można zrobić wypieprzenie tego eor #$ff ,clc , adc #1 - zmieniając kolejność w tablicach przy ujemnych liczbach!

no tak tylko ,ze uwzgledniajac tyle mozliowsci te tablice beda juz zajmowac ~32k, zmiana bankow zajmuje tez troche cykli, wiedz moze byc to nie warte zachodzu...

dzieki za odpowiedz, zachwilke wysle przyklad na mail'a

86

(89 odpowiedzi, napisanych Programowanie - 8 bit)

Aha, jeszcze jedno... moze da sie oszczedzic i uzyc tych samych komorek do mnozenia hi i lo bajtu B, gdybys normalizowal A i B zeby byly dodatnie oba, sprawdzil znak (A XOR Bhi) i mial 2 wersje w zaleznosci od tego znaku (produkujaca dodatni lub ujemny wynik

oczywiscie da sie i dzieki czemu zaoszczedziemy ~16cykli ale wtedy w razie konieczonosci trzeba by bylo dodatkowo odwracac A a to strata 24cykli na odwrucenie i 5/6 cykli na sprawdzenie znaku (w aktualnej wersji nie trzeba A odwracac), wiedz to by bylo szybsze jesli A>=0, a jesli zalozyc ,ze rozklad liczb dodatnich i ujemnych bedzie taki sam to raczej na tym stracimy... (poniewaz dla ujemnych stracimy 13-14cykli a na dodatnich zyskamy tylko 11-12cykli w stosunku do wersji ktorej aktualnie uzywam)


Aha, i ten wzorek nad kodem cos nie tego

oczywiscie zamiast: A*B = B*(A_LO + 256*B_HI) = A_LO*B + 256*A_HI*B, powinno byc: A*B = B*(A_LO + 256*A_HI) = A_LO*B + 256*A_HI*B (B - liczba 8 bitowa, A - liczba 16bitowa)

stworzyc 2 wersje, jedna dla dodatnich, druga dla ujemnych, zeby sprawdzac znak a tylko raz

dobry pomysl, na pierwszy rzut oka dajacy 2 cykle zysku dla dodatnich i 5 cykli dla ujemnych (albo 5cykli zysku dla dodatnich i 2 cykle zysku dla ujemnych - w zaleznosci od tego w jakiej kolejnosci umiesicmy podprocedury)

- Twoja metoda odwracania znaku liczby (lda liczba, eor #$ff, (clc ,) adc #(0/1), sta liczba) da sie zastapic szybsza: lda #0, (sec ,) sbc liczba, sta liczba. Oszczedzasz 3*2=6 cykli.

huhu faktycznie 6cykli zysku, to juz cos! dzieki wielkie! ;)

87

(89 odpowiedzi, napisanych Programowanie - 8 bit)

potrzebuje szybkiej procedury do mnozenia liczb 16bitowych ze znakiem razy liczbe 8bitowa ze znakiem.
Aktualnie moja procka wyglada tak i korzysta z zaleznosci ,ze:
A*B = B*(A_LO + 256*A_HI) = A_LO*B + 256*A_HI*B

; 16bit signed by 8bit signed multiplication
;
; input: a=:1, b=:2,:3
; return: a*b=:4 (24bit result)
;
smul16 .macro ' '
    lda :1
    bpl pos
    eor #$ff
    clc
    adc #1
pos    sta sqr1l
    sta sqr1h
    eor #$80
    sta ssqr1l
    sta ssqr1h
    eor #$ff
    sta ssqr2l
    sta ssqr2h
    eor #$80
    sta sqr2l
    sta sqr2h

    sec
    lda :3 ; hi
    eor #$80
    tay
    lda (ssqr1l),y
    sbc (ssqr2l),y
    sta :4+1
    lda (ssqr1h),y
    sbc (ssqr2h),y
    sta :4+2
    sec
    ldy :2 ; lo
    lda (sqr1l),y
    sbc (sqr2l),y
    sta :4
    lda (sqr1h),y
    sbc (sqr2h),y

    clc
    adc :4+1
    bcc t0
    inc :4+2
t0    sta :4+1
    lda :1
    bpl endmul
; fix sign
    lda :4
    eor #$ff
    clc
    adc #1
    sta :4
    lda :4+1
    eor #$ff
    adc #0
    sta :4+1
    lda :4+2
    eor #$ff
    adc #0
    sta :4+2
endmul
.endm

sqrl1 to tablica funkcji f(x) = (x*x)/4 gdzie x jest liczba bez znaku
ssqrl2 to tablica funkcji f(x) = (x*x)/4 gdzie x jest liczba ze znakiem
(dla przypomnienia: a*b = f(a+b) - f(a-b) )

takie cos zajmuje srednio ~130cykli, w najgorszym wypadku 156...
problem polega na tym ,ze tracimy ~40cykli na zmiane znaku wyniku (i mnoznika)
czy da sie jakos sprytnie skonstruowac tablice, tak aby nie tracic czasu na te operacje?
gdzies kiedys czytalem na jakims forum c64 ,ze da sie pomnozyc 16bitsigned by 8bit signed w <100cykli, mysle ,ze ich procedura byla podobna tylko miala lepsze tablice, tak ,ze nie trzeba bylo odwracac wyniku, dzieki czemu mogli to zrobic w <100cykli...
pytanie tylko jak takie tablice maja wygladac...

88

(5 odpowiedzi, napisanych Scena - 8bit)

wlasnie skonczylem wersje finalna dema z Forever HEX. Mozna ja pobrac tu: http://manta.univ.gda.pl/~pwisnie/pm_fin.zip. Cale demo w sumie zostalo napisane od nowa, dzieki czemu dziala troche szybciej. Dodalem takze "end part" czyli brakujaca scene z wersji z party. Reszta to zmiany kosmetyczne ;)

89

(29 odpowiedzi, napisanych Sprzęt - 8bit)

alex napisał/a:

Wiadomo, wszystko zależy od opóźnień, ale jeśli np. w grze trzeba szybko ruszać joystickiem, to ruchy będą tak samo szybkie jak normlnie ale odrobinke opóźnione. Zresztzą skoro w Doom'a i inne gry sieciowe grają ludzie z całego świata i jakoś to wszystko chodzi to czemu by to nie miało sie sprawdzić z atarowskimi hitami ;)

klopot w tym ,ze w tych grach pobieranie danych od klienta (uzytkownika) nie jest tak rozwiazany jak w grach na atari...
np w Quake wyglada to mniej wiecej tak: jesli gracz wykona jakis ruch nastepuje wysylanie pakietu z ta informacja do servera, teraz server wysyla ta informacje do wszystkich graczy, teraz jak gracz otrzyma informacje ,ze on lub jakis inny gracz/obiekt wykonal ruch wykonuje go (wiedz w tym momecie sa pewne opoznienia), tylko ,ze teraz ten ruch bedzie sie wykonywal przez iles tam nastpenych klatek (poniewaz gracz tam nie przesuwa sie o wsporzedne rzedu -1/+1(tak jak to ma miejsce na atari) a o wartosci zmiennoprzecinkowe tzn. jesli gracz wykona ruch do przodu o vector np. [0.0, 2.0, 0.0] to w zaleznosci od szybkosci poruszania sie gracza (i ilosci klatek na sekunde na danym komputerze) co klatke ten gracz bedzie wykonywac ruch o np. [0.0, 0.2, 0.0] wiedz wykonanie calego ruchu zajmie mu 10klatek i to daje sporo czasu na wyslanie lub odbior nowych pakietow dzieki czemu mimo np. pingu 300 da sie uniknac "zabich skokow"

na atari jak by byl ping 300 to w ciagu sekundy byly by mozna wykonane max 3-4 ruchy gracza... w innych grach typu Quake itp tez ale jak juz wczesniej wspominalem tam te 3-4 ruchy starczyly by aby zajac 1sekunde na ich wykonanie dzieki czemu gracze caly czas by plynnie sie poruszali i nie bylo by zadnych przeskokow, na atari gracz by wykonal tylko 3-4 ruchy na 50 mozliwych (tzn przesunol by sie np. o 3-4pixele chociaz moglby w tym samym czasie przesunac sie o 50pixeli)

chodzi mi o to,ze gry na atari nie byly pisane pod katem gry sieciowej ;)

wezmy prosty przyklad: niech jeden gracz ma caly czas joy'a w prawo, w grze w ktorej poruszamy postacia w prawo i w lewo o 1 pixel. Przy pingu stalym <20ms bedzie wszystko ok postac plynnie bedzie sie poruszac w prawo. Przy pingu ,ktory chodz przez chwile bedzie miec opoznienie >20ms nastapi "zabi skok" poniewaz pakiet nie zdazy dojsc w odpowiednim momecie do Atari i postac jako ,ze interfejs nie otrzymal stanu joysticka pozostanie przez 1/50 sekundy w miejscu
jak cos takiego bedzie wystepowac troche czesciej niz 1 raz na sekunde bedzie to napewno widoczne.
w sumie mozna bylo by to rozwiac tak ,ze jesli interfejs na czas nie otrzymal by odpowiedzi od gracza moglby powtorzyc ostatni komunikat jaki dostal od gracza, dzieki czemu zostal by usuniety problem z "zabimi skokami" i przy pingu <50ms dalo by sie sensownie grac, ale przy pingu wiekszym powielanie ostatniego stanu joysticka dalo by efekt slizgania sie postaci na lodzie...

moze zbytnio teoretycznie i za bardzo sie czepiam ;) ale mysle ,ze problem z obsluga i przesylaniem pakietow powinien byc rozwiazany w pierwszej kolejnosci...

90

(29 odpowiedzi, napisanych Sprzęt - 8bit)

pomysl moze i ciekawy, ale teoretycznie wiekszosc gier na atari dziala w tepie "1raz na ramke" co oznacza ,ze stan joysticka jest sprawdzany 50razy na sekunde, wiedz ,zeby nie bylo by zadnych opoznien ping pomiedzy dwoma kompami podpietymi do internetu powinien byc <20ms, a raczej malo osob moze sie pochwalic takim dobrym laczem...
synchronizacja polaczenia by w pewnym sensie zalatwila sprawe, ale sterowanie bylo by bardzo "skokowe", pomiejajac nieregularny "ping" i packet lost...
przez co wiekszosc gier stala by sie srednio grywalna wlasnie ze wzgledu na sterowanie...

91

(21 odpowiedzi, napisanych Programowanie - 8 bit)

Hej!
Jesli chodzi o jezyk programowania to polecam asemblera, jest to jedyny sensowny jezyk w jakim mozna programowac na atari i wcale nie taki trudny jak niektorzy mowia. Jesli masz juz jakies doswiadczenie/pojecie o programowaniu to nie trac czasu i nie zawracaj sobie glowy Turbo Basic'em, Action! itp. Asembler naprawde nie jest taki trudny na jaki wyglada, poprostu trzeba miec troche inne podejscie.
Jesli chodzi o kompilatory to pod Windowsa polecam xasm (bardzo szybki i dobry kompilator) oraz MADS, ktorego sam ostatnio uzywam (o wiele wolniejszy ale za to ma to czego nie ma xasm a co bardzo upraszcza sprawe w duzych projektach - MAKRA! wiedz jesli nie masz takiego trupa jak ja tylko jakis szybszy komp to nie powinno ci to robic problemu), jest jeszcze hardcore assembler Epiego, ktory jest mega szybki i posiada tez makra itp (niestety narazie nie kojarze aby byl dostepny publicznie :( ). Co do linuxa to jest pewien crossasembler ale nie pamietam nazwy ^__^
wszystkie wyzej wymienione programy sa to crossasemblery i mysle ,ze o wiele wygodniej i lepiej jest pisac na PC+emulator niz siedziec przy Atari (sam kiedys wolalem siedziec i programowac na real Atari, ale teraz poprostu wiem ,ze napisanie wiekszego projektu bylo by prawie nie mozliwe, w najlepszym przypadku bardzo utrudnione), pod Emulcem masz swietny Debuger oraz nieporownywalna wygode pracy.

Co do petli FOR to najprostrza wyglada mniej wiecej tak w C++:

  for (char i=0; i<64; i++)
  {
    tmp=tmp+i;
  }

natomiast w Asemblerze 6502 tak:

  ldx #0 ; int i=0
loop
  txa
  clc
  adc tmp
  sta tmp ; tmp=tmp+i
  inx ; i++
  cpx #64
  bne loop ; skoczy gdy X<64 (dokladniej gdy nie rowne 64)

instrukcja IF to tez prosta sprawa

C++
  if (A==B)
    ...


Asm6502:
  lda A
  cmp B
  bne endif
; A=B
  ...

endif

i drugi przyklad

C++
  if (A>=B || A<C)
  {
    ...
  }
  ...


Asm6502:
  lda A
  cmp B
  bcs warunekspelniony ; skocz gdy A>=B
  lda A
  cmp C
  bcc warunekniespelniony ; skocz gdy A>=C
warunekspelniony
  ...

warunekniespelniony
  ...

a co do ogolnego programowania to wcale nie musisz znac na poczatku sprzetu ;) w praktyce (bynajmniej jesli chodzi o prace "scenowe") wystarczy podstawowa znajomosc ANTIC'a + wiadomoci o organizacji pamieci ekranu oraz w jaki sposob dane sa przechowywane w pamieci komputera. Jesli miales juz stycznosc z programowaniem to po zalapaniu tego nie powinno byc klopotow (no dopoki nie bedzie ci potrzebne szybkie mnozenie lub inne "nienaturalne" operacje matematyczne ;> ale to juz troche inny temat)

pifarek napisał/a:

Mam nadzieje, że ktoś odpowie na chociaż jedno pytanie. Naprawdę chciałbym napisać coś na Atari i mieć satysfakcję (chodźby dla samego siebie), ale musze mieć jakieś pojęcie. Jestem chyba jednym z najmłodszych fanatyków Atarynki (na karku mija 19 rok życia) i napewno dzięki czemu mam więcej czasu.

No ja tez mam jeszcze 19lat ;P
A co do wolnego czasu to roznie ale i tak nie narzekam...
jak bys mial jakies pytania/problemy to wal do mnie na GG:2342303 z checia pomoge

92

(58 odpowiedzi, napisanych Scena - 8bit)

hmm kiedys juz nad tym myslalem, z ta roznica ,ze zamiast menu, demo bylo by podzielone na czesci w starym dobrym stylu (cos ala Overmind). Kazdy part nie musial by byc koniecznie powiazany z reszta, ale wymagane by bylo ,zeby konczyl sie bez interwencji uzytkownika i mial jakies limity czasowe. Wszystko potem mozna bylo by poskladac w jedno duze Mega Demo, muzycy skomponowali by do kazdej czesci dema jakas muzyke, graficy mogli by porobic roznego rodzaju logosy, ktore moglyby wypelniac czesc ekranu nie zajeta przez efekt, oraz zrobic fullscreeny na czas doladowywania kolejnego efektu.
Przydalo by sie zrobic aby efekt zarowno wchodzil jak i konczyl sie plynnie, zeby wszystko ladnie i spojnie wygladalo (ten kto ogladal dema na c64 wie o co mi chodzi).
Ostatnia faza bylo by polaczenie wszystkiego w sensowna calosc i napisanie irq-loadera (o czym ja wogole nie mam pojecia :>).
Mysle ,ze bez klopotu znalazlo by sie nie mniej niz 4programistow, paru muzykow i grafikow, szczegolnie ,ze wiekszosc osob nie ma czasu na zrobienie samemu czegos wiekszego, teraz moglaby sie wykazac, wkoncu napisanie 1-2efektow to naprawde nie duzo czasu (jesli demo mialo by byc wystawione na Quast2k6 to mamy niespelna rok, czyli kupe czasu)

napoczatku jednak nalezalo by pomyslec nad koncepcja tego dema, mysle ,ze dobrym rozwiazaniem bedzie totalny Oldschool (juz odrazu nasuwa sie tytul dema: "Back To Basic" :>), czyli efekty raczej w trybach Nie-GTIA (chociaz moga byc wyjatki :>)
uwzgledniajac nowe "wynalazki" typu G2F itp, poniewaz jak by nie patrzec, oprocz dema Jaskier'a wprzeciagu kilku lat nie pojawilo sie zadnego demo, ktore mozna by bylo nazwac Oldschool'owym (pomijajac to ,ze wszystkie laza na mutacjach trybu 9)

oczywiscie pisze sie na ten projekt i pomoge w jego realizacji jak tylko bede mogl!

93

(4 odpowiedzi, napisanych Programowanie - 8 bit)

oczywiscie wszystko zalezy jaka to bedzie "obrobka". Teksturowanie napewno bedzie wolniejsze bo juz je testowalem jakis czas temu ;) co do blur'a to sie nie wypowiem, wszystko zalezy od algorytmu, dla dokladniejszego blur'a prawdopodobnie sposob z buforem 1bajt/pixel bedzie szybszy i wygodniejszy, poniewaz trzeba bedzie odczytywac kilka pixeli (co napewno bedzie szybsze niz bawic sie z nibblami), w sumi gdyby sie zastanowic to mozna dojsc do wniosku ,ze wszystkie algorytmy ktore wymagaja odczytu zawartosci pixela powinny dzialac szybciej z buforem 1bajt/pixel, bo caly klopot to wlasnie odczyt pixela z bufora (trzeba ANDowac albo uzywac do tego tablic) a nie zapis...

jedno jest pewne, taka organizacja ekranu jest "ladna" z punktu widzenia programisty bo wtedy bardzo przyjemnie sie pisze program, z szybkoscia bywa roznie ;)

trzeba jeszcze wziosc pod uwage, ze czyszczenie takiego bufora zajmuje 2 razy wiecej czasu niz czyszczenie ekranu, poniewaz bufor bedzie 2 razy wiekszy niz pamiec ekranu...

a co do:

lda kolor
ldy pos_x
sta (screenp),y

policzmy cykle: 3+3+6=12cykli na zapis do bufora, teraz dodamy jeszcze cykle jakie sa potrzebne zeby "skonwertowac" pixel:

ldx backbuf
lda mul16tb,x
ora backbuf+1
sta screen

mamy 4+3+4+4=15cykli/per two pixels, czyli srednio 8cykli na pixel, dodajmy to 12+8=20 cyki, do tego jeszcze dochodza 4 dodatkowe cykle na czyszczenie bufora, 10+4=24 i tyle potrzeba cykli aby postawic 1 pixel.

teraz normalna procka do stawiania pixeli (na nibblach):

ldx pos_x
ldy div2tab,x
lda (scr),y
and maska,x
ora kolor,x
sta (scr),y

3+4+5+4+4+6=26cykli

hmm czyli teoretycznie wyglada na to ,jesli dobrze wszystko obliczylem ,ze stawianie pojedynczych pixeli jest szybsze w trybie "chunk" o 2 cykli T___T, ale napewno jest wolniejsze niz stawianie kilku pixeli na raz, bo procka na nibblach by wygladala mniej wiecej tak:

ldx kolorpixelapierwszego
lda mul16tb,x
ora kolorpixeladrugiego
sta (scr),y
iny
...

co by dawalo 3+3+3+6+2=17cykli/per two pixels, czyli 8/9 cykli na pixel

a w "chunk" wygladalo by to tak:

lda kolorpixelapierwszego
sta (scr),y
iny
lda kolorpixeladrugiego
sta (scr),y
iny

3+6+2 + 3+6+2 = 22cykli na zapis do bufora + 8 cykli na wyczyszczenie bufora + 15cykli na konwersje, czyli mamy razem 35cykli/per two pixels!!! czyli 17-18cykli na pixel!!! co jest dwa razy wolniejsze niz ta sama procedura na niblach....

94

(4 odpowiedzi, napisanych Programowanie - 8 bit)

    ldx backbuf
    lda mul16tb,x
    ora backbuf+1
    sta screen

    ldx backbuf+2
    lda mul16tb,x
    ora backbuf+3
    sta screen+1

    ldx backbuf+4
    lda mul16tb,x
    ora backbuf+5
    sta screen+2

    ...

mul16tb    dta $00,$10,$20,$30,$40,$50,$60,$70
    dta $80,$90,$a0,$b0,$c0,$d0,$e0,$f0

zamiast wpisywac do bufora $aa, $99 itp wpisujesz: $0a, $09 dzieki czemu nie trzeba bedzie uzywac operacj AND.
backbuf to tylni bufor gdzie zapisany jest obraz w formacie 1pixel/bajt
screen to adres pamieci obrazu, tak rozpisana procka powinna bez klopotu zmiescic sie w 1 ramce (umieszczajac tablice mul16tb na stronie zerowej zyskasz o 1920bajtow krotsza procedure i o tyle samo cykli szybsza (dla rozdzielczosci 80x48))

tak z ciekawosci po co Ci cos takiego?
przeciez przez taka orgazniacje bufora wszystkie operacje beda prawie 2 razy wolniejsze (pomijajac procedure chunk2nibble), bo zamiast wypelniania 2cykli/pixel bedziesz miec 4cykle/pixel, prosciej mowiac zeby postawic 4 pixele trzeba:

sta buffor
sta buffor+1
sta buffor+2
sta buffor+3

zamiast

sta screen
sta screen+1

operacje na nibblach sa bardzo proste i szybkie nawet dla 6502 wiedz nie widze wogole sensu robienia czegos takiego

95

(28 odpowiedzi, napisanych Software, Gry - 8bit)

sorry, za lekkie spoznienie...
tutaj mozna zassac skany: http://83.18.144.22/~pr0be/corewars.zip.

96

(28 odpowiedzi, napisanych Software, Gry - 8bit)

sqward nie bede musial, juz zalatwilem ;)
dzisiaj ~21 wrzuce...

97

(28 odpowiedzi, napisanych Software, Gry - 8bit)

zgadza sie, Wojny Rdzeniowe byly w czasopismie "Moje Atari" 6/91, mam wlasnie ten numer przed soba, ale nie mam niestety skanera, popytam sie kumpli moze ktos w poblizu ma, to zeskanuje...

98

(5 odpowiedzi, napisanych Bałagan)

tak np. Paint Shop Pro przy zmianie palety kolorow z 24bit (RGB) na 16kolorow ustawia je w kolejnosc od najciemniejszego do najasniejszego i taka bitmape mozna bez klopotu wczytac na atari.

99

(39 odpowiedzi, napisanych Bałagan)

hehe tez kiedys nad tym myslalem ;)
pomijajac fakt wygenerowania tych obrazow oraz ich przechowania, to niestarczylo by nikomu zycia aby przejzec chociazby 1/10000000 tych zdjec, pomijajac juz fakt ,ze 99,9% tych obrazow nie nadawalo by sie wogole do ogladania ;)

100

(36 odpowiedzi, napisanych Programowanie - 8 bit)

seban napisał/a:

ha!
a i jeszcze jedno na początku wersji zaproponowanej przez Probe z inx,inc powinniśmy mieć wszyscy LDX #0 :) wiec dochodzą nam dwa bajty :(

zalezy jak na to patrzec ;)
jesli ma byc to procka do depakowania tylko 1 segmentu danych to tak, jesli np. tych segmentow danych jest wiecej, jest wrecz przeciwnie LDX #<dane zajmuje 2 bajty, a LDA #<dane sta _src+1 az 5 ;)

tak czy inaczej jesli procka Marok'a naprawde dziala to Respect dla niego! ;)