Rozdział 6
PROGRAMOWANIE ZE SPARTADOS X

Funkcje SpartaDOS X z Basica.

Wiele możliwości SpartaDOS może być wykorzystanych w Basicu, Action!, języku maszynowym i innych językach programowania. Poniżej zamieszczony jest wykaz instrukcji Basica, które pozwalają programiście uzyskać dostęp do SpartaDOS X. Zastosowanie ich w innych językach nie powinno sprawić trudności.

W tym wykazie IOCB oznacza Blok Kontroli Wejścia/Wyjścia (Input/Output Contol Block) zwany także kanałem i numerowany od 0 do 7. IOCB 0 jest używany przez system operacyjny Atari dla edytora ekranowego, więc normalnie nie powinien być wykorzystywany. Dyskietka Atari DOS jest to dyskietka sformatowana w standardzie Atari DOS 2, zarówno w pojedynczej, rozszerzonej jak i podwójnej gęstości. Taki format jest tworzony przez Atari DOS 2.0s i 2.5, MYDOS, BiboDOS i inne klany DOS 2 oraz przez SpartaDOS X, gdy zostanie użyty tryb Atari DOS. d:, path i fname.ext odpowiadają dowolnym dozwolonym w SpartaDOS X nazwom urządzenia, szlaku i pliku (z rozszerzeniem), jak to zostało określone w rozdziale 4.

Uwagi o ustalonej stacji.

Należy pamiętać, że D: w Basicu lub w innym języku odpowiada stacji standardowej (ustalonej), lecz niekoniecznie stacji numer 1. W Command Processor D: odpowiada stacji numer 4. W większości innych DOS-ów, włącznie z wcześniejszymi wersjami SpartaDOS, D: reprezentuje D1:

OPEN #1,4,0 "D:TEST.TXT"

otwiera plik TEST.TXT w ustalonej stacji, lecz niekoniecznie w stacji numer 1, do odczytu SpartaDOS X.

Dostęp do systemu przez CIO.

Urządzenie D: dostępne przez CIO w SpartaDOS X nie jest procedurą obsługi stacji dysków, lecz systemową procedurą SpartaDOS. Dowolne urządzenie systemu może być dostępne przez CIO z dowolnego programu przez poprzedzenie jej nazwy literą D. Na przykład:

OPEN #3,8,0 "DPRN:"

otwiera wyjście na drukarkę. Oznacza to również, że D4:, DD:, DD4, DDD:, DDSK4:, DDSKD: odpowiadają stacji dysków numer 4. Gdy wywołuje się urządzenie inne niż stacja dysków lub moduł SpartaDOS X (CAR:), to część zawierająca fname.ext jest ignorowana. Oczywiście możliwe jest także użycie zwykłych nazw urządzeń: D1:-D9:, E:, P:, R: itd. tak, jak w innych DOS-ach.


Otwarcie pliku.

Zadanie: Otwiera dostęp do pliku dyskowego poprzez SpartaDOS X
Składnia: OPEN #IOCB,aux1,aux2,"Dd:[path]fname.ext"

Uwagi:
Ta instrukcja otwiera plik dyskowy poprzez SpartaDOS X. Aux1 określa tryb (zapis, odczyt, wymiana, katalog itd), w którym plik jest otwierany. Poniżej podana jest lista dozwolonych wartości aux1. Jeśli nic nie zostało podane, to aux2 powinno być równe 0.

4 Otwiera plik tylko do odczytu.
6 Otwiera katalog dyskietki. Umożliwia odczyt katalogu jak przy pomocy poleceń DIR i DIRS. Aux2 służy do wybrania
rodzaju katalogu. Jeżeli aux2 jest równe 0, to jest użyty format polecenia DIRS. Jeżeli aux2 jest równy 128, to użyty jest długi format DIR, włącznie z rozmiarem w bajtach, datą i czasem.
8 Otwiera plik tylko do zapisu.
9 Otwiera plik w trybie dopisywania danych. Dane będą zapisywane na końcu istniejącego pliku. Jeżeli wskazany plik nie istnieje, to zostanie on utworzony.
12 Otwiera plik w trybie wymiany danych. Ten tryb pozwala zarówno zapisywać jak i odczytywać dane.

UWAGA: Na dyskietkach w formacie SpartaDOS możliwe jest ustawienie głowicy i/lub zapis poza końcem pliku otwartego do wymiany.

Przykład:
Oto krótki przykład programu w Basicu, który odczytuje katalog z dyskietki w stacji numer 1 w długim formacie i wyświetla go na ekranie:

10 DIM ENTRY$(40)
20 OPEN #1,6,128 "D1:*.*"
30 REM TRAP powoduje skok programu do wiersza 80
40 REM gdy zostanie napotkany koniec katalogu
50 TRAP 80
60 INPUT #l,ENTRY$:? ENTRY$
70 GOTO 60
80 CLOSE #1

Bezpośredni dostęp do katalogów.

