<?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_Plot_w_Graphics_0</id>
	<title>Programowanie: Plot w Graphics 0 - 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_Plot_w_Graphics_0"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Programowanie:_Plot_w_Graphics_0&amp;action=history"/>
	<updated>2026-10-02T19:56:50Z</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:_Plot_w_Graphics_0&amp;diff=3302&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:_Plot_w_Graphics_0&amp;diff=3302&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;Procedury poniżej opisują, jak w trybie [[Graphics 0]] zrobić plota o precyzji podpixelowej - o rozdzielczości 80x48 używając standardowego zestawu znaków. W całym artykule operuję na kodach wewnętrznych [[ANTIC (układ)|Antica]].&lt;br /&gt;
&lt;br /&gt;
== Odrobina teorii ==&lt;br /&gt;
&lt;br /&gt;
Tryb ten nie był pomyślany do wyświetlania rastrowej grafiki, co wiąże się z kilkoma problemami. Głównym jest nieliniowość pamięci - podobnie jak w trybach bitowych jeden bajt określa stan kilku pixli (tutaj: czterech), jednakże w przeciwieństwie do nich tutaj jeden bajt określa stan pixli sąsiadujących ze sobą w poziomie jak i w pionie (a nie tylko w poziomie jak to zwykle bywa). Zakładając, ze lewy, górny pixel ma pozycje 0.0 a prawy dolny - 79.47 to pierwszy bajt pamięci określa pixle: 0.0, 1.0, 0.1, 1.1, drugi bajt: 2.0, 3.0, 2.1 i 3.1 itd... Kolejny problem to nieliniowość samego zestawu znaków. Bajt wyszyszczony to &amp;#039;&amp;#039;&amp;#039;$00&amp;#039;&amp;#039;&amp;#039; (spacja). Chcąc zapalić pixel 0.0 - wpisujemy wartość &amp;#039;&amp;#039;&amp;#039;$4c&amp;#039;&amp;#039;&amp;#039; (kod znaku z jedną ćwiartką) do pierwszej komórki pamięci obrazu. Jeśli następnie zapalimy pixel 1.0 - pod ten sam adres trzeba wpisać wartość &amp;#039;&amp;#039;&amp;#039;$d5&amp;#039;&amp;#039;&amp;#039; (górna połowa znaku jest zapalona), itd..&lt;br /&gt;
&lt;br /&gt;
W ten sposób mamy już koncepcję, jak podbić rozdzielczość. Jest jeszcze jeden drobny problem: jaki znak wyświetlić dla dwóch układów pixli: 0.0 i 1.1 oraz 0.1 i 1.0. Atari nie ma znaku szachownicy. Ja (ze względu na podobieństwo wyglądu) wybrałem znaki o kodach: &amp;#039;&amp;#039;&amp;#039;$47&amp;#039;&amp;#039;&amp;#039; oraz &amp;#039;&amp;#039;&amp;#039;$46&amp;#039;&amp;#039;&amp;#039; (grube wersje znaków &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; oraz &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Praktyka, czyli mięso ==&lt;br /&gt;
&lt;br /&gt;
Plot używa czterech tablic, każda o rozmiarze 256 bajtów. Dokładniej rzecz biorąc, nie całe 256 bajtów jest zajęte, tylko wybrane 16 bajtów. Pomiędzy nimi są dziury - można je użyć do własnych celów. Są jeszcze dwie mniejsze tablice, każda o długości 48 bajtów (lub innej, jeśli operujemy na niestandardowym ekranie) - młodsze oraz starsze bajty adresów linii ekranu. Każdy wiersz w tablicy jest podwojony.&lt;br /&gt;
&lt;br /&gt;
Stałe używane przez procedury:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
addr - wektor (2 kolejne bajty) na stronie 0&lt;br /&gt;
screen - adres ekranu&lt;br /&gt;
screen_lo - tablica na młodsze bajty adresów dla kolejnych linii ekrany,&lt;br /&gt;
screen_hi - jak wyżej, ale dla starszych bajtów,&lt;br /&gt;
plot00 do plot11 - tablice do zapalania kolejnych ćwiartek.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do wygenerowania wspomnianych tablic można użyć poniższej procedury:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
plot0_init equ *&lt;br /&gt;
		lda &amp;amp;lt;screen             ; wartości początkowe&lt;br /&gt;
		sta addr&lt;br /&gt;
		lda &amp;amp;gt;screen&lt;br /&gt;
		sta addr+1&lt;br /&gt;
		ldx #$00&lt;br /&gt;
