CIO
From Atariki
Wersja z dnia 04:52, 10 gru 2004 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 01:28, 12 gru 2004 KMK (Dyskusja | wkład) Next diff → |
||
Linia 1: | Linia 1: | ||
- | CIO - Central Input Output - rezydujący w pamięci ROM komputera podsystem [[XL OS|XL OS-u]] odpowiedzialny za obsługę plików. | + | CIO - Central Input/Output - rezydujący w pamięci ROM komputera podsystem [[XL OS|XL OS-u]] odpowiedzialny za obsługę plików. |
* [[Lista handlerów CIO|Zestawienie znanych handlerów CIO]] | * [[Lista handlerów CIO|Zestawienie znanych handlerów CIO]] | ||
Linia 9: | Linia 9: | ||
===Bloki kontroli wejścia/wyjścia=== | ===Bloki kontroli wejścia/wyjścia=== | ||
- | 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 "kanał" transmisji danych z wybranym urządzeniem. Blok numer 0 jest zajęty przez standardowy edytor ekranowy (urządzenie "E:", konsola systemowa). | + | 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 "kanał" transmisji danych z wybranym urządzeniem. Blok numer 0 jest zajęty przez standardowy edytor ekranowy (urządzenie "E:", 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). |
- | CDN. | + | Użycie interfejsu CIO polega na wypełnieniu wybranego IOCB odpowiednimi wartościami, załadowaniu do rejestru X pomnożonego przez 16 numeru kanału, oraz - przy zapisie bajt po bajcie - ewentualnej danej do akumulatora, a następnie wywołaniu procedury CIOMAIN przez skok JSR pod adres $E456. Przy powrocie rejestr Y zawiera wartość 1 w przypadku powodzenia lub ujemny [[kody błędów|kod błędu]], akumulator zaś - przy odczycie bajt po bajcie - ewentualną daną. |
+ | |||
+ | ====Struktura IOCB==== | ||
+ | |||
+ | <table broder=1><cellpadding=5> | ||
+ | |||
+ | <tr><td>Bajt</td><td>Etykieta</td><td>Opis</td></tr> | ||
+ | <tr><td>0</td><td>ICCHID</td> | ||
+ | <td>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. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>1</td><td>ICDNO</td> | ||
+ | <td>Numer urządzenia podanego przez użytkownika (np. 3 dla "D3:NAZWA") albo 1, gdy numer nie został podany. Ustawiane automatycznie przez system. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>2</td><td>ICCMD</td> | ||
+ | <td>Kod żądanej operacji (rozkaz); ustawiany przez program. Dozwolone kody: | ||
+ | * $03 - OPEN - otwarcie pliku | ||
+ | * $05 - GET RECORD - odczyt danych w trybie tekstowym | ||
+ | * $07 - GET BYTES - odczyt danych w trybie binarnym | ||
+ | * $09 - PUT RECORD - zapis danych w trybie tekstowym | ||
+ | * $0B - PUT BYTES - zapis danych w trybie binarnym | ||
+ | * $0C - CLOSE - zamknięcie pliku | ||
+ | * $0D - STATUS - odczyt statusu handlera | ||
+ | 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. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>3</td><td>ICSTAT</td> | ||
+ | <td>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. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>4-5</td><td>ICBUFA</td> | ||
+ | <td>Adres bufora dla operacji, ustawiany przez użytkownika. Dla OPEN, STATUS i operacji specjalnych powinien wskazywać nazwę pliku. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>6-7</td><td>ICPUTB</td> | ||
+ | <td>Zmniejszony o 1 adres procedury wysyłania 1 bajtu do urządzenia. Ustawiany automatycznie przez system w czasie otwierania pliku. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>8-9</td><td>ICBUFL</td> | ||
+ | <td>Wielkość bufora dla danej operacji, ustawiany przez program użytkownika. Jeśli wynosi 0, to bajt przekazywany jest w akumulatorze. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>10</td><td>ICAX1</td> | ||
+ | <td>Pierwszy bajt pomocniczy, przy otwieraniu pliku oznacza rodzaj dostępu ($04 - odczyt, $08 - zapis, $0C - zapis i odczyt). W BASIC-u jest to drugi parametr instrukcji OPEN. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>11</td><td>ICAX2</td> | ||
+ | <td>Drugi bajt pomocniczy. Jego znaczenie jest zależne od handlera, np. przy otwieraniu ekranu w trybie graficznym będzie to numer trybu graficznego. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>12</td><td>ICAX3</td> | ||
+ | <td>Trzeci bajt pomocniczy. Jego znaczenie jest zależne od handlera. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>13</td><td>ICAX4</td> | ||
+ | <td>Trzeci bajt pomocniczy. Jego znaczenie jest zależne od handlera. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>14</td><td>ICAX5</td> | ||
+ | <td>Czwarty bajt pomocniczy. Jego znaczenie jest zależne od handlera. | ||
+ | </td></tr> | ||
+ | |||
+ | <tr><td>15</td><td>ICAX6</td> | ||
+ | <td>Piąty bajt pomocniczy. Jego znaczenie jest zależne od handlera. | ||
+ | </td></tr> | ||
+ | |||
+ | </table> |
Wersja z dnia 01:28, 12 gru 2004
CIO - Central Input/Output - rezydujący w pamięci ROM komputera podsystem XL OS-u odpowiedzialny za obsługę plików.
Sposób użycia
Żądaną operację definiuje się ustawiwszy przedtem odpowiednie zmienne w wybranym bloku IOCB (Input/Output Control Block, $0340-$03BF), 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 kod błędu.
Bloki kontroli wejścia/wyjścia
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 "kanał" transmisji danych z wybranym urządzeniem. Blok numer 0 jest zajęty przez standardowy edytor ekranowy (urządzenie "E:", 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).
Użycie interfejsu CIO polega na wypełnieniu wybranego IOCB odpowiednimi wartościami, załadowaniu do rejestru X pomnożonego przez 16 numeru kanału, oraz - przy zapisie bajt po bajcie - ewentualnej danej do akumulatora, a następnie wywołaniu procedury CIOMAIN przez skok JSR pod adres $E456. Przy powrocie rejestr Y zawiera wartość 1 w przypadku powodzenia lub ujemny kod błędu, akumulator zaś - przy odczycie bajt po bajcie - ewentualną daną.
Struktura IOCB
Bajt | Etykieta | Opis |
0 | ICCHID | 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. |
1 | ICDNO | Numer urządzenia podanego przez użytkownika (np. 3 dla "D3:NAZWA") albo 1, gdy numer nie został podany. Ustawiane automatycznie przez system. |
2 | ICCMD | Kod żądanej operacji (rozkaz); ustawiany przez program. Dozwolone kody:
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. |
3 | ICSTAT | Status operacji ustawiany automatycznie po jej wykonaniu, czyli wartość 1 gdy sukces lub ujemny kod błędu. Czyli to samo, co jest przekazywane w rejestrze Y przy powrocie z CIO. |
4-5 | ICBUFA | Adres bufora dla operacji, ustawiany przez użytkownika. Dla OPEN, STATUS i operacji specjalnych powinien wskazywać nazwę pliku. |
6-7 | ICPUTB | Zmniejszony o 1 adres procedury wysyłania 1 bajtu do urządzenia. Ustawiany automatycznie przez system w czasie otwierania pliku. |
8-9 | ICBUFL | Wielkość bufora dla danej operacji, ustawiany przez program użytkownika. Jeśli wynosi 0, to bajt przekazywany jest w akumulatorze. |
10 | ICAX1 | Pierwszy bajt pomocniczy, przy otwieraniu pliku oznacza rodzaj dostępu ($04 - odczyt, $08 - zapis, $0C - zapis i odczyt). W BASIC-u jest to drugi parametr instrukcji OPEN. |
11 | ICAX2 | Drugi bajt pomocniczy. Jego znaczenie jest zależne od handlera, np. przy otwieraniu ekranu w trybie graficznym będzie to numer trybu graficznego. |
12 | ICAX3 | Trzeci bajt pomocniczy. Jego znaczenie jest zależne od handlera. |
13 | ICAX4 | Trzeci bajt pomocniczy. Jego znaczenie jest zależne od handlera. |
14 | ICAX5 | Czwarty bajt pomocniczy. Jego znaczenie jest zależne od handlera. |
15 | ICAX6 | Piąty bajt pomocniczy. Jego znaczenie jest zależne od handlera. |