Ustawienie bitu 4 w aux1 (zwiększenie o 16) umożliwia bezpośredni dostęp do katalogu. Pozwala to na odczytywanie i/lub zapisywanie katalogu SpartaDOS tak, jakby był to normalny plik danych. Jest to znacznie szybsze niż zwykły odczyt katalogu, jednak jest to najprostszy sposób zniszczenia katalogu i uczynienia dyskietki nieużytecznej, gdy popełnisz błąd w jej katalogu. Unikaj bezpośredniego dostępu do katalogu, chyba że wiesz dokładnie co robisz i nie obawiasz się utracić informacji zapisanych na dyskietce. Tryb ten jest dozwolony także dla dyskietek Atari DOS, jeśli zainstalowana jest procedura ATARIDOS.SYS. Tłumaczy ona katalog Atari na format SpartaDOS i odwrotnie.

Wykorzystanie szlaku (path).

Dodanie 32 do wartości aux1 określającej tryb otwarcia tylko do odczytu powoduje korzystanie ze szlaku ustalonego przez zmienną "PATH" przy poszukiwaniu pliku, na przykład:

OPEN #1,4+32,0 "D:CONFIG.DAT"

Nie działa to przy otwieraniu pliku w innym trybie. Więcej informacji na ten temat znajdziesz w rozdziale 5.

Tryb śledzenia.

Dodanie 64 do aux1 ustawia OPEN w trybie śledzenia atrybutów. Teraz aux2 służy do określenia zadanych atrybutów. Jeżeli konieczny jest długi format katalogu, to 128 należy dodać do aux1 zamiast do aux2. W celu określenia śledzonych atrybutów plików następujące wartości powinny być dodane do aux2, zakładając że początkową wartością jest 0:

zabezpieczony +1 niezabezpieczony +16
ukryty +2 nie ukryty +32
archiwalny +4 nie archiwalny +64
podkatalog +8 nie podkatalog +128

Odczytywane będą tylko te pliki, których atrybuty spełniają wskazane warunki. Wartość aux2 równa 0 powoduje ignorowanie wszystkich atrybutów, w tym nawet "ukrycia" pliku.

Na przykład, aby uzyskać katalog w długim formacie zawierający tylko ukryte pliki, należy wiersz 20 we wcześniejszym przykładzie zmienić następująco:

20 OPEN #1,6+64+128,2 "D1:*.*"

Dla krótkiego spisu katalogu bez podkatalogów trzeba użyć:

20 OPEN #1,6+64,128 "D1:*.*"

Zaś długi katalog nie ukrytych, zabezpieczonych plików, które mają rozszerzenie ".COM" da nam:

20 OPEN #1,6+64+128,1+32 "D1:*:COM"

Możliwe jest wybranie przeciwstawnych warunków (np.: 1+16, zabezpieczone i niezabezpieczone) dla każdego atrybutu. Nie powoduje, to błędu, lecz nie zostanie wybrany żaden plik, gdyż żaden wpis katalogu nie spełnia równocześnie obu takich warunków.


Zmiana nazwy pliku (RENAME).

Zadanie: Zmiana nazwy pliku lub grupy plików.
Składnia: XIO 32,#IOCB,0,0,"Dd:(path)fname1.ext fname2.ext"

Uwagi:
Nazwa pliku lub nazwy plików określone przez fname1.ext są zmieniane na fname2.ext, dokładnie tak samo jak przy pomocy polecenia RENAME. Wybrany IOCB powinien być dla tej operacji zamknięty. W specyfikacjach obu nazw mogą być użyte jokery.

UWAGA: SpartaDOS X ma funkcje RENAME o rozbudowanym działaniu. Możliwe jest nadanie dwóm lub więcej plikom tej samej nazwy, gdy zmienia się równocześnie nazwy kilku plików. Sposób odtworzenia takich plików jest podany w opisie polecenia RENAME w rozdziale 4.


Skasowanie pliku (ERASE).

Zadanie: Usuwa zbędny plik z dyskietki.
Składnia: XIO 33,#IOCB,0,0,"Dd:[path]fname.ext"

Uwagi:
Określony plik lub pliki są usuwane z dyskietki. Wybrany IOCB powinien być dla tej operacji zamknięty. W specyfikacji pliku mogą być użyte jokery. Pomimo, iż w niektórych przypadkach możliwe jest odtworzenie skasowanego pliku (patrz polecenie UNERASE w rozdziale 4) to polecenia tego należy używać bardzo ostrożnie.


Zabezpieczenie pliku (ATR +P).

Zadanie: Zabezpiecza plik lib pliki przed skasowaniem lub zmianą.
Składnia: XIO 35,#IOCB,0,0,"Dd:[path]fname.ext"

Uwagi:
Wskazane pliki będą mogły być otwierane tylko do odczytu. Wybrany IOCB powinien być dla tej operacji zamknięty. W specyfikacji pliku mogą być użyte jokery. Zabezpieczonych plików nie można skasować, zmienić i zapisać oraz nie można zmieniać ich nazw.


