<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=Programowanie%3A_Przerywanie_d%C5%82ugotrwa%C5%82ych_operacji_klawiszem_BREAK</id>
	<title>Programowanie: Przerywanie długotrwałych operacji klawiszem BREAK - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=Programowanie%3A_Przerywanie_d%C5%82ugotrwa%C5%82ych_operacji_klawiszem_BREAK"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Programowanie:_Przerywanie_d%C5%82ugotrwa%C5%82ych_operacji_klawiszem_BREAK&amp;action=history"/>
	<updated>2026-10-04T22:54:07Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=Programowanie:_Przerywanie_d%C5%82ugotrwa%C5%82ych_operacji_klawiszem_BREAK&amp;diff=3304&amp;oldid=prev</id>
		<title>imported&gt;Atariki recovery: Reconstructed from archived HTML; see provenance manifest</title>
		<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Programowanie:_Przerywanie_d%C5%82ugotrwa%C5%82ych_operacji_klawiszem_BREAK&amp;diff=3304&amp;oldid=prev"/>
		<updated>2026-10-01T08:51:48Z</updated>

		<summary type="html">&lt;p&gt;Reconstructed from archived HTML; see provenance manifest&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[SpartaDOS X]] posiada mechanizmy pozwalające programiście elegancko obsługiwać sytuacje wyjątkowe.&lt;br /&gt;
