Autor Wątek: Szczegółowy opis pliku Tap  (Przeczytany 5471 razy)

Frodo

  • *
  • Wiadomości: 18
Szczegółowy opis pliku Tap
« dnia: 2015.12.24, 12:55:59 »
Na stronie http://www.worldofspectrum.org/faq/reference/formats.htm nie znajduję, wiem że na końcu ma binarne dane, wcześniej musi mieć pole, gdzie te dane ładować oraz od której instrukcji wykonywać.

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Szczegółowy opis pliku Tap
« Odpowiedź #1 dnia: 2015.12.24, 13:30:54 »
Przecież TAP to jest po prostu obraz standardowej taśmy ZX-Spectrum - w środku siedzą dokładnie takie dane jakie wyrzuca z siebie komputer przy nagrywaniu. A w opisie masz napisane... dwa bajty długości bloku danych a potem czyste dane z procedury zapisu. Jeśli jest więcej niż jeden blok to całość jest powtarzana. Czyli np. standardowy program w BASICu będzie miał dwa bloki - 17 bajtów nagłówka i blok z danymi. Program z loaderem, screenem i jednym blokiem kodu będzie miał 6 bloków - nagłówek, BASIC, nagłówek, screen, nagłówek, kod. To, gdzie taki blok ma się załadować zapisane jest w nagłówku, który jest specyficzny dla danego typu pliku.

Frodo

  • *
  • Wiadomości: 18
Odp: Szczegółowy opis pliku Tap
« Odpowiedź #2 dnia: 2015.12.24, 13:46:18 »
Właśnie chodzi mi o ten nagłówek, na przykładzie split_border.tap który byl zamieszczony na tym forum. split_border.tap liczy 239 bajtów a skompilowany przez pasmo.exe split_border.asm liczy 118 bajtów. 120 bajtów to nagłówek i jeden bajt jest na końcu

matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Szczegółowy opis pliku Tap
« Odpowiedź #3 dnia: 2015.12.24, 14:16:09 »
Nie chodzi ci o nagłówek. Chodzi ci o to, że nie rozumiesz struktury tego, co jest w pliku ;)

Plik zawiera cztery bloki i dwa pliki. Pierwszy i trzeci blok to bloki nagłówka po 17 bajtów każdy. Zawierają informację o tym jakiego typu jest dany plik, jaką ma nazwę, jaki jest długi i - zależnie od typu - dodatkowe informacje. Drugi i czwarty blok to właściwe pliki danych - specyficzne dla typu. W tym wypadku drugi blok (czyli pierwszy plik) to loader dodawany przez pasmo przy kompilacji z opcją --tapbas. Ten loader to krótki program w BASICu, który po wczytaniu jest uruchamiany od linii 10 a następnie wczytuje drugi plik (z czwartego bloku) insrukcją LOAD "" CODE i uruchamia instrukcją RANDOMIZE USR 32768. Adres 32768 to adres, który podawany jest w pliku assemblerowym w ostatniej dyrektywie END - jest ona specyficzna dla pasmo i oznacza (poza tym, że koniec kodu) właśnie adres od jakiego kod ma być uruchamiany.

A same dane w tym wypadku to po kolei:
dwa bajty: 19 - długość bloku danych (wliczając rodzaj i sumę kontrolną)
jeden bajt: 0 - rodzaj (nagłówek)
17 bajtów: zawartość nagłówka
1 bajt: $1B - suma kontrolna bloku

dwa bajty: 73 - długość bloku danych
jeden bajt: $ff - rodzaj (blok danych)
71 bajtów: dane (program w BASICu)
1 bajt: $08 - suma kontrolna bloku

dwa bajty: 19 - długość bloku danych
jeden bajt: $00 - rodzaj (nagłówek)
17 bajtów: zawartość nagłówka
1 bajt: $43 - suma kontrolna bloku

dwa bajty: 120 - długość bloku danych
jeden bajt: $ff - rodzaj (blok danych)
118 bajtów: dane (kod maszynowy)
1 bajt: $42 - suma kontrolna bloku

