1

(237 odpowiedzi, napisanych Fabryka - 8bit)

Trochę ponad 1/3 wysokości ekranu. Kiedy na Altirze wybierze się 14 MHz, pewnie będzie tak samo.

2

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

Ostatnia dzisiejsza wersja ma błąd. Krok po kroku:

1) ładujemy całość
2) przechodzimy do menu
3) wybieramy New game
4) wybieramy którykolwiek z epizodów, np. nr 3, wciskamy Return
5) robimy parę kroków
6) wciskamy Esc, żeby wrócić do menu
7) wybieramy New game - już w tym momencie panel na dole zamienia się w kaszkę
8) wybieramy inny epizod, np. nr 2, wciskamy Return (panel się odtwarza)
9) robimy parę kroków
10) wciskamy Esc, żeby wrócić do menu
11) wybieramy New game (panel = kaszka)
12) wybieramy epizod nr 1, wciskamy Return - w tym mniej więcej momencie następuje zwis, program przestaje reagować na klawiaturę i joystick

https://www.atari.org.pl/forum/misc.php?action=pun_attachment&item=13802

3

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

Jeszcze się przyczepię, bo to trochę pokazuje, jak u tego całego Claude'a jest z myśleniem, a tym samym, z jakością kodu. Mamy takie coś:

00:E9EA:    REP #$20
            LDA $D1
            AND #$7FFF
            ASL
            ASL
            CLC
            ADC #$2C74
            STA $84
            SEP #$20
            LDY #$00
            LDA [$84],Y
            STA $E7
            INY
            LDA [$84],Y
            STA $E8

Jak widać, wersja testowa w końcu używa 16-bitowego akumulatora (i robi to dużo częściej niż poprzednia, naliczyłem 47 wystąpień rozkazu rep #$20). I bardzo dobrze. Ale byłoby lepiej, gdyby to było robione z głową:

1) rozkaz AND #$7FFF jest w ogóle niepotrzebny, a zajmuje 3 bajty i 3 cykle
2) dalej mamy przełączenie na 8-bitowy akumulator (SEP #$20), po czym kod radośnie pobiera z pamięci 16-bitowe słowo bajt po bajcie i takoż bajt po bajcie odkłada je do dwóch kolejnych komórek pamięci.

Powinno być tedy:

00:E9EA:    REP #$20
            LDA $D1
            ASL
            ASL
            CLC
            ADC #$2C74
            STA $84
            LDA [$84]
            STA $E7
            SEP #$20

Oszczędza się 10 bajtów i 15 cykli, głównie dzięki przestawieniu jednego rozkazu w inne miejsce.

Dalej idzie wywołanie podprogramu, który: a) kopiuje owo $E7-$E8 do $EF-$F0, oczywiście znowu bajt po bajcie, robiąc jednocześnie mnożenie przez 8 przez trzykrotne przesunięcie w lewo, oczywiście też bajt po bajcie (tym razem przynajmniej pierwsze przesunięcie robi razem z kopiowaniem, brawo; ale resztę już na pamięci, niebrawo). Chociaż można to zrobić tak:

00:E9EA:    REP #$20
            LDA $D1
            ASL
            ASL
            CLC
            ADC #$2C74
            STA $84
            LDA [$84]
            STA $E7
            ASL
            ASL
            ASL
            STA $EF           
            SEP #$20

W następnym kroku do obliczonej wartości trzeba dodać 256 i zapisać ją pod $BF-$C0. Kod:

            CLC
            LDA $EF
            ADC #$00
            STA $BF
            LDA $F0
            ADC #$01
            STA $C0

Chociaż wystarczyłoby tak:

00:E9EA:    REP #$20
            LDA $D1
            ASL
            ASL
            CLC
            ADC #$2C74
            STA $84
            LDA [$84]
            STA $E7
            ASL
            ASL
            ASL
            STA $EF
            CLC
            ADC #$0100
            STA $BF          
            SEP #$20

Oryginał: 36 rozkazów (w tym dwie pary JSR/RTS), 67 bajtów, 130 cykli CPU.

Modyfikacja: 17 rozkazów, 29 bajtów, 53 cykle CPU. Przy czym STA $E7 może być w ogóle niepotrzebne, jeśli tak, to 16 rozkazów, 27 bajtów, 49 cykli.

4

(237 odpowiedzi, napisanych Fabryka - 8bit)

pajero napisał/a:

Jestem ciekaw ile Wasz team poświęcił na to czasu?  W latach wyszło to ca. per oko?  Ale bez ściemy

