tak Windows

nawet nie wiem jak się zabrać za profilowanie kodu, mam dokonać nowej kompilacji Atari800 ? czym ? Visual C ?

nie wykluczone że ktoś jeszcze może mieć pomysł na przyspieszenie w/w fragmentu gry, dlatego jestem ciekaw pomysłów

oto fragment kodu KL który prosi się o przyspieszenie i rezygnacje z przesuwania bitów, jest on w dużej mierze odpowiedzialny za spowolnienia działania gry, realizuje przepisanie danych z bitmapą kształtu i maski do buforów, następnie przesuwa N-krotnie bity w tychże buforach

ogólnie KL na podstawie rodzaju obiektu wykonuje obsługę bitmapy statycznej lub bitmapy ducha (ducha jak bohater, przeszkadzajki, przedmioty do zebrania)

bitmapy z kształtem jak i maską zapisane są standardowo bo liniowo, np. dla bitmapy o szerokości 3 bajtów mamy

012
345
678
9 ..... itd.


E_1B92  program realizujący obsługę ruchomych obiektów (bohater, przeszkadzajki, przedmioty), który prosi się o dopalacze :)

E_0378    przechowuje aktualny kierunek, przyjmuje wartości 0 lub 7, 0 dla kierunku w górę, 7 dla kierunku w dół, na podstawie kierunku podejmowana jest decyzja czy dokonywać lustrzanego odbicia bitmapy czy nie

E_0400    bufor dla bitmapy z kształtem (256 bajtów)
E_0500    bufor dla bitmapy z maską kształtu (dla operacji AND) (256 bajtów)

E_000E+1 zmienna przechowująca wysokość bitmapy
E_001B+1 zmienna przechowująca wysokość bitmapy

E_0046  zmienna przechowująca szerokość bitmapy (przepisywana do zmiennych E_004E i E_004F)

E_004D    zmienna przechowująca wartość ofsetu względem początku strony pamięci, dane w buforach E_0400 i E_0500 umieszczane są tak aby kończyły się na ostatnim bajcie strony, dzięki temu nie trzeba dokonywać dodatkowych testów wystarczy INY\ BNE LOOP

E_0050    zmienna w której przechowywana jest liczba bitów (pixli) do przesunięcie (przesuwa w prawo przez ROR)

mirror    tablica pod adresem $5300 (256 bajtów) z predefiniowanymi wartościami, przy jej pomocy dokonywane jest lustrzane odbicie bitmapy


E_1AA2    ldx E_0047
    lda temp1+$d8,x
    beq E_1AA1
    cpx E_0070
    bcs E_1AB2
    lda E_0670,x
    bmi E_1A9E
E_1AB2    lda E_03A0,x
    sta E_0045

    lda E_0378,x
    pha
    lda E_0350,x
    clc
    adc E_0300,x
    sec
    sbc #$20
    pha
    and #$F8
    sta E_0012+1
    sta E_005A
    pla
    and #$07
    sta E_0048
    beq E_1AD5
    inc E_0045
E_1AD5    lda E_0045
    asl @
    asl @
    asl @
    adc E_005A
    sta E_005B
    ldx #$00
    ldy #{inx}
    pla
    beq E_1AEA
    ldx E_0045
    dex

    ldy #{dex}
E_1AEA    sty E_1B04

    lda #{nop}
    sta E_0020
    sta E_0021
    sta E_0022

    lda E_0012+1
    lsr @
    lsr @
    lsr @
    tay

E_1AFB    mva    E_0400,y    E_0052,x
    mva    #{inx}        E_001E,x
E_1B04    inx
    iny
    dec E_0045
    bne E_1AFB

    ldx E_0047
    lda E_0500,x
    cmp #$13
    bcc E_1B17
    clc
    adc E_0670,x

E_1B17    tay
    lda E_0300,x
    lsr @
    sta E_001B+1

    lda #$90
    sec
    sbc E_0350,x
    lsr @
    clc
    adc E_001B+1
    adc E_0328,x
    sec
    sbc E_2E66,y
    pha
    lsr @
    lsr @
    lsr @
    sta E_001B+1

    lda #$6A
    clc
    adc E_001B+1
    bmi E_1B8B
    sta E_0008+1
    pla
    and #$07
    eor #$07
    sta E_0006+1

    lda E_03A0,x        ; szerokość bitmapy
    sta E_0046

    lda bmpHeights,y
    sta E_000E+1
    sta E_001B+1
    tya
    asl @
    tay

    mva    bmpAddress,y    E_0049
    clc
    adc <msk0-bmp0        ; młodszy bajt ofsetu do maski bitmapy
    sta E_004B

    mva    bmpAddress+1,y    E_0049+1
    adc >msk0-bmp0        ; starszy bajt ofsetu do maski bitmapy
    sta E_004B+1

    ldy E_0046        ; 0-szerokość_bitmapy*wysokość_bitmapy
    lda #$00        ; obliczamy ofset aby umieścić dane pod koniec strony buforów E_0400, E_0500