Służą do tego procedury opisane w 4 rozdziale [http://sdx.atari8.info/index.php?show=en_docs podręcznika programowania] p.t. &amp;quot;Obsługa błędów&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Zazwyczaj używa się ich przy przechwytywaniu sytuacji wyjątkowych występujących podczas operacji na plikach, jednakże można z powodzeniem wykorzystać ten mechanizm do generowania sytuacji wyjątkowych we własnych procesach.&lt;br /&gt;
&lt;br /&gt;
Wystarczy ustawić własną obsługę błędu za pomocą &amp;#039;&amp;#039;&amp;#039;U_SFAIL&amp;#039;&amp;#039;&amp;#039; i z wnętrza własnej procedury wywołać fukcję &amp;#039;&amp;#039;&amp;#039;U_FAIL&amp;#039;&amp;#039;&amp;#039; z kodem błędu w akumulatorze:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;protectedroutine:&lt;br /&gt;
  lda ?catchad&lt;br /&gt;
  ldx ?catchad+1&lt;br /&gt;
  jsr U_SFAIL&lt;br /&gt;
&lt;br /&gt;
  jsr routine&lt;br /&gt;
&lt;br /&gt;
  jmp U_XFAIL&lt;br /&gt;
&lt;br /&gt;
?catchad .dw catchroutine&lt;br /&gt;
&lt;br /&gt;
catchroutine:&lt;br /&gt;
  ...           ;obsługujemy błąd&lt;br /&gt;
  rts&lt;br /&gt;
&lt;br /&gt;
;a to procedura generująca błąd&lt;br /&gt;
routine:&lt;br /&gt;
  ...           ;coś robimy&lt;br /&gt;
&lt;br /&gt;
  lda #ERROR    ;i generujemy błąd&lt;br /&gt;
  jmp U_FAIL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W przypadku wygenerowania błędu funkcja &amp;#039;&amp;#039;&amp;#039;U_FAIL&amp;#039;&amp;#039;&amp;#039; przekazuje sterowanie natychmiast do procedury obsługi, a stan stosu odtwarzany jest tak, aby powrót nastąpił do procedury wywołującej kod zakładający pułapkę - w tym przypadku będzie to punkt wywołujący &amp;#039;&amp;#039;&amp;#039;protectedroutine&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;UWAGA!&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;U_SFAIL&amp;#039;&amp;#039;&amp;#039; w żaden sposób nie raportuje przepełnienia wewnętrznego stosu zarejestrowanych procedur obsługi błędów należy więc pamiętać, iż takich procedur obsługi może być maksymalnie 10.&lt;br /&gt;
&lt;br /&gt;
== Klawisz BREAK ==&lt;br /&gt;
&lt;br /&gt;
OS w przypadku naciśnięcia klawisza BREAK powoduje wyzerowanie komórki IRQSTAT ($11). Można więc wykorzystując opisany wyżej mechanizm łatwo zaimplementować funkcjonalność przerywania dowolnego długotrwałego procesu za pomocą wciśnięcia klawisza BREAK.&lt;br /&gt;
&lt;br /&gt;
W kodzie długotrwałej procedury należy co jakiś czas sprawdzać zawartość IRQSTAT i jeśli została wyzerowana rzucić błąd (np. [[Kody statusowe Atari OS|BREAK KEY ABORT]])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;routine:&lt;br /&gt;
  ...&lt;br /&gt;
  jsr erroronbreak&lt;br /&gt;
  ...&lt;br /&gt;
  rts&lt;br /&gt;
&lt;br /&gt;
erroronbreak:&lt;br /&gt;
  lda IRQSTAT&lt;br /&gt;
  seq&lt;br /&gt;
  rts&lt;br /&gt;
  dec IRQSTAT&lt;br /&gt;
  lda #$80      ;BREAK KEY ABORT&lt;br /&gt;
  jmp U_FAIL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warto zauważyć, iż po wykryciu wciśnięcia klawisza BREAK wstawiana jest wartość $FF do IRQSTAT. Ustawiana jest ona przez OS podczas normalnej pracy i po obsłudze wciśnięcia klawisza BREAK podczas procedur I/O (procedury edytora ustawiają tam wartość $80 po obsłudze wciśnięcia klawisza BREAK, lub $88 po obsłudze wciśnięcia kombinacji klawiszy CTRL+3).&lt;br /&gt;
Jest to o tyle istotne, że funkcje konsoli sprawdzają tę komórkę i również generują błąd wciśnięcia klawisza BREAK, więc brak jej obsługi spowodowałby nieoczekiwane wyrzucenie błędu przy pierwszej próbie użycia np. &amp;#039;&amp;#039;&amp;#039;PRINTF&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;PUTC&amp;#039;&amp;#039;&amp;#039;, itp.&lt;br /&gt;
&lt;br /&gt;
Oczywiście ustawianie własnej pułapki przez &amp;#039;&amp;#039;&amp;#039;U_SFAIL&amp;#039;&amp;#039;&amp;#039; nie jest obowiązkowe. Wyjątek rzucony przez &amp;#039;&amp;#039;&amp;#039;U_FAIL&amp;#039;&amp;#039;&amp;#039; przechwyci w takiej sytuacji poprzednio zarejestrowana procedura lub w ostateczności systemowa procedura obsługi błędów.&lt;br /&gt;
&lt;br /&gt;
== Kody błędów ==&lt;br /&gt;
&lt;br /&gt;
Do &amp;#039;&amp;#039;&amp;#039;U_FAIL&amp;#039;&amp;#039;&amp;#039; w akumulatorze przekazuje się kod błędu. Kody te dzielone są na dwie logiczne grupy:&lt;br /&gt;
&lt;br /&gt;
* wartości dodatnie (0..127) oznaczają kody statusu operacji,&lt;br /&gt;
* wartości ujemne (128..255, czy też inaczej -128..-1) oznaczają kody błędów.&lt;br /&gt;
&lt;br /&gt;
W przypadku gdy rzucony wyjątek obsługuje procedura systemowa, wtedy wyłącznie w przypadku wyrzucenia kodu błędu następuje wypisanie komunikatu (wg pliku zdefiniowanego w zmiennej środowiskowej &amp;#039;&amp;#039;&amp;#039;$SYSERR&amp;#039;&amp;#039;&amp;#039; - standardowo jest to CAR:SYSERR.MSG) na ekran konsoli.&lt;br /&gt;
&lt;br /&gt;
Jeśli program wywoływany jest z poziomu polecenia wsadowego zwrócony kod statusu można testować za pomocą warunku &amp;#039;&amp;#039;&amp;#039;IF ERROR&amp;#039;&amp;#039;&amp;#039;. Szczegóły opisane są w 5 rozdziale [http://sdx.atari8.info/index.php?show=en_docs instrukcji użytkownika] p.t. &amp;quot;Command Processor - szersze możliwości&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Programowanie Atari 8-bit]]&lt;br /&gt;
[[Kategoria:Niezbędnik kodera]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>