Po przejrzeniu zakurzonych archiwów wychodzi mi, że prace nad sprzętem zaczęły się w styczniu 2021 roku. Pierwszy prototyp działał na 7,09 MHz (1,773 x 4). Po paru miesiącach zrobiło się z tego 1,773 x 6 = 10,63 MHz.

W toku tego zdarzały się wielomiesięczne przerwy, ostatnia trwała ok. 6 miesięcy od końca lipca 2024 do lutego 2025, bo po zmianie sprzętu nowy prototyp okazał się bardzo niestabilny i długo trwało, zanim Simius doszedł z tym do ładu.

Firmwarem początkowo był przerobiony ANT.EXE od Antonii I. Natomiast prace nad obecnym firmwarem zaczęły się 10 lutego 2025 (o 23:09, więc w zasadzie to 11 lutego).

5

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

w1k: wrzuć na github bieżące źródła, zanim wyjedziesz.

PS. Ten kawałek jest przecudny:

00:7408: 18        CLC
00:7409: A5 F8     LDA $F8
00:740B: 69 04     ADC #$04
00:740D: 8D B8 0E  STA $0EB8
00:7410: A5 F9     LDA $F9
00:7412: 69 00     ADC #$00
00:7414: 8D B9 0E  STA $0EB9
00:7417: 4E B9 0E  LSR $0EB9
00:741A: 6E B8 0E  ROR $0EB8
00:741D: 4E B9 0E  LSR $0EB9
00:7420: 6E B8 0E  ROR $0EB8
00:7423: 4E B9 0E  LSR $0EB9
00:7426: 6E B8 0E  ROR $0EB8
00:7429: AD B8 0E  LDA $0EB8
00:742C: 0D B9 0E  ORA $0EB9
00:742F: D0 03     BNE $7434
00:7431: EE B8 0E  INC $0EB8
00:7434: A9 08     LDA #$08
00:7436: 8D B7 0E  STA $0EB7
00:7439: AD A7 0E  LDA $0EA7
00:743C: D0 26     BNE $7464
00:743E: AD A6 0E  LDA $0EA6
00:7441: C9 41     CMP #$41
00:7443: B0 1F     BCS $7464
00:7445: A9 01     LDA #$01
00:7447: 8D B7 0E  STA $0EB7
00:744A: 4E B9 0E  LSR $0EB9
00:744D: 6E B8 0E  ROR $0EB8
00:7450: 4E B9 0E  LSR $0EB9
00:7453: 6E B8 0E  ROR $0EB8
00:7456: 4E B9 0E  LSR $0EB9
00:7459: 6E B8 0E  ROR $0EB8
00:745C: AD B8 0E  LDA $0EB8
00:745F: D0 03     BNE $7464
00:7461: EE B8 0E  INC $0EB8
00:7464: A9 00     LDA #$00
00:7466: 85 EF     STA $EF
00:7468: 85 F0     STA $F0
00:746A: A9 01     LDA #$01
00:746C: 85 F1     STA $F1
00:746E: AD A8 0E  LDA $0EA8
00:7471: 85 F6     STA $F6
00:7473: AD A9 0E  LDA $0EA9
00:7476: 85 F7     STA $F7

Tak poza wszystkim, ten model AI jest chyba przekonany, że zapisanie akumulatora do pamięci przez STA powoduje utratę jego zawartości. Stąd numery typu LDA $1361 / STA $1354 / LDA $1354, albo STA $0EB9 / LSR $0EB9 itp.

