DracOS
From Atariki
Wersja z dnia 12:33, 22 maj 2006 KMK (Dyskusja | wkład) (przeniesienie z art. SIO) ← Previous diff |
Wersja z dnia 12:34, 22 maj 2006 KMK (Dyskusja | wkład) (→Rozszerzenie SIO) Next diff → |
||
Linia 5: | Linia 5: | ||
== Rozszerzenie SIO == | == Rozszerzenie SIO == | ||
- | [[DracOS]] (odmiana [[XL OS]] przygotowana dla procesora [[65C816]]) zawiera rozszerzenie SIO pozwalające na transfery danych bezpośrednio do i z dodatkowej pamięci adresowalnej liniowo (tj. znajdującej się pod adresami wyższymi niż $FFFF) oraz 32-bitowe adresowanie sektorów. | + | System zawiera rozszerzenie SIO pozwalające na transfery danych bezpośrednio do i z dodatkowej pamięci adresowalnej liniowo (tj. znajdującej się pod adresami wyższymi niż $FFFF) oraz 32-bitowe adresowanie sektorów. |
===Blok DCB=== | ===Blok DCB=== |
Wersja z dnia 12:34, 22 maj 2006
Systemy operacyjne:
8-bit:
Altirra OS
Atari OS
CP/M
DracOS
OS++
QMEG OS
Turbo-816 OS
XL OS
16/32-bit:
TOS
MultiTOS
FreeMiNT
MagiC
Minix
Autorem tej wersji XL OS jest KMK. Istnieje - ciągle w dość wczesnym stadium rozwoju - dedykowany temu systemowi interpreter BASIC-a, nazywający się MultiBASIC.
Spis treści |
Rozszerzenie SIO
System zawiera rozszerzenie SIO pozwalające na transfery danych bezpośrednio do i z dodatkowej pamięci adresowalnej liniowo (tj. znajdującej się pod adresami wyższymi niż $FFFF) oraz 32-bitowe adresowanie sektorów.
Blok DCB
Block DCB w tej wersji systemu jest rozszerzony do 16 bajtów i wygląda następująco:
Adres | Etykieta | Wielkość | Znaczenie |
$0300 | DDEVIC | Bajt | Identyfikator urządzenia (zob. niżej). |
$0301 | DUNIT | Bajt | Numer urządzenia; w przypadku stacji dysków numer napędu. |
$0302 | DCMND | Bajt | Komenda dla urządzenia. |
$0303 | DSTATS | Bajt | Przed wywołaniem SIO należy ustawić tu rodzaj operacji ($40 odczyt, $80 zapis). Po powrocie z systemu znajduje się tu status operacji (kod błędu). |
$0304 | DBUFA | Dwa bajty | Adres bufora. |
$0306 | DTIMLO | Bajt | Czas oczekiwania - w sekundach - na pozytywną odpowiedź urządzenia. |
$0307 | DUNUSE | Bajt | Bajt nieużywany, zarezerwowany do przyszłych zastosowań. |
$0308 | DBYT | Dwa bajty | Wielkość bufora; musi być zgodna z wielkością transmitowanego bloku danych. |
$030A | DAUX1 | Bajt | Pierwszy bajt pomocniczy. W operacjach dyskowych młodszy bajt numeru sektora. |
$030B | DAUX2 | Bajt | Drugi bajt pomocniczy. W operacjach dyskowych starszy bajt numeru sektora. |
$030C | DAUXA | Bajt | Trzeci bajt pomocniczy. Młodszy bajt starszego słowa 32-bitowego numeru sektora. |
$030D | DAUXB | Bajt | Czwarty bajt pomocniczy. Starszy bajt starszego słowa 32-bitowego numeru sektora. |
$030E | DBFX1 | Bajt | Najstarszy bajt adresu bufora. |
$030F | DBFX2 | Bajt | Bajt zarezerwowany. |
Sposób użycia
Dla utrzymania zgodności z dotychczasowym oprogramowaniem, a już zwłaszcza z dotychczasowymi sterownikami urządzeń podłączanych do szyny równoległej, wpisanie pod $000304/5/E 24-bitowego adresu nie da pożądanego wyniku; jeśliby bowiem urządzenie brało pod uwagę tylko 16 najmłodszych bitów adresu ignorując najstarszy bajt wpisany pod $00030E, wtedy - przy odczycie - dane zostałyby umieszczone nie tam, gdzie trzeba. Musi więc istnieć mechanizm, który zapobiega tego typu nieporozumieniom.
W tym celu SIO definiuje trzy nowe urządzenia wirtualne, o kodach jak następuje:
- $B1 (= $31 + $80) - stacja dysków
- $C0 (= $40 + $80) - drukarka
- $D0 (= $50 + $80) - RS-232C
Wywołanie urządzenia z takim kodem w DDEVIC powiadamia sterownik SIO, że adres bufora w DCB jest 24-bitowy i że najstarszy bajt adresu jest pod $00030E (w przeciwnym wypadku SIO zakłada, że najstarszy bajt adresu to 0); oraz że numer sektora jest 32-bitowy i jest umieszczony w DAUX1/DAUX2/DAUXA/DAUXB (UWAGA: w przypadku szeregowych stacji dysków, SIO2IDE, SIO2PC itp. dwa najstarsze bajty tego numeru są ignorowane, ale powinny być wyzerowane dla kompatybilności). Poza tym działanie urządzeń wirtualnych jest identyczne, jak tradycyjnych (odpowiednio $31, $40 i $50), a kod urządzenia jest przed wysłaniem na port szeregowy przekładany na kod rzeczywisty.
Przyjmując komendę do wykonania SIO w żaden sposób nie sprawdza, czy dodatkowa pamięć w ogóle istnieje - zakłada się, że program sam stwierdzi jej istnienie (choćby za pomocą funkcji alokacji pamięci) przed próbą odczytu do niej danych.