if (adres1 > adres2)

Adresy są nazywane w C wskaźnikami, np.

char *p = ...
p += 0x100; // zwiększ adres
*p += 5; // zwiększ bajt pod adresem p

2

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

http://www.e-basteln.de/computing/65f02/65f02/

3

(53 odpowiedzi, napisanych Miejsca w sieci)

To tym bardziej przeplot ma znaczenie - trzeba go dobrać do prędkości dekompresji.

4

(53 odpowiedzi, napisanych Miejsca w sieci)

Ładne! Podoba mi się też intro.

32:49 - glitch na dole kolumny po prawej.
"Press Action to continue" ?

Co do prędkości odczytu, to wygląda mi jakby dyskietka była zaformatowana z nieoptymalnym przeplotem.

5

(80 odpowiedzi, napisanych Scena - 8bit)

xxl napisał/a:

"scena" dryfuje, zrob jakis stream i wyznacz kierunek kapitanie :D

Zrobił

6

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

Będzie brzęczeć składowa 50 Hz i piszczeć 15 kHz.

7

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

Pytasz o to, czy masz 16 czy 48 KB podstawowego RAMu?
Jeśli masz cartridge z BASICiem, to:

? PEEK(106)/4

16 = 16 KB
40 = 48 KB (8 KB przesłonięte przez BASIC)

8

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

Wow, właśnie odkryłem, że Compiler Explorer ma cc65! https://godbolt.org/z/4YvxdeT7f

9

(4 odpowiedzi, napisanych Programowanie - 8 bit)

Nie ma.

10

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

To nie jest sam pomysł, tylko coś działającego. Napisz chociaż do autora, że Ci to potrzebne.

11

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

Akurat taka optymalizacja w kompilatorze nie jest zbyt skomplikowana: sprawdzasz, że inicjalizator tablicy jest stały i że tablica jest tylko odczytywana. Poprawiłem nie ze względu na wydajność, tylko czytelność kodu - jak widzę taki, jak Twój, to szukam miejsca, gdzie tablica jest modyfikowana oraz dlaczego literały znakowe konwertują się do wskaźnika nie-const - to powinien być błąd kompilacji. Niezależnie, czy targetem jest 6502 czy Xeon.

Bardziej skomplikowana jest analiza zakresu zmiennych.

Jako twórca kompilatora widziałem większe "kwiatki", ale to już przy jakimś piwie kiedyś. I o LLVMie. ;)

12

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

https://atarionline.pl/forum/comments.p … ionID=5783

13

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

Lepiej napisać to tak:

static const char * const msg[] = { ... };

I wtedy to jest zwykła tablica o stałym adresie (spoko, non-stop spotykam się z kodem napisanym tak, jak Ty napisałeś :).
Kluczowe jest, czy kompilator zrozumie, że "i" jest w zakresie 0..127 i wtedy:

; AX=i
    asl @
    tay
    lda msg,y
    ldx msg+1,y
    jsr pushax

Tu widać, że w przypadku 65816 nie ma to znaczenia.

14

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

seban napisał/a:

nie wiem jak jest dokładnie w CC65 (trzeba by podpytać np. Fox-a) ale wydaje mi się że stos jest emulowany (przynajmniej gdy wybierzemy "większy model pamięci/adresowania"). Niestety narzut kodu przy realizacji w tego w ten sposób jest dość spory i mam wrażenie że wydajność kodu generowanego przez kompilator drastycznie spada.

ABI cc65 stosuje do argumentów i zmiennych lokalnych stos programowy. Na stronie zerowej jest wskaźnik o identyfikatorze "sp". Stos sprzętowy jest używany tylko do adresów powrotu i na dane tymczasowe. Odczyt z wierzchołka stosu programowego wygląda tak:

    ldy #1
    lda (sp),y
    tax
    dey
    lda (sp),y

Na tej zasadzie mamy dostęp do wierzchnich 256 bajtów stosu.

seban napisał/a:

Wydaja mi się że w przypadku 65xx i C problemem stają się również operacje które wymagają użycia dużej ilości
wskaźników, przykładowo:

ctx->iocb.len = 256;

Tu widzę tylko jeden wskaźnik: ctx. Zagnieżdżone struktury mają offsety będące stałymi czasu kompilacji.

; AX=ctx
    sta ptr
    stx ptr+1
    ldy #offsetof(ctx_iocb.len)
    lda #<256
    sta (ptr),y
    iny
    lda #>256
    sta (ptr),y
perinoid napisał/a:

@Fox: Możesz wyspecyfikować, o co ci chodzi? Czego według ciebie nie zrobiłem lub co zrobiłem a nie powinienem? I przede wszystkim, czemu powinienem byl tak zrobić (lub nie)? Konkrety proszę. Przyglądałem się fragmentom, np. jak robiona jest pętla dla tablicy dłuższej niż jedną strona albo jak jest robione memcpy. Ale całego kodu nie przeglądałem bo nie było to dla mnie interesujące.

Twierdzę, że wydajność kodu zależy od tego, czy ISA jest dostosowana do semantyki języka programowania.
Twierdzisz, że "można spokojnie napisać kompilator", "Bez żadnego problemu", "zadanie dla studenta 3-go roku informatyki", ale nawet nie zajrzałeś do wyników cc65, nie wspominając o jego algorytmach optymalizacji.
Jeśli nie było to dla Ciebie interesujące, to skąd tak śmiałe tezy?

15

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

perinoid napisał/a:

Myślisz zbyt "szablonowo" - język wejściowy to jedno, kod generowany to drugie. Można spokojnie napisać kompilator
(...)
nie przyglądałem się temu jak wygląda wygenerowany kod maszynowy.

Ciekawe podejście do problemu.

16

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

Dzięki za odpowiedzi! Autor posta chyba popłynął. W komentarzu ktoś mu wytknął, że nie wszystkie myszki działają z pasywną przejściówką.

Hmmm, nie szukają w tym WDC inżyniera kompilatora? ;)

Z C na 6502 są dwa podstawowe problemy:

  • większość kodu operuje na intach, które są co najmniej 16-bitowe

  • mocno używany jest stos, a 6502 oferuje tylko dostęp do elementu na wierzchu i ma mały stos

65816 rozwiązuje oba te problemy. Nie widziałem kodu wygenerowanego dla 65816, ale mogę się założyć, że jest znacznie bardziej wydajny, niż dla 6502.

17

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

Adam Klobukowski napisał/a:

Nie widzę żadnego odniesienia do 6502. To na pewno ten link co trzeba?

Pod zdjęciem adaptera: "It has a full-fledged computer inside it, usually a simple embedded processor with a 6502 core".

18

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

https://www.quora.com/Does-a-USB-to-PS- … -protocols

Ciekawe, naprawdę stosuje się rdzenie 6502 w takich zastosowaniach?

19

(12 odpowiedzi, napisanych Fabryka - 8bit)

Szpulowiec w kuchni Pina rok temu brzmiał świetnie. A VBXE robi wszystko to, co XEP i wiele więcej.

20

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

Nie znałem tego programu, a Control+H pokazuje imponującą listę operacji! Dodałem obsługę do RECOIL.

21

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

"Jump! (1986)(Happy-Computer)(DE)[a].xex" ? Wygląda jak dekompresja Koala.

22

(74 odpowiedzi, napisanych Programowanie - 8 bit)

xxl napisał/a:

dobrze... dekompresor ZX0 strumienia z pliku: https://xxl.atari.pl/zx0-decompressor/

A wiesz, że dekompresor ZX0 na 6502 już był? Jest link na https://github.com/einar-saukas/ZX0

Szybkie mnożenie w Shrinklerze:
http://www.atari.org.pl/forum/misc.php?action=pun_attachment&amp;item=7538&amp;download=0

Dekompresja obrazka trwa teraz 5,6 sekundy zamiast 9,5 sekundy.

Koszty:

  • dodatkowe 1,5 KB na tablice kwadratów

  • kod dłuższy o około 150 bajtów - co nie jest złym wynikiem, bo wciąż jest krótszy od inflate

  • dodatkowe 8 bajtów na stronie zerowej

23

(4 odpowiedzi, napisanych Programowanie - 8 bit)

W Numenie większość efektów była odpalana z VBLK, włącznie z tymi, które zajmowały kilka ramek. Dekompresja kolejnych części oraz buforowanie muzyki odbywały się w "wątku głównym".

24

(4 odpowiedzi, napisanych Programowanie - 8 bit)

VBLK nie, bo "X nie jest stałe". DLI by się nadało.

Inne podejście to jeśli procka jest jednorodna, wstawić do niej jakiś licznik, żeby sama umiała się przerwać.

25

(74 odpowiedzi, napisanych Programowanie - 8 bit)

Dzięki!

ZX0 widocznie ma podobne założenia, jak FlashPack - liczy się nie tyle stopień kompresji, co szybka dekompresja krótką procedurą. Całkiem sprytnie zaprojektowany!