Autor Wątek: Format AYM - nie AY nie YM  (Przeczytany 13801 razy)

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Format AYM - nie AY nie YM
« dnia: 2015.11.26, 19:34:13 »
Zagadka dla matematyka

Znam pewien utwór zapisany w formacie AYM. Zawiera kompletny kod, więc to nie jest YM (zrzut rejestrów). AY też nie, gdyż AYSplittr nie otwiera go, nagłówek ma całkiem inną strukturę. Próbuję znaleźć specyfikację formatu, aby znaleźć adres ładowania kodu i uruchomienia. Wyszukiwarki nie znajdują nic sensownego.

Pierwszy załącznik (png) to podgląd w hex edytorze. Od adresu +30hex (+48dec) zawarte są prawdopodobnie dane ładowania i startu. Analiza adresów JP i CALL z kodu wykazuje, że ładowany jest pod adres około 13000 (to muzyka z Amstrada).
W nagłówku podobne wartości występują i są dwie możliwości - zapisane w big lub lil endian.
AYM header
big end       lil end
f133 = 13297  3300 = 13056
823d = 15746  3df1 = 15857
Sam kod zaczyna się od +44h (+68d) od LD BC, 13116
Teraz podgląd pliku w debuggerze. Żadna z liczb z nagłówka nie występuje w kodzie, ale inne są blisko.
Adres bazowy to +0. Zadaniem jest znalezienie go.
+0
ld bc, 13116
+20
ld ix, 13197
+86
ld hl, 15611
+186
call 14825

+196
ld a,0 (song number?)
ld (13385),a
ld hl, 13296
dec (hl)

+208
ld ix, 13197 (song data for channels?)
call 13776
ld ix, 13230
call 13776
ld ix, 13263
call 13776

+340
ld b, 244 ;cpc ports
out (c),d
ld bc, 62976
out (c),c
ld a, 192
out (c),a
out (c),c
ld b, 244
out (c),e
ld b, 246
add a,a
out (c),a
out (c),c

+1697
call 13496 (i inne)

+2085
ld a, (15223) (kod lub dane muzyki po długiej przerwie nop)

+2533
ld sp, 13055 (sugeruje adres, ale to dane)
defb 253
ld sp, 13025
rst 56
       
+2642
jp 13116

W drugim załączniku jest pełny kod zgrany od adresu bazowego (bez nagłówka)
W trzecim plik .aym, który gra dobrze w AYEmulator i tylko w nim, co znaczy że błędów nie ma. Inne playery nie rozpoznają tego formatu.
AY Music, ULA plus.

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: Format AYM - nie AY nie YM
« Odpowiedź #1 dnia: 2015.11.26, 23:37:17 »
Zgodnie ze źródłem AY_Emula, nagłówek pliku AYM to:
TAYMFileHeader = packed record
   AYM:array[0..2] of char;
   Rev:char;
   Name:array[0..27] of char;
   Author:array[0..15] of char;
   Init,Play:word;
   MusMin,MusMax,MusPos,RegPos:byte;
   AF,BC,DE,HL,IX,IY:word;
   Blocks:byte;
 end;
 TAYMBlock = packed record
   start,size:word;
 end;

Czyli w tym przypadku :
init = $3d82 = 15764
play = $33f1 = 13297
mus = 0 .. 3
muspos = 0
regpos = 6

edit:
strzelam, że ładowane pod 0x3337... ale strzelam :)
Przestałem strzelać.
Jeden blok danych, o długości $0a50, ładowany pod adres $333c, blok zaczyna się od offsetu $0049
« Ostatnia zmiana: 2015.11.27, 00:45:16 wysłana przez steev »
Machines should work. People should think.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Format AYM - nie AY nie YM
« Odpowiedź #2 dnia: 2015.11.27, 02:42:17 »
I chodzi :) Fakt, że to muzyka z Operation Wolf, ta sama co na Spectrum, trochę w innej tonacji, ale może coś innego się trafi. Jutro ją dokończę - ilość utworów i czas.
Init dokładnie jest 15746, widzę że nie tylko ja uwielbiam przeliczać z hex.
Z tego wynika, że pola Name i Author mają stałą długość i każdy kod będzie w tym samym miejscu (?)

AY Music, ULA plus.

Dr Piotr

  • ***
  • Wiadomości: 196
Odp: Format AYM - nie AY nie YM
« Odpowiedź #3 dnia: 2015.11.27, 03:46:50 »
Opis formatu masz ponizej:

ú AYM

   This format has been developed to allow replaying of original musics for AY
whose playing routines has been created for Z80 processor. Every file contains
original Z80 code and data needed to play music on AY 3-891x sound chip. If you
know what this is for and are able to dig musics yourself, feel free to send
them to me! Here is the format used:

