Wiersz poleceń
From Atariki
Wersja z dnia 06:01, 30 lip 2015 Sikor (Dyskusja | wkład) (+nakładka funkcyjna na inne) ← 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, 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 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ń").