Odbezpieczanie pliku (ATR -P).

Zadanie: Odbezpiecza pliki uprzednio zabezpieczone.
Składnia: XIO 36,#IOCB,0,0,"Dd:[path]fname.ext"

Uwagi:
Usuwa to status zabezpieczenia wskazanych plików. Pliki te mogą być teraz skasowane, zmienione lub przemianowane. Wybrany IOCB powinien być dla tej operacji zamknięty. W specyfikacji pliku mogą być użyte jokery.


Ustawienie pozycji w pliku (POINT).

Zadanie: Pozwala na bezpośredni dostęp do określonego punktu wewnątrz pliku dyskowego (lub poza końcem pliku, jeśli to konieczne).
Składnia: X=POS
Y=0 (patrz opis)
POINT #IOCB,X,Y
lub
A=INT(POS/65536)
B=INT((POS-A*65536)/256)
C=POS-A*65536-B*256
POKE 844+IOCB*16,C
POKE 845+IOCB*16,8
POKE 846+IOCB*16,A
XIO 37,#IOCB,aux1,aux2,"Dd:"

Uwagi:
Inaczej niż Atari DOS, który stosuje bezwzględną pozycję na dyskietce (sektor i bajt w sektorze) dla funkcji NOTE i POINT, SpartaDOS X używa względnej pozycji w pliku. POS jest tu kolejnym bajtem aktualnie otwartego pliku. Na przykład, jeżeli POS jest 612, to następna instrukcja GET odczyta z pliku 613 bajt. Wartość ta odpowiada tej samej pozycji w pliku, nawet gdy plik zostanie fizycznie przeniesiony na inną dyskietkę. Przed tą operacją plik musi być otwarty.

Z powodu ograniczeń Atari Basic, Basic XL i Basic XE pierwszy pokazany sposób, wykorzystujący instrukcję POINT, działa nie tylko dla pozycji nie przekraczających 32767. Jeżeli podanie zostanie wartość większa niż 32767, to wystąpi błąd. Dla ustalenia dalszych pozycji w tych językach (a także w niektórych innych) konieczne jest użycie drugiego sposobu. Instrukcja POINT jest omijana przez zapisanie trzech bajtów pozycji bezpośrednio w rejestrach IOCB i wykonanie XIO. Aux1 i aux2 muszą mieć wartości takie jak przy otwieraniu pliku.

Inne języki, jak Action! i Turbo Basic XL, nie mają ograniczeń w instrukcji POINT, pozwalając użyć jej zamiast dłuższego sposobu z XIO. W takim przypadku trzeba zastosować następujący format:

Y+INT(POS/65536)
X+POS-Y*65536
POINT #IOCB,X,Y

Jeżeli byłeś użytkownikiem wcześniejszych wersji SpartaDOS, to powinieneś zauważyć, że NOTE i POINT działają teraz w ten sam sposób na dyskietkach Atari DOS i SpartaDOS. POINT nie używa numeru sektora i bajtu niezależnie od formatu dyskietki.

Użycie NOTE i POINT w SpartaDOS X z dyskietką Atari DOS może być bardzo czasochłonne, ponieważ dla określenia względnej pozycji w pliku konieczne jest każdorazowe odczytanie pliku od początku. Powoduje to także wolniejszy odczyt segmentowych plików binarnych z dyskietek Atari DOS niż z dyskietek SpartaDOS. Tabele NOTE i POINT tworzone przez inne DOS-y (w tym wcześniejsze wersje SpartaDOS dla dyskietek Atari DOS) nie są już poprawne.

Na dyskietkach SpartaDOS możliwe jest ustalenie pozycji poza końcem pliku otwartego w trybie dopisywania. Gdy dane są umieszczane w pliku poza końcem, to plik otrzymuje nową długość, lecz żaden fizyczny sektor nie zostaje wykorzystany na odstęp pomiędzy starymi i nowymi danymi. W mapie sektorów plików taki sektor otrzymuje numer 0. Dopiero po zapisaniu czegoś w tym odstępie sektor jest ustalony. Taki odstęp nie może być odczytywany, a plik który go zawiera, nie może być kopiowany. Próba wykonania takiej czynności spowoduje błąd.


Odczyt pozycji w pliku (NOTE).

Zadanie: Określenie bieżącej pozycji w pliku.
Składnia: NOTE #IOCB,X,Y
POS=X+65536*Y

Uwagi:
Operacja ta zwraca bieżącą, względną pozycję w aktualnie otwartym pliku. Nie jest to numer sektora i bajtu w sektorze, niezależnie od formatu dyskietki. Plik musi być przed tą operacją otwarty.

Użytkowników SpartaDOS 2.x i 3.x może zainteresować sposób działania w tej wersji. Instrukcja XIO 38 opisana w podręczniku SpartaDOS Construction SET działa nadal, lecz nie jest konieczna.