E_1B6B    sec            ; dzięki temu będzie można osiągnąć koniec kopiowania po INY\BNE (bez dodatkowych testów)
    sbc E_000E+1
    dey
    bne E_1B6B

    sta E_004D        ; obliczona wartość ofsetu

    lda E_0048
    bne E_1B92        ; skok do obsługi bitmap z duchami

    ldx E_004D        ; przepisujemy statyczną bitmapę
    ldy #$00
E_1B7B    mva    (E_0049),y    E_0400,x
    mva    (E_004B),y    E_0500,x
    iny
    inx
    bne E_1B7B
    beq bmpMirror        ; w tym wypadku zachowa się jak JMP

E_1B8B    pla
E_1B8C    lda #$FF
    sta E_0638,x
    rts


* ---    SPRITE ENGINE

E_1B92    lda E_0378,x        ; program dla ruchomych elementów gry (bohatera, przeszkadzajek i przedmiotów)
    eor E_0048
    cmp E_0048
    beq E_1B9E

    clc
    adc #$01
E_1B9E    sta E_0050        ; przesunięcie pozycji poziomej z duchem

    lda E_0046        ; szerokość bitmapy
    sta E_004E
    sta E_004F

    lda E_004D
    sec
    sbc E_000E+1
    sta E_004D
    tax
                ; skopiowanie bitmapy do bufora E_0400 i maski do bufora E_0500
    ldy #$00
E_1BB0    mva    (E_0049),y    E_0400,x
    mva    (E_004B),y    E_0500,x
    inx
    iny
    cpy E_004F
    bne E_1BB0

    mva    #$00    E_0400,x    ; wstawiamy pustą wartość $00 do bufora z bitmapą kształtu
    mva    #$FF    E_0500,x    ; wstawiamy pusta wartość $FF do bufora z bitmapą maski
    inx                ; puste wartości są potrzebne dla operacji przesuwania bitów

    lda E_004F
    clc
    adc E_004E
    sta E_004F

    dec E_001B+1
    bne E_1BB0


    ldy E_0050        ; przesunięcie pixli bitmapy kształtu i bitmapy maski

E_1BD8    ldx E_004D        ; liczba powtórzeń pętli w zmiennej E_0050
    clc
E_1BDB    ror E_0400,x    ; kształt
    inx
    bne E_1BDB

    ldx E_004D
    sec
E_1BE4    ror E_0500,x    ; maska
    inx
    bne E_1BE4
    dey
    bne E_1BD8

    inc E_0046


bmpMirror
    ldx E_0047

    ldy #+8
    lda E_0378,x
    beq E_1C1C

    ldy E_004D            ; dokonuje lustrzanego odbicia bitmapy z duchem
E_1BFA    ldx    E_0400,y
    mva    mirror,x    E_0400,y

    ldx    E_0500,y
    mva    mirror,x    E_0500,y
    iny
    bne E_1BFA

    ldx E_0046
    dex
    txa
    asl @
    asl @
    asl @
    adc E_0012+1
    sta E_0012+1

    ldy #-8
E_1C1C    sty E_0037+1

    mva    E_0012+1    E_001B+1
    mva    #$52        E_0000+1
    mva    E_004D        E_0004+1

    jsr    PUTShape

    ldx E_0047
    cpx E_0070
    bcs E_1C47

    mva    E_0008+1    E_0638,x
    mva    E_0012+2    E_0654,x
    mva    E_005A        E_0600,x
    mva    E_005B        E_061C,x

E_1C47    rts

jakieś propozycje ?

pamięci wolnej pod ROM-em i w RAM-ie trochę jest, tak że można rozpisywać i tablicować do woli

1,405

(26 odpowiedzi, napisanych Scena - 8bit)

a ja poproszę o demo gry Crysis

1,406

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

Pin napisał/a:

