PIC (Paint 256)
From Atariki
Wersja z dnia 07:56, 4 sie 2022 Mono (Dyskusja | wkład) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (offsety, długości, znaczenie) |
||
Linia 1: | Linia 1: | ||
Format pliku programu [[Paint 256]] zawierającego obraz o rozdzielczości 80x96 bez interlace wykorzystujący efekt "PAL Blending". | Format pliku programu [[Paint 256]] zawierającego obraz o rozdzielczości 80x96 bez interlace wykorzystujący efekt "PAL Blending". | ||
- | Obraz zawiera surowe dane dwóch obrazów 80x96 pikseli w trybie [[Graphics 9]] i [[Graphics 11]] umieszczonych kolejno po sobie. Każdy obraz stanowi 96 linii po 40 bajtów, czyli 3840 bajtów ($0F00), a więc łącznie 7680 bajtów ($1E00). | + | Obraz zawiera surowe dane dwóch obrazów 80x96 pikseli w trybie [[Graphics 11]] i [[Graphics 9]] umieszczonych kolejno po sobie. Każdy obraz stanowi 96 linii po 40 bajtów, czyli 3840 bajtów ($0F00), a więc łącznie 7680 bajtów ($1E00). |
+ | |||
+ | <table border=1> | ||
+ | <tr><td>offset</td><td>długość</td><td>opis</td></tr> | ||
+ | <tr><td>$0000</td><td>$0028</td><td>linia 0 (linia skanningowa 0) w trybie [[Graphics 11]]</td></tr> | ||
+ | <tr><td>$0028</td><td>$0028</td><td>linia 1 (linia skanningowa 2) w trybie [[Graphics 11]]</td></tr> | ||
+ | <tr><td>...</td><td>...</td><td>kolejne linie w trybie [[Graphics 11]]</td></tr> | ||
+ | <tr><td>$0ED8</td><td>$0028</td><td>linia 95 (linia skanningowa 190) w trybie [[Graphics 11]]</td></tr> | ||
+ | <tr><td>$0F00</td><td>$0028</td><td>linia 0 (linia skanningowa 1) w trybie [[Graphics 9]]</td></tr> | ||
+ | <tr><td>$0F28</td><td>$0028</td><td>linia 1 (linia skanningowa 3) w trybie [[Graphics 9]]</td></tr> | ||
+ | <tr><td>...</td><td>...</td><td>kolejne linie w trybie [[Graphics 9]]</td></tr> | ||
+ | <tr><td>$1DD8</td><td>$0028</td><td>linia 95 (linia skanningowa 191) w trybie [[Graphics 9]]</td></tr> | ||
+ | </table> | ||
+ | |||
+ | Format pliku jest na tyle prosty że można go bez problemu obsłużyć z poziomu chociażby [[Turbo BASIC XL]], posiłkując się jedynie prostą wstawką (w kodzie maszynowym) służącą do przełączania pomiędzy trybami [[Graphics 11]]/[[Graphics 9]]. Przykładowy program ładujący i pokazujący obrazek w tym formacie może wyglądać tak: | ||
+ | {{grafr|Paint256_example_pic.png}} | ||
+ | 10 DIM F$(32):GOSUB 30 | ||
+ | 11 GRAPHICS 0:? | ||
+ | 12 INPUT "ENTER FILENAME ";F$ | ||
+ | 13 TRAP 25:OPEN #1,4,0,F$ | ||
+ | 14 GRAPHICS 9 | ||
+ | 15 SCR=DPEEK(88):GOSUB 20 | ||
+ | 16 SCR=DPEEK(88)+40:GOSUB 20 | ||
+ | 17 CLOSE #1 | ||
+ | 18 X=USR(1536):POKE 764,255 | ||
+ | 19 GOTO 11 | ||
+ | 20 ------------------------------ | ||
+ | 21 FOR I=0 TO 95 | ||
+ | 22 BGET #1,SCR,40:SCR=SCR+80 | ||
+ | 23 NEXT I | ||
+ | 24 RETURN | ||
+ | 25 ------------------------------ | ||
+ | 26 GRAPHICS 0:? | ||
+ | 27 ? "Error #";ERR;" at line #";ERL | ||
+ | 28 END | ||
+ | 29 ------------------------------ | ||
+ | 30 DIM A$(128):RESTORE 35:READ A$ | ||
+ | 31 FOR I=0 TO $24 | ||
+ | 32 POKE $0600+I,DEC(A$(I*2+1,I*2+2)) | ||
+ | 33 NEXT I | ||
+ | 34 RETURN | ||
+ | 35 DATA A90FCD0BD4D0FBA2C2AD6F028D0AD48D1BD049808D6F02CAD0EFAD0FD22904D0DF68606860 | ||
+ | |||
+ | Wykorzystując inny język programowania, np. [[Action!]] wcale nie trzeba się uciekać od używania wstawek w kodzie maszynowym czy tez zewnętrznych procedur napisanych w [[Asembler|asemblerze]], poniższy program odczytuje z dyskietki plik "EXAMPLE.PIC" i pokazuje go ekranie: | ||
+ | INCLUDE "D:IO.ACT" | ||
+ | |||
+ | ; Procedura wczytuje dany "pół-obraz" (dane o chrominancji lub luminancji) pod wskazany adres w pamięci | ||
+ | |||
+ | PROC READ(CARD ADR) | ||
+ | BYTE Y | ||
+ | |||
+ | FOR Y=0 TO 95 | ||
+ | DO | ||
+ | BGET(1,ADR,40) | ||
+ | ADR==+80 | ||
+ | OD | ||
+ | |||
+ | RETURN | ||
+ | |||
+ | ; kod startuje od tego miejsca | ||
+ | |||
+ | PROC MAIN() | ||
+ | CARD SCR | ||
+ | BYTE WSYNC=$D40A,VCOUNT=$D40B,PRIOR=$D01B | ||
+ | |||
+ | CLOSE(1) ; zamknięcie kanału IOCB#1 (może być otwarty przez runtime Action! po wywołaniu INCLUDE) | ||
+ | OPEN(1,"D:EXAMPLE.PIC",4,0) ; otwarcie pliku | ||
+ | |||
+ | GRAPHICS(9) ; włączamy tryb graficzny nr 9 (16 odcieni jednego koloru) | ||
+ | |||
+ | SCR=PEEKC(88) READ(SCR) ; wczytujemy obraz zawierający dane chrominancji i umieszczamy go liniach parzystych | ||
+ | SCR=PEEKC(88)+40 READ(SCR) ; wczytujemy obraz zawierający dane luminancji i umieszczamy go liniach nieparzystych | ||
+ | |||
+ | CLOSE(1) ; zamykamy kanał IOCB#1 | ||
+ | |||
+ | ; poniższa procedura realizuje przełączanie co linię trybów GTIA (9/11) | ||
+ | DO | ||
+ | WHILE VCOUNT#$0F DO OD ; czekamy na linie ekranową #30 (VCOUNT zawiera licznik linii podzielony przez dwa) | ||
+ | |||
+ | WHILE VCOUNT#112 ; wykonujemy pętlę do czasu aż VCOUNT nie osiągnie wartości 112 | ||
+ | DO | ||
+ | WSYNC=0 ; czekamy do końca linii skaningowej | ||
+ | PRIOR=$40 ; włączamy tryb 9 GTIA | ||
+ | WSYNC=0 ; czekamy do końca linii skaningowej | ||
+ | PRIOR=$C0 ; włączamy tryb 11 GTIA | ||
+ | OD | ||
+ | OD | ||
+ | |||
+ | Spotykane są też rozszerzenia [[256]] oraz [[AP2]] dla tego formatu. | ||
[[Kategoria:Atari 8-bit]] | [[Kategoria:Atari 8-bit]] | ||
[[Kategoria:Formaty plików]] | [[Kategoria:Formaty plików]] |
Aktualna wersja
Format pliku programu Paint 256 zawierającego obraz o rozdzielczości 80x96 bez interlace wykorzystujący efekt "PAL Blending".
Obraz zawiera surowe dane dwóch obrazów 80x96 pikseli w trybie Graphics 11 i Graphics 9 umieszczonych kolejno po sobie. Każdy obraz stanowi 96 linii po 40 bajtów, czyli 3840 bajtów ($0F00), a więc łącznie 7680 bajtów ($1E00).
offset | długość | opis |
$0000 | $0028 | linia 0 (linia skanningowa 0) w trybie Graphics 11 |
$0028 | $0028 | linia 1 (linia skanningowa 2) w trybie Graphics 11 |
... | ... | kolejne linie w trybie Graphics 11 |
$0ED8 | $0028 | linia 95 (linia skanningowa 190) w trybie Graphics 11 |
$0F00 | $0028 | linia 0 (linia skanningowa 1) w trybie Graphics 9 |
$0F28 | $0028 | linia 1 (linia skanningowa 3) w trybie Graphics 9 |
... | ... | kolejne linie w trybie Graphics 9 |
$1DD8 | $0028 | linia 95 (linia skanningowa 191) w trybie Graphics 9 |
Format pliku jest na tyle prosty że można go bez problemu obsłużyć z poziomu chociażby Turbo BASIC XL, posiłkując się jedynie prostą wstawką (w kodzie maszynowym) służącą do przełączania pomiędzy trybami Graphics 11/Graphics 9. Przykładowy program ładujący i pokazujący obrazek w tym formacie może wyglądać tak:
10 DIM F$(32):GOSUB 30 11 GRAPHICS 0:? 12 INPUT "ENTER FILENAME ";F$ 13 TRAP 25:OPEN #1,4,0,F$ 14 GRAPHICS 9 15 SCR=DPEEK(88):GOSUB 20 16 SCR=DPEEK(88)+40:GOSUB 20 17 CLOSE #1 18 X=USR(1536):POKE 764,255 19 GOTO 11 20 ------------------------------ 21 FOR I=0 TO 95 22 BGET #1,SCR,40:SCR=SCR+80 23 NEXT I 24 RETURN 25 ------------------------------ 26 GRAPHICS 0:? 27 ? "Error #";ERR;" at line #";ERL 28 END 29 ------------------------------ 30 DIM A$(128):RESTORE 35:READ A$ 31 FOR I=0 TO $24 32 POKE $0600+I,DEC(A$(I*2+1,I*2+2)) 33 NEXT I 34 RETURN 35 DATA A90FCD0BD4D0FBA2C2AD6F028D0AD48D1BD049808D6F02CAD0EFAD0FD22904D0DF68606860
Wykorzystując inny język programowania, np. Action! wcale nie trzeba się uciekać od używania wstawek w kodzie maszynowym czy tez zewnętrznych procedur napisanych w asemblerze, poniższy program odczytuje z dyskietki plik "EXAMPLE.PIC" i pokazuje go ekranie:
INCLUDE "D:IO.ACT" ; Procedura wczytuje dany "pół-obraz" (dane o chrominancji lub luminancji) pod wskazany adres w pamięci PROC READ(CARD ADR) BYTE Y FOR Y=0 TO 95 DO BGET(1,ADR,40) ADR==+80 OD RETURN ; kod startuje od tego miejsca PROC MAIN() CARD SCR BYTE WSYNC=$D40A,VCOUNT=$D40B,PRIOR=$D01B CLOSE(1) ; zamknięcie kanału IOCB#1 (może być otwarty przez runtime Action! po wywołaniu INCLUDE) OPEN(1,"D:EXAMPLE.PIC",4,0) ; otwarcie pliku GRAPHICS(9) ; włączamy tryb graficzny nr 9 (16 odcieni jednego koloru) SCR=PEEKC(88) READ(SCR) ; wczytujemy obraz zawierający dane chrominancji i umieszczamy go liniach parzystych SCR=PEEKC(88)+40 READ(SCR) ; wczytujemy obraz zawierający dane luminancji i umieszczamy go liniach nieparzystych CLOSE(1) ; zamykamy kanał IOCB#1 ; poniższa procedura realizuje przełączanie co linię trybów GTIA (9/11) DO WHILE VCOUNT#$0F DO OD ; czekamy na linie ekranową #30 (VCOUNT zawiera licznik linii podzielony przez dwa) WHILE VCOUNT#112 ; wykonujemy pętlę do czasu aż VCOUNT nie osiągnie wartości 112 DO WSYNC=0 ; czekamy do końca linii skaningowej PRIOR=$40 ; włączamy tryb 9 GTIA WSYNC=0 ; czekamy do końca linii skaningowej PRIOR=$C0 ; włączamy tryb 11 GTIA OD OD
Spotykane są też rozszerzenia 256 oraz AP2 dla tego formatu.