Wiersz poleceń

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 07:28, 30 lip 2015
Mono (Dyskusja | wkład)
(Inicjowanie funkcji odczytu wiersza poleceń - tryb posredni indeksowy)
← Previous diff
Aktualna wersja
KMK (Dyskusja | wkład)
(korekta przykładu i opisu (funkcja była źle opisana przez ICD w podręczniku użytkownika SDX, stąd zamieszanie))
Linia 1: Linia 1:
-Część [[DOS]]-ów dla Atari obsługiwana jest za pośrednictwem tzw. [https://pl.wikipedia.org/wiki/Wiersz_polece%C5%84 wiersza poleceń] (ang. ''command line''). Takimi DOS-ami są np. [[OS/A Plus|OS/A+]], [[DOS XL]], [[SpartaDOS]], [[TopDOS]]. System (na ogół) oferuje przy tym funkcję pozwalającą programowi na w miarę bezbolesny odczyt parametrów podanych przez użytkownika.+Część [[DOS]]-ów dla Atari obsługiwana jest za pośrednictwem tzw. [https://pl.wikipedia.org/wiki/Wiersz_polece%C5%84 wiersza poleceń] (ang. ''command line''). Takimi DOS-ami są np. [[OS/A Plus|OS/A+]], [[DOS XL]], [[SpartaDOS]], [[BW-DOS]], [[CP|DOS 2.5CP]], [[DOS II/D|DOS II+/D]], [[TopDOS]]. System (na ogół) oferuje przy tym funkcję pozwalającą programowi na w miarę bezbolesny odczyt parametrów podanych przez użytkownika.
-Część DOSów nie mająca w standardzie wiersza poleceń doczekała się nakładki funkcyjnej lub zamiennika warstwy funkcyjnej (w większości przypadków zapisywanej jako DUP.SYS) oferującej standard wiersza poleceń, który zazwyczaj ma zaimplementowane wszystkie (lub większość) polecenia danego dosu. Przykładem jest tu DOS 2,5 i jego [[Command Procesor]] wypuszczony przez [[L.K. Avalon]].+== Standard OSS ==
-Standard w tej dziedzinie opracowała firma [[OSS]]. Zgodny z nim interfejs wiersza poleceń zaimplementowano w DOS XL oraz SpartaDOS.+Najpopularniejszy standard w tej dziedzinie jest dziełem firmy [[OSS]]. Zgodny z nim interfejs wiersza poleceń zaimplementowano w OS/A+ (czyli DOS XL), a [[ICD]] użyło go w SpartaDOS. Obsługuje go też BW-DOS - jako klon SpartaDOS.
-== Wykrycie dostępności wiersza poleceń ==+=== Wykrycie dostępności wiersza poleceń ===
-Nie wszystkie DOS-y zawierają funkcje odczytu wiersza poleceń, jego obecność trzeba zatem wykryć. Standard DOS XL przewiduje, że funkcja odczytu wiersza poleceń jest dostępna, jeśli pod adresem wskazanym przez wektor DOSVEC ($0a), dodać 3, znajduje się rozkaz skoku JMP procesora [[6502]]. Rozkaz ten (w trybie absolutnym) ma kod operacyjny 76 ($4C):+Nie wszystkie DOS-y zawierają funkcje odczytu wiersza poleceń, jego dostępność trzeba zatem wykryć. Standard DOS XL przewiduje, że funkcja odczytu wiersza poleceń jest dostępna, jeśli pod adresem wskazanym przez wektor DOSVEC ($0a), dodać 3, znajduje się rozkaz skoku JMP procesora [[6502]]. Rozkaz ten (w trybie absolutnym) ma kod operacyjny 76 ($4C):
<pre> <pre>
 +boot? = $09
dosvec = $0a dosvec = $0a
 +
 + lda boot? ; sprawdzamy, czy DOS w ogóle jest w pamięci
 + lsr
 + bcc _no_command_line
 +
 + lda dosvec+1 ; a jeśli tak, czy DOSVEC nie wskazuje ROM-u
 + cmp #$c0
 + bcs _no_command_line
ldy #$03 ldy #$03
Linia 22: Linia 31:
</pre> </pre>
-== Inicjowanie funkcji odczytu wiersza poleceń ==+=== Inicjowanie funkcji odczytu wiersza poleceń ===
Jeśli wykrycie się powiodło, ten adres - tzn. (DOSVEC)+3 - jest adresem wywołania procedury pobrania parametrów z wiersza poleceń. Ponieważ w 6502 brakuje rozkazu wywołania procedury w trybie pośrednim indeksowym, najlepiej jest ten adres przepisać do własnego programu: Jeśli wykrycie się powiodło, ten adres - tzn. (DOSVEC)+3 - jest adresem wywołania procedury pobrania parametrów z wiersza poleceń. Ponieważ w 6502 brakuje rozkazu wywołania procedury w trybie pośrednim indeksowym, najlepiej jest ten adres przepisać do własnego programu:
Linia 36: Linia 45:
</pre> </pre>
-== Wywołanie funkcji odczytu wiersza poleceń ==+=== Wywołanie funkcji odczytu wiersza poleceń ===
Kodem jak powyżej inicjujemy następujący rozkaz: Kodem jak powyżej inicjujemy następujący rozkaz:
Linia 44: Linia 53:
</pre> </pre>
-Po wykonaniu tego JSR-a ustawiony bit Z rejestru znaczników CPU (czyli "wynik zerowy") oznacza, że w wierszu poleceń nie ma więcej parametrów. Przeciwny stan tego znacznika znaczy, że parametr został pobrany do bufora COMFNAM znajdującego się pod adresem (DOSVEC)+33. Jego zawartość zawsze zaczyna się od specyfikacji urządzenia (np. "D:") i zawsze zakończona jest znakiem EOL (ASCII 155). A zatem:+Wykonanie tego JSR-a pobiera podany parametr do bufora COMFNAM znajdującego się pod adresem (DOSVEC)+33. Zawartość COMFNAM zawsze zaczyna się od specyfikacji urządzenia (np. "D:") i zawsze zakończona jest znakiem EOL (ASCII 155), co oznacza że przekazując do programu parametr "DOWOL.TXT" w COMFNAM otrzymamy ciąg "D1:DOWOL.TXT"+EOL.
 + 
 +Procedura pobierania parametru nie sprawdza automatycznie, czy wiersz polecenia już się skończył: program musi to sprawdzić przez porównanie stanu wskaźnika bufora wejściowego (BUFOFF) sprzed wywołania procedury ze stanem po jej wywołaniu. A zatem:
<pre> <pre>
 +next ldy #$0a
 + lda (dosvec),y
 + pha
zcr jsr $0000 zcr jsr $0000
 + ldy #$0a
 + pla
 + cmp (dosvec),y
beq _no_more_parameters beq _no_more_parameters
Linia 57: Linia 74:
bne _cp bne _cp
... ; tu robimy z parametrem pobranym do bufora "parbuf" to, co potrzebujemy ... ; tu robimy z parametrem pobranym do bufora "parbuf" to, co potrzebujemy
- jmp zcr+ jmp next
_no_more_parameters _no_more_parameters
... ...
</pre> </pre>
 +
 +'''UWAGA!''' Nieoczywistym może być, że nazwy urządzeń podawane jako parametry do programu rozwijane są wewnętrznie według konwencji przyjętej przez używany DOS. Tak więc parametr "D:DOWOL.TXT" w DOS XL zostanie rozwinięty do postaci "D1:DOWOL.TXT", ale już Sparta DOS X rozwinie go jako "D4:DOWOL.TXT", a to dlatego że "D:" to dla niego czwarty dysk (począwszy od "A:").
 +
 +== SpartaDOS X ==
 +[[SpartaDOS X]], jako klon SpartaDOS, oferuje zgodny z powyżej opisanym interfejs programowy, dzięki czemu istnieje zgodność wstecz, a programy napisane dla DOS XL i SpartaDOS są w stanie interpretować wiersz poleceń również wtedy, kiedy zostały uruchomione pod tym DOS-em.
 +
 +Programy napisane specjalnie dla SpartaDOS X mają do dyspozycji oddzielny, bardziej wyrafinowany interfejs służący do interpretacji parametrów przekazanych w wierszu polecenia. Składa się nań kilkanaście procedur dostępnych za pośrednictwem [[symbol]]i i zawartych w [[Biblioteka SpartaDOS X|bibliotece SpartaDOS X]], które nie tylko pobierają z wiersza poleceń kolejne parametry, ale też są w stanie je automatycznie interpretować i przetwarzać (np. liczbę przekazaną w postaci ciągu ASCII na postać 32-bitowej reprezentacji całkowitej).
 +
 +Opis tego interfejsu znajduje się w [[Przewodnik programisty SpartaDOS X|Przewodniku programisty SpartaDOS X]], dostępnym [http://sdx.atari8.info/index.php?show=en_docs tutaj] (rozdział 5, "Obróbka wiersza poleceń").
[[Kategoria:Niezbędnik kodera]] [[Kategoria:Niezbędnik kodera]]

Aktualna wersja

Część DOS-ów dla Atari obsługiwana jest za pośrednictwem tzw. wiersza poleceń (ang. command line). Takimi DOS-ami są np. OS/A+, DOS XL, SpartaDOS, BW-DOS, DOS 2.5CP, DOS II+/D, TopDOS. System (na ogół) oferuje przy tym funkcję pozwalającą programowi na w miarę bezbolesny odczyt parametrów podanych przez użytkownika.

Spis treści

Standard OSS

Najpopularniejszy standard w tej dziedzinie jest dziełem firmy OSS. Zgodny z nim interfejs wiersza poleceń zaimplementowano w OS/A+ (czyli DOS XL), a ICD użyło go w SpartaDOS. Obsługuje go też BW-DOS - jako klon SpartaDOS.

Wykrycie dostępności wiersza poleceń

Nie wszystkie DOS-y zawierają funkcje odczytu wiersza poleceń, jego dostępność trzeba zatem wykryć. Standard DOS XL przewiduje, że funkcja odczytu wiersza poleceń jest dostępna, jeśli pod adresem wskazanym przez wektor DOSVEC ($0a), dodać 3, znajduje się rozkaz skoku JMP procesora 6502. Rozkaz ten (w trybie absolutnym) ma kod operacyjny 76 ($4C):

boot?  = $09
dosvec = $0a

     lda boot?           ; sprawdzamy, czy DOS w ogóle jest w pamięci
     lsr
     bcc _no_command_line

     lda dosvec+1        ; a jeśli tak, czy DOSVEC nie wskazuje ROM-u
     cmp #$c0
     bcs _no_command_line

     ldy #$03
     lda (dosvec),y
     cmp #$4c
     bne _no_command_line
     ...                 ; tu dalsze czynności związane z wierszem poleceń

_no_command_line
     ...                 ; przeskok tutaj oznacza brak dostępności wiersza poleceń

Inicjowanie funkcji odczytu wiersza poleceń

Jeśli wykrycie się powiodło, ten adres - tzn. (DOSVEC)+3 - jest adresem wywołania procedury pobrania parametrów z wiersza poleceń. Ponieważ w 6502 brakuje rozkazu wywołania procedury w trybie pośrednim indeksowym, najlepiej jest ten adres przepisać do własnego programu:

     lda dosvec
     clc
     adc #$03
     sta zcr+1
     lda dosvec+1
     adc #$00
     sta zcr+2

Wywołanie funkcji odczytu wiersza poleceń

Kodem jak powyżej inicjujemy następujący rozkaz:

zcr  jsr $0000

Wykonanie tego JSR-a pobiera podany parametr do bufora COMFNAM znajdującego się pod adresem (DOSVEC)+33. Zawartość COMFNAM zawsze zaczyna się od specyfikacji urządzenia (np. "D:") i zawsze zakończona jest znakiem EOL (ASCII 155), co oznacza że przekazując do programu parametr "DOWOL.TXT" w COMFNAM otrzymamy ciąg "D1:DOWOL.TXT"+EOL.

Procedura pobierania parametru nie sprawdza automatycznie, czy wiersz polecenia już się skończył: program musi to sprawdzić przez porównanie stanu wskaźnika bufora wejściowego (BUFOFF) sprzed wywołania procedury ze stanem po jej wywołaniu. A zatem:

next ldy #$0a
     lda (dosvec),y
     pha
zcr  jsr $0000
     ldy #$0a
     pla
     cmp (dosvec),y
     beq _no_more_parameters

     ldy #33
_cp  lda (dosvec),y
     sta parbuf-33,y
     iny
     cmp #$9b
     bne _cp
     ...                 ; tu robimy z parametrem pobranym do bufora "parbuf" to, co potrzebujemy
     jmp next

_no_more_parameters
     ...

UWAGA! Nieoczywistym może być, że nazwy urządzeń podawane jako parametry do programu rozwijane są wewnętrznie według konwencji przyjętej przez używany DOS. Tak więc parametr "D:DOWOL.TXT" w DOS XL zostanie rozwinięty do postaci "D1:DOWOL.TXT", ale już Sparta DOS X rozwinie go jako "D4:DOWOL.TXT", a to dlatego że "D:" to dla niego czwarty dysk (począwszy od "A:").

SpartaDOS X

SpartaDOS X, jako klon SpartaDOS, oferuje zgodny z powyżej opisanym interfejs programowy, dzięki czemu istnieje zgodność wstecz, a programy napisane dla DOS XL i SpartaDOS są w stanie interpretować wiersz poleceń również wtedy, kiedy zostały uruchomione pod tym DOS-em.

Programy napisane specjalnie dla SpartaDOS X mają do dyspozycji oddzielny, bardziej wyrafinowany interfejs służący do interpretacji parametrów przekazanych w wierszu polecenia. Składa się nań kilkanaście procedur dostępnych za pośrednictwem symboli i zawartych w bibliotece SpartaDOS X, które nie tylko pobierają z wiersza poleceń kolejne parametry, ale też są w stanie je automatycznie interpretować i przetwarzać (np. liczbę przekazaną w postaci ciągu ASCII na postać 32-bitowej reprezentacji całkowitej).

Opis tego interfejsu znajduje się w Przewodniku programisty SpartaDOS X, dostępnym tutaj (rozdział 5, "Obróbka wiersza poleceń").

Personal tools