<?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=FWA</id>
	<title>FWA - 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=FWA"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=FWA&amp;action=history"/>
	<updated>2026-10-02T20:56:37Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=FWA&amp;diff=1364&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=FWA&amp;diff=1364&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;Format obrazu zapisywanego przez program graficzny [[Fun with Art]].&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;offset&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;długość&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;opis&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| $0000&lt;br /&gt;
| $0002&lt;br /&gt;
| Identyfikator pliku $FE $FE.&lt;br /&gt;
|-&lt;br /&gt;
| $0002&lt;br /&gt;
| $0001&lt;br /&gt;
| Wartość rejestru koloru ramki COLBAKS ($02C8).&lt;br /&gt;
|-&lt;br /&gt;
| $0003&lt;br /&gt;
| $0001&lt;br /&gt;
| Wartość rejestru koloru COLPF0S ($02C4).&lt;br /&gt;
|-&lt;br /&gt;
| $0004&lt;br /&gt;
| $0001&lt;br /&gt;
| Wartość rejestru koloru COLPF1S ($02C5).&lt;br /&gt;
|-&lt;br /&gt;
| $0005&lt;br /&gt;
| $0001&lt;br /&gt;
| Wartość rejestru koloru COLPF2S ($02C6).&lt;br /&gt;
|-&lt;br /&gt;
| $0006&lt;br /&gt;
| $0100&lt;br /&gt;
| Dane programu [[Display List]], kod przerwania VBL, a także kod wspierający obsługę DLI - ładowane na 6-tą stronę pamięci ($0600-$06FF).&lt;br /&gt;
|-&lt;br /&gt;
| $0106&lt;br /&gt;
| $1E10&lt;br /&gt;
| Dane obrazu ładowane w obszar $5000-$6E0F.&lt;br /&gt;
|-&lt;br /&gt;
| $1F16&lt;br /&gt;
| $0002&lt;br /&gt;
| Długość programu DLI (kolejno młodszy LSB i starszy MSB bajt).&lt;br /&gt;
|-&lt;br /&gt;
| $1F18&lt;br /&gt;
| ...&lt;br /&gt;
| Kod programu DLI o maksymalnej długości 2300 bajtów.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Kolory ==&lt;br /&gt;
&lt;br /&gt;
Wartości rejestrów cienii dla kolorów COLBAKS, COLPF0S, COLPF1S i COLPF2S definiują początkowe ustawienia rejestrów, które będą obowiązywać począwszy od góry ekranu.&lt;br /&gt;
Każda późniejsza zmiana rejestrów kolorów odbywa się w przerwaniach DLI i jest realizowana przez specjalny program.&lt;br /&gt;
&lt;br /&gt;
== 6 strona ==&lt;br /&gt;
&lt;br /&gt;
Fragment danych znajdujący się na 6 stronie pamięci ($0600-$06FF) zawiera program [[Display List]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0600 70        8 BLANK&lt;br /&gt;
0601 70        8 BLANK&lt;br /&gt;
0602 70        8 BLANK&lt;br /&gt;
0603 4E 00 50  LMS 5000 MODE E&lt;br /&gt;
0606 0E        MODE E -+&lt;br /&gt;
...                    +- 101 x MODE E&lt;br /&gt;
066A 0E        MODE E -+&lt;br /&gt;
066B 4E 00 60  LMS 6000 MODE E&lt;br /&gt;
066E 0E        MODE E ------------------+&lt;br /&gt;
066F 0E        MODE E                   +&lt;br /&gt;
0670 0E        MODE E                   +&lt;br /&gt;
0671 0E        MODE E                   +&lt;br /&gt;
0672 0E        MODE E                   +&lt;br /&gt;
0673 8E        DLI MODE E               +&lt;br /&gt;
0674 0E        MODE E                   +- 89 x MODE E&lt;br /&gt;
0675 0E        MODE E                   +&lt;br /&gt;
0676 0E        MODE E                   +&lt;br /&gt;
0677 0E        MODE E                   +&lt;br /&gt;
0678 8E        DLI MODE E               +&lt;br /&gt;
0679 0E        MODE E -+                +&lt;br /&gt;
...                    +- 78 x MODE E   +&lt;br /&gt;
06C6 0E        MODE E -+----------------+&lt;br /&gt;
06C7 41 00 06  JVB 0600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
służący do wyświetlenia obrazu, który prócz informacji o liniach trybu (MODE) oraz początkowych adresach bloków danych (LMS) składających się na zawartość ekranu zawiera też znaczniki przerwań (DLI) używanych do redefinicji kolorów umieszczone w odpowiadających im rozkazach tworzenia linii trybu.&lt;br /&gt;
&lt;br /&gt;
Dalej znaduje się kod programu instalującego kolejny handler przerwania DLI (sposób jego użycia zostanie omówiony dalej)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
06CA: 68        PLA&lt;br /&gt;
06CB: AA        TAX&lt;br /&gt;
06CC: 68        PLA&lt;br /&gt;
06CD: 8D 01 02  STA $0201   ;VDSLST+1&lt;br /&gt;
06D0: E8        INX&lt;br /&gt;
06D1: D0 03     BNE $06D6&lt;br /&gt;
06D3: EE 01 02  INC $0201   ;VDSLST+1&lt;br /&gt;
06D6: 8E 00 02  STX $0200   ;VDSLST&lt;br /&gt;
06D9: 68        PLA&lt;br /&gt;
06DA: AA        TAX&lt;br /&gt;
06DB: 68        PLA&lt;br /&gt;
06DC: 40        RTI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Następnie umieszczony jest kod przerwania VBLKI instalujący pierwsze przerwanie DLI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
06DD: A9 00     LDA #$00&lt;br /&gt;
06DF: 8D 00 02  STA $0200   ;VDSLST&lt;br /&gt;
06E2: A9 00     LDA #$00&lt;br /&gt;
06E4: 8D 01 02  STA $0201   ;VDSLST+1&lt;br /&gt;
06E7: A9 C0     LDA #$C0&lt;br /&gt;
06E9: 8D 0E D4  STA $D40E   ;NMIEN&lt;br /&gt;
06EC: 4C 5F E4  JMP $E45F   ;JSYSVBV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;UWAGA!&amp;#039;&amp;#039;&amp;#039; Należy zauważyć, że adres przerwania DLI (LSB w $06DE, MSB w $06E3) nie jest określony i wymaga uzupełnienia zanim zainstalowane zostanie przerwanie VBLKI.&lt;br /&gt;
&lt;br /&gt;
Reszta strony, czyli 17 bajtów w obszarze $06EF-$06FF dopełniona jest zerami.&lt;br /&gt;
&lt;br /&gt;
== Obraz ==&lt;br /&gt;
&lt;br /&gt;
Dane obrazu zorganizowane są w dwa bloki (zgodnie z tym co widać w programie [[Display List]] ANTIC-a):&lt;br /&gt;
&lt;br /&gt;
* 102 linie po 40 bajtów w obszarze $5000-$5FEF&lt;br /&gt;
* 90 linii po 40 bajtów w obszarze $6000-$6E0F&lt;br /&gt;
&lt;br /&gt;
Między nimi znajduje się obszar $5FF0-$5FFF zawierający 16 nieużywanych bajtów o wartości $00.&lt;br /&gt;
&lt;br /&gt;
== DLI ==&lt;br /&gt;
&lt;br /&gt;
Blok procedur przerwań DLI znajduje się na samym końcu pliku poprzedzony jedynie dwoma bajtami rozmiaru (w tym przypadku $21 $00).&lt;br /&gt;
&lt;br /&gt;
Jest on w pełni relokowalny i może być umieszczony w dowolnym miejscu pamięci (tu załadowany jest pod adres $3000):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3000: 48        PHA&lt;br /&gt;
3001: 8A        TXA&lt;br /&gt;
3002: 48        PHA&lt;br /&gt;
3003: A9 E0     LDA #$E0&lt;br /&gt;
3005: 8D 0A D4  STA $D40A   ;WSYNC&lt;br /&gt;
3008: 8D 1A D0  STA $D01A   ;COLBAK&lt;br /&gt;
300B: 20 CA 06  JSR $06CA&lt;br /&gt;
&lt;br /&gt;
300E: 48        PHA&lt;br /&gt;
300F: 8A        TXA&lt;br /&gt;
3010: 48        PHA&lt;br /&gt;
3011: A9 18     LDA #$18&lt;br /&gt;
3013: 8D 0A D4  STA $D40A   ;WSYNC&lt;br /&gt;
3016: 8D 17 D0  STA $D017   ;COLPF1&lt;br /&gt;
3019: A9 E6     LDA #$E6&lt;br /&gt;
301B: 8D 1A D0  STA $D01A   ;COLBAK&lt;br /&gt;
301E: 20 CA 06  JSR $06CA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jak widać mamy tu dwie procedury przerwania zakończone bardzo oryginalnym (bo realizowanym przez JSR) wywołaniem procedury znajdującej się pod adresem $06CA.&lt;br /&gt;
&lt;br /&gt;
Analiza programu [[Display List]] ANTIC-a pokazuje że faktycznie mamy DWA znaczniki żądania obsługi przerwania DLI w bajtach $0673 i $0678 odpowiadających 109 i 114 linii obrazu.&lt;br /&gt;
&lt;br /&gt;
Pierwsza procedura zachowuje rejestry A i X na stosie, zmienia wartość rejestru tła COLBAK po czym skacze do procedury ustawiającej kolejny adres przerwania DLI. Druga również skacze pod $06CA uprzednio ustawiając COLPF1 i COLBAK.&lt;br /&gt;
&lt;br /&gt;
Skok JSR odbywa się z tzw. &amp;quot;śladem&amp;quot;, czyli na stosie zapisywany jest adres kolejnej instrukcji znajdującej się za JSR-em zmniejszony o 1. W następnej instrukcji jak widać znajduje się kolejna procedura DLI, tak więc jej adres jest po prostu odłożony na stosie, a zdejmuje go właśnie procedura pod adresem $06CA, zwiększa o 1 i zapisuje w wektorze obsługi przerwania DLI VDSLST ($0200). Taka sztuczka pozwala na skrócenie każdej z procedur DLI, bo zamiast każdorazowego&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nextDLI = $yyxx&lt;br /&gt;
&lt;br /&gt;
A9 xx     LDA #&amp;amp;lt;nextDLI&lt;br /&gt;
8D 00 02  STA VDSLST&lt;br /&gt;
A9 yy     LDA #&amp;amp;gt;nextDLI&lt;br /&gt;
8D 01 02  STA VDSLST+1&lt;br /&gt;
68        PLA&lt;br /&gt;
AA        TAX&lt;br /&gt;
68        PLA&lt;br /&gt;
40        RTI&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mamy tylko 3-bajtowy JSR.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;UWAGA!&amp;#039;&amp;#039;&amp;#039; Ostatnie przerwanie DLI również kończy się skokiem ustawiającym nowe DLI, a przecież dalej mogą znajdować się przysłowiowe maliny. Jakkolwiek trzecie przerwanie DLI nie powinno zostać nigdy wywołane, to dla bezpieczeństwa można za blokiem procedur DLI umieścić rozkaz RTI (opkod $40) nie pozwalający w razie czego na utratę kontroli nad maszyną.&lt;br /&gt;
&lt;br /&gt;
== Instalacja ==&lt;br /&gt;
&lt;br /&gt;
Aby poprawnie wyświetlić obraz należy bloki pliku załadować pod adresy docelowe (czyli na 6-tą stronę, a dane obrazu pod $5000), zaś blok procedur DLI w dowolnie wybrane wolne miejsce pamięci RAM (przykładowo pod adres $3000). Następnie uzupełnić adres pierwszej procedury DLI (będącej adresem bloku procedur DLI) w komórkach $06DE i $06E3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ldx #&amp;amp;lt;$3000&lt;br /&gt;
  ldy #&amp;amp;gt;$3000&lt;br /&gt;
  stx $06DE&lt;br /&gt;
  sty $06E3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zainicjalizować kolory wartościami załadowanymi z początku pliku&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ldx #$xx&lt;br /&gt;
  ldy #$yy&lt;br /&gt;
  stx $02C8   ;COLBAKS&lt;br /&gt;
  sty $02C4   ;COLPF0S&lt;br /&gt;
  ldx #$xx&lt;br /&gt;
  ldy #$yy&lt;br /&gt;
  stx $02C5   ;COLPF1S&lt;br /&gt;
  sty $02C6   ;COLPF2S&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
zainstalować program [[Display List]] i ustawić szerokość ekranu&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  lda #%00100010&lt;br /&gt;
  ldx #&amp;amp;lt;$0600&lt;br /&gt;
  ldy #&amp;amp;gt;$0600&lt;br /&gt;
  sta $022F   ;DMACTLS&lt;br /&gt;
  stx $0230   ;DLPTRS&lt;br /&gt;
  sty $0231   ;DLPTRS+1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i zainstalować przerwanie VBLKI&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  ldy #&amp;amp;lt;$06DD&lt;br /&gt;
  ldx #&amp;amp;gt;$06DD&lt;br /&gt;
  lda #$06&lt;br /&gt;
  jsr $E45C   ;JSETVBV&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Przykład ==&lt;br /&gt;
&lt;br /&gt;
Przykładowy program napisany w [[Turbo BASIC XL]] umożliwiający wyświetlenie obrazka w formacie Fun with Art.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;10 DIM N$(32)&lt;br /&gt;
11 PICADR=((PEEK($02E6) DIV 16)-2)*16:DLIADR=PICADR-9&lt;br /&gt;
12 DO:GRAPHICS 0:TRAP 40&lt;br /&gt;
13 ?: ? &amp;quot;--- Fun with Art Viewer v.1.01 ---&amp;quot;&lt;br /&gt;
14 ? &amp;quot;- done by: Seban/Code3, (p) 1992 -&amp;quot;&lt;br /&gt;
15 ?: ? &amp;quot;Input filename: &amp;quot;;:INPUT N$:OPEN #1,4,0,N$&lt;br /&gt;
16 REM - GET &amp;amp;amp; CHECK HEADER DATA -&lt;br /&gt;
17 GET #1,A:GET #1,B&lt;br /&gt;
18 IF (A&amp;amp;lt;&amp;amp;gt;B) OR (A&amp;amp;lt;&amp;amp;gt;$FE)&lt;br /&gt;
19 ?:? N$;&amp;quot;: is not an FwA file!&amp;quot;:END&lt;br /&gt;
20 ENDIF:POKE $22F,0:PAUSE 0&lt;br /&gt;
21 REM - GET COLORS&lt;br /&gt;
22 BGET #1,$02C8,1:BGET #1,$02C4,3&lt;br /&gt;
23 REM - GET DISPLAY LIST&lt;br /&gt;
24 BGET #1,$0600,256&lt;br /&gt;
25 REM - GET IMAGE DATA&lt;br /&gt;
26 BGET #1,PICADR*256,$1E10&lt;br /&gt;
27 REM - GET DLI CODE LENGTH&lt;br /&gt;
28 GET #1,DLO:GET #1,DLH&lt;br /&gt;
29 REM - GET DLI CODE&lt;br /&gt;
30 BGET #1,DLIADR*256,256*DLH+DLO&lt;br /&gt;
31 CLOSE #1&lt;br /&gt;
32 REM - SETUP DL, DLI&lt;br /&gt;
33 POKE $0605,PICADR:POKE $066D,PICADR+16&lt;br /&gt;
34 POKE $06DE,0:POKE $06E3,DLIADR:DPOKE $0230,$0600&lt;br /&gt;
35 POKE $06E8,$C0:POKE $D40E,$00:DPOKE $0222,$06DD:DPOKE $D40E,$C0&lt;br /&gt;
36 POKE $022F,$22:GET X:POKE $022F,0:PAUSE 0&lt;br /&gt;
37 POKE $06E8,$40:POKE $D40E,$00:DPOKE $0222,$E45F:POKE $D40E,$40&lt;br /&gt;
38 LOOP&lt;br /&gt;
40 ?:? &amp;quot;Error #&amp;quot;;ERR;&amp;quot; at line &amp;quot;;ERL&lt;br /&gt;
41 ?:? &amp;quot;Press any key to restart.&amp;quot;&lt;br /&gt;
42 CLOSE #1:GET K:LOOP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Linki ==&lt;br /&gt;
&lt;br /&gt;
* [[FWA (format bloku)|Format bloku]] zapisywanego przez program [[Fun with Art]]&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Formaty plików]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>