Autor Wątek: CopyCopy jak używać  (Przeczytany 17644 razy)

yarko

  • ***
  • Wiadomości: 146
  • Miejsce pobytu:
    Szczecin
CopyCopy jak używać
« dnia: 2011.12.01, 19:39:50 »
Może głupio to zabrzmi - ale jak się tego używało? Teraz mam tylko emulatory i gotowe romy, kiedyś gdy miałem ZX Spectrum+ ~1984-1987 to było podstawowe narzędzie  ;) a teraz czas zatarł pamięć ....

popocop

  • *****
  • Wiadomości: 830
  • Miejsce pobytu:
    Warszawa
Odp: CopyCopy jak używać
« Odpowiedź #1 dnia: 2011.12.01, 19:43:25 »
Dokładny opis był chyba w specjalnym wydaniu "Komputera" pt. "Tajniki ZX Spectrum".
Tak na szybko to pamiętam, że ładowało się używając LOAD (czyli klawisz J) i Enter, a nagrywało używając SAVE.
ZX Spectrum +2 & PicoDiv SD,
Timex 2048 & divIDE 57c

Duddie

  • ****
  • Wiadomości: 402
  • Miejsce pobytu:
    Warszawa
Odp: CopyCopy jak używać
« Odpowiedź #2 dnia: 2011.12.01, 19:53:19 »
1. CAT — klawisz C
Przeglądanie nagłówków (nie niszczy zbiorów zapisanych w pamięci).
2. LOAD — klawisz J
Wczytywanie zbiorów do pamięci.
LOAD — od następnego zbioru;
LOAD 1 — od początku pamięci (skasowanie wszystkich zbiorów wczytanych poprzednio);
LOAD n — od n-tego zbioru;
LOAD n TO m — od n-tego do m-tego zbioru;
LOAD TO m — od następnego do m-tego zbioru;
LOAD AT nn — od adresu nn; nn jest inicjowany na 23296, przez LOAD AT 23040 można zwiększyć wolną pamięć do 42496; kasuje wszystkie zbiory nie niszcząc ich fizycznie;
LOAD (nn — wczytanie pierwszych nn bajtów zbioru (z pominięciem nagłówka), może być także LOAD n/nn;
LOAD (nn TO — wczytanie z opuszczeniem pierwszych nn bajtów (z pominięciem nagłówka);
Przykład:
LOAD (6912 —wczytanie tylko screen-u;
LOAD (6912 TO — wczytanie z pominięciem screen-u.
SAVE — klawisz S
Nagrywanie zbiorów na taśmie.
3. SAVE — od pierwszego do ostatniego;
SAVE n — od n-tego zbioru;
SAVE TO m — od pierwszego do m-tego zbioru;
SAVE n TO m — od n-tego do m-tego zbioru;
SAVE STEP n — ustawienie przerwy między zbiorami w sekundach, przy n = 9 (przerwa dowolna) pojawia się komunikat Press any key...;
SAVE n TO m STEP n — od n-tego do m-tego zbioru co n sekund;
4. VERIFY — klawisz V
Weryfikowanie nagranych zbiorów.
VERIFY — patrz LOAD;
VERIFY n TO m — patrz LOAD n TO m;
VERIFY n — patrz LOAD;
5. LET — klawisz L
Zmiana nagłówka.
LET 2=naz,,1 — zbiór numer 2, nazwa = naz, start = 1;
LET 3=,500,1,5 — zbiór numer 3, długość = 500, start = 1, próg = 5;
W nazwie pomijane są spacje, można w nazwie umieścić spacje graficzne — GRAPHICS 8. LET bez parametrów powoduje wydruk zbiorów. Jeśli pojawia się komunikat OUT OF MEMORY, to należy zmieniać nagłówek po jednym parametrze.
6. LIST — klawisz K
Wydruk pamięci, pokazuje 15 bajtów — adres, wartość słowa, wartość bajtu (dec) i kod znaku. Przez Enter uzyskuje się następne 15 bajtów.
LIST nn — wydruk od adresu nn.
Uwaga: zawartość obszaru pamięci pomiędzy adresami 23552 i 23754 (zmienne systemowe) jest przenoszona w inne miejsce.
7. POKE — klawisz O
Modyfikacja zawartości pamięci;
POKE x, nn — x — adres, nn — wartość dwubajtowa;
POKE x, n — x — adres, n — wartość jednobajtowa;
Jeżeli druga wartość jest większa od 256, to automatycznie wpisuje się dwa bajty.
8. USR — klawisz U
USR nn — wykonanie programu maszynowego od adresu nn.
9. RETURN — klawisz Y
Powrót do BASICu: inicjuje zmienne systemowe i kanały, nie niszczy fizycznie zbiorów.
10. COPY — klawisz Z
COPY — kopiowanie jednego zbioru o długości do 49096 bajtów bez nagłówka; rozpoczęcie nagrywania (save) przez Caps Shift; można nagrywać wielokrotnie; pomija nagłówek; niszczy program COPY COPY.
COPY nn — kopiowanie jednego zbioru o długości do 49152 bajtów (bez nagłówka), początek nagrywania przez Caps Shift, nagrywanie jednorazowe. Przed wczytaniem ustawić nagranie tuż za nagłówkiem (to znaczy wcisnąć Enter dopiero po przejściu nagłówka). COPY nn niszczy program główny COPY COPY, nn oznacza adres, pod którym schowany będzie program kopiujący (29 bajtów) 16384 < nn < 65350, na przykład: COPY 16387 — program schowa się w pierwszym wierszu ekranu; COPY 23698 — w MEMBOT. COPY zawiesza się w przypadku błędu na taśmie i po ukończeniu nagrywania. Moduły COPY nie są aktywne, jeśli przedtem wykorzysta się ostatnie 200 bajtów pamięci.
11. PRINT — klawisz P
ZX Spectrum 48K, ZX Spectrum+, ZX Spectrum 128K, ZX Spectrum +2/+3, Timex 2048, Unipolbrit 2086, FDD3000, Timex Terminal 3000, PlusD, Multiface 128, Multiface +3, divIDE Plus, IF1+microdrive

yarko

  • ***
  • Wiadomości: 146
  • Miejsce pobytu:
    Szczecin
Odp: CopyCopy jak używać
« Odpowiedź #3 dnia: 2011.12.01, 20:07:04 »
Duddie -  :o - wielkie dzięki !!!

popocop

  • *****
  • Wiadomości: 830
  • Miejsce pobytu:
    Warszawa
Odp: CopyCopy jak używać
« Odpowiedź #4 dnia: 2011.12.01, 20:58:39 »
Zawsze mnie ciekawiło w jaki sposób Copy Copy dawał radę skopiować plik o długości 49152 bajtów (czyli pełne 48kB), na Spectrum z 48kB pamięci.
ZX Spectrum +2 & PicoDiv SD,
Timex 2048 & divIDE 57c

Duddie

  • ****
  • Wiadomości: 402
  • Miejsce pobytu:
    Warszawa
Odp: CopyCopy jak używać
« Odpowiedź #5 dnia: 2011.12.02, 11:03:37 »
popocop, jak zwrócisz uwagę na to, co jest w takim dłuuuugim pliku, to będziesz wiedział.... Producenci gier, aby uniemożliwić ich kopiowanie, zapisywali fragment ROM i potem dopiero był CODE. COPY COPY wczytuje więc program pod adres, gdzie jest ROM (odczytuje to z nagłówka). Potem zapisuje tak samo.... Rzeczywistego kodu jest mniej niż RAMu, inaczej nie mogliby tego zapisać.
ZX Spectrum 48K, ZX Spectrum+, ZX Spectrum 128K, ZX Spectrum +2/+3, Timex 2048, Unipolbrit 2086, FDD3000, Timex Terminal 3000, PlusD, Multiface 128, Multiface +3, divIDE Plus, IF1+microdrive

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: CopyCopy jak używać
« Odpowiedź #6 dnia: 2011.12.02, 12:49:40 »
@Duddie A niby czemu nie można by zapisać całego RAMu i mieć poprawnego programu? Przecież wystarczy, żeby loader poprawnie ustawił stos, parametry dla loada i skoczył do ROMu. Procedura ładowania wciągnie cały RAM w tym nowy stos i po powrocie z niej nastąpi skok do właściwego startu programu. Dokładnie tak samo z zapisem - w ramie, który zrzucasz pozostaje co prawda sama procedura zapisywania bloku na taśmę, ale zrzucić można przecież całą pamięć. A poza tym - duży może sobie na to pozwolić - jakby producent nie chciał, żeby procedura zapisu siedziała w RAMie to można przecież wsadzić eproma w którym jest ona wpisana a jakiś nieużywany kawałek ;)

I mam wrażenie, że miałem kiedyś jakieś szachy, które miały właśnie pełne 48 kilo co do bajtu i blok zaczynał się od 16384.


Duddie

  • ****
  • Wiadomości: 402
  • Miejsce pobytu:
    Warszawa
Odp: CopyCopy jak używać
« Odpowiedź #7 dnia: 2011.12.02, 14:31:46 »
matofesi, masz rację. I tak działa właśnie COPY COPY. Po wczytaniu całości następuje skok do procedury SAVE.
ZX Spectrum 48K, ZX Spectrum+, ZX Spectrum 128K, ZX Spectrum +2/+3, Timex 2048, Unipolbrit 2086, FDD3000, Timex Terminal 3000, PlusD, Multiface 128, Multiface +3, divIDE Plus, IF1+microdrive

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: CopyCopy jak używać
« Odpowiedź #8 dnia: 2011.12.02, 15:45:07 »
@Duddie Ja się domyślam, że tam jest coś sprytnego, ale nie da się tego zrobić tak na 100%, żeby dało się skopiować co do bajtu 48 kilo. A w każdym razie ja sobie nie wyobrażam jak - musisz obciąć albo początek albo koniec bloku - gdzieś musi się zmieścić procedura ustawiająca parametry zapisu pliku i czekająca na klawisz.

Pyza^Illusion

  • *****
  • Wiadomości: 586
  • Miejsce pobytu:
    Lubań, dolnośląskie
Odp: CopyCopy jak używać
« Odpowiedź #9 dnia: 2011.12.02, 16:15:25 »
Ja to się w COPY-COPY mało co bawiłem, bo znacznie lepiej było używać Compress Copy, który w locie kompresował pliki. Cała pamięć i tak nie była wypełniona kaszaną, i jakieś tablice, czy pustki się zdarzały. Zwykle można było nawet półtorej gry za jednym zamachem wczytać :p Jak mniejsze tytuły to nawet dwie, czy trzy. Już nie wspomnę o CompressCopy128 :D
ZX Spectrum+ (128kB by STAVI), FDD3000, TI-OF-TTL/ZXVGS, Masterface2b, MacFace II, DivIDE plus, Just Speccy 128...

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: CopyCopy jak używać
« Odpowiedź #10 dnia: 2011.12.02, 17:33:38 »
O ile dobrze pamietam to ja uzywalem turbo copy, ktore rowniez kopresowalo w locie.

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: CopyCopy jak używać
« Odpowiedź #11 dnia: 2011.12.02, 18:01:26 »
To są wszystko późniejsze wynalazki. Copy Copy to jest matka wszystkich kopierów ;)

popocop

  • *****
  • Wiadomości: 830
  • Miejsce pobytu:
    Warszawa
Odp: CopyCopy jak używać
« Odpowiedź #12 dnia: 2011.12.02, 20:01:37 »
To są wszystko późniejsze wynalazki. Copy Copy to jest matka wszystkich kopierów ;)

Dokładnie, a poza tym Copy Copy było niezastąpione przy cięciu plików na kawałki, wpisywaniu POKE'ów itp.
ZX Spectrum +2 & PicoDiv SD,
Timex 2048 & divIDE 57c

rafamiga

  • ***
  • Wiadomości: 215
  • Miejsce pobytu:
    Warszawa
Odp: CopyCopy jak używać
« Odpowiedź #13 dnia: 2011.12.03, 00:49:11 »
@Duddie Ja się domyślam, że tam jest coś sprytnego, ale nie da się tego zrobić tak na 100%, żeby dało się skopiować co do bajtu 48 kilo.

Da się. Z grubsza tak:

1. W bajty <nn> do <nn+26> ładujesz 27-bajtową procedurkę, która czeka na CAPS SHIFT i skacze do ROM, zapisując 49152 bajty od 16384, bez nagłówka ofkors.

2. Kopiujesz procedurę ładowania do RAM, relokując, gdy trzeba. [LD-BYTES spod 0556]

3. W odpowiednim momencie skopiowanej procedury wstawiasz skok do "dolepku", który sprawdza wskaźnik, mówiący gdzie zapisać szczytany z taśmy bajt, i gdy adres jest pomiezy <nn>, a <nn>+28, nie zapisuje tego bajtu do pamięci.

3a. Drugim "dodatkiem" jest skok do kawałka kodu, gdy wskaźnik osiągnie <nn>+29. Kod ustawi stos na <nn>+27 i skoczy w środek pętli opóźniającej procedury ładowania, tej w ROM-ie, dokładnie do LD-EDGE-2.

Oczywiście, przy obu operacjach trzeba skomensować pętlę opóźniającą, biorąc pod uwagę liczbę taktów procesora "zżeranych" przez te sprawdziany. No ale szybki rzut oka na LD-EDGE-2 potwierdza, że mamy dużo taktów "nadmiaru", bo tam jest 22-krotna pętla opóźniająca, i to na polegająca na dekrementacji A, a nie na DJNZ [znaczy, wolniejsza].

Do potwierdzenia lekturą samej LD-BYTES. Wykrywanie zbocza sygnału jest w LD-EDGE-1. http://www.wearmouth.demon.co.uk/zx82.htm.

A dlaczego 27 bajtów? Bo w instrukcji, którą zacytował Duddie, napisano, że COPY 16387 umieszcza procedurkę w pierwszym wierszu ekranu. Skoro ekran ma szerokość 32 bajtów [256 pikseli] to od 16387 do 16415 jest 29 bajtów, no ale na stosie musi leżeć 16387, jako adres powrotny z LD-BYTES, a to zajmuje 2 bajty i pewnie jeszcze kilka bajtów, na stos używany przezcież przez LD-BYTES.

27 bajtów to ciut przy dużo jak na czekanie na caps i skok do SA-BYTES. Pewnie w tych 27 są właśnie te "ekstra" rzeczy dołożone do LD-BYTES, miejsce na stos i adres powrotu.
« Ostatnia zmiana: 2011.12.03, 01:01:16 wysłana przez rafamiga »
--
rafamiga

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: CopyCopy jak używać
« Odpowiedź #14 dnia: 2011.12.03, 14:36:47 »
Ok. Ale to nadal nie zmienia faktu, że nie dostajesz kopii co do bitu - te 27 bajtów cały czas musi tam gdzieś siedzieć. Czyli zasadniczo jeśli nie da się ze 100% pewnością znaleźć miejsca na ten kawałek procedury istnieje prawdopodobieństwo, że wstrzelimy się w coś, co jest jednak istotne dla kopiowanego programu albo pominiemy coś, co jest dla niego istotne. A jak program będzie wredny to może się przejechać przez pamięć zaraz po starcie i policzyć sumę kontrolną ;)

I tak - zdaję sobie sprawę, że nikomu nie chciało się robić takich rzeczy przy zastosowaniu systemowego formatu zapisu bo nie miało to jakiegoś wielkiego sensu - lepiej było wymyślić jakiś nietypowy format, którego standardowe kopiery nie były w stanie przeczytać. A na koniec i tak zawsze można było tak zabezpieczony program przegrać na porządnym dwukasetowym decku i wszystkie zabezpieczenia się kopiowały na nową taśmę ;)