Jest też odporny na zwiększanie akumulatora przez INC (zamiast CLC / ADC #$01), zmniejszanie go przez DEC (zamiast SEC / SBC #$01) i przeważnie na zerowanie komórek pamięci przez STZ (prawie wszędzie wali LDA #$00 / STA).

6

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

w1k napisał/a:

drac030, tak, pozwoliłem AI na to spojrzeć i przyznać, że niektóre rzeczy są tam zbędne. w rzeczywistości takie zmiany w kodzie dają około −302 µs/f = +0,18% fps.

No, cóż, pokazałem trzy miejsca, w których sekwencje rozkazów dają się skrócić aż o połowę albo o 1/3. Tylko trzy, chociaż takich miejsc jest multum, gdzie nie spojrzeć, aż się prosi, żeby to zrobić. Myślę, że, zwłaszcza w krytycznych procedurach, dałoby to mierzalny efekt. Szkoda, że nie chcesz spróbować (skłonić do tego AI).

7

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

w1k napisał/a:

benche.. + SPEEDUP_LOG.md (jest napisane po słowacku)

Nie no, statystyki fajne.

Co nie zmienia faktu, że procedura, która zajmuje połowę czasu CPU (draw_twall_clip wraz z przyległościami) jest, jak napisałem powyżej, pełna nieporadnego kodu, ze zbędnymi rozkazami (jak powyżej, albo np. zamiast STZ nagminnie jest LDA #$00 / STA), z seriami 32-bitowych operacji (move'ów, dodawań, odejmowań) rozbitymi bez sensu na serie rozkazów ośmiobitowych itp.

A potem konkluzja brzmi np., że "brzdou je CPU" - przy takim kodzie to nie jest wcale dziwne.

EDIT: przykład tego, o czym mowa (z pliku renderer.asm)

a) oryginał

.proc calc_nodeptr
        lda zp_nid
        sta m_a
        lda zp_nid+1
        and #$7F
        sta m_a+1
        jsr m_x4                     ; m_prod = nid*28 via shifts (= *32 - *4).
        lda m_prod        ;3
        sta m_ma          ;3
        lda m_prod+1    ;3
        sta m_ma+1      ;3           ; m_ma = nid*4
        asl m_prod        ;5
        rol m_prod+1    ;5           ; nid*8
        asl m_prod        ;5
        rol m_prod+1    ;5           ; nid*16
        asl m_prod        ;5
        rol m_prod+1    ;5           ; nid*32
        sec                    ;2
        lda m_prod        ;3
        sbc m_ma          ;3
        sta m_prod        ;3
        lda m_prod+1    ;3
        sbc m_ma+1      ;3
        sta m_prod+1    ;3           ; nid*28
        clc                      ;2
        lda m_prod        ;3
        adc #<MAP_NODES    ;2           ; MAP_NODES = offset inside the EXT bank; the
        sta zp_nodeptr   ;3           ;   readers go [zp_nodeptr],y (long indirect)
        lda m_prod+1     ;3           ;   with zp_nodeptr+2 = MAP_EXT_BANK, set ONCE
        adc #>MAP_NODES ;2           ;   by init_level -- nothing else writes +2
        sta zp_nodeptr+1 ;3 - suma: 80 cykli CPU, 46 bajtów
        rts
.endp

b) ja bym spróbował tak

.proc calc_nodeptr
        lda zp_nid
        sta m_a
        lda zp_nid+1
        and #$7F
        sta m_a+1
        jsr m_x4
        rep #$20        ;3
        lda m_prod      ;4
        sta m_ma        ;4
        asl             ;2
        asl             ;2
        asl             ;2
        sec             ;2
        sbc m_ma        ;4
        clc             ;2
        adc.w #MAP_NODES ;3 
        sta zp_nodeptr    ;4 
        sep #$20        ;3 - suma: 35 cykli CPU, 20 bajtów
        rts
.endp

PS. to m_x4 zapewne też można przyśpieszyć.

8

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

w1k napisał/a:

drac030, dzięki, wprowadziłem zmiany, zmiana prędkości jest rzeczywiście tylko kosmetyczna. dziś/jutro opublikuję ostatnią wersję z poprawkami, zanim opuszczę słowację na 10 dni.

Nie ma pośpiechu, dzięki.

Popatrzyłem sobie jeszcze tu i tam i nadal mi się wydaje, że coś można osiągnąć mikrooptymalizacjami niekoniecznie nawet polegającymi na zastosowaniu 16-bitowego akumulatora, bo i kod czysto ośmiobitowy można ulepszyć, np.

https://www.atari.org.pl/forum/misc.php?action=pun_attachment&amp;item=13797

Zakładając, że nie ma odwołań z zewnątrz pod $4d60 (a nie widzę, żeby były), reforma da 8 cykli zysku (a ten kawałek kodu jest wywoływany bardzo często).

Co więcej, zawartość akumulatora jest potem (po odgałęzieniu bcc pod $4d66 do rts w $4d76) tracona, więc można zastąpić cmp $1353 przez sec/sbc $1353, a sec i sbc stojące poniżej odgałęzienia zlikwidować całkowicie. To da razem 10 cykli zysku - a cały kawałek od adresu $4d5a do $4d6d ma ich, o ile dobrze liczę, 28.

No, i tak dalej, i tym podobnie, usque ad mortem.

9

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

Dzięki za troskę, ale o niczym nie zapomniałem - w1k może to wkleić Claudowi tak samo, jak wkleja tu jego odpowiedzi.

10

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

w1k napisał/a:

16-bit A: cały silnik = max 6,1 % klatki (0,35 fps przy 5,7) - para rep/sep kosztuje 6 cykli, tyle samo, ile oszczędza jedno 16-bitowe dodawanie; przerobiony blok w paint_col dał netto 1 cykl, drugi wywalił boot. clc/adc #1 = 0,1 %.