Wszystkie te dane (poza dwoma pierwszymi dla każdego bloku) to jest dokładnie to, co Spectrum zapisuje na fizycnzej taśmie ze standardowych procedur zapisu danych z ROMu.

ikci

  • *****
  • Wiadomości: 1216
  • Miejsce pobytu:
    Kraków
Odp: Szczegółowy opis pliku Tap
« Odpowiedź #4 dnia: 2015.12.24, 23:59:15 »
Kolega Mat wyczerpał totalnie temat, ale ja bym proponował coś bardziej łopatologicznie ze wsparciem software'owym,
nie chodzi mi o to aby się wymądrzać i wchodzić w kompetencje Mata, lecz raczej aby spróbować "zarazić" tematem
osoby zupełnie zielone :-)

Moja propozycja:

Ściągnij sobie kombajn do edycji / podglądania / manipulacji na plikach taśmowych, dyskowych itd ZX Spectrum
http://www.zx-modules.de/

Programem ZX-Blockeditor otwórz sobie przedmiotowy plik split_border.tap

Zobaczysz takie cosik:



Pozycje 0001 oraz 0002 olewasz bo nie są do niczego nam potrzebne.

Nas interesują pozycje które zaznaczyłem na żółto.

Pozycja 0003 to nagłówek "loadera' w BASIC-u - jak każdy nagłówek taśmowy - ma on długość 17 bajtów

Pozycja 0004 to sam program w języku BASIC - możesz go sobie podejrzeć / edytować.
Najedź myszką na tą pozycję i kliknij prawy przycisk myszki, wybierz: Edit datablock with ZX-Editor...
Otworzy Ci się okienko  ZX Editora



Widzisz programik (loader) który uruchamia się automatycznie od linii nr 10 i następnie wykonuje instrukcję
POKE 23610,255 która odnosi się do zmiennych systemowych (pod tym adresem przechowywany jest numer ostatniego błędu)
Pomińmy to - nie wiem po co ta instrukcja POKE jest tutaj używana (zwykle kiedy nie ma błędu to mamy pod tym adresem liczbę 255,
zatem być może"narzuca" się komputerowi, że nie ma błędu?)

Później instrukcja LOAD"" CODE i wczytywany jest nagłówek (pozycja 0005) nadający kolejnemu blokowi maszynowemu (pozycja 0006)
nazwę "split_bord" i wiemy (z rysunku pierwszego) że ten blok kodu maszynowego ma długość 118 bajtów i jest wczytywany pod adres 32768
Stąd w kolejnej linii nr 40 naszego BASIC-owego loadera mamy instrukcję RANDOMIZE USR 32768 która uruchamia ten programik.

Najedź myszką na pozycję 0006 czyli blok programu w kodzie maszynowym i kliknij prawym przyciskiem myszki.
Wybierz: Send to...  Send to ZX-Assembler
Bedziesz mógł sobie podejrzeć jak wygląda kod tego programiku



Powodzenia w rozgryzaniu tajników ZX Spectrum  :)

Pozdrawiam





ZX Spectrum 48K, ZX Spectrum +, ZX Spectrum 128K, ZX Spectrum +2, ZX Spectrum +2B, ZX Spectrum +3, TIMEX TC2048, UNIPOLBRIT Komputer 2068, Didaktik Gama 80kB, 
Amstrad/Schneider CPC6128, Schneider CPC464, Commodore C64, Atari 800XL, 65XE 130XE, A500+, A600, A1200, ATARI 1040 STF

Frodo

  • *
  • Wiadomości: 18
Odp: Szczegółowy opis pliku Tap
« Odpowiedź #5 dnia: 2015.12.25, 11:03:13 »
Zrobiłem program wyświetlający .tap wraz z kodem Basica oraz tworzący .tap na podstawie pliku binarnego. Może przydać się aby zapoznać się ze szczegółami tego formatu.