atarionline.pl FXS czyli cienie dla VBXE - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1: CommentAuthormono
      • CommentTime19 Jan 2015 22:01 zmieniony
       
      Większość rejestrów VBXE to rejestry dostępne tylko do zapisu. Ich wadą jest to, że nie ma żadnej możliwości odczytu wartości z takiego rejestru (np. VIDEO_CONTROL=$D640 lub XDL_ADR=$D641..3). Często pod jednym adresem znajdują się tak naprawdę dwa rejestry sprzętowe - jeden tylko do zapisu (np. IRQ_CONTROL=$D654) i jeden tylko do odczytu (IRQ_STATUS=$D654).
      W oryginalnym hardwarze Atari sytuacja jest identyczna i poradzono sobie z problemem w ten sposób, że wprowadzono tzw. rejestry-cienie (ang. shadow registers) - przykładowo IRQEN=$D20E ma swój cień w IRQENS=$10. Zasada jest taka, że chcąc zapisać coś do rejestru sprzętowego programista jest zobowiązany do zapisu również rejestru-cienia, tak więc chcąc odblokować przerwanie TIMER1 POKEY-a robimy:
      lda #%00000001
      ora IRQENS ;$10
      sta IRQENS ;$10
      sta IRQEN ;$D20E

      Dzięki temu pozostałe elementy systemu (np. procedura detekcji źródła IRQ) wiedzą co w rejestrze IRQEN zostało faktycznie ustawione. Analogicznie np. w ANTIC-u DLPTR=$D402..3 ma swój cień w DLPTRS=$230, DMACTL=$D400 ma cień w DMACTLS=$22F, w GTIA GTIACTL=$D01B ma cień w GTIACTLS=$26F, itd. Niestety nie wszystkie rejestry w hardwarze mają swoje odpowiedniki i dotkliwie można to odczuć np. na NMIEN=$D40E, czy większości rejestrów GTIA.

      Oczywiście jeśli pisze się program przejmujący kontrolę nad światem problem jest marginalny i w razie potrzeby taki cień można sobie samemu w kodzie zorganizować, ale jeśli chciałoby się napisać jakiś programik rozszerzający możliwości OS-a, zainstalować TSR-a w systemie i wrócić do shella, wtedy niestety krótkowzroczność projektantów systemu daje popalić.

      Zrobiłem więc sterownik dla SDX, który wydziela 40-bajtowy obszar w pamięci RAM przeznaczony właśnie na cienie dla rejestrów VBXE. Obszar ten dostępny jest przez symbol VBXEFXS i wygląda tak:
      OFFSET NAZWA           TYP    OPIS
      $00: VIDEO_CONTROL byte : kontrola video
      $01: XDL_ADR long : adres listy wyświetlania
      $04: CSEL byte : wybór koloru w palecie
      $05: PSEL byte : wybór palety
      $06: CR byte : składowa R
      $07: CG byte : składowa G
      $08: CB byte : składowa B
      $09: COLMASK byte : maska dla kolizji
      $0A: COLCLR byte : reset kolizji
      $0B: - byte : zarezerwowane
      $0C: - byte : zarezerwowane
      $0D: - byte : zarezerwowane
      $0E: - byte : zarezerwowane
      $0F: - byte : zarezerwowane
      $10: BL_ADR long : adres programu blittera
      $13: BLITTER_START byte : start blittera
      $14: IRQ_CONTROL byte : kontrola przerwań IRQ
      $15: P0 byte : priorytet overlay/playfield 0
      $16: P1 byte : priorytet overlay/playfield 1
      $17: P2 byte : priorytet overlay/playfield 2
      $18: P3 byte : priorytet overlay/playfield 3
      $19: - byte : zarezerwowane
      $1A: - byte : zarezerwowane
      $1B: - byte : zarezerwowane
      $1C: - byte : zarezerwowane
      $1D: MEMAC_B_CONTROL byte : kontrola okna MEMACB
      $1E: MEMAC_CONTROL byte : kontrola okna MEMACA
      $1F: MEMAC_BANK_SEL byte : wybór banku MEMACA
      $20: VBLIT word : wektor przerwania blittera
      $22: VMEMLO long : pierwszy dostępny adres VRAM
      $25: VMEMHI long : ostatni dostępny adres VRAM

      Oznaczenia:
      - byte - 1 bajt
      - word - 2 bajty
      - long - 3 bajty

      32 pierwsze bajty to cienie dla sprzętu (dla wygody offsety cieni są identyczne, jak rejestrów sprzętowych - upraszcza to w niektórych sytuacjach sposób adresowania choć marnują się cenne komórki RAM), prócz tego dodatkowo zdefiniowane są:
      - VBLIT - wektor obsługi przerwania od blittera VBXE. Procedura detekcji włączona jest w ciąg obsługi przerwań IRQ na najwyższym priorytecie (ograniczenie OS-a) i testuje IRQ_STATUS bazując na ustawieniu cienia IRQ_CONTROL, potwierdza jego przyjęcie po czym przekazuje sterowanie do procedury obsługi użytkownika wektoryzowanej przez VBLIT. Procedura użytkownika powinna na końcu wykonać PLA, RTI (jak większość innych przerwań IRQ).
      - VMEMLO - wskazuje najmniejszy dostępny wolny adres VRAM,
      - VMEMHI - wskazuje największy dostępny wolny adres VRAM. Jej początkowa wartość zależy od tego jaki rdzeń mamy włączony - z emulacją RAMBO czy bez.

      Z tego właśnie sterownika (w starszej wersji) korzysta np. Tomek-8 demo dla VBXE.

      Wymaganiem do działania FXS jest obecność w systemie symbolu VBXEBASE, który jest instalowany przez sterownik VBXE.SYS. Podejmuje on detekcję karty VBXE, wyświetla informacje o rdzeniu, wersji i obecności emulowanego rozszerzenia RAMBO i zostawia w pamięci tylko symbol VBXEBASE wskazujący na adres rejestrów sprzętowych karty (czyli $D640 lub $D740).
      Dzięki temu programy pisane dla SDX mogą po prostu odwoływać się do żądanych zasobów za pośrednictwem symboli
      icl 'vbxefx.icl'

      VBXEBASE smb 'VBXEBASE'

      lda VBXEBASE+COLDETECT
      ...
      ...
      sta VBXEBASE+VIDEO_CONTROL

      lub też
      icl 'vbxefx.icl'

      VBXEBASE smb 'VBXEBASE'

      org $80
      vbxead .ds 2

      vbxebase .word VBXEBASE

      ldx vbxebase
      ldy vbxebase+1
      stx vbxead
      sty vbxead+1
      ...
      ldy #COLDETECT
      lda (vbxead),y
      ...
      ...
      ldy #VIDEO_CONTROL
      sta (vbxead),y

      i nie muszą bawić się w samodzielną detekcję - w CONFIG.SYS należy tylko załadować odpowiednie drivery:
      DEVICE VBXE
      DEVICE VBXEFXS

      i Wioletta. Analogicznie rzecz się ma z rejestrami-cieniami (odpowiedni .icl w załączniku).

      UWAGA! Załadowanie sterownika S2: czyli S_VBXE.SYS powoduje, że nie jest wymagane ładowanie dwóch poprzednich (VBXE.SYS, VBXEFXS.SYS), bo odpowiednia funkcjonalność została tam przez Drac030 zaimplementowana.
      Dodatkową zaletą jest również to, że S2: prócz wielu funkcji jak zarządzanie paletami kolorów, obsługa dodatkowych trybów graficznych i tekstowych czy operacje rysowania punktu, linii i okręgu posiada również mechanizmy zarządzania pamięcią VRAM dzięki czemu wskaźniki VMEMLO i VMEMHI będą wskazywać zawsze aktualny stan (sam VBXEFXS.SYS takich mechanizmów nie zawiera więc tylko inicjalizuje odpowiednio wskaźniki podczas procedury RESET).

      Opisane sterowniki będą włączone do następnej dystrybucji SDX (4.47).
      Gdyby ktoś chciał się pobawić cieniami załączam sterowniki, manuale i pliki do zainkludowania do madsa.

      Edit: vbxe2.sys to oczywiście vbxe.sys (engine forum zmienił nazwę pliku).
      No i oczywiście apostrofy w kodzie nie mają być przefiksowane backslashami.
      • 2:
         
        CommentAuthorjhusak
      • CommentTime20 Jan 2015 00:01 zmieniony
       
      Słuszna idea - na pewno pomoże w popularyzowaniu tego sprzętu :)

      A dało by się jeszcze łatwym sumptem zrobić coś takiego jako include dla normalnych systemów dyskowych operacyjnych? Tzn include do własnego programu w asm i już.
      • 3: CommentAuthormono
      • CommentTime20 Jan 2015 00:01 zmieniony
       
      To co instaluje się w pamięci to:
      - procedura RESET inicjalizująca cienie i zerująca rejestry hardwareowe VBXE oraz wpinająca przerwanie IRQ od blittera,
      - procedura IRQ od blittera,
      - obszar rejestrów cieni.
      W manualu masz procedurę IRQ kompletnie opisaną. Procedura RESET też jest prosta. Cienie to kawałek RAM (żaden cień nie jest modyfikowany przez sterownik na jakimś przerwaniu - to po prostu kawałek obszaru RAM do trzymania wartości). Więc taki include nie ma chyba sensu.
      Gdybyś jednak chciał mieć takiego TSRa dla AtariDOSa, to rodzi się problem: gdzie trzymać cienie żeby były łatwo dostępne dla programów :) Jedynym imho sensownym rozwiązaniem jest urządzenie CIO (bo tylko ono pozwala na dynamiczne dodawanie rzeczy do OS-a) np. implementacja dedykowanego sterownika do urządzenia @:. Można to zrobić. Pytanie: czy warto? Jednak SDX to potęga... :]
      • 4:
         
        CommentAuthorjhusak
      • CommentTime20 Jan 2015 01:01 zmieniony
       
      Mi chodzi o to, że:
      - albo piszemy pod spartę i tylko pod spartę, czyli olewamy 99% użytkowników
      - albo piszemy demo/grę dla wszystkich.

      I do tego drugiego punktu fajnie byłoby mieć include z tymi wszystkimi bajerami dostępnymi wewnętrznie wewnątrz kodu aplikacji.
      • 5: CommentAuthormono
      • CommentTime20 Jan 2015 01:01 zmieniony
       
      Tylko czy w demie/grze, w których sam przecież rządzisz wszystkim to ma sens?
      Oczywiście taki inklud mogę przygotować, bo jest prościutki. Składałby się z procedury detekcji VBXE FX, instalacji przerwania IRQ i obszaru z cieniami.

      Edit: Na szybko, ale powinno działać - jest to kompilacja kodu VBXE.SYS i VBXEFXS.SYS.
      • 6: CommentAuthortebe
      • CommentTime20 Jan 2015 10:01
       
      pod VBXE to każdy chciałby bibliotekę do obsługi duszków, duszki jako OVERLAY VBXE

      takie konkretne, np. 32 duszki, rejestry pozycji x:y, szerokości, dodatkowych operacji, adres pamięci duszka itp. itd.
      • 7: CommentAuthormono
      • CommentTime20 Jan 2015 10:01 zmieniony
       
      W "każdy" ja też się wpisuję :)

      Edit: A pracujesz może nad czymś takim?
      • 8:
         
        CommentAuthorjhusak
      • CommentTime20 Jan 2015 11:01 zmieniony
       
      @mono, no właśnie chodzi o to, że to niby proste i łatwe, ale:
      - jeśli będzie inklud/biblioteka, to każdy będzie mógł z niej skorzystać
      - będzie miał łagodniejszą (mniej stromą) krzywą wprowadzenia w temat
      - nie będzie podchodził, jak do jeża.

      Wydaje mi się, że na githubie czy gdzieś można taki projekt "VBXE i z czym to się je" założyć i tam te rzeczy umieszczać. Także procedurki pod konkretne języki: asm, action, basic, etc.
      • 9:
         
        CommentAuthorpirx
      • CommentTime20 Jan 2015 11:01
       
      Tebe, jhusak - popieram, bo próbowałem coś skrobnąć dla VBXE i się nie przebiłem przez dokumentację. Oczywiście powodem była moja słaba determinacja, ale takie biblioteczki załatwiające chociaż inicjalizację byłyby na wagę srebra. No może brązu. No dobra - na wagę aluminium.
      • 10: CommentAuthormono
      • CommentTime20 Jan 2015 12:01 zmieniony
       
      Sprawdzone. Załączony vbxelib.asx działa - można używać.

      - vbxe_discover - wykrywa obecność VBXE
      - vbxe_required - wykrywa rdzeń FX w wersji 1.2x
      - vbxe_init - instalacja cieni i irq oraz zerowanie vbxe
      - vbxe_destroy - deinstalacja irq i zerowanie vbxe
      - vbxe_shadows - cienie
      - vbxead (ZPG) - adres rejestrów sprzętowych
      - fxsad (ZPG) - adres cieni

      Należy spojrzeć na początek kodu i sobie to dostosować/wyciąć co zbędne.
      • 11: CommentAuthorpin
      • CommentTime20 Jan 2015 17:01
       
      :) -

      Jhusak:

      czyli olewamy 99% użytkowników


      Masz U1MB, lub Side?
      • 12:
         
        CommentAuthorjhusak
      • CommentTime21 Jan 2015 13:01 zmieniony
       
      Z całym szacunkiem Pin, ale gier ze sparty (ani z żadnego innego dosa) nie będę odpalał. Tylko Bootloader. Może być SIDEowy.

      Mam U1MB i Side. Ale nie po to, aby spartę odpalać; sparta to jest system, który zabiera radość obcowania z czymś prostym, czym jest Atari.

      Wprowadza natomiast poczucie profesjonalizmu, a tego tu nie szukam :)

      Tak, odpalałem spartę. Nie mam ochoty przebijać się przez manuale i inne; wiem, czego się po sparcie spodziewać i nie ciągnie mnie to jakoś...
      • 13:
         
        CommentAuthorjhusak
      • CommentTime21 Jan 2015 13:01 zmieniony
       
      @mono - dzięki, właśnie o takie coś chodziło.
      Tak, żeby cuś zainkludować i zacząć od razu zabawę :)

      Jeszcze super byłoby, gdyby w środku .asx były komentarze (rozwinięte), które zawarłeś w poście. Tak, żeby popatrzeć i wiedzieć o co chodzi.

      Rozumiem, że załącznik ten z postu nr 5?
      • 14: CommentAuthormono
      • CommentTime21 Jan 2015 14:01 zmieniony
       
      Nie ma za co.
      Tak - załącznik z postu nr 5 i *.icl z postu nr 1.
      Komentarze - "zacna idea" :) Się dorobi.

      Edit: Manuale też pozostają aktualne (może z wyjątkiem fragmentów kodu dla SDX).
      • 15: CommentAuthorRocky
      • CommentTime21 Jan 2015 15:01 zmieniony
       
      Witam..
      Mam propozycję, aby takie sprawy + sterowniki do vbxe zaszyć w standardowym osie.
      Jeśli kogoś stać na vbxe to tym bardziej np. na ultimate, gdzie można wgrać kilka osów.. Jeden z nich mógłby być dedykowany dla posiadaczy VBXE.
      Przykładowa lista:
      1. Stock XE
      2. Turbo OS
      3. Q-MEG
      4. Stock VBXE OS

      Wtedy w Basicu będzie można używać VBXE...
      • 16: CommentAuthorpin
      • CommentTime21 Jan 2015 17:01
       
      bez sensu ;)
      • 17: CommentAuthormono
      • CommentTime21 Jan 2015 17:01 zmieniony
       
      To nie takie proste. Taki OS obawiam się byłby mocno niekompatybilny ze standardowym AtariOS.
      Drac030 zrobił fajny sterownik S2: dzięki któremu w BASIC-u jest możliwość korzystania z nowych trybów VBXE, ale niestety wiele możliwości (np. blitter, kolizje) są ciągle niewykorzystane. A na 2 i 3 stronie nie ma już miejsca...
      W ROM-ie zresztą też. Trzeba byłoby założyć tam bankowany ROM (jak w SDX) i przebudować OS-a. I co wtedy poczęliby wszyscy miłośnicy bezpośrednich skoków do ROM-u? Nawet gdyby był kompatybilny pod wględem funkcjonalnym ze starym (korzystającym z ANTIC-a i GTIA).
      Ogromne możliwości zapewnia też współpraca trójki układów ANTIC-GTIA-VBXE (jak VBXE może generować obraz dla ANTIC-a i GTIA pokazałem w "demie" Tomek-8 vs VBXE - tam w ogóle VBXE nie rysuje obrazu - tam obraz rysuje ANTIC+GTIA a VBXE tylko przygotowuje dane) i to również wymagałoby przemyślenia.
      Tak więc myślę, że to nie jest trywialne zadanie.