Tak, ja wiem, ile zajmuje rep/sep, i oczywiście, przy całkowicie ośmiobitowym kodzie, nie zawsze się opłaca przełączenie (dla pojedynczej operacji - prawie nigdy). Ale tam są takie oto na przykład ciągi rozkazów 8-bitowych:

https://www.atari.org.pl/forum/misc.php?action=pun_attachment&amp;item=13796

Nie patrzę całościowo, więc nie wiem, czy ten kawałek ma jakikolwiek wpływ na renderowanie klatek, ale wygląda, jakby danie rep #$20 na początku, a sep #$20 gdzieś na końcu pozwoliło go skrócić o połowę.

Widziałem podobny kawałek kopiujący w podobny sposób z miejsca na miejsce bodaj 12 bajtów przy użyciu 24 rozkazów - 72 bajty, 96 cykli, przy przełączeniu na 16-bitowy akumulator zeszłoby to do 40 bajtów i 14 rozkazów na sumę 66 cykli.

Jakieś ciągi lsr/ror/lsr/ror na dwóch kolejnych bajtach, w pętlach i bez - to wszystko jest do optymalizacji.

11

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

Czasem wyświetla.

https://www.atari.org.pl/forum/misc.php?action=pun_attachment&amp;item=13794

12

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

No, OK, aczkolwiek wczoraj w polu "Time" wyświetlił mi dwie cyfry przed dwukropkiem i dwie po (coś w rodzaju 17:34). Jak jest w oryginale, nie wiem, nigdy wcześniej w Dooma nie grałem :]

Widziałem też, że, mimo że program pracuje w trybie natywnym, marnuje sporo czasu i miejsca przeprowadzając wszystkie obliczenia na 8-bitowym akumulatorze, nie używa move'ów blokowych (mvn/mvp - ale może nie ma dla nich zastosowania?), robi clc/adc #$01 zamiast inc, albo sec/sbc #$01 zamiast dec itp.

Może i tym warto byłoby się zająć w przyszłości, a nuż poprawi się troszkę wydajność.

13

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

w1k napisał/a:

(vbxe.cpp:1361, z komentarzem dokładnie o tym, że dema nadpisują pierwszy rekord bez czekania). Prawdziwy rdzeń efektów pobiera te 21 bajtów BCB z pamięci VRAM w cyklach, które daje mu wyświetlacz - a te dwie instrukcje (~10 cykli, znacznie mniej w systemie Rapidus) wyprzedzą to pobieranie.

No, tak, race condition jak malowanie.

Jeszcze tu chyba coś jest nie tak, jakby brakowało cyfr przed ":"


https://www.atari.org.pl/forum/misc.php?action=pun_attachment&amp;item=13789

14

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

1. Ładuje się z SIO

2. Na prawdziwym sprzęcie (Antonia II) zakłócenia graficzne zniknęły!

15

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

Tam jest jeszcze ten problem, że tego programu nie da się załadować z SIO. Przynajmniej takiego normalnego. Trzeba użyć albo HDD (IDE+, SIDE), albo np. SIO wbudowanego w IDE+ (US SIO w menu IDE Plusa).

A to dlatego, że procedura IRQ, znajdująca się pod adresem $0491 i podwieszona pod wektor IRQ pod adresem $0216, jest przystosowana do działania w trybie natywnym. Podczas ładowania DOOM przełącza się w tryb emulacji i zapomina ją przy tym odwiesić.

W rezultacie przychodzące przerwanie szeregowe w trybie emulacji odkłada na stos dwa bajty (X i A), a potem, w celu skoku pod stary adres obsługi w ROM-ie, zdejmuje 3 (nb. nie przywracając zawartości ani X, ani A) i rujnuje zawartość stosu.



https://www.atari.org.pl/forum/misc.php?action=pun_attachment&amp;item=13788

16

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

Może trzeba to zgłosić phaeronowi, bo to wygląda na błąd w emulatorze (a w każdym razie jakiś brak kompatybilności).

Chyba, że to tylko u mnie, ale wątpię.

17

(214 odpowiedzi, napisanych Fabryka - 8bit)

mayonez napisał/a:

A normalnie SDX bez tych drajverow nie ruszy ?

Ruszy. Dodatki powodują, że całość (np. formatowanie katalogu) działa szybciej, i pozostawiają więcej wolnej pamięci w obszarze pierwszych 64k i banków ext.

EDIT: A, no i jest parę dodatkowych programów, które bez nich nie ruszą, jakkolwiek na tym Toolkicie, który jest na sdx.atari8.info, jest ich chyba jeezcze cały jeden, czy góra dwa.