AYM file format (created by Roman Dolejsi, comments send to [email protected])
-------------------------------------------------------------------------------
name    size    pos    info
---------------------------
'AYM0'   dword   00 ... identifier (AY Music, format revision 0)
name    db 28   04 ... music name
author   db 16   20 ... music author name
init   word   30 ... music init entry (A = music number)
play   word   32 ... interrupt player entry
musmin  byte    34 ... min music number
musmax   byte   35 ... max music number (musmax - musmin = number of musics)
muspos  byte    36 ... starting music number
regpos  byte    37 ... reg in which musnum is stored when entering init (00-0B)
AFreg   word   38 ... AF register before entering init routine
BCreg   word    3A ... BC register
DEreg   word    3C ... DE register
HLreg   word    3E ... HL register
IXreg   word    40 ... IX register
IYreg   word    42 ... IY register
blocks  byte    44 ... number of memory blocks

from pos 45h, rest of the file contains memory blocks each carrying this:
begin   word  b+00 ... where in the memory this block begins (64k addr space)
size    word  b+02 ... how long is this block
bdata  [size] b+04 ... block of Z80 music code data for AY-3-8910
                       (currently for ZX128 envir.: FFFD=Ctrl, BFFD=Data,
                        and for Amstrad CPC envir.: F6=Switch, F4=Ctrl/Data)



steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: Format AYM - nie AY nie YM
« Odpowiedź #4 dnia: 2015.11.27, 09:35:22 »
Źródło?
« Ostatnia zmiana: 2015.11.27, 10:43:09 wysłana przez steev »
Machines should work. People should think.

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: Format AYM - nie AY nie YM
« Odpowiedź #5 dnia: 2015.11.27, 09:39:16 »
Z tego wynika, że pola Name i Author mają stałą długość i każdy kod będzie w tym samym miejscu (?)
Tak, długość pól Name i Author jest stała.
Bloki z danymi zawsze będą zaczynały się w tym samym miejscu - od ofsetu 0x45
Natomiast same dane mogą już trafiać w dowolne miejsce - jest ono definiowane przez pierwsze dwa słowa każdego bloku danych (adres, długość)
Machines should work. People should think.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Format AYM - nie AY nie YM
« Odpowiedź #6 dnia: 2015.11.27, 10:22:27 »
Gdzie to znalazles? Wydaje mi sie, że przeszukalem co możliwe. Do tego stopnia zaskoczony brakiem jakiejkolwiek informacji zalozylem strone na CPC Wiki piszac co wiedzialem i zamierzam to uzupełnic.
AY Music, ULA plus.

steev

  • *****
  • Wiadomości: 1362
  • Miejsce pobytu:
    inode 42
Odp: Format AYM - nie AY nie YM
« Odpowiedź #7 dnia: 2015.11.27, 10:33:05 »
W źródłach AY_Emulatora. A to co wrzucił Dr Piotr potwierdziło :)
Ciekawe skąd jest jego informacja...
edit: Już wiem skąd - rdosplay.txt z pakietu rdosplay.
« Ostatnia zmiana: 2015.11.27, 10:42:48 wysłana przez steev »
Machines should work. People should think.

Dr Piotr

  • ***
  • Wiadomości: 196
Odp: Format AYM - nie AY nie YM
« Odpowiedź #8 dnia: 2015.11.28, 17:53:05 »
W źródłach AY_Emulatora. A to co wrzucił Dr Piotr potwierdziło :)
Ciekawe skąd jest jego informacja...
edit: Już wiem skąd - rdosplay.txt z pakietu rdosplay.

trafiony -zatopiony :). W pakiecie rdosplay jest ze 40 muzyczek w tym formacie.

Abrimaal

  • *****
  • Wiadomości: 965
  • Miejsce pobytu:
    Lemmingrad
  • Zamulator
    • Games for ULA plus
Odp: Format AYM - nie AY nie YM
« Odpowiedź #9 dnia: 2015.11.29, 01:40:21 »
Ja tego pakietu nie mam. W folderze są tylko pliki .exe, .rev i .txt. Możesz się podzielić?
AY Music, ULA plus.

Dr Piotr

  • ***
  • Wiadomości: 196
Odp: Format AYM - nie AY nie YM
« Odpowiedź #10 dnia: 2015.11.29, 16:11:14 »
Ja tego pakietu nie mam. W folderze są tylko pliki .exe, .rev i .txt. Możesz się podzielić?
Mozesz scaignac go stad:
https://web.archive.org/web/20030109085620/http://sorry.vse.cz/dimension/rdos/rdosplay/rply021a.zip