bez urazy - lecz mam nadzieję, iż znikoma ilość koderów "wpadnie" na tak dobry pomysł by ładować kod od $0000 :)

Knight Lore zajmuje m.in. obszar $0000..$2000 i pewnie inne konwersje XXL-a gier z BBC Micro także

XXL trochę się nagimnastykował aby to pociąć na kawałki, upchac do pamięci i potem poprzenosić w odpowiednie miejsca, dla kodera wygodniej jest gdy ma wgląd w kod jako ciągły obszar, kiedy program jest już skończony można go przystosować do innej mniej czytelnej formy

widocznie na innych platformach sprzętowych ładowanie od $0000 to nie problem :)

1,407

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

xxl napisał/a:

kart to jest swietny nosnik, loadera dla takiej gry mozna sobie napisac w doslownie kilkunastu bajtach. pierwsze co robimy to odlaczamy OS Atari :-) i cala pamiec dla nas, mozemy ladowac program od adresu $0000 a z dyskietki? pewnie $2000.

XXL mam taki loader który wykorzystuje dodatkowe banki pamięci aby załadować plik do pamięci podstawowej $0000..$CFFF, $d800..$ffff  -$100 bajtów na loader

1,408

(9 odpowiedzi, napisanych Fabryka - 8bit)

Knight Lore działa na znakach, nie jest to tryb bitmapy, stąd większa komplikacja, dla bitmapy nie trzeba się cackać z każdym znakiem, obliczać jego adres itp. można walić bajt po bajcie

ogólnie gdyby rozpisać pętle modyfikujące znaki wówczas byłoby to nieznacznie wolniejsze od bitmapy, jednak nie ma na to pamięci w podstawowym ramie

1,409

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

kod gry pisany pod karta jest tylko do odczytu, program nie może modyfikować sam siebie, jest ściślejszy podział na obszar kodu i danych

1,410

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

seban napisał/a:

Teraz sobie przypomniałem... dla turbo 2000F był programik który umożliwiał wczytywanie danych ze spectrum. i Faktycznie na giełdzie na Saskiej prosiłem spectrum-owców aby mi nagrywali mi fajne obrazki z gier ze spectrum na taśmę... w domu czytałem to przy pomocy turbo 2000F i oglądałem te obrazki na ATARI :)

rzeczywiście był taki programik, obrazki pozyskane w ten sposób zostały umieszczone w pierwszej część Happy Demo

1,411

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

dzięki za wyjaśnienie, idea w sumie prosta tylko podejście do tematu różne, ilość oprogramowania i jakość loaderów rzeczywiście wpływała na popularność danego roziwązania, ja przerzuciłem się z T6000 na T2000F właśnie ze względu na lepszy soft, więcej tytułów można było przenieść na turbo

a wiadomo kto pierwszy zapoczątkował sprzętowe modyfikacje magnetów na turbo, czy dużo więcej osób wpadło na ten sam pomysł w tym samym czasie

1,412

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

a tak z ciekawości mógłby ktoś nieuświadomionemu elektronicznie napisać na czym polega Turbo do magnetu Atari XE/XL

pozatym ciekawe dlaczego Atari oferowało tylko normal zamiast turbo jak na C64, czy Turbo do magnetu XE/XL sporo podrażało koszty sprzętu, pomijam marże elektroników którzy montowali systemy turbo

kiedyś specjalnie pojechałem do Warszawy aby zamontować T2000F, poprzednio miałem właśnie Turbo6000, goście z W-wy nie omieszkali skrytykować tego rozwiązania, czym się różniły od strony elektronicznej systemy turbo, z doświadczenia wiem że na T6000 nie udało przenieść się wszystkich rodzaji plików, wersje plikową carta T2000F można znaleźć na http://madteam.atari8.info (zrzut pamięci)

w sumie istniała swego rodzaju wojna zdaje się pomiędzy T2000 i Blizzard, który w końcu okazał się lepszy i dlaczego ?

1,413

(244 odpowiedzi, napisanych Fabryka - 8bit)

no to jeszcze tutaj można dowiedzieć się jak zapisane są informacje o komnatach w Knight Lore, Alien8, Pentagram, można pociągnąć edytor do silnika Filmation na którym działają te gry, można poczytać troche o historii tych gier jak i zmian jakie zaszły w ich kodzie

http://retrospec.sgn.net/users/nwalker/filmation/

p.s.
do edytora Filmation dołączone są wyripowane dane na temat komnat do Knight Lore i Alien8

1,414