Odczyt długości pliku.

Zadanie: Określa długość aktualnie otwartego pliku.
Składnia: XIO 39,#IOCB,aux1,aux2,"Dd:"
A=PEEK(844+IOCB*16)
B=PEEK(845+IOCB*16)
C=PEEK(846+IOCB*16)
LENGHT=A+B*256+C*65536

Uwagi:
Zwraca długość aktualnie otwartego pliku. IOCB, aux1 i aux2 powinny mieć takie same wartości, jak użyte przy otwieraniu pliku.


Odczyt pliku binarnego (LOAD).

Zadanie: Odczytuje i uruchamia plik binarny z innego programu.
Składnia: XIO 40,#IOCB,4,0,"Dd:[path]fname.ext"

Uwagi:
Instrukcja ta odczytuje plik binarny i uruchamia go korzystając z wektorów INIT i/lub RUN. IOCB powinien być zamknięty. Odczyt pliku binarnego z dyskietki AtariDOS trwa nieco dłużej niż odczyt tego samego pliku z dyskietki SpartaDOS.


Tworzenie katalogu (MKDIR).

Zadanie: Tworzy nowy podkatalog.
Składnia: XIO 42,#IOCB,0,0,"Dd:[path]newdir"

Uwagi:
Katalog "newdir" jest tworzonym podkatalogiem. Szlak podany przed nim musi być poprawny. Na przykład, jeżeli użyjesz:

XIO 42,#1,0,0,"D1:LARRY>MOE>CURLY>SHEMP"

to szlak "LARRY>MOE>CURLY>" musi znajdować się rzeczywiście w bieżącym katalogu, aby został utworzony podkatalog "SHEMP".

IOCB powinien być dla tej operacji zamknięty. Działa to TYLKO na dyskietkach w formacie SpartaDOS.


Kasowanie katalogu (RMDIR).

Zadanie: Usuwa istniejący podkatalog.
Składnia: XIO 43,#IOCB,0,0,"Dd:[path]olddir"

Uwagi:
Podkatalog "olddir" jest kasowany. Aby wykonanie tej operacji było możliwe, to musi on być pusty. Zasady użycia szlaków i IOCB są podane w opisie XIO 42.


Zmiana bieżącego katalogu (CHDIR).

Zadanie: Zmienia bieżący katalog na dyskietce.
Składnia: XIO 44,#IOCB,0,0,"Dd:path"

Uwagi:
Zmienia to katalog, który jest stosowany, gdy określona została stacja dysków bez podania katalogu. Zasady użycia szlaku i IOCB są podane w opisie XIO 42.


Ustalenie odczytu wstępnego (BOOT).

Zadanie: Określa plik, który będzie odczytywany przy włączeniu komputera bez SpartaDOS X.
Składnia: XIO 45,#IOCB,0,0,"Dd:[path]fname.ext"

Uwagi:
Powoduje to odczyt wskazanego pliku, gdy komputer jest włączany lub ponownie uruchamiany bez użycia modułu SpartaDOS X. We wcześniejszych wersjach SpartaDOS odczytywany był plik *.DOS. W SpartaDOS X instrukcja ta ma pewne ograniczenia. IOCB powinien być zamknięty, a dyskietka musi mieć format SpartaDOS.

UWAGA: BOOT nie działa ze wszystkimi plikami binarnymi. Gdy odczytywany jest plik bez DOS-u, musi być spełnionych kilka specjalnych warunków. Podstawowym zastosowaniem tej instrukcji jest odczyt pliku DOS.


Ustawienie atrybutów (ATR).

Zadanie: Ustala status zabezpieczenia, ukrycia i archiwizacji plików.
Składnia: XIO 49,#IOCB,aux1;aux2,"Dd:fname.ext"

Uwagi:
Instrukcja ta służy do modyfikacji atrybutów pliku lub plików. W nazwie pliku dozwolone są jokery. Aux1 wskazuje zmieniane atrybuty i określa sposób ich zmiany. Aux2 wybiera pliki, których atrybuty będą zmieniane.

W celu wykonania żądanej modyfikacji atrybutów, należy do aux1 dodać następujące wartości, zakładając, że początkową wartością jest 0:

zabezpieczenie +1 odbezpieczenie +16
ukrycie +2 ujawnienie +32
ustawienie arch. +4 skasowanie arch. +64

Aux2 ma takie samo znaczenie, jak w trybie śledzenia instrukcji OPEN. Wybiera on pliki według ich aktualnych atrybutów. Następujące wartości powinny być dodane do aux2, zakładając że początkowa wartością było 0:

zabezpieczony +1 niezabezpieczony +16
ukryty +2 nie ukryty +32
archiwalny +4 nie archiwalny +64
podkatalog +8 nie podkatalog +128

Na przykład, w celu ukrycia wszystkich plików z rozszerzeniem ".BAK" w stacji numer 1 użyj:

XIO 46,#1,2,0,"D1:*.BAK"

Aby zabezpieczyć i ustawić archiwalność wszystkich ukrytych plików w stacji numer 1 użyj:

XIO 49,#1,1+4,2,"D1:*.*"

zaś dla ujawnienia i odbezpieczenia wszystkich ukrytych plików z rozszerzeniem ".BAK" w stacji numer 1 użyj:

XIO 49,#1,16+32,2,"D1:*.BAK"

Dla tej operacji IOCB powinien być zamknięty.


Formatowanie dyskietki (FORMAT).

Zadanie: Inicjuje dyskietkę, ustalając odpowiednie dane dla ścieżek, sektorów i katalogu.
Składnia: XIO 254,#IOCB,0,0,"Dd:"

Uwagi:
Parametr "Dd:" jest ignorowany, ponieważ instrukcja ta powoduje skok do menu formatera SpartaDOS X. Numer stacji, format, gęstość i inne wartości mogą być wybrane z tego menu. Gdy formater jest opuszczany przez naciśnięcie klawisza <ESC>, to sterowanie jest ponownie przekazywane do realizowanego programu. Wybrany IOCB powinien być zamknięty.

UWAGA: Formatowanie dyskietki niszczy wszystkie zawarte na niej dane. Ukrycie i zabezpieczenie nie chroni pliku przed zniszczeniem podczas formatowania dyskietki.

Następne dwie operacje nie są dostępne poprzez instrukcję XIO. Muszą one być wywołane bezpośrednio poprzez CIO. Po programie w Basicu demonstrującym ich użycie zamieszczony jest wydruk procedury w języku maszynowym, która pozwala na wykorzystanie tych operacji.


Odczyt danych (CHKDSK).

Zadanie: Odczytuje dane o dyskietce.
Dane: iccom = 47
icbal = młodszy bajt adresu "Dd:"
icbah = starszy bajt adresu "Dd:"
icbll = młodszy bajt adresu bufora
icblh = starszy bajt adresu bufora
Wynik: bufor = wynik operacji CHKDSK (17 bajtów)
+0 = numer wersji dyskietki, 0 dla formatu Atari DOS
+1 = liczba bajtów w sektorze, 0 dla 256 bajtów
+2 = całkowita liczba sektorów na dyskietce (2 bajty)
+4 = liczba wolnych sektorów na dyskietce (2 bajty)
+6 = nazwa dyskietki, zawsze "AtariDOS" dla formatu Atari DOS
(8 bajtów)
+14 = sekwencyjny numer dyskietki, 0 dla formatu Atari DOS
+16 = losowy numer dyskietki, 0 dla formatu Atari DOS

Odczyt bieżącego katalogu (CHDIR).

Zadanie: Odczytuje szlak od katalogu głównego do bieżącego katalogu stacji.
Dane: iccom = 48
icbal = młodszy bajt adresu "Dd:[path]"
icbah = starszy bajt adresu "Dd:[path]"
icbll = młodszy bajt adresu bufora
icblh = starszy bajt adresu bufora
Wynik: bufor = wynik operacji CHDIR

Przykład:

Poniżej znajduje się krótki program w Basicu demonstrujący użycie dwóch ostatnich wywołań CIO. Dalej umieszczony jest wydruk w asemblerze procedury zawartej w instrukcjach DATA (a później w zmiennej tekstowej CIO$).

10 DIM CIO$(32),BUFFER(64),DRIVE$(4),CHKDSK(17)
20 DRIVE$="D1:":DRICE$(4)=CHR$(155)
30 RESTORE 50
40 FOR X=1 TO 32:READ Y:CIO$(X)-CHR$(Y):NEXT X
50 DATA 104,104,104,10,10,10,10,170,104,104,157
60 DATA 66,3,104,157,69,3,104,157,68,3,104,157
70 DATA 73,3,104,157,72,3,76,86,228
80 REM PETLA GLOWNA
90 BUFFER$(1)=CHR$(0):BUFFER$(64)=CHR$(0)
100 BUFFER$(2)=BUFFER$
110 ? :? "Demonstracja wywołania CIO"
120 ? :? "1 -> CHKDSK"
130 ? :? "2 -> Szlak do bieżącego katalogu"
140 INPUT CHOICE
150 IF CHOICE<>1 AND CHOICE<>2 THEN l20
160 ICCOM=CHOICE+46
170 ? :? "Która stacja";: INPUT D
180 D=INT(D): IF D<1 OR d>9 THEN 170
190 DRIVE$(2,2)=STR$(D):IOCB=1:?
200 X=USR(ADR(CIO$),ICOB,ICCOM,ADR(DRIVE$),ADR(BUFFER$))
210 IF CHOICE=1 THEN 270
220 IF BUFFER$(1,1)=CHR$(0)THEN ? "Katalog głowny":GOTO 80
230 FOR X=1 TO LEN(BUFFER$)
240 IF BUFFER$(X,X)=CHR$(0) THEN BUFFERS(X,X) ">":BUFFER$=BUFFER$(1,X):POP :GOTO 260
250 NEXT X
260 ? BUFFER$:GOTO 80
270 FOR X=1 TO 17:Y=ASC(BUFFER$(X,X)):CHKDSK(X-1)=Y:NEXT X
280 ? " VOLUME: "BUFFER$(7,14)
290 ? "Bytes/sector: ";
300 IF CHKDSK(1)=0 THEN CHKDSK(1)=256
310 ? CHKDSK(1)
320 ? "Total bytes: ";
330 ? CHKDSK(1)=(CHKDSK(2)+256+CHKDSK(3))
340 ? " Bytes free: ";
350 ? CHKDSK(1)=(CHKDSK(4)+256+CHKDSK(5))
360 GOTO 80

