<?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_Program_odporny_na_RESET</id>
	<title>Programowanie: Program odporny na RESET - 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_Program_odporny_na_RESET"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Programowanie:_Program_odporny_na_RESET&amp;action=history"/>
	<updated>2026-10-02T17:46:02Z</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:_Program_odporny_na_RESET&amp;diff=3303&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:_Program_odporny_na_RESET&amp;diff=3303&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;Uodpornienie programu na wciśnięcie klawisza RESET realizowane jest zależnie od tego, w jaki sposób program jest ładowany do pamięci komputera.&lt;br /&gt;
&lt;br /&gt;
== BOOT ==&lt;br /&gt;
&lt;br /&gt;
Program ładowany z nośnika za pośrednictwem procedury BOOT otrzymuje sterowanie w dwóch momentach:&lt;br /&gt;
&lt;br /&gt;
1. Po załadowaniu wszystkich sektorów/rekordów programu określonych w [[BOOT (format pliku)|nagłówku BOOT]].&lt;br /&gt;
&lt;br /&gt;
Wywoływana jest wtedy procedura inicjalizacji umiejscowiona pod adresem BOOT_ADDRESS+6.&lt;br /&gt;
Ta procedura wywoływana jest jednorazowo w całym procesie BOOT i jest to dobre miejsce do inicjalizacji danych, które nie będą inicjalizowane po wykonaniu RESET-u.&lt;br /&gt;
Ponieważ długość programu bootowalnego ograniczona jest do 256 sektorów/rekordów, jest to również dobre miejsce do załadowania pozostałej części programu do pamięci.&lt;br /&gt;
Jeśli proces inicjalizacji przebiegł poprawnie, procedura powinna zakończyć się ze skasowanym znacznikiem C. Ustawiony znacznik C przy wyjściu z procedury skutkuje zgłoszeniem błędu BOOT ERROR i powtórką (lub, w przypadku magnetofonu, zakończeniem) procesu BOOT-owania.&lt;br /&gt;
&lt;br /&gt;
2. Po zainicjalizowaniu programu.&lt;br /&gt;
&lt;br /&gt;
Adres startu programu, umiejscowiony pod adresem BOOT_ADDRESS+4, przepisywany jest do DOSINI ($0C), jeśli BOOT odbywał się z dysku, lub do CASINI ($02) jeśli BOOT-owano z kasety, i jest to automatycznie adres, pod który system operacyjny będzie przekazywał kontrolę programowi po naciśnięciu klawisza RESET.&lt;br /&gt;
&lt;br /&gt;
Nie należy ingerować w zawartość rejestru BOOT? ($09), gdyż jest on ustawiany przez system operacyjny.&lt;br /&gt;
&lt;br /&gt;
Wektor inicjalizacji DOSINI/CASINI może zostać wykorzystany do natychmiastowego uruchomienia programu, lub też do jego inicjalizacji i ustawienia wektora DOSVEC ($0A), do którego sterowanie przekazywane jest przez procedurę RESET po całkowitym zakończeniu jej działania.&lt;br /&gt;
W ten sposób instaluje się w systemie [[DOS]].&lt;br /&gt;
&lt;br /&gt;
Wektor DOSVEC jest ustawiany przez OS w początkowej fazie procedury RESET na adres wejścia do SELF-TEST, więc jeżeli z procedury DOSINI/CASINI powrócimy do systemu nie ustawiwszy wektora DOSVEC, wtedy OS na końcu odda sterowanie właśnie tam.&lt;br /&gt;
&lt;br /&gt;
Wektor DOSVEC służy również do przekazania sterowania po wydaniu komendy &amp;quot;DOS&amp;quot; BASIC-a, oraz jest ogólnie wektorem wskazującym procedurę uruchomienia programu powłoki (zazwyczaj Command Processor lub Menu DOS-a).&lt;br /&gt;
&lt;br /&gt;
Przykładowy program bootujący:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DOSVEC = $a&lt;br /&gt;
&lt;br /&gt;
prog = $2000&lt;br /&gt;
&lt;br /&gt;
  opt h- o+&lt;br /&gt;
  org prog&lt;br /&gt;
&lt;br /&gt;
;nagłówek boot&lt;br /&gt;
  .byte 0      ;flaga boot - nieużywana przez system (niektóre DOS-y ustawiają tu swój identyfikator)&lt;br /&gt;
  .byte count  ;ilość sektorów boot&lt;br /&gt;
  .word prog   ;adres ładowania&lt;br /&gt;
  .word start  ;adres uruchomienia programu&lt;br /&gt;
