CoBra DEVIL - BASIC cu suport floppy


CONȚINUT:

(Clic pe link pentru a ajunge acolo, tasta Home pentru a reveni aici)
  1. Scurtă descriere a sistemului de operare

  2. Programe utilitare de bază folosite în DEVIL
  3. Arhiva mea de dischete DEVIL CoBra
  4. Procedură pentru conversie imagini Teledisk de dischete CoBra DEVIL în imagini floppy RAW

  5. Utilitar pentru transfer fişiere între Linux şi imagini RAW de dischete CoBra DEVIL
  6. Conversie imagini RAW de dischete CoBra DEVIL în imagini HFE pentru emulatorul fizic de floppy disk HxC cu SD Card



1. Scurtă descriere a sistemului de operare



Fiind un calculator cu interfață floppy, evident că pînă la urmă a apărut și o variantă de BASIC adaptată pentru CoBra cu suport pentru floppy disk. Denumirea sub care l-am cunoscut la vremea respectivă este DEVIL, evident din cauza mesajului afișat la pornire și poate și din cauza fondului negru afișat la pornire, în loc de clasicul fond alb al Basic-ului original Spectrum:


Modul de stocare a datelor pe disc este diferit față de modul de stocare al fișierelor în CP/M, de exemplu, sau în alte sisteme de operare. Stocarea datelor pe disc folosește discul floppy ca suport de implementare a aceluiași mod standard de stocare a datelor pe bandă magnetică folosit de un ZX Spectrum standard. Cu alte cuvinte, discul floppy este folosit ca o bandă magnetică împărțită în felii de 9 KB, cît este capacitatea unei piste pe ambele fețe. Blocurile de date stocate pot fi numai de tip standard (Program, Bytes, Character Array sau Number Array) cu header-ul aferent. Nu pot fi stocate blocuri de date fără header (cu excepția unui caz, descris mai jos). Din acest motiv, doar un număr foarte restrîns de programe pot fi stocate corect pe un floppy disc DEVIL. Un eventual program non-standard va trebui modificat și adus la o formă standard, cu header pentru toate blocurile lui componente și viteză de încărcare standard, pentru a putea fi stocat pe disc.