18

(237 odpowiedzi, napisanych Fabryka - 8bit)

perinoid napisał/a:

Czy można pin 1 połączyć na krótko z pinem 8 w VBXE?

Jeśli chodzi o to:

https://www.atari.org.pl/forum/misc.php?action=pun_attachment&amp;item=13785

to chyba można.

19

(214 odpowiedzi, napisanych Fabryka - 8bit)

mayonez napisał/a:

jak mam to wyprowadzić do audio Jacka ?

49 PBI i 5 ECI to jest Audio-in (wejście do komputera z wyjścia z IDE+). Audio-out natomiast znajduje się w gnieździe monitorowym.

20

(237 odpowiedzi, napisanych Fabryka - 8bit)

Tak, on się różni tylko ich obecnością, ale są wrzucone na CAR: dlatego, że musisz je załadować z CAR: oraz w kolejności pokazanej w przykładowym CONFIG.SYS. Resztę można ładować z dysku.

21

(237 odpowiedzi, napisanych Fabryka - 8bit)

mayonez napisał/a:

Jakie drivery trzeba do SDX doinstalować?

Jeśli ściągniesz wersję SDX zbudowaną dla IDE+, w archiwum będzie plik SDX450_ideplus816.rom. On zawiera trzy sterowniki na CAR: 65816.SYS, ENV816.SYS i SIO816.SYS. Dwa pierwsze są w zasadzie obowiązkowe.

Na Toolkicie w katalogu DRIVERS>TURBODRV> masz resztę, przy czym najważniejszy jest EXT816.SYS. Obejrzyj zawartość CFG_FILE.ARC, tam są przykładowe pliki konfiguracyjne, w tym CONFIG.SYS (w pliku TURBO.TXT nazwany omyłkowo RAPIDUS.CFG). Przestudiuj to sobie, oczywiście ścieżki dostępu trzeba dostosować do struktury własnego dysku.

Zakłada się, że w ROM-ie masz Rapidus OS (czyli XLOS/816). Gdybyś chciał przełączyć się na AltirraOS/816, do CAR: trzeba dorzucić 65816A.SYS i ładować go zamiast 65816.SYS.

W SDX 4.51 to jest zarazam bardziej rozbudowane, lepiej zdebugowane i jednocześnie mniej skomplikowane (mniej binariów, wybór pomiędzy 65816.SYS a 65816A.SYS automatyczny itp.), ale niestety, jako że serwer krap.pl padł i leży od tygodni plackiem, mamy opóźnienie i chwilowo trzeba lubić to, co się ma.

22

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

Jak widać, najwięcej zakłóceń jest w trybie bez tekstur, ale przy włączonych teksturach też je widać:

https://youtu.be/ZOc4h4p8UDA

To jest dzisiejsza wersja doom.atr, sprzęt Rapidus 20 MHz (z "prawdziwym" procesorem), VBXE 1.1, rdzeń FX 1.26.

23

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

w1k napisał/a:

A ta wersja?

Na tej drugiej wersji jest to samo. Postaram się to nagrać późniejszym popołudniem.

tebe napisał/a:

nie wiem czy Altirra ma cycle-exact dla blittera VBXE

Nie ma.

24

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

A tak wracając do samego programu, to coś jest w nim nie tak, bo o ile na emulatorze jest tak czyściutko, jak na Twoim filmie, o tyle na prawdziwym sprzęcie występują bardzo często zakłócenia w nakładaniu tekstur, albo w wypełnianiu powierzchni, kiedy teksturowanie jest wyłączone - w tym ostatnim wypadku to jest bardzo widoczne.

Nie bardzo wiem, jaka może być przyczyna, może niewyzerowany RAM VBXE?

Problem występuje tak samo na Antonii, jak i na Rapidusie.

25

(237 odpowiedzi, napisanych Fabryka - 8bit)

lopez napisał/a:

Wybacz, ale przeczytałem wszystkie strony tego wątku jeszcze raz i oprócz tej zacytowanej odpowiedzi nic więcej nie ma na ten temat.

Proszę 1:

drac030 napisał/a:

Na dodatek możesz sobie przełączać stronę, na której są rejestry VBXE, pomiędzy D6 a D7 bez użycia lutownicy.

Proszę 2:

Simius napisał/a:

Obecnie na sześciu w jednej linii wyprowadzone są na stałe sygnały, które mogą się kiedyś do czegoś przydać. Na przykład sygnał wyboru strony D6/D7 do VBXE, pozwalający ustawić stronę w BIOSie, bez przelutowywania przewodu na LS138.