&lt;br /&gt;
init:&lt;br /&gt;
  ;tu można zainicjalizować dane nie inicjalizowane po RESET&lt;br /&gt;
  ...&lt;br /&gt;
  clc&lt;br /&gt;
  rts&lt;br /&gt;
&lt;br /&gt;
start:&lt;br /&gt;
  ;a tu zainicjalizować dane inicjalizowane po RESET&lt;br /&gt;
  ...&lt;br /&gt;
  ;i przejąć sterowanie&lt;br /&gt;
  ...&lt;br /&gt;
  ;lub ewentualnie zapisać DOSVEC&lt;br /&gt;
  ldx #&amp;amp;lt;run&lt;br /&gt;
  ldy #&amp;amp;gt;run&lt;br /&gt;
  stx DOSVEC&lt;br /&gt;
  sty DOSVEC+1&lt;br /&gt;
  ;i wrócić do systemu&lt;br /&gt;
  rts&lt;br /&gt;
&lt;br /&gt;
run:&lt;br /&gt;
  ;a to się będzie wykonywać po zakończeniu BOOT-a lub po wydaniu polecenia DOS z BASIC-a&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
len = *-prog&lt;br /&gt;
count = (len+127)/128 ;obliczenie ilości sektorów boot - ceil(len/128)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOS ==&lt;br /&gt;
&lt;br /&gt;
Program pracujący pod kontrolą jakiegokolwiek DOS-u nie jest odporny na wciśnięcie klawisza RESET. Zostaje on wtedy przerwany, a kontrola przekazywana jest bezpośrednio do DOS-u.&lt;br /&gt;
&lt;br /&gt;
Aby uodpornić taki program na RESET wykorzystuje się tradycyjny mechanizm inicjalizowania systemu.&lt;br /&gt;
&lt;br /&gt;
Odbywa się to poprzez tzw. przedłużenie wektora DOSINI/CASINI, dzięki czemu przed inicjalizacją własnego programu ma szanse zainicjalizować się DOS oraz programy TSR zainstalowane w systemie wcześniej.&lt;br /&gt;
&lt;br /&gt;
== Format nierelokowalny (zgodny z AtariDOS) ==&lt;br /&gt;
&lt;br /&gt;
Programy w [[Binarny plik DOSu|tradycyjnym formacie binarnym]] nie są relokowalne.&lt;br /&gt;
&lt;br /&gt;
Niezależnie od rodzaju DOS-u, przez który są uruchamiane, przedłużanie wektora CASINI/DOSINI odbywa się w taki sam sposób:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CASINI = 2&lt;br /&gt;
BOOT? = 9&lt;br /&gt;
DOSVEC = $a&lt;br /&gt;
DOSINI = $c&lt;br /&gt;
&lt;br /&gt;
prog = $2000&lt;br /&gt;
&lt;br /&gt;
  opt h+ o+&lt;br /&gt;
  org prog&lt;br /&gt;
&lt;br /&gt;
init:&lt;br /&gt;
  jsr prolong&lt;br /&gt;
  ;w przypadku TSR można tutaj podnieść MEMLO&lt;br /&gt;
  ...&lt;br /&gt;
  ;tutaj wykonujemy program główny&lt;br /&gt;
  ...&lt;br /&gt;
  ;po czym przy wyjściu z programu przywracamy zawartość wektora&lt;br /&gt;
  lda BOOT?&lt;br /&gt;
  ldx #0      ;BOOT z kasety (przywracamy CASINI=$02)&lt;br /&gt;
  cmp #2&lt;br /&gt;
  beq @+&lt;br /&gt;
  ldx #10     ;BOOT z dysku (przywracamy DOSINI=$0C)&lt;br /&gt;
@ lda init+1&lt;br /&gt;
  ldy init+2&lt;br /&gt;
  sta CASINI,x&lt;br /&gt;
  sty CASINI+1,x&lt;br /&gt;
  jmp (DOSVEC)&lt;br /&gt;
&lt;br /&gt;
prolong:&lt;br /&gt;
  ;a to wykona się tylko raz po uruchomieniu programu przez DOS&lt;br /&gt;
  lda BOOT?&lt;br /&gt;
  ldx #0      ;BOOT z kasety (przedłużamy CASINI=$02)&lt;br /&gt;
  cmp #2&lt;br /&gt;
  beq @+&lt;br /&gt;
  ldx #10     ;BOOT z dysku (przedłużamy DOSINI=$0C)&lt;br /&gt;
