Wiersz poleceń
From Atariki
Wersja z dnia 23:52, 29 lip 2015 KMK (Dyskusja | wkład) (→Wywołanie funkcji odczytu wiersza poleceń - w zasadzie drugi indeks nie jest potrzebny) ← 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. |
- | Standard w tej dziedzinie opracowała firma [[OSS]]. Zgodny z nim interfejs wiersza poleceń zaimplementowano w DOS XL oraz SpartaDOS. | + | == Standard OSS == |
- | == Wykrycie dostępności wiersza poleceń == | + | 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. |
- | 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): | + | === 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): | ||
<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 20: | Linia 31: | ||
</pre> | </pre> | ||
- | == Inicjowanie funkcji odczytu wiersza poleceń == | + | === Inicjowanie funkcji odczytu wiersza poleceń === |
- | Jeśli wykrycie się powiodło, to ten adres - tzn. (DOSVEC)+3 - jest adresem wywołania procedury pobrania parametrów z wiersza poleceń. Ponieważ w 6502 brak jest rozkazu wywołania procedury w trybie pośrednim, 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: |
<pre> | <pre> | ||
Linia 34: | 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 42: | 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 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 55: | 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ń").