Kopírování a přesouvání adresářů v Calm Commanderu
14. 6. 2026

Jak jsem psal včera - vydal jsem Calm Commander 1.0 a jedna z jeho novinek byla i kopírování adresářů a podadresářů a to do hloubky 11 podaddresářů. Uveřejnil jsem tuto novinku na FB stránce ZX Spectrum Next s tím, že si chvilku odpočinu, ale rozhořela se tam diskuze o tom, proč není Calm Commander dot command. Je to jednoduché - protože já ho jako dot command nikdy nechtěl - popravdě si myslím, že by to bylo kontraproduktivní. Calm Commander zabírá spousttu místa - LFN i 8.3 jména souborů/adresářůnačteného adresáře si drží v paměti, při kopírování si ukládá data do co největší části paměti, pluginy sami o sobě také něco sežraly (myslím tím paměť). Ale nějak se tam ve mne zrodila myšlinka udělat několik dot příkazů - kopírování, delete a dirinfo. A dnes bych Vám rád představil příkaz copy.

.copy – nový dot command pro ZX Spectrum Next

Jak jsem psal včera - vydal jsem Calm Commander 1.0 a jedna z jeho novinek byla i kopírování adresářů a podadresářů a to do hloubky 11 podaddresářů. Uveřejnil jsem tuto novinku na FB stránce ZX Spectrum Next s tím, že si chvilku odpočinu, ale rozhořela se tam diskuze o tom, proč není Calm Commander dot command. Je to jednoduché - protože já ho jako dot command nikdy nechtěl - popravdě si myslím, že by to bylo kontraproduktivní. Calm Commander zabírá spousttu místa - LFN i 8.3 jména souborů/adresářůnačteného adresáře si drží v paměti, při kopírování si ukládá data do co největší části paměti, pluginy sami o sobě také něco sežraly (myslím tím paměť). Ale nějak se tam ve mne zrodila myšlinka udělat několik dot příkazů - kopírování, delete a dirinfo. A dnes bych Vám rád představil příkaz copy.

Syntaxe
.copy zdroj cil
.copy -s zdroj -d cil

Oba formáty jsou rovnocenné. Cesty s mezerami v názvu uzavřete do uvozovek.

Přepínače
  • -mmove (přesun): po úspěšném zkopírování smaže zdrojový soubor nebo adresář
  • -yyes (přepis): přepisuje existující cílové soubory; bez tohoto přepínače se existující soubory přeskočí
  • -h — zobrazí nápovědu

Kopírování jednoho souboru:
Soubor se čte do 8 kB pracovního bufferu na adrese $DC00 a zapisuje se na cíl po blocích. Pokud cíl končí lomítkem nebo jde o existující adresář, jméno zdrojového souboru se přidá automaticky. Jinak se cílová cesta použije jako výsledné jméno souboru.

Kopírování adresáře (rekurzivní):

  1. Příkaz prochází adresářový strom do hloubky 11 úrovní (MAX_DEPTH = 11).
  2. Každý podadresář vytvoří v cíli (F_MKDIR – chyba „již existuje" se ignoruje).
  3. Soubory v každém podadresáři zkopíruje se zachováním dlouhých jmen (LFN).
  4. Před vlastní kopií projde strom naprázdno a spočítá položky – kvůli zobrazení průběhu.
  5. Průběh se zobrazuje jako Copying: nazev_adresare (X/celkem) a pro každý soubor soubor [XkB/CelkemkB].
  6. Adresářové handles se před rekurzí uzavírají a po ní znovu otevírají – tím se obchází omezení NextZXOS na počet současně otevřených handles.

Přesun adresáře (-m):
Nejprve proběhne kompletní rekurzivní kopie, pak se celý zdrojový strom smaže (soubory přes F_UNLINK, adresáře přes F_RMDIR zdola nahoru). Pro přesun jednoho souboru se nejdříve zkusí F_RENAME (rychlé přejmenování na stejném disku); teprve pokud selže, provede se kopie + smazání.

Chování při přepisu
  • Bez -y: existující cílový soubor se přeskočí a zobrazí se Skipping existing: jmeno.
  • S -y: cílový soubor se přepíše.
Pravidla pro cílovou cestu
  • Cíl končí / nebo \ → zdrojové jméno se přidá za lomítko.
  • Cíl je existující adresář → zdrojové jméno se zkopíruje do tohoto adresáře.
  • Jinak → cíl je výsledné jméno souboru nebo adresáře.
  • Zdrojová cesta s koncovým lomítkem (adresar/) se normalizuje na adresar.
Bezpečnostní pojistky
  • Ochrana před kopírováním adresáře do sebe: příkaz zjistí, zda cílová cesta není podadresářem zdrojové, a kopii odmítne.
  • Ověření cílového rodiče: před zahájením kopie zkontroluje, že nadřazený adresář cíle existuje. Pokud ne, skončí s hláškou copy: destiny path not found.
  • Přerušení stiskem BREAK (CAPS SHIFT + SPACE): zastaví operaci kdykoli, smaže rozepsaný cílový soubor a vypíše Cancelled.
  • Příkaz instaluje ROM error handler, aby chyby (typicky chybějící jednotka na emulátorech) nespadly do BASICu.
Výkon

Během kopírování a mazání se CPU dočasně přepne na 28 MHz (NextReg $07 = 3). Po skončení – ať úspěšném, chybném, nebo zrušeném – se turbo vrátí na původní hodnotu.

Pár technických věcí
  • Pracovní buffer: 8192 bajtů na adrese $DC00–$FBFF
  • Zásobník zdrojových cest: $C000 (12 × 256 bajtů)
  • Zásobník cílových cest: $CC00 (12 × 256 bajtů)
  • Maximální délka cesty: 255 znaků
  • Maximální hloubka podadresářů: 11 úrovní
  • Adresáře se čtou v LFN režimu → dlouhá jména jsou zachována
  • Spouští se na adrese $2000 (standardní dot command)
Příklady
.copy zaloha zaloha2

Zkopíruje soubor nebo adresář zaloha do zaloha2.

.copy -y "Calm Commander" "backup/"

Zkopíruje adresář Calm Commander (s mezerou v názvu) do backup/Calm Commander. Existující soubory přepíše.

.copy -s "muj adresar" -d "d:/moje zaloha"

Kopírování s cestami v uvozovkách je vhodné, když cesta obsahuje mezery.

.copy -m stary novy

Přesune adresář stary na novy (kopie + smazání zdroje).

Chybové hlášky a výstup z .copy
  • copy: missing or bad arguments — chybí zdroj nebo cíl, nebo neznámý přepínač
  • copy: destiny path not found — nadřazený adresář cíle neexistuje
  • copy: esxDOS error $XX stg $YY — interní chyba; XX je esxDOS chybový kód, YY je fáze (pro ladění)
  • Skipping existing: jmeno — soubor na cíli existuje a nebyl zadán -y
  • Cancelled. — uživatel stiskl BREAK
  • Done. — kopírování nebo přesun úspěšně dokončen

Ke stažení: shrek128.itch.io

Snímek obrazovky 2026-06-14 201954

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *