1 Ostatnio edytowany przez mono (2015-01-19 23:23:12)

Drac030 w wątku obok wspomniał o FXS. Opiszę może ocb i po co to wszystko.

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..1, 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.

Post's attachments

vbxe.man 514 b, nikt jeszcze nie pobierał tego pliku. 

vbxe.sys 404 b, nikt jeszcze nie pobierał tego pliku. 

vbxefx.icl 2.36 kb, nikt jeszcze nie pobierał tego pliku. 

vbxefxs.icl 151 b, liczba pobrań: 2 (od 2015-01-19) 

vbxefxs.man 7.36 kb, liczba pobrań: 1 (od 2015-01-19) 

vbxefxs.sys 502 b, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

2

mono napisał/a:

upraszcza to w niektórych sytuacjach sposób adresowania choć marnują się cenne komórki RAM

Upraszcza nawet znacznie: można zapisać cień i odpowiedni rejestr sprzętowy przy użyciu tego samego podprogramu.

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.

Ale załadowanie VBXE.SYS przedtem może się przydać, bo S_VBXE dziedziczy adres bazowy rejestrów VBXE z symbolu VBXEBASE, jeśli takowy jest zdefiniowany w chwili ładowania sterownika. Z kolei VBXE.SYS pozwala na ustawienie tego adresu z palca (wystarczy podać go w linii poleceń).

Bieżąca beta S_VBXE.SYS nie ustawia VMEMLO/VMEMHI, bo zapomniałem. Ale zrobi się.

KMK
? HEX$(6670358)

3

drac030 napisał/a:
mono napisał/a:

upraszcza to w niektórych sytuacjach sposób adresowania choć marnują się cenne komórki RAM

Upraszcza nawet znacznie: można zapisać cień i odpowiedni rejestr sprzętowy przy użyciu tego samego podprogramu.

Prawda. Można też np.

  icl 'vbxefx.icl'

VBXEBASE smb 'VBXEBASE'
VBXEFXS smb 'VBXEFXS'

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

lub też

  icl 'vbxefx.icl'

VBXEBASE smb 'VBXEBASE'
VBXEFXS smb 'VBXEFXS'

  org $80
vbxead .ds 2
fxsad .ds 2

vbxebase .word VBXEBASE
vbxefxs .word VBXEFXS

  ldx vbxebase
  ldy vbxebase+1
  stx vbxead
  sty vbxead+1
  ldx vbxefxs
  ldy vbxefxs+1
  stx fxsad
  sty fxsad+1
  ...
  ldy #COLDETECT
  lda (vbxead),y
  ...
  ...
  ldy #VIDEO_CONTROL
  sta (fxsad),y
  sta (vbxead),y
hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

4

Prawda jest taka, że ta niby rozrzutność powoduje zmniejszenie kodu i bilans wyjdze na plus.

5

Jeszcze istnieją dwa programy, które wymagają uaktualnienia w związku ze zmianami w sterowniku FXS. To są:

* rotozoomer.pl, "patriotyczny" zumek-rotatorek dla Atari z kartami turbo zrobionymi na 65C816,
* Let's Emu, emulator ZX Spectrum 48k dla maszyn jak powyżej.

Jedno i drugie można uruchomić na Altirze (zalecane jest włączenie max. pamięci liniowej, 65C816, 20 MHz oraz użycie pliku *.rom załączonego do r3d.arc jako systemu "Other"). Jeno Altirra nie emuluje Evie, więc muzyczki dla AY-greka będą na niej milczące. Takoż demo Lamersów 4D-demo na Altirze nie przechodzi do końca (a na Rapidusie owszem).

Wracając do Evie, zachęcałbym do zachęcania autora, żeby zachęcił jakiegoś producenta do wyprodukowania przynajmniej próbnej partii towaru.

Paczka z emulcem zawiera trochę programów na Spectrum, sporo z nich ma muzyczki na AY.

Post's attachments

R3D.ARC 200.91 kb, liczba pobrań: 5 (od 2015-01-24) 

zx09b.tar.gz 1.16 mb, liczba pobrań: 6 (od 2015-01-24) 

Tylko zalogowani mogą pobierać załączniki.
KMK
? HEX$(6670358)

6

Dzięki za aktualizacje.

Kontakt: pin@usdk.pl

7

Oba programy chodzą bez problemów. Dzięki Draco.

8

drac030 napisał/a:

* Let's Emu, emulator ZX Spectrum 48k dla maszyn jak powyżej.

Ale tylko 48k RAM czy 80/128 też?

drac030 napisał/a:

Wracając do Evie, zachęcałbym do zachęcania autora, żeby zachęcił jakiegoś producenta do wyprodukowania przynajmniej próbnej partii towaru.

Jak Lotharkowi się zwróci zainwestowany w Rapidusa samochód to może będzie szansa.
Bo byłoby miło.
A może prostsze coś by się dało zrobić - właściwy YM/AY i tylko przysłowiowe "kilka scalaków" do jego obsługi? Bez całości w FPGA - zapewne byłoby dużo taniej. Z ewentualnym Covoxem na pokładzie, którego "na rynku" obecnie nie ma luzem.

9

lemiel napisał/a:

Ale tylko 48k RAM czy 80/128 też?

Gołe 48k. 128k dość komplikuje adresowanie, co na pewno odbiłoby się ujemnie na wydajności emulacji (a ta i tak ledwie co sięga 100% oryginału).

KMK
? HEX$(6670358)

10

Lets EMU! - 48k maszyna wyłącznie.

Kontakt: pin@usdk.pl

11

Można mimochodem dodać, że w paczce z emulatorem jest gra "Three weeks in Paradise" http://www.atari.org.pl/forum/viewtopic.php?id=4113 ;)

KMK
? HEX$(6670358)

12

Hahah. Draco może zgarnąć wszystkie nagrody w konkursach Sikora :) Szykuj Sikor kasiorę! (100zł jeśli dobrze widzę) i Megę STE :)

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje