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