init_1 equ *&lt;br /&gt;
		lda addr                ; dwukrotnie zapisz adres wiersza do tablic screen_lo i screen_hi&lt;br /&gt;
		sta screen_lo,x&lt;br /&gt;
		lda addr+1&lt;br /&gt;
		sta screen_hi,x&lt;br /&gt;
		inx&lt;br /&gt;
		lda addr&lt;br /&gt;
		sta screen_lo,x&lt;br /&gt;
		lda addr+1&lt;br /&gt;
		sta screen_hi,x&lt;br /&gt;
		clc                     ; przesun sie na nastepny wiersz pamieci ekranu&lt;br /&gt;
		lda addr&lt;br /&gt;
		adc #$28                ; szerokość ekranu w bajtach&lt;br /&gt;
		sta addr&lt;br /&gt;
		lda addr+1&lt;br /&gt;
		adc #$00&lt;br /&gt;
		sta addr+1&lt;br /&gt;
		inx&lt;br /&gt;
		cpx #$30                ; wysokość ekranu w bajtach*2&lt;br /&gt;
		bne init_1&lt;br /&gt;
&lt;br /&gt;
; 00 10 - układ pixli w bajcie&lt;br /&gt;
; 01 11&lt;br /&gt;
; plot00&lt;br /&gt;
		lda #$4c                ; ustaw poprawne wartości dla zapalania poszczególnych ćwiartek&lt;br /&gt;
		sta plot00+$00&lt;br /&gt;
		sta plot00+$4c&lt;br /&gt;
		lda #$d5&lt;br /&gt;
		sta plot00+$4b&lt;br /&gt;
		sta plot00+$d5&lt;br /&gt;
		lda #$47&lt;br /&gt;
		sta plot00+$49&lt;br /&gt;
		sta plot00+$47&lt;br /&gt;
		lda #$59&lt;br /&gt;
		sta plot00+$4f&lt;br /&gt;
		sta plot00+$59&lt;br /&gt;
		lda #$80&lt;br /&gt;
		sta plot00+$cc&lt;br /&gt;
		sta plot00+$80&lt;br /&gt;
		lda #$cb&lt;br /&gt;
		sta plot00+$55&lt;br /&gt;
		sta plot00+$cb&lt;br /&gt;
		lda #$cf&lt;br /&gt;
		sta plot00+$d9&lt;br /&gt;
		sta plot00+$cf&lt;br /&gt;
		lda #$c9&lt;br /&gt;
		sta plot00+$46&lt;br /&gt;
		sta plot00+$c9&lt;br /&gt;
; plot10&lt;br /&gt;
		lda #$4b&lt;br /&gt;
		sta plot10+$00&lt;br /&gt;
		sta plot10+$4b&lt;br /&gt;
		lda #$d5&lt;br /&gt;
		sta plot10+$4c&lt;br /&gt;
		sta plot10+$d5&lt;br /&gt;
		lda #$d9&lt;br /&gt;
		sta plot10+$49&lt;br /&gt;
		sta plot10+$d9&lt;br /&gt;
		lda #$46&lt;br /&gt;
		sta plot10+$4f&lt;br /&gt;
		sta plot10+$46&lt;br /&gt;
		lda #$cc&lt;br /&gt;
		sta plot10+$55&lt;br /&gt;
		sta plot10+$cc&lt;br /&gt;
		lda #$c9&lt;br /&gt;
		sta plot10+$59&lt;br /&gt;
		sta plot10+$c9&lt;br /&gt;
		lda #$80&lt;br /&gt;
		sta plot10+$cb&lt;br /&gt;
		sta plot10+$80&lt;br /&gt;
		lda #$cf&lt;br /&gt;
		sta plot10+$47&lt;br /&gt;
		sta plot10+$cf&lt;br /&gt;