Unitatea de alocare logică este deci o pistă pe ambele fețe, adică 9 KB. Fiecărei unități de alocare (piste) îi corespunde o intrare în directorul discului, care ocupă 256 octeți. Unui bloc de date îi corespunde o intrare de catalog, iar o intrare de catalog poate avea mai multe intrări de director dacă blocul de date respectiv ocupă mai mult de 9 KB. Catalogul discului ocupă primele 3 piste (#0, #1, #2) iar dimensiunea sectoarelor pe disc este de 256 octeți, fiecare pistă (ambele fețe) avînd 36 sectoare. Asta înseamnă că în catalog încap maxim 3 x 36 = 108 intrări, iar zona de date a discului are maxim 80 - 3 = 77 unități de alocare (piste). Formatul de disc DEVIL prezintă întrețesere fizică (nu și întrețesere logică), numerele fizice ale sectoarelor de pe fața unei piste avînd succesiunea 1, 10, 2, 11, 3, 12, 4, 13, 5, 14, 6, 15, 7, 16, 8, 17, 9, 18, aceasta fiind și ordinea lor logică de citire.

Dacă un bloc de date stocate pe disc este mai mare de 9 KB, el va fi stocat pe mai multe piste, necesitînd mai multe intrări în catalogul discului. Intrările suplimentare vor avea octetul de tip (octetul 0) cu valoarea $E4 și vor fi stocate în catalog în ordinea datelor din blocul de date respectiv. La fel și datele propriu-zise stocate pe disc, vor fi stocate în piste succesive în ordinea lor normală în care au fost stocate pe bandă magnetică.

Intrările de catalog ale blocurilor de date șterse (cu comanda ERASE sau un utilitar oarecare) vor avea octetul tip (octetul 0) setat pe valoarea $E5.

Blocurile de date stocate pe disc au două atribute care pot fi manipulate: Read-Only/Read-Write (R/O-R/W) și Catalog/Hidden (DIR/SYS). Acestea sînt stocate în octetul 18 (octet de atribute fișier) al intrării respective din catalogul discului (primul octet fiind octetul 0, care reprezintă tipul blocului de date - $00 pentru Program, $01 pentru Number Array, $02 pentru Character Array, $03 pentru Bytes). Ca fapt divers, o intrare în catalog ocupă 256 octeți, din care numai primii 18 sînt folosiți, restul avînd în mod normal valoarea $00.
Am menționat mai sus că există un caz excepțional în care blocuri headerless pot fi stocate pe un floppy disc DEVIL.

Este cazul în care unul sau mai multe blocuri headerless consecutive avînd fiecare cîte un Flag byte = $FF și care urmează imediat după un bloc de date standard (Program sau Code).
În acest caz, octeții headerless sînt stocați imediat după sfîrșitul octeților din blocul de date standard (dacă blocul de date standard ocupă mai puțin decît un multiplu de 9 KB, octeții headerless vor fi stocați începînd cu primul octet nefolosit din ultima pistă ocupată de datele blocului standard).

Lungimile acestor blocuri headerless consecutive vor fi stocate în octeții (de regulă) nefolosiți de după octetul #17 din fiecare intrare de director a respectivei intrări de catalog. Octeții #18 și #19 sînt totdeauna nefolosiți. Dacă există date headerless de stocat, octeții #20 și #21 vor conține o copie a lungimii datelor din blocul standard care precede datele headerless. Deci vom avea 256 - 18 - 2 - 2 = 234 octeți disponibili în fiecare intrare de director pentru stocarea lungimii blocurilor headerless. Întrucît fiecare lungime de bloc este reprezentată pe 2 octeți, înseamnă că putem avea maxim 234 / 2 = 117 blocuri headerless stocate imediat după un bloc standard.

Deci, în concluzie, în fiecare intrare de director octeții #18 și #19 sînt totdeauna nefolosiți, octeții #20 și #21 sînt rezervați (vezi mai sus) iar octeții #22 . . . #255 sînt de regulă nefolosiți dar pot stoca lungimi de blocuri headerless dacă e nevoie.

Basic-ul standard Spectrum are implementate 3 comenzi pentrul lucrul cu Microdrive: ERASE, CAT și FORMAT. Dintre acestea, ERASE și CAT sînt în cazul DEVIL modificate pentru a lucra cu interfața floppy din CoBra, iar comanda FORMAT este desființată (execuția ei nu are nici un efect, terminîndu-se imediat cu mesajul standard
0 OK, 0:1
.

Comanda ERASE are sintaxa
ERASE "filename"
, unde filename este numele unui bloc de date stocat pe disc iar ghilimelele trebuiesc incluse.

Comanda CAT nu recunoaște nici un parametru (în Basic Spectrum standard necesită ca parametru numele unității între ghilimele, ca de exemplu
"A:"
), simpla ei invocare provocînd listarea pe ecran a conținutului discului din prima unitate fizică de disc detectată ca READY. Cu alte cuvinte, dacă sînt prezente unitățile fizice de disc 0, 1 și 2, și ambele unități fizice 2 și 3 au cîte un disc introdus și sînt READY, comanda CAT va lista conținutul discului din unitatea fizică 2. Dacă există un disc introdus și în unitatea 0 care este READY, atunci va fi listat conținutul discului din unitatea fizică 0.

În exemplul de mai jos am listat cu CAT conținutul dischetei UTILS1 din arhiva mea de dischete DEVIL.

1:

Se introduce comanda CAT (New Mode, apoi Symbol Shift + 9)...

2:

... și după un ENTER conținutul dischetei este listat.


2. Programe utilitare de bază folosite în DEVIL



Există 3 utilitare de bază folosite în DEVIL: În continuare am să le prezint pe fiecare pe scurt.

STAT - UTILITAR DE MANIPULARE FIȘIERE (BLOCURI DE DATE) ȘI ATRIBUTE FIȘIER

1:

Se tastează comanda de încărcare, LOAD "STAT".

2:

După încărcare, programul afișează un meniu principal. Pentru început, trebuie obligatoriu selectată opțiunea "Statistics" (tasta S) care determină și ce unitate fizică va fi folosită în continuare (dacă sînt prezente mai multe).

3:

Această opțiune afișează numărul de fișiere, spațiul ocupat și spațiul liber pe disc precum și o reprezentare grafică a gradului de ocupare a discului. Acesta e rezultatul pentru discul GAMES1 din arhiva mea pe 3.5".

4:

Apăsînd orice tastă se revine în meniul principal. În continuare se poate alege orice altă opțiune din meniu, să alegem "Catalogue".

5:

Este afișat catalogul discului, cu detalii pentru fiecare bloc de date. Acesta e catalogul discului GAMES1. Blocurile de date cu atribut SYS (Hidden) sînt afișate în invers video.

6:

Întrucît catalogul nu poate fi afișat în întregime pe un singur ecran, cu un ENTER se permite defilarea conținutului în sus și afișarea următoarei pagini...

7:

...și a încă uneia, care e și ultima.

8:

După care, cu orice tastă se revine în meniul principal. Mai departe să alegem opțiunea "File" cu tasta F.

9:

Este afișată o listă cu numele fiecărui bloc de date de pe disc, cu primul nume selectat. Cu tasta SPACE sau tastele cu săgeți se poate deplasa selecția pe alt nume. Acesta e conținutul discului UTILS3 din arhiva mea.

10:

Am deplasat selecția pe blocul "EPROM6.13" (sursa în Assembler a unui program pe care l-am scris pentru programatorul de EPROM-uri proiectat de mine), după care am apăsat ENTER.

11:

Ecranul se schimbă și apare un meniu de opțiuni pentru acest bloc de date. Se pot schimba cele două atribute (R/O-R/W cu tastele O sau W, DIR/SYS cu tastele H sau S). Se poate redenumi, șterge sau executa acest bloc de date.

12:

Am apăsat tasta O pentru a schimba atributul Read/Write în Read Only și ecranul se schimbă revenind în meniul "File". Apăs din nou ENTER pentru a accesa din nou blocul "EPROM6.13".

13:

Se observă că acum blocul are atribut Read Only. Apăs tasta H pentru a seta și atributul SYS (Hidden).

14:

Programul revine din nou în meniul "File". Apăs iar ENTER pentru a accesa din nou blocul "EPROM6.13".

15:

Se observă că acum blocul are atributele Read Only și Hidden ("Non catalog").

16:

Apăs tasta M și revin în meniul principal după care cu tasta E părăsesc programul pentru a reveni în Basic.

17:

Programul afișează pentru cîteva secunde un mesaj de adio...

18:

...după care execută un reset Basic și apare mesajul de start al DEVIL.


DIP - UTILITAR PENTRU COPIERE FIȘIERE DE PE UN DISC PE ALTUL

1:

Se tastează comanda de încărcare, LOAD "DIP".

2:

După încărcare, programul afișează un meniu principal de comenzi. Se pot copia blocuri de date prin tastarea tipului de date (P, N, C sau B) urmat de : și apoi de numele blocului. Comanda CAT afișează conținutul discului.

3:

Să presupunem că vrem să copiem programul "GENS 4", care are două blocuri: Program "GENS 4" și Code "GENS4". Tastăm mai întîi comanda de copiere a blocului Program:

4:

După un ENTER apare un mesaj cerînd introducerea discului sursă. Se introduce discul în unitate și se apasă ENTER.

5:

Apare un mesaj care anunță operația de căutare a blocului "GENS 4" pe disc și programul începe căutarea.

6:

Cînd blocul a fost găsit, apare alt mesaj care anunță găsirea, blocul este încărcat de pe disc în memorie și se cere introducerea discului destinație.

7:

Se introduce discul destinație și se apasă ENTER. Apare un mesaj anunțînd salvarea blocului și operația de salvare începe.

8:

După terminarea salvării, apare din nou prompter-ul așteptînd o nouă comandă

9:

În continuare tastăm comanda de copiere a blocului Bytes:

10:

După un ENTER apare un mesaj cerînd introducerea discului sursă (întrucît ecranul s-a umplut, este defilat cu un rînd în sus). Se introduce discul în unitate și se apasă ENTER.

11:

Apare un mesaj care anunță operația de căutare a blocului "GENS4" pe disc și programul începe căutarea.

12:

Cînd blocul a fost găsit, apare alt mesaj care anunță găsirea, blocul este încărcat de pe disc în memorie și se cere introducerea discului destinație.

13:

Se introduce discul destinație și se apasă ENTER. Apare un mesaj anunțînd salvarea blocului și operația de salvare începe.

14:

După terminarea salvării, apare din nou prompter-ul așteptînd o nouă comandă

15:

Aici am tastat comanda CAT (New Mode, Symbol Shift + 9) pentru a vedea conținutul discului destinație...

16:

...și după un ENTER sînt listate cele două blocuri copiate anterior.

17:

După care am tastat E...

18:

...și după un ENTER programul se termină printr-un reset...

19:

...și apare mesajul de start DEVIL.


FIU - UTILITAR PENTRU COPIERE FIȘIERE DE PE BANDĂ MAGNETICĂ PE DISC

1:

Se tastează comanda de încărcare, LOAD "FIU".

2:

După un ENTER ecranul se schimbă, apare un mesaj de start și se așteaptă apăsarea oricărei taste pentru a continua.

3:

După apăsarea oricărei taste ecranul se schimbă și apare interfața de lucru, dar programul încă nu e complet încărcat. Cîmpul "Free" din dreapta sus care indică memoria disponibilă este gol.

4:

După un moment apare un mesaj care anunță încărcarea unui bloc de cod care face parte din acest utilitar...

5:

...și blocul se încarcă (în mod foarte vizibil) în treimea inferioară a ecranului, în memoria video.

6:

După care programul pornește efectiv, este afișată memoria totală disponibilă și se așteaptă introducerea unei comenzi. Cu tasta L se poate încărca de pe bandă, cu S se salvează codul încărcat pe disc.

7:

În continuare am apăsat L pentru a încărca un program de pe bandă magnetică. Pentru această demonstrație am să folosesc un joc, AMAUROTE. Border-ul și-a schimbat culoarea, așteptînd semnalul audio.

8:

Semnalul de încărcare al header-ului primului bloc apare pe BORDER...

9:

...după care informația din header apare în lista de pe ecran.

10:

În continuare blocul de date propriu-zis este încărcat...

11:

...după care este și el afișat în listă.

12:

Apoi semnalul de încărcare al header-ului celui de-al doilea bloc apare pe BORDER...

13:

...după care informația din header apare în lista de pe ecran.

14:

În continuare blocul de date propriu-zis este încărcat (un SCREEN)...

15:

...după care este și el afișat în listă.

16:

În acest moment am apăsat tasta SPACE pentru a opri încărcarea. Următorul bloc este cam mare și n-ar mai încăpea în memorie, așa că mai întîi am să salvez ce s-a încărcat pînă în acest moment.

17:

Pentru asta introduc un disc gol (formatat) în unitate. Blocurile care trebuiesc salvate trebuiesc mai întîi selectate cu tasta ENTER. Așa că apăs ENTER o dată...

18:

...de două ori...

19:

...de trei ori...

20:

...de patru ori...

21:

Apăs tasta S pentru a salva selecția pe disc. Meniul din dreapta se dezactivează, selecția din listă se mută pe primul bloc, numele acestuia apare deasupra listei în cîmpul "Current:" (care mai înainte era gol) și blocul este salvat pe disc.

22:

După ce primul bloc a fost salvat, selecția din listă se mută pe al doilea bloc, numele acestuia apare deasupra listei în cîmpul "Current:" și este și el salvat pe disc.

23:

Acum cele două blocuri încărcate pot fi șterse din memorie pentru a face loc următorului bloc al programului care este copiat. Ștergerea (blocurilor selectate) se face cu tasta K.

24:

După apăsarea ei, meniul se dezactivează cîteva momente....

25:

...apoi lista se golește, memoria disponibilă afișată în dreapta sus revine la maximul de la început și meniul din dreapta se reactivează, cu numai două opțiuni disponibile (Load și Exit).

26:

În continuare apăs L pentru a încărca și restul jocului de pe bandă magnetică. Border-ul devine alb, așteptînd semnalul audio de încărcare.

27:

Semnalul de încărcare al header-ului ultimului bloc apare pe BORDER...

28:

...după care informația din header apare în lista de pe ecran.

29:

În continuare blocul de date propriu-zis este încărcat...

30:

...după care încărcarea se termină, și întrucît aici s-a terminat și programul de copiat...

31:

...apăs tasta SPACE pentru a opri încărcarea. Meniul se activează și numele blocului încărcat este selectat în listă.

32:

Acum trebuie iar selectate header-ul și blocul pentru a fi salvate pe disc, așa că apăs ENTER o dată...

33:

...și încă o dată.

34:

După care apăs S pentru a începe salvarea. Meniul din dreapta se dezactivează, selecția din listă se mută pe header-ul blocului, numele acestuia apare deasupra listei în cîmpul "Current:" și blocul este salvat pe disc.

35:

După ce salvarea se termină, meniul se reactivează. Acum că am terminat copierea, am să testez și opțiunea "name" din meniu care redenumește un bloc de date încărcat. Evident, folsind tasta N.

36:

Așadar, cu selecția pe header-ul (numele) ultimului bloc încărcat, apăs N și cîmpul cu numele inițial (PROG) se golește așteptînd introducerea altui nume. Am să-l redenumesc PROG1. Deci va trebui să tastez pe rînd...

37:

... P ...

38:

... R ...

39:

... O ...

40:

... G ...

41:

... 1 ...

42:

... și ENTER. Meniul din dreapta se reactivează după ce a fost dezactivat pe durata introducerii noului nume.

43:

Acum apăs K pentru ștergerea blocului încărcat din memorie și lista se golește.

44:

După care apăs E pentru a părăsi programul și a reveni în DEVIL. Este executat un reset...

45:

...și apoi apare mesajul de start DEVIL.

46:

Acum, pentru a vedea conținutul discului pe care am făcut salvarea, apelez la comanda CAT (New Mode, SS + 9)...

47:

...și după un ENTER, conținutul discului este afișat, confirmînd salvarea cu succes a programului copiat.


3. Arhiva mea de dischete DEVIL CoBra



La vremea respectivă, prin 1990-1997, am adunat şi eu, ca orice CoBrist fanatic, tot ce mi-a picat în mînă în materie de software CoBra. În materie de DEVIL n-am reuşit să adun prea multe, afară de utilitarele de bază folosite cu acest BASIC cu suport floppy, restul software-ului este în majoritate transferat de mine de pe bandă magnetică. Și cum nu orice program poate fi transferat pe disc DEVIL, și cantitatea de dischete cu software DEVIL adunate de mine este drastic redusă.

La fel ca în cazul CP/M, în prima parte a anilor '90, unitatea pe care o foloseam cu CoBra fiind una de 5 ¼" DSDD 80 piste 720K, am stocat software pentru DEVIL pe dischete de 5 ¼". Am adunat în perioada respectivă 6 dischete, 3 cu utilitare, 3 cu jocuri.

Ulterior, în a doua jumătate a anilor '90, am achiziţionat şi o unitate de 3 ½", şi ca urmare mi-am copiat toată arhiva de pe dischete de 5 ¼" pe dischete de 3 ½". Pe acestea din urmă, pe la sfîrşitul anilor anilor '90, cînd aveam deja un PC, le-am arhivat cu Teledisk şi le-am pus la păstrare pe un CD cu date. Dischetele de 5 ¼" au fost puse la păstrare şi se vede treaba că s-au păstrat foarte bine, întrucît recent (prin 2013) le-am scos de la naftalină şi le-am arhivat şi pe ele cu Teledisk, cu străvechea unitate de 5 ¼", care s-a păstrat şi ea foarte bine.

Aşa se face că în momentul de faţă am două arhive diferite de imagini Teledisk ale unor dischete DEVIL CoBra, conţinînd practic cam aceleaşi lucruri. Am să listez în continuare cele două arhive, cu conţinutul fiecărei dischete şi rezultatul scanării cu SAMdisk, care în cîteva cazuri dezvăluie erori logice pe disk, şi cu ocazia asta inventarierea va deveni completă, stabilind care dischete au erori şi care sînt în regulă.

Pentru fiecare imagine floppy este prezentat listingul catalogului de disc obținut cu utilitarul STAT, sub formă de screen snapshot (ca să nu trebuiască să mai fac lucru manual transcriind tot textul), precum și rezultatul scanării cu SAMdisk, care listează numerele de sector pentru toate pistele prezente în imaginea floppy. Aceste două informații sînt afișate atunci cînd cursorul mouse-ului este deasupra denumirii imaginii floppy respective. Imaginea floppy în sine poate fi descărcată cu un right-click pe denumirea ei urmată de „Save As”. De asemenea, în dreapta celulei cu denumirea imaginii floppy respective se află altă celulă cu textul „Disk STATistics”. Aducerea cursorului de mouse peste acest text va afișa rezultatul comenzii Statistics din STAT pentru acea dischetă. Și ca să fie tot tacîmul complet, pentru imagini floppy cu erori fondul este roz și un mic tip va fi afișat cu descrierea erorii.

DISCHETE DEVIL 3 ½" CU JOCURI: (pentru descărcare, right-click pe denumirea dischetei din stînga şi apoi "Save As")

Imagine floppy

Conţinut

SAMdisk scan

GAMES1.TDO Disk STATistics

GAMES2.TDO Disk STATistics
GAMES3.TDO Disk STATistics


DISCHETE DEVIL 3 ½" CU UTILITARE: (pentru descărcare, right-click pe denumirea dischetei din stînga şi apoi "Save As")

Imagine floppy

Conţinut

SAMdisk scan

UTILS1.TDO Disk STATistics

UTILS2.TDO Disk STATistics
UTILS3.TDO Disk STATistics


DISCHETE DEVIL 5 ¼" CU JOCURI: (pentru descărcare, right-click pe denumirea dischetei din stînga şi apoi "Save As")

Imagine floppy

Conţinut

SAMdisk scan

DISK_1D.TDO Disk STATistics

DISK_2D.TDO Disk STATistics
DISK_3D.TDO Disk STATistics


DISCHETE DEVIL 5 ¼" CU UTILITARE: (pentru descărcare, right-click pe denumirea dischetei din stînga şi apoi "Save As")

Imagine floppy

Conţinut

SAMdisk scan

DISK_D0.TDO Disk STATistics

DISK_D1.TDO Disk STATistics
DISK_D2.TDO Disk STATistics

* * *

4. Procedură pentru conversie imagini Teledisk de dischete CoBra DEVIL în imagini floppy RAW



Pentru conversie de imagini floppy DEVIL din format Teledisk în format RAW, eu personal folosesc două programe (metode) diferite:
  1. Un script scris de mine (TD02RAW, descris în continuare), care se folosește de alte două executabile, SAMdisk.exe (scris de Simon Owen) și hexdumptxt2bin (scris de mine).
    Această metodă va genera o imagine RAW cu sectoarele salvate întrețesut, exact în ordinea lor fizică de pe disc.
  2. Utilitarul HxCFloppyEmulator.exe folosit cu emulatorul floppy HxC. Pentru conversie, imaginea Teledisk trebuie încărcată cu butonul „Load”, apoi deschisă fereastra Track Analyzer și șterse eventualele piste existente cu numărul mai mare de 79, după care cu butonul „Export” se salvează imaginea în format RAW.
    Această metodă va genera o imagine RAW cu sectoarele salvate neîntrețesut, în ordinea numerelor fizice de sector.
Plecînd de la observaţia că utilitarul SAMdisk scris de Simon Owen poate extrage întreg conţinutul unei imagini floppy Teledisk (.TD0) în format text, listînd toţi octeţii sectoarelor de pe disc în hexa, începuse să mă preocupe ideea de a găsi o cale „automatizată” de conversie a imaginilor Teledisk din arhiva mea în imagini RAW, conţinînd pur şi simplu în format binar toate sectoarele dischetei, în ordinea lor fizică.

O astfel de imagine ar putea apoi fi folosită cu vreun viitor utilitar (preferabil scris de mine) care să transfere fişiere (blocuri de date) din şi în aceste imagini.

Spre deosebire de CP/M, în cazul DEVIL nu mai este folosită o întrețesere logică a sectoarelor, ci una fizică. Pe cînd la CP/M sectoarele unei piste (512 octeți/sector) sînt numerotate fizic (pe o față) pe disc în ordine, de la 1 la 9, în cazul DEVIL sectoarele unei piste (256 octeți/sector) sînt numerotate fizic cu factor de întrețesere 2, adică ordinea fizică a sectoarelor pe disc (pe o față) este 1, 10, 2, 11, 3, 12, 4, 13, 5, 14, 6, 15, 7, 16, 8, 17, 9, 18.

Conversia unei imagini Teledisk cu întrețesere fizică în imagine RAW, în cazul folosirii utilitarului HxCFloppyEmulator.exe, produce un rezultat la care nu mă așteptam, acest utilitar salvînd sectoarele în imaginea RAW în ordinea numerelor fizice de sector în loc să le salveze în ordinea lor fizică de pe disc. Se pare că ăsta ar fi standardul de facto pentru imagini RAW. Numai că eu nu sînt de acord cu ideea asta, și mi se pare mult mai logic ca sectoarele salvate într-o imagine RAW să respecte ordinea în care există fizic pe disc. Cu alte cuvinte, dacă discul original are întrețesere fizică, și imaginea RAW să aibă sectoarele dispuse întrețesut.

În afară de problema întrețeserii fizice expusă mai sus, la conversia .TD0 -> .RAW mai trebuie considerat un aspect: unele imagini Teledisk din arhiva mea sînt ale unor dischete cu format de 720K, dar care anterior formatării finale de 720K fuseseră formatate în 860K. În momentul arhivării lor cu Teledisk, au fost citite cu o unitate de 5 ¼" care nu suporta mişcarea capului pe toate cele 86 piste, ci numai pe 82-83. Ca urmare, Teledisk le-a arhivat ca dischete cu 82 de piste întrucît numai 82 a putut citi. Evident pistele 80-81 nu prezintă interes, deoarece datele de pe dischetă sînt stocate în format 720 KB, pe numai 80 de piste. Aşadar, la conversia .TD0 -> .RAW, trebuie excluse pistele de la 80 în sus.

În concluzie, un utilitar adevărat de conversie imagini DEVIL din format Teledisk în format RAW ar trebui să accepte ca parametru de intrare un domeniu de piste care să participe la procesul de transfer date în imaginea RAW. Pentru dischete DEVIL, domeniul folosit va fi de la 0 la 79. Pentru acest format (18 sectoare pe o faţă de pistă, 256 octeţi/sector), mărimea unei imagini RAW generate va fi de exact 737280 octeţi (80 piste x 36 sectoare/pistă x 256 octeţi/sector).

Ca și în cazul CP/M, se poate folosi același script bash scris de mine (TD02RAW) pentru a converti imaginea Teledisk în imagine RAW folosindu-se de utilitarul SAMdisk.exe al lui Simon Owen, după care se poate folosi un alt utilitar scris de mine în C standard (cobra-devil-diskimg-copy.c, descris ceva mai jos) care să facă transfer de fișiere între imagini RAW DEVIL și Linux. Scriptul "TD02RAW" se folosește de executabilul SAMdisk.exe pentru a extrage pistele cu date din imaginea Teledisk în mod text (listing hexa), care text este apoi convertit în imagine binară (RAW). Iniţial era spart în două părţi: prima parte extrăgea pistele, a doua parte convertea din text în binar. Ulterior le-am combinat, am obţinut un singur script şi am adăugat mai multe opţiuni. Problema e că partea a doua, aşa cum e scrisă în Bash, se mişcă foarte încet. Pentru convertirea unei dischete din listing text hexa în imagine binară, e nevoie de vreo oră (!!!). Aşa că ulterior am adăugat opţiunea folosirii unui executabil extern scris în C (hexdumptxt2bin, prezentat mai jos) care să rezolve conversia din text în binar, şi care rezolvă treaba instantaneu. În prezent scriptul se uită să vadă dacă executabilul extern e prezent şi dacă e, îl foloseşte. Dacă nu e, se foloseşte varianta muncitorească scrisă în Bash ca şi restul scriptului.

Script Bash pentru conversie din imagine Teledisk în imagine RAW (TD02RAW)



Recomand folosirea lui împreună cu utilitarul hexdumptxt2bin prezentat mai jos (salvat în același director cu acest script)
SINTAXĂ: TD02RAW TD0_image [start_track [end_track]]

NOTĂ:
1. "TD0_image" este numele unei imagini Teledisk FĂRĂ extensia .TD0 (care trebuie să fie prezentă).
2. "start_track" este numărul primei piste extrase din imaginea Teledisk.
3. "end_track" este numărul ultimei piste extrase.
Dacă prima pistă extrasă are numărul (n) mai mare ca 0, pistele de la 0 la n-1 for fi generate în imaginea RAW pline cu octetul $E5 (formatate).
Dacă start_track și end_track nu sînt precizate, se vor considera ca fiind start_track = 0 și end_track = 79, deci pentru cazuri normale, apelarea scriptului fără nici un parametru după numele fișierului imagine Teledisk este absolut suficientă.

EXEMPLU:
Pentru extragerea datelor din imaginea floppy DEVIL GAMES1.TD0 (720K, 80 piste) trebuie folosită comanda:

TD02RAW GAMES1

iar pistele 80-81 din imaginea Teledisk vor fi excluse din imaginea RAW.

Utilitar Linux scris în C Standard pentru conversie din text în binar (hexdumptxt2bin.c)

Arhiva ZIP descărcabilă conţine sursa programului redată mai jos, executabilul generat prin compilare statică (ar trebui să ruleze fără probleme pe orice sistem Linux diferit de al meu) şi un log rezultat la compilare pentru conformitate (conţine comanda efectivă cu care l-am compilat şi mesajele compilatorului)

SINTAXĂ: hexdumptxt2bin filename.hexdump

NOTĂ: Fişierul text dat ca parametru trebuie să aibă extensia .hexdump.

Fişierul binar rezultat este salvat ca "filename.bin"

* * *

5. Utilitare pentru transfer fişiere între Linux şi imagini RAW de dischete CoBra DEVIL



5.1 Utilitar Linux in mod text, scris in C Standard.


Este un program în mod text (rulabil în consolă Linux) care generează imagini floppy (formatate), extrage fişiere din imagini floppy, le scrie în imagini, şterge fişiere din imagini, listează conţinutul în detaliu, suportă atributele de fișier DEVIL Read Only/Read Write și Catalog/Non Catalog și verifică existenţa unor anumite erori logice în filesystem-ul DEVIL. Are un help încorporat care este afişat în consolă text cînd este lansat fără argumente.

ATENȚIE! Acest program lucrează numai cu imagini RAW în format întrețesut (sectoarele dispuse în aceeași ordine fizică în care există pe disc)

NOTĂ:
Din cauza stilului Spectrum de stocare a informațiilor pe bandă magnetică, transferul de fișiere din/în imagini floppy CoBra DEVIL (cu utilitarul de față) se face în format .TAP, conform descrierii acestui format de către Gerton Lunter, autorul emulatorului Spectrum „Z80”. La extragerea unei aplicații dintr-o imagine floppy DEVIL trebuie specificat un domeniu de blocuri, folosind indexul blocurilor de date din catalogul de disc afișat cu comanda -l (listare). Deci mai întîi se afișează conținutul imaginii floppy cu comanda -l, după care se poate da comanda -x cu domeniul de blocuri care trebuie extrase. De regulă primul bloc va fi un „Program”, urmat de cîteva alte blocuri de „Code”. Dacă primul bloc este afișat de exemplu cu indexul 1 iar blocurile următoare care fac parte din aceeași aplicație au indexurile 2, 3, 4, 5, 6, domeniul care trebuie folosit pentru extragerea aplicației din imaginea DEVIL este „1-6”. Fișierul .TAP astfel extras va purta numele primului bloc din domeniul specificat, care de regulă va fi numele original al programului respectiv.

Întrucît cele mai multe programe scrise de alții convertesc imagini floppy Teledisk cu sectoare întrețesute fizic în imagini RAW în care sectoarele nu mai sînt întrețesute, am implementat în acest utilitar două comenzi speciale: -i (întrețesere) și -di (deîntrețesere).

Comanda -i preia o astfel de imagine RAW cu întrețeserea pierdută și reface întrețeserea corect. Dacă imaginea inițială se numește de exemplu devildisk.img, imaginea cu întrețeserea refăcută va fi salvată ca devildisk_interleaved.img. Evident, devildisk.img este presupusă a avea sectoare de 256 octeți, cu 18 sectoare/pistă/față, și 80 piste.

Comanda -di preia o imagine RAW cu întrețesere și o salvează fără. Dacă imaginea inițială se numește de exemplu devildisk.img, imaginea cu întrețeserea eliminată va fi salvată ca devildisk_deinterleaved.img. Evident, devildisk.img este presupusă a avea sectoare de 256 octeți, cu 18 sectoare/pistă/față, și 80 piste. Această comandă trebuie folosită înainte de a o exporta în format HFE cu utilitarul HxCFloppyEmulator.exe pentru a o folosi în emulatorul floppy.

Arhiva ZIP descărcabilă conţine sursa programului redată mai jos, executabilul generat prin compilare statică (ar trebui să ruleze fără probleme pe orice sistem Linux diferit de al meu) şi un log rezultat la compilare pentru conformitate (conţine comanda efectivă cu care l-am compilat şi mesajele compilatorului).

Utilitar Linux scris în C Standard pentru transfer fişiere din imagini RAW floppy DEVIL Cobra (cobra-devil-diskimg-copy.c)


5.2 Utilitar Linux în mod grafic, scris în C++ și Qt 3.3.8.


2018-06-22:


După cîteva (6) luni de zile de la demararea acțiunii (cu pauze lungi și dese) am terminat și o versiune grafică în C++ și Qt (deocamdată Qt versiunea 3.3.8) a utilitarului anterior de transfer date din/în imagini floppy DEVIL pentru CoBra.

Am obținut un program care poate fi folosit în două moduri: Acest utilitar poate fi compilat în mai multe forme: Utilitatea acestui program este maximă atunci cînd este folosit în conjuncție cu un emulator floppy hardware (de exemplu HxC), pentru care imaginile RAW pot fi ușor convertite (în format HFE) și folosite pe un SD Card direct cu CoBra.

Deocamdată nu am apucat să fac și o versiune de help în limba română, dar va trebui s-o fac și pe-asta.

Redau mai jos două snapshot-uri din timpul funcționării programului, împreună cu arhiva descărcabilă conținînd fișierele sursă precum și fișierul executabil gata compilat (în 3 variante) în caz că nu aveți un sistem cu toate dependențele necesare compilării.

Utilitar grafic (Qt3) Linux pentru transfer date din/în imagini RAW floppy CoBra DEVIL

Arhiva descărcabilă - rev.4.9.2 MD5: daf03e7c46b092abe77263a52ae70aaa

5.3 Utilitar Linux în mod grafic, scris în C++ și Qt 4.8.6.


2019-02-28:


Acum vreun an am terminat și o versiune grafică în C++ și Qt 4.8.6 a utilitarului anterior de transfer date din/în imagini floppy DEVIL pentru CoBra.

Funcționalitatea este identică, singura diferență este Qt4 în loc de Qt3. Ca și versiunea anterioară în Qt3, este program care poate fi folosit în două moduri: Acest utilitar poate fi compilat în mai multe forme: Utilitatea acestui program este maximă atunci cînd este folosit în conjuncție cu un emulator floppy hardware (de exemplu HxC), pentru care imaginile RAW pot fi ușor convertite (în format HFE) și folosite pe un SD Card direct cu CoBra.

Nici aici nu am apucat să fac și o versiune de help în limba română, dar va trebui s-o fac și pe-asta.

Redau mai jos două snapshot-uri din timpul funcționării programului, împreună cu arhiva descărcabilă conținînd fișierele sursă precum și fișierul executabil gata compilat (în 3 variante) în caz că nu aveți un sistem cu toate dependențele necesare compilării.

Utilitar grafic (Qt4) Linux pentru transfer date din/în imagini RAW floppy CoBra DEVIL

Arhiva descărcabilă - rev.5.1 MD5: 657a0a53d512f6c5011f4ce66d236b8c

* * *

6. Conversie imagini RAW de dischete CoBra DEVIL în imagini HFE pentru emulatorul fizic de floppy disk HxC cu SD Card



O imagine RAW de dischetă DEVIL CoBra poate fi obţinută prin diverse metode, una ar fi prin conversia dintr-o imagine Teledisk existentă pe una din cele două căi descrise la paragraful 2, alta ar fi prin generare cu utilitarul "cobra-devil-diskimg-copy.c" prezentat mai sus. Cea mai interesantă utilizare a unei astfel de imagini RAW este folosirea ei într-un emulator fizic de floppy disk. Eu personal posed un astfel de emulator, aşa că am să fac aici un mic comentariu despre conversia imaginilor RAW DEVIL CoBra în imagini HFE utilizabile pe un SD Card introdus în emulator.

Pentru a utiliza o imagine RAW în emulatorul HxC, aceasta trebuie mai întîi convertită într-o imagine HFE, care este singurul format acceptat pentru imagini floppy stocate pe SD Card-ul introdus în emulator. Odată obţinute, aceste fişiere în format HFE vor putea fi folosite atît în regim de citire cît şi în regim de scriere, oferind facilităţi foarte puternice de emulare a unei dischete reale. Reamintesc că înainte de conversia în format HFE, imaginea RAW trebuie adusă (dacă este în format întrețesut) la un format neîntrețesut (cu comanda -di din cobra-devil-diskimg-copy).

Primul lucru care trebuie spus aici este că o imagine RAW conţine numai datele utilizator stocate pe discheta originală (octeţii de date din sectoarele de pe dischetă). Toate informaţiile despre formatarea dischetei (numărul de sectoare pe pistă, numărul de octeţi pe sector, factorul de întreţesere, parametrii Pre-Index GAP, Index Mark, Post-Index GAP, GAP2, GAP3 etc.) lipsesc. Toate aceste informaţii lipsă sînt însă incluse în imaginile HFE. Pentru conversia RAW -> HFE, utilizatorul va trebui să cunoască unii din parametrii de formatare ai dischetei originale corespunzătoare imaginii RAW şi să-i introducă într-un program de conversie RAW -> HFE.

Emulatorul HxC vine cu un utilitar aferent de conversie a imaginilor floppy ("HxCFloppyEmulator.exe"). Pentru a converti o imagine RAW CoBra DEVIL de 720 KB în imagine HFE cu acest utilitar, primul lucru care trebuie făcut este să se asigure faptul că imaginea RAW are sectoarele dispuse fără întrețesere. Dacă este o imagine manipulată cu cobra-devil-diskimg-copy, trebuie convertită cu comanda -di. După ce imaginea este convertită fără întrețesere se procedează astfel:

1. Se lansează executabilul (fie în Microsh*t Windblows, fie în Linux sub Wine - eu evident l-am rulat sub Wine). Va apare o fereastră principală (vezi imaginea din dreapta).
2. Se dă un clic pe butonul "Load Raw image"
3. Va apare o altă fereastră ("RAW File format configuration") în care trebuie introduşi parametrii de formatare ai dischetei corespunzătoare imaginii RAW care trebuie convertită (vezi imaginea următoare din dreapta).
În această fereastră toţi parametrii necesari vor apare cu nişte valori implicite. Unele din ele vor trebui schimbate pentru a corespunde cu formatul CP/M CoBra, după cum urmează:
4. Cîmpul "Format Value" trebuie setat la 229 (adică 0xE5, octetul de formatare DEVIL)
5. Cîmpul "Sector per track" trebuie setat la 18.
6. Selectorul "Sector size" trebuie setat la 256 Bytes.
7. Cîmpul "Interleave" trebuie setat la 2.
8. Checkbox-ul "Auto GAP3" trebuie debifat şi cîmpul "GAP3 length" setat la 12.
9. Toţi ceilalţi parametri pot fi lăsaţi la valorile implicite, care ar trebui să arate ca în imaginea din dreapta.
10. Se dă un clic pe butonul "Load RAW file", şi în fereastra de selecţie fişier care apare se selectează fişierul RAW care trebuie convertit. După asta fereastra de configurare se va închide şi se va reveni în fereastra principală.
11. În fereastra principală se dă un clic pe butonul "Export" şi se alege formatul de fişier HFE precum şi numele fişierului care va fi salvat cu acest format.