Godzina dziennie, przez dwa tygodnie.

Zabawa w programowanie c64. Usunąłem Kernal ROM i BASIC ROM. Zostawiłem Character ROM. Przez dwa tygodnie będę pisał własny Kernal. Nie będę niczego re-implementował. Piszę tylko to co jest potrzebne do uruchomienia komputera i kolejnych osiągnięć. Celów nie wyznaczam z góry, bo apetyt rośnie w miarę jedzenia.

Dzień pierwszy - organizacja narzędzi i podstawy.

  • vice jako emulator
  • kwrite jako edytor (ma podświetlanie składni 6502)
  • vasm jako asm (ponieważ Ben)
  • zmieniłem paletę kolorów c64 na bardziej estetyczną: https://lospec.com/palette-list/pico-8
  • staram się nie używać debuggera i podglądania stanu emulatora. Chyba, że brak działania wynika z czegoś czego nie wiem i nie jest oczywiste.
  • zapisałem konfigurację vice, tak by po uruchomieniu widzieć od razu wynik pracy.

Wnioski:

Vice nie startuje bez zdefiniowanego BASIC ROM. Więc wygenerowałem pusty ROM:


  .blk 8192 0


Vice nie wczytuje od nowa plików ROM nawet po softwarowym cyklu ponownego włączenia komputera. Trzeba uruchamiać emulator od nowa.

6510 ma wbudowany port i/o, którego bity ustalają czy w pewnych przestrzeniach pamięci ma być ROM, czy RAM. Po resecie port jest w trybie INPUT i ustawia wszystko na RAM. Jak komputer startuje? Twórcy komputera dołożyli rezystory podciągające do sygnałów, które powinny być aktywne by komputer wystartował.

Udało mi się wstępnie zaprogramować VIC2, bym widział, że mój kod coś robi. Ustawiłem ramkę na cały ekran i zmieniam jej kolory.

Jutro zajmę się tajemniczymi przestrzeniami adresowymi VIC. Miejsce w którym VIC czyta dane z pamięci jest wyznaczane zarówno przez rejestry VIC jak i jeden z układów CIA. Pewnie uda to ustawić na tyle by wyświetlić znak lub jakiś napis.

  • サぺルOP
    link
    fedilink
    arrow-up
    1
    ·
    8 months ago

    Udało mi się przygotować VIC2 do wyświetlania tekstu.

    Chyba dowiedziałem się czemu C64 ma dwa zestawy znaków. VIC2 ma tryb tekstowy z rozszerzonym tłem. Polega na tym, że dwa ostatnie bity z kodu znaku mogą ustawić jego niezależny kolor tła. Paletę tych kolorów wybiera się w rejestrach VIC. Ogranicza to zestaw znaków do 64. Stąd w pierwszym zestawie, w tym obszarze są wszystkie najważniejsze znaki.

    ROM z obrazami znaków dla procesora może znajdować się w obszarze $d000 po odpowiednim ustawieniu portu $01. Jednak dla VIC adres ROM znajduje się w obszarach 1000-1ffff lub 9000-9ffff. Jeśli chce się z niego korzystać, VIC musi mieć przestrzeń adresową w tych miejscach.

    VIC umie używać 16 kB pamięci. CIA#2 wybiera za pomocą port A w którym banku w przestrzeni 64k będzie działał VIC.

    Ja ustawiłem bank 8000-bffff. Znaki na +1800 (zestaw dodatkowy), ekran na +2000. Bo chciałem, żeby zaczynał się od A000.

    Nie zdążyłem wyświetlić napisu bo robiłem dużo dziwnych testów i nie opracowałem nawet głupiego czyszczenia ekranu.

    Więc dzień 3 to procedury wyświetlania, a potem obsługa klawiatury.

    • naurM
      link
      fedilink
      Polski
      arrow-up
      1
      ·
      8 months ago

      Fajny pomysł na projekt.

      Implementacje robisz na podstawie datasheetów od układów, czy sprawdzasz też np wiki C64?

      […] ekran na +2000. Bo chciałem, żeby zaczynał się od A000.

      I see what you did there. ;-)

      • サぺルOP
        link
        fedilink
        Polski
        arrow-up
        1
        ·
        8 months ago

        Chyba przesadziłem. W maju przerabiałem rodzinę Z80 (tu jest sporo ciekawostek). W czerwcu pisałem wymyślony komputer na 65c02 nawiązujący peryferiami do 1975. Ten drugi robiłem jako eksperyment w organizowaniu kodu. Emulator mi się podobał, ale eksperyment się nie udał. Uznałem, że to czego szukałem w emulatorze odnajdę w C64.

        Znalazłem amatorskie tabele rejestrów w ramach mapy pamięci. Są konkretne w porównaniu z dokumentacją. Ustawiam rejestry i sprawdzam czy dobrze zrozumiałem. Potem eksperymentuje by to lepiej zrozumieć.

    • サぺルOP
      link
      fedilink
      Polski
      arrow-up
      1
      ·
      8 months ago

      Agrest się nie udał, tak samo jak サルナシ. Napisałem tego sporo. Nie jestem dobry w pisaniu emulatorów. Przynajmniej takich spełniających moje wymagania czasu rzeczywistego. Nie powiedziałem jeszcze ostatniego słowa.

  • サぺルOP
    link
    fedilink
    Polski
    arrow-up
    1
    ·
    8 months ago

    Jeśli ktoś chciałby przejść na skróty i zyskać jak najwięcej intelektualnej rozrywki z 6502. Polecam przećwiczenie operacji na pamięci, dłuższych niż 256 bajtów, posługując się tylko mózgiem i spisem instrukcji. Jest wiele rozwiązań i scenariuszy. Każdy znajdzie coś dla siebie.

    Można powiedzieć “Pokaż mi swoją procedurę wypełniania 1000 bajtów pamięci, a powiem ci kim jesteś”.

    Zaczynam doceniać ludzi od NES.

    • naurM
      link
      fedilink
      arrow-up
      1
      ·
      8 months ago

      Z mojego punktu widzenia podobne rozkminy są w grach Zachtronics.
      Tamten zestaw instrukcji jest nieźle zaprojektowany, Rozkazów jest w sumie bardzo mało, ale można wymyślić sporo rozwiązań do każdego zadania.
      Wracamy więc ponownie do starej prawdy, że ograniczenia pobudzają kreatywność.

      • サぺルOP
        link
        fedilink
        Polski
        arrow-up
        1
        ·
        edit-2
        8 months ago

        Jako dzieciak robiłem samo-modyfikujący się kod. Podmieniałem argumenty w STA. Teraz piszę kod dla ROM. Więc skorzystałem z STA (nn), y. Otoczka tego to też sporo przemyśleń. To była fajna zabawa. W porównaniu z Z80 to prymitywizm (gdzie rozkazy potrafią robić trzy 16-bitowe operacje na raz). Wydaje mi się, że komputery z 6502 powinny być wyposażone w jakieś szczątkowe DMA jak w NES.

        Robiłem też porównanie z P65Pas, cc65 i Gemini 2.5 Pro. Ten ostatni wypadł najlepiej i zrobił taki kod jak mój. Mój kod jest zwykle 2…3x krótszy niż generowany przez kompilatory.

        • naurM
          link
          fedilink
          Polski
          arrow-up
          1
          ·
          8 months ago

          Masz jakieś konkretne kryterium optymalizacji? Rozmiar kodu albo szybkość?

          • サぺルOP
            link
            fedilink
            Polski
            arrow-up
            1
            ·
            edit-2
            8 months ago

            Skoro krótszy to rozmiar. Na razie nie mam potrzeby liczyć cykli. Chociaż i tak często zwracam na to uwagę jeśli mam dylemat przy wyborze instrukcji.

            Z z80-llvm też tak miałem. Ale to żadne osiągnięcie.

          • サぺルOP
            link
            fedilink
            Polski
            arrow-up
            1
            ·
            8 months ago

            Kiedy bawiłem się z80, musiałem ręcznie wpisywać kod maszynowy w hex. Więc może się uwarunkowałem.

  • サぺルOP
    link
    fedilink
    Polski
    arrow-up
    1
    ·
    8 months ago

    Klawiaturę obsługuje układ CIA#1. Jego dwa, 8-bitowe porty tworzą wiersze i kolumny macierzy klawiatury. Port A to kolumny, ustawiony jako wyjście. Port B to wiersze ustawione jako wejście. Układ CIA zapewnia rezystory pullup. Jedną z kolumn trzeba ustawić na 0 i patrzeć który wiersz będzie miał wartość 0.

    Schematy nie zgadzały mi się z kodami klawiszy. Napisałem program, który wyświetla wartości binarne wierszy i kolumn. Kolejną kolumnę wybiera się klawiszem RESTORE (PgUp). Jest on podłączony do przerwania NMI. W ten sposób stworzyłem własną tabelkę 8x8 układu klawiszy.

    Ciekawistka: porty obsługujące klawiaturę są też podłączone do wejść joysticków.

  • サぺルOP
    link
    fedilink
    Polski
    arrow-up
    1
    ·
    7 months ago

    Przerobiłem wszystkie tryby tekstowe i graficzne vic2. Chunky vs Planar to małe piwo.