; plot01&lt;br /&gt;
		lda #$4f&lt;br /&gt;
		sta plot01+$00&lt;br /&gt;
		sta plot01+$4f&lt;br /&gt;
		lda #$59&lt;br /&gt;
		sta plot01+$4c&lt;br /&gt;
		sta plot01+$59&lt;br /&gt;
		lda #$46&lt;br /&gt;
		sta plot01+$4b&lt;br /&gt;
		sta plot01+$46&lt;br /&gt;
		lda #$55&lt;br /&gt;
		sta plot01+$49&lt;br /&gt;
		sta plot01+$55&lt;br /&gt;
		lda #$c9&lt;br /&gt;
		sta plot01+$d5&lt;br /&gt;
		sta plot01+$c9&lt;br /&gt;
		lda #$cc&lt;br /&gt;
		sta plot01+$d9&lt;br /&gt;
		sta plot01+$cc&lt;br /&gt;
		lda #$cb&lt;br /&gt;
		sta plot01+$47&lt;br /&gt;
		sta plot01+$cb&lt;br /&gt;
		lda #$80&lt;br /&gt;
		sta plot01+$cf&lt;br /&gt;
		sta plot01+$80&lt;br /&gt;
; plot11&lt;br /&gt;
		lda #$49&lt;br /&gt;
		sta plot11+$00&lt;br /&gt;
		sta plot11+$49&lt;br /&gt;
		lda #$47&lt;br /&gt;
		sta plot11+$4c&lt;br /&gt;
		sta plot11+$47&lt;br /&gt;
		lda #$d9&lt;br /&gt;
		sta plot11+$4b&lt;br /&gt;
		sta plot11+$d9&lt;br /&gt;
		lda #$55&lt;br /&gt;
		sta plot11+$4f&lt;br /&gt;
		sta plot11+$55&lt;br /&gt;
		lda #$cf&lt;br /&gt;
		sta plot11+$d5&lt;br /&gt;
		sta plot11+$cf&lt;br /&gt;
		lda #$cb&lt;br /&gt;
		sta plot11+$59&lt;br /&gt;
		sta plot11+$cb&lt;br /&gt;
		lda #$cc&lt;br /&gt;
		sta plot11+$46&lt;br /&gt;
		sta plot11+$cc&lt;br /&gt;
		lda #$80&lt;br /&gt;
		sta plot11+$c9&lt;br /&gt;
		sta plot11+$80&lt;br /&gt;
		rts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz możemy użyć plota właściwego:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; parametry:&lt;br /&gt;
;  rejestry x, y - własciwa pozycja pixla do zapalenia&lt;br /&gt;
plot0 equ *&lt;br /&gt;
		lda screen_lo,y         ; zapisz adres wiersza pamieci ekranu w addr&lt;br /&gt;
		sta addr&lt;br /&gt;
		lda screen_hi,y&lt;br /&gt;
		sta addr+1&lt;br /&gt;
		tya                     ; określ, o którą ćwiartkę chodzi (tutaj badamy współrzędną Y)&lt;br /&gt;
		lsr @&lt;br /&gt;
		bcs plot0_0&lt;br /&gt;
		txa                     ; jak wyżej, ale badamy współrzędna X&lt;br /&gt;
		lsr @&lt;br /&gt;
		tay&lt;br /&gt;
		bcc plot0_1&lt;br /&gt;
		lda (addr),y            ; używając wcześniej przygotowanych tablic zapisz odpowiednią wartość do pamięci ekranu.&lt;br /&gt;
		tax&lt;br /&gt;
		lda plot10,x&lt;br /&gt;
		sta (addr),y&lt;br /&gt;
		rts&lt;br /&gt;
plot0_1 equ *&lt;br /&gt;
		lda (addr),y&lt;br /&gt;
		tax&lt;br /&gt;
		lda plot00,x&lt;br /&gt;
		sta (addr),y&lt;br /&gt;
		rts&lt;br /&gt;
plot0_0 equ *&lt;br /&gt;
		txa&lt;br /&gt;
		lsr @&lt;br /&gt;
		tay&lt;br /&gt;
		bcc plot0_2&lt;br /&gt;
		lda (addr),y&lt;br /&gt;
		tax&lt;br /&gt;
		lda plot11,x&lt;br /&gt;
		sta (addr),y&lt;br /&gt;
		rts&lt;br /&gt;
plot0_2 equ *&lt;br /&gt;
		lda (addr),y&lt;br /&gt;
		tax&lt;br /&gt;
		lda plot01,x&lt;br /&gt;
		sta (addr),y&lt;br /&gt;
		rts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jak to działa w praktyce, można zobaczyć w demach: Unplugged oraz Unfused.&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Niezbędnik kodera]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>