@ lda CASINI,x&lt;br /&gt;
  ldy CASINI+1,x&lt;br /&gt;
  sta init+1&lt;br /&gt;
  sty init+2&lt;br /&gt;
  lda #&amp;amp;lt;init&lt;br /&gt;
  ldy #&amp;amp;gt;init&lt;br /&gt;
  sta CASINI,x&lt;br /&gt;
  sty CASINI+1,x&lt;br /&gt;
  rts&lt;br /&gt;
&lt;br /&gt;
  run init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Format relokowalny (SpartaDOS X) ==&lt;br /&gt;
&lt;br /&gt;
[[SpartaDOS X]] definiuje specjalny [[COM#SpartaDOS X|relokowalny format pliku binarnego]]. Pozwala on dodatkowo na wykorzystanie symboli oraz rezerwacje pamięci.&lt;br /&gt;
&lt;br /&gt;
Przedłużenie wektora DOSINI następuje tu analogicznie jak w przypadku programów nierelokowalnych. Okazuje się jednak, że to nie wystarcza do poprawnego uruchomienia programu po wciśnięciu RESET, ponieważ podczas wywoływania łańcucha inicjalizującego poprzednio zainstalowane w systemie programy, DOS przejmuje kontrolę i nie wraca do procedury inicjującej program.&lt;br /&gt;
&lt;br /&gt;
Zapobiega temu wyzerowanie zmiennej COMTAB+$20 (nieoficjalnie zwanej DOSFLG) w fazie inicjalizacji. Gdy odporność na RESET stanie się niepotrzebna (np. tuż przed zakończeniem programu), zmienną tę należy ustawić na dowolną ujemną wartość.&lt;br /&gt;
&lt;br /&gt;
Ponieważ SDX nie obsługuje magnetofonu, można darować sobie rozpoznawanie rodzaju BOOT-a i aktualizację CASINI, a skoncentrować się wyłącznie na DOSINI.&lt;br /&gt;
&lt;br /&gt;
Przykładowy program relokowalny (dla SpartaDOS X):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DOSVEC = $a&lt;br /&gt;
DOSINI = $c&lt;br /&gt;
&lt;br /&gt;
COMTAB smb &amp;#039;COMTAB  &amp;#039;&lt;br /&gt;
&lt;br /&gt;
  opt h+ o+&lt;br /&gt;
  blk reloc main&lt;br /&gt;
&lt;br /&gt;
init:&lt;br /&gt;
  jsr prolong&lt;br /&gt;
  ...&lt;br /&gt;
  ;tutaj wykonujemy program główny&lt;br /&gt;
  ...&lt;br /&gt;
  ;po czym przy wyjściu z programu przywracamy zawartość wektora&lt;br /&gt;
  ldx init+1&lt;br /&gt;
  ldy init+2&lt;br /&gt;
  stx DOSINI&lt;br /&gt;
  sty DOSINI+1&lt;br /&gt;
  lda #$ff&lt;br /&gt;
  sta COMTAB+$20&lt;br /&gt;
  jmp (DOSVEC)&lt;br /&gt;
&lt;br /&gt;
prolong:&lt;br /&gt;
  ;a to wykona się tylko raz po uruchomieniu programu przez DOS&lt;br /&gt;
  ldx DOSINI&lt;br /&gt;
  ldy DOSINI+1&lt;br /&gt;
  stx init+1&lt;br /&gt;
  sty init+2&lt;br /&gt;
  ldx initad&lt;br /&gt;
  ldy initad+1&lt;br /&gt;
  stx DOSINI&lt;br /&gt;
  sty DOSINI+1&lt;br /&gt;
  lda #0&lt;br /&gt;
  sta COMTAB+$20&lt;br /&gt;
  rts&lt;br /&gt;
&lt;br /&gt;
initad .word init&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Linki ==&lt;br /&gt;
&lt;br /&gt;
* [[BOOT (format pliku)|Format BOOT]]&lt;br /&gt;
* [[Binarny plik DOSu|Format binarnego pliku DOS]]&lt;br /&gt;
* [[COM#SpartaDOS X|Format binarnego pliku SpartaDOS X]]&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>