<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=CIO</id>
	<title>CIO - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=CIO"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=CIO&amp;action=history"/>
	<updated>2026-10-02T23:44:05Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=CIO&amp;diff=501&amp;oldid=prev</id>
		<title>imported&gt;Atariki recovery: Reconstructed from archived HTML; see provenance manifest</title>
		<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=CIO&amp;diff=501&amp;oldid=prev"/>
		<updated>2026-10-01T08:51:48Z</updated>

		<summary type="html">&lt;p&gt;Reconstructed from archived HTML; see provenance manifest&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;CIO - Central Input/Output - rezydujący w pamięci [[ROM]] komputera podsystem [[Atari OS|Atari OS-u]] odpowiedzialny za obsługę plików.&lt;br /&gt;
&lt;br /&gt;
== Sposób użycia ==&lt;br /&gt;
&lt;br /&gt;
Żądaną operację definiuje się ustawiwszy przedtem odpowiednie zmienne w wybranym bloku IOCB (Input/Output Control Block, $0340-$03BF), załadowawszy do rejestru X jego pomnożony przez 16 numer oraz - przy zapisie bajt po bajcie - ewentualną daną do akumulatora, a nastepnie wywołuje skokiem JSR pod JCIOMAIN $E456, co jest punktem wejściowym podsystemu zarządznia plikami. Przy powrocie rejestr Y zawiera wartość 1 w przypadku powodzenia, bądź ujemny [[Kody błędów|kod błędu]], rejestr X numer kanału pomnożony przez 16, akumulator zaś - przy odczycie bajt po bajcie - ewentualną daną.&lt;br /&gt;
&lt;br /&gt;
=== Bloki kontroli wejścia/wyjścia IOCB ===&lt;br /&gt;
&lt;br /&gt;
Pod adresem $0340 znajduje się zajmujący 128 bajtów pamięci obszar bloków kontroli wejścia/wyjścia (IOCB). Bloków tych jest osiem, każdy z nich definiuje jeden niezależny &amp;quot;kanał&amp;quot; transmisji danych z wybranym urządzeniem. Blok numer 0 jest zajęty przez standardowy edytor ekranowy (urządzenie &amp;quot;E:&amp;quot;, konsola systemowa). Reszta jest do wykorzystania przez programy, np. [[BASIC]] używa kanału nr 7 do wysyłania danych na drukarkę instrukcją LPRINT, a kanału nr 6 jako ekranu graficznego (otwieranego instrukcją GRAPHICS).&lt;br /&gt;
&lt;br /&gt;
==== Struktura IOCB ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Bajt&lt;br /&gt;
| Etykieta&lt;br /&gt;
| Opis&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| ICCHID&lt;br /&gt;
| Tzw. numer identyfikacyjny. Tak naprawdę jest to indeks wpisu w tablicy handlerów wskazującego dane urządzenie. Ustawiany jest automatycznie przez system. Wartość $FF oznacza, że kanał jest zamknięty, każda inna - że jest w użyciu.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| ICDNO&lt;br /&gt;
| Numer urządzenia podanego przez użytkownika (np. 3 dla &amp;quot;D3:NAZWA&amp;quot;) albo 1, gdy numer nie został podany. Ustawiane automatycznie przez system.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| ICCMD&lt;br /&gt;
| Kod żądanej operacji (rozkaz); ustawiany przez program. Dozwolone kody:&lt;br /&gt;
* $03 - OPEN - otwarcie pliku&lt;br /&gt;
* $05 - GET RECORD - odczyt danych w trybie tekstowym&lt;br /&gt;
* $07 - GET BYTES - odczyt danych w trybie binarnym&lt;br /&gt;
* $09 - PUT RECORD - zapis danych w trybie tekstowym&lt;br /&gt;
* $0B - PUT BYTES - zapis danych w trybie binarnym&lt;br /&gt;
* $0C - CLOSE - zamknięcie pliku&lt;br /&gt;
* $0D - STATUS - odczyt statusu handlera&lt;br /&gt;
&lt;br /&gt;
Wszystkie pozostałe kody o wartościach powyżej 13 ($0D) są traktowane jako kody operacji specjalnych i przekazywane bezpośrednio do handlera urządzenia, bez interpretacji przez system.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ICSTAT&lt;br /&gt;
| Status operacji ustawiany automatycznie po jej wykonaniu, czyli wartość 1 gdy sukces lub ujemny [[Kody błędów|kod błędu]]. Czyli to samo, co jest przekazywane w rejestrze Y przy powrocie z CIO.&lt;br /&gt;
|-&lt;br /&gt;
| 4-5&lt;br /&gt;
| ICBUFA&lt;br /&gt;
| Adres bufora dla operacji, ustawiany przez użytkownika. Dla OPEN, STATUS i operacji specjalnych powinien wskazywać nazwę pliku.&lt;br /&gt;
|-&lt;br /&gt;
| 6-7&lt;br /&gt;
| ICPUTB&lt;br /&gt;
| Zmniejszony o 1 adres procedury wysyłania 1 bajtu do urządzenia. Ustawiany automatycznie przez system w czasie otwierania pliku.&amp;lt;br /&amp;gt;&lt;br /&gt;
Po zamknięciu kanału ustawiany jest tu adres procedury CIONOPN zwracającej kod 133 (DEVICE OR FILE NOT OPEN).&lt;br /&gt;
|-&lt;br /&gt;
| 8-9&lt;br /&gt;
| ICBUFL&lt;br /&gt;
| Wielkość bufora dla danej operacji, ustawiany przez program użytkownika. Po operacji zawiera liczbę bajtów odczytanych lub zapisanych. Jeśli 0, to bajt przekazywany jest w akumulatorze.&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| ICAX1&lt;br /&gt;
| Pierwszy bajt pomocniczy, przy otwieraniu pliku oznacza rodzaj dostępu ($04 - odczyt, $08 - zapis, $09 - dopisywanie, $0C - zapis i odczyt). W BASIC-u jest to drugi parametr instrukcji OPEN.&lt;br /&gt;
|-&lt;br /&gt;
| 11&lt;br /&gt;
| ICAX2&lt;br /&gt;
| Drugi bajt pomocniczy. Jego znaczenie jest zależne od handlera, np. przy otwieraniu ekranu w trybie graficznym będzie to numer trybu graficznego.&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| ICAX3&lt;br /&gt;
| Trzeci bajt pomocniczy. Jego znaczenie jest zależne od handlera.&lt;br /&gt;
|-&lt;br /&gt;
| 13&lt;br /&gt;
| ICAX4&lt;br /&gt;
| Czwarty bajt pomocniczy. Jego znaczenie jest zależne od handlera.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| ICAX5&lt;br /&gt;
| Piąty bajt pomocniczy. Jego znaczenie jest zależne od handlera.&lt;br /&gt;
|-&lt;br /&gt;
| 15&lt;br /&gt;
| ICAX6&lt;br /&gt;
| Szósty bajt pomocniczy. Jego znaczenie jest zależne od handlera.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wykaz urządzeń ==&lt;br /&gt;
&lt;br /&gt;
System operacyjny standardowo instaluje pięć urządzeń. Są to:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;P:&amp;quot; - drukarka&lt;br /&gt;
* &amp;quot;C:&amp;quot; - magnetofon kasetowy&lt;br /&gt;
* &amp;quot;E:&amp;quot; - edytor ekranowy (konsola)&lt;br /&gt;
* &amp;quot;S:&amp;quot; - ekran graficzny&lt;br /&gt;
* &amp;quot;K:&amp;quot; - klawiatura&lt;br /&gt;
&lt;br /&gt;
Zob. też [[Lista handlerów CIO|zestawienie znanych handlerów CIO]].&lt;br /&gt;
&lt;br /&gt;
== Funkcje specjalne ([[XIO]]) ==&lt;br /&gt;
&lt;br /&gt;
* [[Lista funkcji specjalnych CIO według urządzeń]]&lt;br /&gt;
* [[Lista funkcji specjalnych CIO według kodów operacyjnych]]&lt;br /&gt;
&lt;br /&gt;
== Organizacja wewnętrzna ==&lt;br /&gt;
&lt;br /&gt;
=== HATABS ===&lt;br /&gt;
&lt;br /&gt;
Podstawą ogranizacji CIO jest HATABS - tablica handlerów. Znajduje się ona pod adresem $031A i liczy 33 bajty. Ponieważ jeden wpis zajmuje trzy bajty, to w HATABS jest miejsce na jedenaście wpisów. Pięć z nich - lub sześć, gdy DOS jest załadowany - jest zajęte przez urządzenia systemowe, reszta jest przeznaczona na handlery użytkownika.&lt;br /&gt;
&lt;br /&gt;
Wpis w HATABS, jako się rzekło, zajmuje trzy bajty. Pierwszy z nich to kod ASCII stanowiący identyfikator urządzenia, np. dla stacji dysków, czyli urządzenia &amp;quot;D:&amp;quot;, jest to $44, czyli &amp;quot;D&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Dwa następne bajty to wskaźnik do tablicy adresowej zdefiniowanej przez handler.&lt;br /&gt;
&lt;br /&gt;
Tablicę HATABS obsługuje znajdująca się w ROM-ie procedura NEWDEV $E486 (zob. [[Tablica skoków]]). Służy ona do dodawania nowych wpisów oraz modyfikacji istniejących.&lt;br /&gt;
&lt;br /&gt;
=== Tablica adresowa sterownika ===&lt;br /&gt;
&lt;br /&gt;
Tablica adresowa sterownika ma 16 bajtów. Pierwsze 12 zajmuje sześć wektorów do procedur handlera implementujących kolejne operacje CIO:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| Bajt&lt;br /&gt;
| Wpis&lt;br /&gt;
| Funkcja&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| Wektor do procedury otwarcia pliku (OPEN)&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 2&lt;br /&gt;
| Wektor do procedury zamknięcia pliku (CLOSE)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| Wektor do procedury odczytu danych (GET)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 4&lt;br /&gt;
| Wektor do procedury zapisu danych (PUT)&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 5&lt;br /&gt;
| Wektor do procedury odczytu statusu (STATUS)&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 6&lt;br /&gt;
| Wektor do procedury operacji specjalnych (SPECIAL)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Wartości wszystkich tych wektorów są pomniejszone o 1.&lt;br /&gt;
&lt;br /&gt;
Następne trzy bajty zajmuje instrukcja skoku JMP do procedury inicjowania handlera. Ostatni bajt jest niewykorzystany.&lt;br /&gt;
&lt;br /&gt;
=== ZIOCB ===&lt;br /&gt;
&lt;br /&gt;
W chwili wejścia do CIO system kopiuje zawartość wskazanego IOCB na stronę zerową, konkretnie do obszaru zwanego ZIOCB, a zaczynającego się od adresu $20. Handler urządzenia wykonując operację I/O powinien wszystkie przekazane informacje pobierać stąd właśnie, a nie z głównych bloków kontroli urządzeń znajdujących się na stronie trzeciej ($0340-$03BF); tu też powinien dokonywać wszystkich modyfikacji, jakich chce dokonać w danych zapisanych z IOCB. Po zakończeniu kodu handlera procedury CIO dokonują przekopiowania danych ze ZIOCB z powrotem do wskazanego przez program bloku IOCB.&lt;br /&gt;
&lt;br /&gt;
Trzeba nadmienić, że CIO przepisuje tylko pierwszych 12 bajtów IOCB, pozostałe 4 bajty ZIOCB wykorzystując do swoich celów.&lt;br /&gt;
&lt;br /&gt;
ICAX3Z i ICAX4Z są wykorzystywane do przechowywania adresu handlera CIO oraz adresu wykonywanej procedury, w ICAX5Z i ICAX6Z zaś zachowane są wartości rejestrów X i A procesora przekazanych przy wejściu do JCIOMAIN. Korzystając z tych komórek można w procedurze obsługi rozkazu zarówno odczytywać, jak i zapisywać wartości ICAX3..6 z IOCB. Procedura CIO tych komórek nie dotyka. Nic więc nie stoi na przeszkodzie, aby w każdym wywołaniu CIO przekazywać parametry oraz zwracać wynik za pomocą wszystkich rejestrów ICAX.&lt;br /&gt;
&lt;br /&gt;
== Mankamenty CIO ==&lt;br /&gt;
&lt;br /&gt;
Trudno orzec, jaka była moda jeśli chodzi o projektowanie tego typu podsystemów pod koniec lat siedemdziesiątych, jednak z dzisiejszego punktu widzenia sposób organizacji CIO wykazuje pewne mankamenty. Za najważniejsze z nich można uznać:&lt;br /&gt;
&lt;br /&gt;
* przypisanie kanałom I/O z góry znanego i ograniczonego pod względem wielkości obszaru w pamięci; skutecznie ogranicza to liczbę równocześnie otwartych plików do ośmiu i jest to bariera nie do przeskoczenia bez zduplikowania przez [[DOS]] podsystemu I/O - co czyni np. [[SpartaDOS X]].&lt;br /&gt;
&lt;br /&gt;
* fakt, że numer kanału jest parametrem wejściowym, a nie daną wyjściową CIO. W efekcie, jeśli jeden program - np. w wyniku jakiejś pomyłki - zostawi otwarty konkretny kanał CIO, drugi program nie może go użyć. Z kolei praktyka zamykania kanałów przed ich użyciem może spowodować kłopoty jeśli program został wywołany z innego, który danego kanału używa do własnych celów.&lt;br /&gt;
&lt;br /&gt;
To ostatnie ograniczenie można ominąć, zob. [[Programowanie: Jak wyszukać pierwszy wolny IOCB|Jak wyszukać pierwszy wolny IOCB]].&lt;br /&gt;
&lt;br /&gt;
== Zobacz też ==&lt;br /&gt;
&lt;br /&gt;
* [[Dostęp do plików]]&lt;br /&gt;
* [[Biblioteczka kodera Atari XL/XE#CIO|Korzystanie z wywołań CIO]]&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Menu Główne]]&lt;br /&gt;
[[Kategoria:Programowanie Atari 8-bit]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>