; adres początkowy jest dowolny
; gdyż procedura będzie w ciągu
clov		.equ		$E456
iccom 	.equ 	$0342
icbal 	.equ 	$0344
icbah 	.equ 	$0345
icbll 	.equ 	$0348
icblh 	.equ 	$0349
  *=5000 			; lub gdziekolwiek.
  pla 				; liczba argumentów.
  pla 				; powinno być 0.
  pla 				; numer IOCB.
  asi a 			; mnoży przez 16
  asi a 			; dla uzyskania
  asi a 			; poprawnej formy
  asi a
  tax 				; do x, gdzie pozostaje
  pla 				; znowu 0
  pla 				; numer rozkazu.
  sta iccom, x
  pla 				; adres ciągu "Dx:"
  sta icbah, x
  pla
  sta icbal, x
  pla 				; adres bufora
  sta icblh, x
  pla
  sta icbll, x
  jmp clov 			; wszystko. Skok do CIO.

Tablica danych SpartaDOS.

Liczne zmienne SpartaDOS są dostępne dla programisty, co pozwala na łatwe korzystanie z nich przez programy użytkowe i aplikacyjne. Ta tablica danych jest określona jako COMTAB i jest wskazywana przez zmienną DOSVEC systemu operacyjnego znajdującą się pod adresem 10 ($OA). Sposób korzystania z niej jest pokazany w zamieszczonym na końcu przykładzie napisanym w asemblerze. Tablica COMTAB jest jednakowa dla wszystkich wersji SpartaDOS, a wyjątki są wskazane w opisie. Ponadto rejestry COMTAB, ZCRNAME, BUFOFF i LBUF są wykorzystywane przez OS/A+ i DOS XL.

DECOUT COMTAB-19
Tylko SpartaDOS X. Zawiera uzupełniony spacjami, przesunięty w prawo wynik procedury "misc_convdc", czyli ciąg znaków ASCII reprezentujący trzybajtową liczbę z DIVEND (patrz "Wartości tablicy na stronie 7"). 8 bajtów.

LSIO COMTAB-10
Wektor wskazujący szybką procedurę obsługi SIO SpartaDOS. Możesz użyć zawartego tu adresu zamiast $E459 (OS SIOV) do wykonania szybkich operacji sektorowych I/O w Twoich programach.

DIVEND COMTAB-6
Tylko SpartaDOS X. Zawarta tu trzybajtowa liczba jest zamieniana przez procedurę "misc_convdc" na ciąg zapisywany w DECOUT (patrz "Wartości tablicy na str. 7").

WARTCMD COMTAB-2
Ten rejestr zawiera rozkaz zapisu SIO. "W" wskazuje zapis z weryfikacją, a "P" wskazuje zapis bez weryfikacji.

COMTAB COMTAB+0
Znajduje się tu rozkaz skoku 6502, po którym następuje adres wejściowy procedury DOS. Skok tutaj wywołuje DOS.


ZCRNAME COMTAB+3
Znajduje się tu rozkaz skoku 6502, po którym następuje adres rozpoczynającej nazwę pliku. Jest to stosowane do interpretacji wiersza polecenia. Skok tutaj powoduje pobranie następnego polecenia z LBUF, przetłumaczenie identyfikatora urządzenia, jeśli został podany, dodanie ustalonego identyfikatora, jeśli nie został podany oraz umieszczenie wyniku w COMFNAM. Każde wywołanie przesuwa wskaźnik BUFOFF na następny wpis w wierszu poleceń, więc każde wywołanie odczytuje następną część wiersza. Jeżeli nie ma więcej wpisów, to przy powrocie ustawiany jest bit Zero w 6502. Ponieważ 6502 nie ma względnego wywołania procedury (jsr), to konieczne jest użycie kilku wierszy asemblera, aby uzyskać dostęp do tej procedury. Jest to pokazane w przykładzie.

BUFOFF COMTAB+10
Wskazuje pozycje w LBUF, gdzie umieszczony jest następny parametr, który będzie odczytywany. Można zmienić tą wartość w celu ponownego odczytania wiersza polecenia.

