SAP (format pliku)
From Atariki
| Wersja z dnia 19:11, 31 mar 2006 Miker (Dyskusja | wkład) (na razie tak - przy okazji się translejtnie...) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (link do aktualnej specyfikacji) |
||
| Linia 1: | Linia 1: | ||
| - | <pre> | + | ===Wstęp=== |
| - | SAP file divides into two parts. First part (in text format) describes | + | |
| - | player/music type and contains credits for the song. Second part (in binary | + | |
| - | format) contains player and music data formed into Atari Binary File format. | + | |
| + | Plik '''SAP''' składa się z dwóch części. Pierwsza (tekst) opisuje typ playera/muzyki oraz zawiera informacje o autorze (lub autorach). Druga - zawiera samą procedurę odtwarzającą oraz dane muzyki - w zwykłym (znanym z Atari) pliku binarnym. | ||
| - | First part - text info | + | ===Część pierwsza - informacja tekstowa=== |
| - | ~~~~~~~~~~~~~~~~~~~~~~ | + | |
| - | For identification of the format, it always starts with "SAP" string. | + | |
| - | After that the credits follow. However, this is not fixed order, just a | + | |
| - | recommendation. Each line should end with EOL string (0D 0A). | + | |
| - | Credits tags: | + | Dla identyfikacji formatu plik zawsze rozpoczyna się ciągiem "SAP", po czym następują |
| - | AUTHOR "" - Name of composer. For ASMA purposes, the name should consist of | + | informacje o osobie, lub osobach, odpowiedzialnych za dany utwór. Wprawdzie nie ma z góry |
| - | real name and nickname (scene handle) in parentheses. No scene | + | ustalonej ich kolejności, jednak zwyczajowo utarło się podawać je tak jak poniżej. Każda linia powinna kończyć się kodami 0D i 0A (EOL). |
| - | group allowed. If song was composed by more authors, use "&". | + | |
| - | Examples: | + | |
| - | AUTHOR "Dariusz Duma (Dhor)" | + | |
| - | AUTHOR "Lukasz Sychowicz (X-Ray) & Piotr Swierszcz (Samurai)" | + | |
| - | NAME "" - Song title. No restrictions, except for it shouldn't contain | + | |
| - | quotation marks. Use apostrophes instead. | + | |
| - | Example: | + | |
| - | NAME "Jocky Wilson's Darts Challenge" | + | |
| - | DATE "" - Copyright year or year of creation. If exact date is known, it can | + | |
| - | also be included in DD/MM/YYYY format. | + | |
| - | Examples: | + | |
| - | DATE "1986" | + | |
| - | DATE "1993-1994" | + | |
| - | DATE "28/08/1997" | + | |
| - | DATE "12/2001" | + | |
| - | After that the player info follows: | + | Wyświetlane informacje: |
| - | TYPE - player type (see below) | + | |
| - | PLAYER - address of player part which will be executed in 1/50 sec | + | |
| - | intervals (or as defined with FASTPLAY) | + | |
| - | MUSIC - address with music data (for C type) | + | |
| - | INIT - address of player part which will init player (for all types | + | |
| - | except C) | + | |
| - | SONGS - number of songs. If SONGS tag not defined, the default value is | + | |
| - | 1. | + | |
| - | DEFSONG - first song which will be played when .sap is loaded (i.e. the | + | |
| - | main game theme). This value is counted from zero (if there are 5 | + | |
| - | songs in the file and the last is the default, the value will be | + | |
| - | DEFSONG 4). The default is 0 if DEFSONG not defined. | + | |
| - | FASTPLAY - number of lines between each call of playing routine (312 by | + | |
| - | default, which is one screen - 1/50 of sec.). For example for | + | |
| - | double-speed song put here the value 156 (312/2). 99% of songs | + | |
| - | are single-speed which means that you don't have to define the | + | |
| - | FASTPLAY variable for them. Works for player TYPE "B". | + | |
| - | Another values recommended: 104 (triple speed), 78 (quadruple | + | |
| - | speed) | + | |
| - | STEREO - song uses dual POKEY configuration. | + | |
| - | commands PLAYER, MUSIC, INIT contain addresses in hexadecimal format. Both | + | *AUTHOR "" - Imię i nazwisko kompozytora. Dla potrzeb [[ASMA]] powinno się podać prawdziwe personalia oraz nick (ksywę scenową) w nawiasach. Nie podaje się grupy. Jeżeli utwór został skomponowany przez więcej niż innego autora, stosuje się znak "&". |
| - | lower- and uppercase characters are allowed for the number. | + | |
| - | PLAYER A000 | + | Przykłady: |
| - | MUSIC 1234 | + | AUTHOR "Dariusz Duma (Dhor)" |
| - | INIT f42e | + | AUTHOR "Lukasz Sychowicz (X-Ray) & Piotr Swierszcz (Samurai)" |
| - | commands SONGS, DEFSONG contain decimal numbers: | + | *NAME "" - Tytuł utworu. W zasadzie bez ograniczeń, stosować można wszystkie znaki prócz cudzysłowów. Zamiast nich można użyć apostrofów. |
| - | SONGS 10 | + | Przykład: |
| - | DEFSONG 9 | + | NAME "Jocky Wilson's Darts Challenge" |
| - | command TYPE contains single character which describes player type. The | + | *DATE "" - Rok "copyrightu" lub rok powstania. Jeżeli dokładna data jest znana, może być przedstawiona w formacie DD/MM/RRRR |
| - | following player types are supported: | + | |
| - | TYPE C - player from CMC (Chaos Music Composer). In this case, also these | + | Przykłady: |
| - | commands must appear: PLAYER, MUSIC. Additionaly you can define | + | DATE "1986" |
| - | SONGS and DEFSONG. Player will be initialized as follows: | + | DATE "1993-1994" |
| + | DATE "28/08/1997" | ||
| + | DATE "12/2001" | ||
| + | |||
| + | W dalszej kolejności następują informacje dla playera: | ||
| + | *TYPE - typ playera (patrz niżej) | ||
| + | *PLAYER - adres playera, który będzie wywoływany w odstępach 1/50-sekundowych (lub takich jak zdefiniowano przez FASTPLAY) | ||
| + | *MUSIC - adres danych muzyki (dla "TYPE C" - typ playera "C") | ||
| + | *INIT - adres części playera odpowiedzialnej za jego zainicjowanie (wszystkie typy oprócz "C") | ||
| + | *SONGS - ilość utworów. Jeśli pominiemy ten parametr, domyślną wartością jest 1 | ||
| + | *DEFSONG - pierwszy utwór, który będzie odgrywany bezpośrednio po wgraniu .sap-a (np. główny temat z gry). Wartość ta jest liczona od zera (jeżeli w pliku jest 5 utworów a ostatni jest domyślny, bedzie wpisane DEFSONG 4). Wartością domyślną jest 0, jeśli "DEFSONG" został pominięty | ||
| + | *FASTPLAY - ilość linii, co którą jest wywoływana procedura odgrywająca (312 domyślnie, czyli jeden ekran - 1/50 sekundy). Na przykład dla podwójnej szybkości utworu ("2 razy na ramkę") wpisz tutaj wartość 156 (312/2). Większość utworów gra z pojedynczą szybkością ("raz na ramkę"), nie jest więc konieczne ustawianie tego parametru. Inne często spotykane wartości: 104 ("3 razy na ramkę"), 78 ("4 razy na ramkę") | ||
| + | *STEREO - utwór używa drugiego [[POKEY]]a (stereo lub/i 8 kanałów) | ||
| + | |||
| + | Komendy PLAYER, MUSIC, INIT zawierają adresy w formacie hexadecymalnym. Przyjmowane są zarówno wielkie, jak i małe litery. | ||
| + | |||
| + | PLAYER A000 | ||
| + | MUSIC 1234 | ||
| + | INIT f42e | ||
| + | |||
| + | Komendy SONGS, DEFSONG zawierają liczby w formacie dziesiętnym: | ||
| + | |||
| + | SONGS 10 | ||
| + | DEFSONG 9 | ||
| + | |||
| + | Komenda TYPE zawiera pojedynczy znak, który określa typ playera. Obsługiwane są następujące typy: | ||
| + | |||
| + | *TYPE C - player do modułów w formacie[[CMC (format pliku)|CMC]] ([[Chaos Music Composer]]). W tym przypadku muszą pojawić się także komendy: PLAYER, MUSIC. Można również zdefiniować SONGS i DEFSONG. | ||
| + | |||
| + | Player zostanie zainicjowany następująco: | ||
| lda #$70 | lda #$70 | ||
| Linia 79: | Linia 65: | ||
| jsr PLAYER+3 | jsr PLAYER+3 | ||
| - | in 1/50 intervals will be executed: | + | Natomiast co 1/50 sekundy wywołane zostanie: |
| jsr PLAYER+6 | jsr PLAYER+6 | ||
| - | This is just internal structure already contained in SAP player, you | + | W tym przypadku nie ma potrzeby dodawania playera z CMC, ponieważ jest on zawarty w pliku SAP. |
| - | don't have to add this code to the CMC player. | + | |
| - | TYPE B - any player. In this case, also these commands must appear: PLAYER, | + | *TYPE B - dowolny player. W tym przypadku także powinny pojawić się komendy PLAYER, INIT. Dodatkowo mozna zdefiniować SONGS i DEFSONG. |
| - | INIT. Additionaly you can define SONGS and DEFSONG. Player will be initialized as follows: | + | |
| + | Wywołanie playera odbędzie się w sposób następujący: | ||
| lda #DEFSONG | lda #DEFSONG | ||
| jsr INIT | jsr INIT | ||
| - | in 1/50 intervals will be executed: | + | Natomiast co 1/50 sekundy wywołane zostanie: |
| jsr PLAYER | jsr PLAYER | ||
| - | TYPE S - SoftSynth. Like type "C", this type is temporary, and is used only | + | *TYPE S - [[Softsynth|SoftSynth]]. W założeniach tymczasowy rodzaj playera (podobnie zresztą jak typ "C"). Może on być użyty tylko w przypadku specjalnego typu utworów, które zostały skomponowane za pomocą programu SoftSynth. |
| - | for special type of songs, that were composed using program | + | |
| - | SoftSynth. | + | *TYPE D - Digital (sample). W tym typie pliku SAP powinny być zdefiniowane komendy INIT i PLAYER. PLAYER (zupełnie jak w typie "B") ustawia adres procedury, która będzie wywoływana co 1/50 sekundy i (także jak w typie "B") będzie kończyć się rozkazem RTS. INIT tym razem działa nieco inaczej. Ustawia on adres procedury, która będzie wywoływana (z numerem utworu w rejestrze A) do zainicjowania programu, ale nie może się kończyć RTS-em. Procedura ta powinna odgrywać sample w nieskończonej pętli. W playerze SAP emulowane są dwa rejestry [[ANTIC (układ)|ANTIC-a]] ($D40A i $D40B). Pomagają one odgrywać sample. Rejestr $D40B zwiększa swoją zawartość co 2 linie obrazu, natomiast $D40A wstrzymuje [[procesor]] do końca aktualnie rysowanej linii. SAP emuluje Atari w systemie PAL z wyłączonym ekranem. Znaczy to, że mamy do dyspozycji 312 linii/ekran, gdzie każda zabiera 105 cykli procesora i 9 cykli na odświeżenie pamięci (co daje 114 cykli na linię). |
| - | TYPE D - Digital. In SAP file with this type, there must be also defined | + | |
| - | commands "INIT" and "PLAYER". "PLAYER" (like in type B) sets | + | |
| - | address of procedure that will be called in 1/50s intervals and | + | |
| - | (like in type B) must end with RTS opcode. INIT this time is a bit | + | |
| - | different. It sets address of procedure that will be called (with | + | |
| - | number of song in register A) to initialize program, but it can't | + | |
| - | end with RTS. It should start playing digis in endless loop. In SAP | + | |
| - | player two ANTIC registers $D40A and $D40B are emulated. They help | + | |
| - | playing samples. D40B register increases its contents each two | + | |
| - | screen lines. D40A holds CPU till the end of actually drawn line. | + | |
| - | SAP emulates Atari in PAL with disabled screen. It means that we | + | |
| - | have 312 lines per screen, each taking 105 CPU cycles and 9 cycles | + | |
| - | of memory refresh (114 cycles per line). | + | |
| - | One more type is recognized by SAP player - TYPE M. Right now it's exactly | + | *TYPE M - póki co identyczny z typem "B". Zróżnicowanie to ma na celu wykorzystanie w przyszłych wersjach SAP-a. |
| - | the same as TYPE B but this differentiation is for future SAP releases. | + | |
| - | Planned features: | + | *TIME xx:xx - Czas trwania utworu z dokładnością do tysięcznych częsci sekundy. Aktualnie jest on rozpoznawany przez pakiet [[ASAP]] oraz wszelkie jego "odgałęzienia". W zależności od ilości subsongów jest on powtórzony odpowiednią ilość razy (kolejno dla każdego subsongu). |
| - | TYPE R - Registers. In this type, binary part is not an Atari binary file. | + | |
| - | This part contains values that will be directly written to Pokey | + | |
| - | registers ($D200-$D208) in 1/50s intervals (or intervals defined | + | |
| - | with FASTPLAY tag). | + | |
| - | TIME xx:xx - Song duration. This is actually already supported by SAP WinAMP | + | |
| - | plug-in. It's still unclear how will subsongs be handled with | + | |
| - | TIME tag. Possibly it will also support tenths or hundredths of | + | |
| - | second (xx:xx.x or xx:xx.xx). | + | |
| - | Example of the header: | + | Planowany był również ''TYPE R'' - Rejestry. |
| - | SAP | + | W tym typie część binarna nie ma postaci pliku binarnego. Część ta zawiera wartości, które będą bezpośrednio wpisywane do rejestrów POKEYa ($D200-$D208) w odstępach 1/50-sekundowych (lub takich jak zdefiniowano przez FASTPLAY). Próby zastosowania tego parametru podjął się Don Mahurin (oto jego [http://sap.openright.org strona]). Wątpliwe jest jednak, by typ R zyskał wsparcie w oprogramowaniu w postaci zaproponowanej przez Dona, z uwagi na dodakowe paramery w stylu AUDCTL (niekompatybilne z żadnym z istniejących odtwarzaczy) oraz brak wsparcia dla możliwych zapętleń i subsongów. Także w przyszłości najprawdopodobniej typ ten zostanie zastąpiony przez ''TYPE B'', tylko z odpowiednio napisaną procedurą odtwarzającą. |
| - | AUTHOR "Jakub Husak" | + | |
| - | NAME "Inside" | + | |
| - | DATE "1990" | + | |
| - | SONGS 3 | + | |
| - | DEFSONG 0 | + | |
| - | TYPE B | + | |
| - | INIT 0F80 | + | |
| - | PLAYER 247F | + | |
| - | Second part - binary data | + | Przykład nagłówka: |
| - | ~~~~~~~~~~~~~~~~~~~~~~~~~ | + | SAP |
| - | This part contains player and music data represented in Atari binary file | + | AUTHOR "Jakub Husak" |
| - | format. This format has two bytes header FF,FF. The following two bytes tell | + | NAME "Inside" |
| - | the loader where to load data, and next two bytes tell where the data end. | + | DATE "1990" |
| - | Init data block ($02E2,$02E3) is not supported. | + | SONGS 3 |
| + | DEFSONG 0 | ||
| + | TYPE B | ||
| + | INIT 0F80 | ||
| + | PLAYER 247F | ||
| - | A little example: | + | ===Część druga - dane binarne=== |
| - | FF FF 00 20 04 20 01 42 A3 04 D5 | + | Część ta zawiera dane playera oraz muzyki zapisane w pliku binarnym. Format ten to [[COM]]. Bloki typu ''Init'' ($02E2,$02E3) nie są obsługiwane. |
| - | \___/ \_________/ \____________/ | + | |
| - | A B C | + | |
| - | A - Binary file header identification (always FF FF) | + | ===Jak stworzyć plik SAP=== |
| - | B - Load addres (StartAddr, EndAddr in LO,HI order - $2000 to $2004) | + | |
| - | C - Data (that will be loaded from StartAddr) | + | |
| - | This example will load values 01,42,A3,04,D5 into memory from $2000 to $2004. | + | Pierwsze co należy zrobić to wyciąć muzykę z gry lub dema i zapisać ją w pliku binarnym. Następnie należy stworzyć plik tekstowy z opisem (tak jak opisano wyżej), po czym można |
| + | zbudować plik .sap poprzez połączenie tych dwóch plików. Można tego dokonać na przykład za pomocą DOSowej komendy COPY: | ||
| + | copy /b music.txt+music.bin music.sap | ||
| - | How to create .SAP file | + | Plik SAP jest gotowy! |
| - | ~~~~~~~~~~~~~~~~~~~~~~~ | + | |
| - | First of all we need to rip music from a game or a demo and save it in Atari | + | |
| - | binary file. Next we can create a text file with description (as described | + | |
| - | above), then we can make .sap file by linking these two files. We can do that | + | |
| - | using DOS command "copy", e.g.: | + | |
| - | copy /b music.txt+music.bin music.sap | + | ===Linki=== |
| + | * [http://asap.sourceforge.net/sap-format.html Specyfikacja pliku] | ||
| - | The file is made now! | + | [[Kategoria:Formaty plików]] |
| - | </pre> | + | |
Aktualna wersja
Spis treści |
Wstęp
Plik SAP składa się z dwóch części. Pierwsza (tekst) opisuje typ playera/muzyki oraz zawiera informacje o autorze (lub autorach). Druga - zawiera samą procedurę odtwarzającą oraz dane muzyki - w zwykłym (znanym z Atari) pliku binarnym.
Część pierwsza - informacja tekstowa
Dla identyfikacji formatu plik zawsze rozpoczyna się ciągiem "SAP", po czym następują informacje o osobie, lub osobach, odpowiedzialnych za dany utwór. Wprawdzie nie ma z góry ustalonej ich kolejności, jednak zwyczajowo utarło się podawać je tak jak poniżej. Każda linia powinna kończyć się kodami 0D i 0A (EOL).
Wyświetlane informacje:
- AUTHOR "" - Imię i nazwisko kompozytora. Dla potrzeb ASMA powinno się podać prawdziwe personalia oraz nick (ksywę scenową) w nawiasach. Nie podaje się grupy. Jeżeli utwór został skomponowany przez więcej niż innego autora, stosuje się znak "&".
Przykłady:
AUTHOR "Dariusz Duma (Dhor)" AUTHOR "Lukasz Sychowicz (X-Ray) & Piotr Swierszcz (Samurai)"
- NAME "" - Tytuł utworu. W zasadzie bez ograniczeń, stosować można wszystkie znaki prócz cudzysłowów. Zamiast nich można użyć apostrofów.
Przykład:
NAME "Jocky Wilson's Darts Challenge"
- DATE "" - Rok "copyrightu" lub rok powstania. Jeżeli dokładna data jest znana, może być przedstawiona w formacie DD/MM/RRRR
Przykłady:
DATE "1986" DATE "1993-1994" DATE "28/08/1997" DATE "12/2001"
W dalszej kolejności następują informacje dla playera:
- TYPE - typ playera (patrz niżej)
- PLAYER - adres playera, który będzie wywoływany w odstępach 1/50-sekundowych (lub takich jak zdefiniowano przez FASTPLAY)
- MUSIC - adres danych muzyki (dla "TYPE C" - typ playera "C")
- INIT - adres części playera odpowiedzialnej za jego zainicjowanie (wszystkie typy oprócz "C")
- SONGS - ilość utworów. Jeśli pominiemy ten parametr, domyślną wartością jest 1
- DEFSONG - pierwszy utwór, który będzie odgrywany bezpośrednio po wgraniu .sap-a (np. główny temat z gry). Wartość ta jest liczona od zera (jeżeli w pliku jest 5 utworów a ostatni jest domyślny, bedzie wpisane DEFSONG 4). Wartością domyślną jest 0, jeśli "DEFSONG" został pominięty
- FASTPLAY - ilość linii, co którą jest wywoływana procedura odgrywająca (312 domyślnie, czyli jeden ekran - 1/50 sekundy). Na przykład dla podwójnej szybkości utworu ("2 razy na ramkę") wpisz tutaj wartość 156 (312/2). Większość utworów gra z pojedynczą szybkością ("raz na ramkę"), nie jest więc konieczne ustawianie tego parametru. Inne często spotykane wartości: 104 ("3 razy na ramkę"), 78 ("4 razy na ramkę")
- STEREO - utwór używa drugiego POKEYa (stereo lub/i 8 kanałów)
Komendy PLAYER, MUSIC, INIT zawierają adresy w formacie hexadecymalnym. Przyjmowane są zarówno wielkie, jak i małe litery.
PLAYER A000 MUSIC 1234 INIT f42e
Komendy SONGS, DEFSONG zawierają liczby w formacie dziesiętnym:
SONGS 10 DEFSONG 9
Komenda TYPE zawiera pojedynczy znak, który określa typ playera. Obsługiwane są następujące typy:
- TYPE C - player do modułów w formacieCMC (Chaos Music Composer). W tym przypadku muszą pojawić się także komendy: PLAYER, MUSIC. Można również zdefiniować SONGS i DEFSONG.
Player zostanie zainicjowany następująco:
lda #$70
ldx #<MUSIC
ldy #>MUSIC
jsr PLAYER+3
lda #$00
ldx #DEFSONG
jsr PLAYER+3
Natomiast co 1/50 sekundy wywołane zostanie:
jsr PLAYER+6
W tym przypadku nie ma potrzeby dodawania playera z CMC, ponieważ jest on zawarty w pliku SAP.
- TYPE B - dowolny player. W tym przypadku także powinny pojawić się komendy PLAYER, INIT. Dodatkowo mozna zdefiniować SONGS i DEFSONG.
Wywołanie playera odbędzie się w sposób następujący:
lda #DEFSONG
jsr INIT
Natomiast co 1/50 sekundy wywołane zostanie:
jsr PLAYER
- TYPE S - SoftSynth. W założeniach tymczasowy rodzaj playera (podobnie zresztą jak typ "C"). Może on być użyty tylko w przypadku specjalnego typu utworów, które zostały skomponowane za pomocą programu SoftSynth.
- TYPE D - Digital (sample). W tym typie pliku SAP powinny być zdefiniowane komendy INIT i PLAYER. PLAYER (zupełnie jak w typie "B") ustawia adres procedury, która będzie wywoływana co 1/50 sekundy i (także jak w typie "B") będzie kończyć się rozkazem RTS. INIT tym razem działa nieco inaczej. Ustawia on adres procedury, która będzie wywoływana (z numerem utworu w rejestrze A) do zainicjowania programu, ale nie może się kończyć RTS-em. Procedura ta powinna odgrywać sample w nieskończonej pętli. W playerze SAP emulowane są dwa rejestry ANTIC-a ($D40A i $D40B). Pomagają one odgrywać sample. Rejestr $D40B zwiększa swoją zawartość co 2 linie obrazu, natomiast $D40A wstrzymuje procesor do końca aktualnie rysowanej linii. SAP emuluje Atari w systemie PAL z wyłączonym ekranem. Znaczy to, że mamy do dyspozycji 312 linii/ekran, gdzie każda zabiera 105 cykli procesora i 9 cykli na odświeżenie pamięci (co daje 114 cykli na linię).
- TYPE M - póki co identyczny z typem "B". Zróżnicowanie to ma na celu wykorzystanie w przyszłych wersjach SAP-a.
- TIME xx:xx - Czas trwania utworu z dokładnością do tysięcznych częsci sekundy. Aktualnie jest on rozpoznawany przez pakiet ASAP oraz wszelkie jego "odgałęzienia". W zależności od ilości subsongów jest on powtórzony odpowiednią ilość razy (kolejno dla każdego subsongu).
Planowany był również TYPE R - Rejestry. W tym typie część binarna nie ma postaci pliku binarnego. Część ta zawiera wartości, które będą bezpośrednio wpisywane do rejestrów POKEYa ($D200-$D208) w odstępach 1/50-sekundowych (lub takich jak zdefiniowano przez FASTPLAY). Próby zastosowania tego parametru podjął się Don Mahurin (oto jego strona). Wątpliwe jest jednak, by typ R zyskał wsparcie w oprogramowaniu w postaci zaproponowanej przez Dona, z uwagi na dodakowe paramery w stylu AUDCTL (niekompatybilne z żadnym z istniejących odtwarzaczy) oraz brak wsparcia dla możliwych zapętleń i subsongów. Także w przyszłości najprawdopodobniej typ ten zostanie zastąpiony przez TYPE B, tylko z odpowiednio napisaną procedurą odtwarzającą.
Przykład nagłówka:
SAP AUTHOR "Jakub Husak" NAME "Inside" DATE "1990" SONGS 3 DEFSONG 0 TYPE B INIT 0F80 PLAYER 247F
Część druga - dane binarne
Część ta zawiera dane playera oraz muzyki zapisane w pliku binarnym. Format ten to COM. Bloki typu Init ($02E2,$02E3) nie są obsługiwane.
Jak stworzyć plik SAP
Pierwsze co należy zrobić to wyciąć muzykę z gry lub dema i zapisać ją w pliku binarnym. Następnie należy stworzyć plik tekstowy z opisem (tak jak opisano wyżej), po czym można zbudować plik .sap poprzez połączenie tych dwóch plików. Można tego dokonać na przykład za pomocą DOSowej komendy COPY:
copy /b music.txt+music.bin music.sap
Plik SAP jest gotowy!