(244 odpowiedzi, napisanych Fabryka - 8bit)

stąd można pociągnąć zdisasemblowany w jakimś stopniu Knight  Lore, Alien8 dla ZX Spectrum (dostępne są bitmapy z wyripowaną grafiką dla tych i jeszcze innych gier)

http://www.icemark.com/downloads/index.html

1,415

(244 odpowiedzi, napisanych Fabryka - 8bit)

tak zazdroszcze że na inne platformy można zrobić grywalną wersje tej gry a na Atari 8-bit nie, zamiast dopracować ten tytuł to XXL zaczyna następny, może kiedyś ktoś tą grę przeportował już na Atari 8-bit tyle że nikt nie odważył sie tego wydać, czyżby Atari było za wolne na tą grę

nie ujmuje XXL-owi zasług ale jak za coś się bierze to liczę że zrobi to do końca tak aby przypominało oryginał nie tylko od strony graficznej ale przede wszystkich od strony grywalności

1,416

(244 odpowiedzi, napisanych Fabryka - 8bit)

XXL-a gonią inne konwersje, ma ich do zrobienia setki, tak więc nie przejmujcie się że nie da się grać bo z innymi tytułami będzie jeszcze gorzej :P

1,417

(244 odpowiedzi, napisanych Fabryka - 8bit)

Urborg napisał/a:

A jakby pociski połączyć w piątego gracza? Coś by to zmieniło? Sorki, pytam bo się na tym nie znam.

zyskałbyś dodatkowy kolor z rejestru $d019 (w trybie kolorowej bitmapy jest to kolor inversu znaków), w trybie HiRes rejestr ten nie jest wykorzystywany, ogólnie wszystkie 4 pociski byłyby w kolorze z rejestru $d019

1,418

(18 odpowiedzi, napisanych Bałagan)

gratulacje, córka i synek do kompletu, zachowaj oryginalne opakowanie to nie straci na wartości ;)

1,419

(244 odpowiedzi, napisanych Fabryka - 8bit)

teraz rzeczywiście nie udaje się gry powiesić :)

1,420

(244 odpowiedzi, napisanych Fabryka - 8bit)

drodzy wazeliniarze, Knight Lore nie jest jeszcze skończony

jeśli naciskać często option (F3 pod emulem) skutkuje to w końcu padnięciem emula, już na samym początku na starcie można dokonać w ten sposób crashu emula, raz szybciej się sypnie innym razem trzeba naciskać pare razy więcej

nie jestem pewien czy zmiany pory dnia dzień/noc jest uzależniona od szybkości działania silnika, bo
jeśli nie jest to nie wróże powodzenia ochotnikom chcącym ukończyć grę

spowolnienia w działaniu gry są irytujące, skutkuje to zmianą czułości reakcji na joy-a i przycisk fire,
a można przecież to obejść wystarczy na VBL-u odczytywać joy, fire i zapisywać w dodatkowej zmiennej podobnie
jak czyni to OS z odczytem klawiatury (należy uwzględnić repetycje)

1,421

(47 odpowiedzi, napisanych Bałagan)

ja miałem kłopoty z playerami, Subedit mimo że miał jakiś patch dla 64bit sypał jakimiś wyjątkami, ogólnie nie wszystkie filmy dało się odtworzyć płynnie tak jak na XP, korzystałem z zintegrowanej grafy i karty dźwiękowej

1,422

(244 odpowiedzi, napisanych Fabryka - 8bit)

Nosty zainstaluj pakiet K-Lite Mega Codec Pack (jeśli używasz Windows)

1,423

(244 odpowiedzi, napisanych Fabryka - 8bit)

xxl napisał/a:

@tebe - mozliwe ze te elementy beda mialy kolor panela ale inna jasnosc.

i nie potrzeba do tego DLI, kolory duchów ustawiasz na wartość $00..$0f, szerokość na maxa i zmieni sie tylko jasność pixli grafiki którą przesłonisz duchami/pociskami, tam gdzie nie ma pixli grafiki nie będzie widać ducha/pocisku (grafika koniecznie w inversie, kolor pixli grafiki oczywiście też z przedziału $00..$0f)

1,424

(244 odpowiedzi, napisanych Fabryka - 8bit)

zamiast podbarwiać cały panel można podbarwić tylko jego wybrane elementy, np. okienko słońce/księżyc, kula, ludzik i jego liczba żyć

1,425

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

http://www.lemon64.com/?game_id=2602