DATER COMTAB+13
Data w formacie dd/mm/rr (3 bajty). Zmieniany przez VGETTD. Ciągle zmieniany gdy włączone jest wyświetlanie czasu i daty w SpartaDOS X.

TIMER COMTAB+16
Czas w formacie hh/mm/ss (3 bajty). Zmieniany przez VGETTD. Ciągle zmieniany gdy włączone jest wyświetlanie czasu i daty.

_BOOFLG COMTAB+27
Tylko SpartaDOS X. Jeżeli komputer jest Atari 800, to $FF. W przeciwnym przypadku zero.

NBNKFLG COMTAB+29
Tylko SpartaDOS X. Liczba wolnych dodatkowych banków pamięci. Ta liczba jest podawana przez polecenie MEM.

BANFLG COMTAB+30
Tylko SpartaDOS X. Jeżeli DOS używa dodatkowej pamięci (USE BANKED), to zawiera $FF. W przeciwnym przypadku zero.

OSRMFLG COMTAB+31
Tylko SpartaDOS X. Jeżeli DOS używa dodatkowej pamięci RAM pod systemem operacyjnym (USE OSRAM), to zawiera $FF. W przeciwnym przypadku zero.

UWAGA: USE NONE jest wskazywane przez równe zero wartości BANKFLG i OSRMFLG.

COMFNAM COMTAB+33
Docelowy bufor procedury ZCRNAME. Zawsze zaczyna się od Dd:, ponieważ ustalona stacja jest dodawana, gdy żadna inna nie została podana. Ten bufor ma 20 bajtów długości.

LBUF COMTAB+63
Wejściowy bufor Command Processor. Tu zapisywany jest cały wiersz polecenia. LBUF ma 64 bajty długości.

COPYBUF COMATB+127
Główny bufor systemu SpartaDOS X.

Przykład:
Poniższy przykład w asemblerze demonstruje sposób odczytu wiersza poleceń SpartaDOS. Kopiuje on po prostu wiersz poleceń, w razie konieczności z dodaniem lub tłumaczeniem specyfikacji stacji. Ustawia on także BUFOFF na zero, więc nazwa polecenia jest wyświetlana.

; wartości CIO i IOCB
clov		.equ 	$E456
iccom 	.equ 	$0342
icbal 	.equ 	$0344
icbah 	.equ 	$0345
icbll 	.equ 	$0348
icblh 	.equ 	$0349
write 	.equ 	$09
; wartości SpartaDOS
comtab 	.equ 	10
zcrname 	.equ 	3
bufoff 	.equ 	10
comfname 	.equ 	33
; Program
 *=$400			; lub gdziekolwiek.
 init 				; szlak twojej procedury
 	ldy #scrname+2		; jest taki jak COMTAB
 	ldx #2
 loop1
 	lda (comtab),y
 	sta crunch,x
 	dey
 	dex
 	bpl loop1
; zerowanie BUFOFF
	lda #0
 	ldy #bufoff
 	sta (comtab),y
mainicop
 	jsr crunch 		; odczyt następnego wpisu.
 	beq exut 			; koniec gdy nie ma.
; Ustawienie danych w COMFNAM dla CIO
	ldx #0		; IOCB #0(E:)
 	lda #63		; max długość bufora
 	sta icbll,x
 	lda #0
 	sta icblh,x
 	lda comtab	; zapis COMTAB+33 w icba
 	clc
 	adc #comfnam
 	sta icbal,x
 	lda comtab,x
 	lda comtab+1
 	adc #0
 	sta icbah,x
 	lda #write	; rozkaz "print string"
 	sta iccom,x
 	jsr clov		;wyświetlenie.
 	jmp mainioop
exit	
 	rts
crunch
 	jmp $FFFF		; zmieniane przez INIT
 	#=$02E0
 	.word init	; wektor uruchomienia.

Wektory pod OS ROM.

Poniższe wektory są dostępne tylko w komputerach XL/XE. Znajdują się one pod ROM systemu operacyjnego i są niszczone przez każdy program wykorzystujący ten obszar, jak Turbo Basic XL. Dobrą praktyką jest sprawdzenie _BOOGLG dla upewnienia się, czy to jest komputer XL/XE i sprawdzeniu każdego wektora przed użyciem.

Ponieważ te wektory są pod ROM, to konieczne jest włączenie RAM zamiast ROM w tym obszarze pamięci. Oto jeden z możliwych sposobów:

lda 		$D301 	; zapis stanu PIA
pha 				; wybierającego banki.
and 		#$FE 	; kasowanie bitu 0.
sta 		$D301 	; włączenie RAM pod ROM
jsr 		VGETTD	; wywołanie procedury
pla
sta 		$D301 	; odtworzenie PIA.

Każda z tych funkcji zawiera rozkaz skoku (JMP), po którym następuje adres procedury. Dobrą praktyką jest sprawdzenie istnienia JMP przed wywołaniem procedury.

VGETTD $FFC0
Umieszcza aktualną wartość czasu i daty w rejestrach TIMER i DATER w COMTAB.

VSETTD $FFC3
Ustawia aktualny czas i datę według wartości umieszczonych w rejestrach TIMER i DATER w COMTAB.

VTDON $FFC6
Włącza i wyłącza wyświetlanie czasu i daty. Jeżeli przy wywołaniu rejestr Y 6502 zawiera 1, to wyświetlanie jest włączane. Jeżeli zawiera 0, to jest wyłączane. Po zakończeniu procedury bit Carry 6502 jest ustawiony, gdy operacja nie została wykonana poprawnie (TD.COM nie był uruchomiony i procedura nie jest zainstalowana).

VFMTTD $FFC9
Zapisuje wiersz czasu/daty we wskazanym buforze. Przed wywołaniem starszy bajt adresu bufora musi być umieszczony w rejestrze X 6502, zaś młodszy bajt w rejestrze Y. Po zakończeniu procedury bit Carry 6502 jest ustawiony, gdy operacja nie została wykonana poprawnie (TD.COM nie był uruchomiony i procedura nie jest zainstalowana).

VXCOMLI $FFD2
Powoduje wykonanie wiersza zawartego w buforze LBUF w COMTAB. Przy wywołaniu BUFOFF powinien zawierać 0.

VKEYON $FFD8
Włącza i wyłącza bufor klawiatury. Jeżeli przy wywołaniu rejestr Y 6502 zawiera 1, to bufor jest włączany. Jeżeli 0, to jest wyłączany.

Wartości tablic na stronie 7.

Liczne rejestry na stronie 7 umożliwiają dostęp do systemu operacyjnego SpartaDOS X. Dokładne wyjaśnienie znaczenia wszystkich rejestrów wykracza poza ramy tej instrukcji, lecz poniżej podane jest kilka bardziej interesujących.

Nazwa Adres Funkcja
     
Sparta_flag $0700 "S", jeśli SpartaDOS
sparta_version $0701 wersja $32=3.2,$40=4.0 itd.
karnel $0703 skok (JMP) do wejścia systemu
misc $0709 skok (JMP) do wejścia "misc"
sio_index $070F table "swap" (9 bajtów)
device $0761 numer urządzenia systemu
name $0762 nazwa i rozszerzenie (11 bajtów)
date $077B patrz niżej (3 bajty)
time $077E patrz niżej (3 bajty)
dateset $0781 patrz niżej
path $07A0 szlak (64 bajty)

Procedury systemowe są wywoływane przez wykonanie skoku do procedury (JSR pod adres $0703 z kodem żądanego rozkazu w rejestrze Y 6502 i numerem żądanego urządzenia w device. Na przykład, z $10 w device wartość 100 w Y powoduje umieszczenie aktualnego czasu i daty w rejestrach time i date. 101 powoduje ustawienie aktualnego czasu i daty według wartości zawartych zmiennych time i date.

Kd_gettd 100 - odczyt czasu i daty
Kd_settd 101 - ustawienie czasu i daty

Poniżej znajduje się wykaz poprawnych rozkazów wektora "misc". Muszą one być wpisane do akumulatora 6502 przed wykonaniem JSR $0709. Rejestr Y jest używany jako indeks COPYBUF dla operacji, które korzystają z tego bufora.

Misc_initz 0 - inicjowanie "misc"
Misc_getfina 1 - zmiana szlaku z COPYBUF na device, path i name Misc_getpath 2 zmiana szlaku z COPYBUF na device i path
Misc_convdc 4 - zmiana liczby z DIVEND na tekst w DECOUT

Cztery młodsze bity w liczbie device są numerem urządzenia, na przykład, 2 dla D2:. Cztery starsze bity mają następujące znaczenie:

0 blok SIO (SPARTA.SYS, ATARIDOS.SYS itd.)
1 zegar (CLOK.SYS, JIFFY.SYS)
2 procedura obsługi modułu ROM
3 procedura obsługi konsoli
4 procedura obsługi drukarki
5 procedura obsługi RS232 (COM.SYS)
6 zarezerwowane
7 zarezerwowane


Za każdym razem, gdy otwierany jest plik, czas i data dla pliku są umieszczane w time i date. Gdy plik jest otwierany tylko do zapisu dateset jest równy 0, to bieżący czas i data są odczytywane do time i date oraz przepisywane do pliku. Jeżeli dateset jest $FF, to plik otrzymuje datę i czas, które były w rejestrach, gdy plik został otwarty. Datatest, inaczej niż rejestr TDOVER we wcześniejszych wersjach SpartaDOS, jest automatycznie kasowany po użyciu. Przy kopiowaniu pliku pozostawia to oryginalny czas i datę. Także w ten sposób programy (jak ARC) przypisują zapamiętane informacje o czasie i dacie nowego pliku.