Tak-tak-tak, kerrrrrrrrrr, tak-tak-tak... (Retró rovat II.)

Ezt a bejegyzést az időjárás „szponzorálta”. Vihar esetén tartózkodom az olyan „dolgoktól”, amik be vannak dugva a konnektorba. Ami egy informatikusnál nem a legproduktívabb, de csak így vannak az adatok biztonságban... :) Volt egy szavazás nem túl régen, amiben páran emlegették az 5.25”-os lemezekkel kapcsolatban az 1541-et. Pár héttel ezelőtt az egyik haverom a „kezembe” nyomott egy csomó régi vasat, hogy ebből a pakkból rakjak neki össze egy működő konfigot, a többi cucc az enyém lehet. Hát, nem vagyok én semmi jónak az elrontója... A cuccok gyalázatosan retkesek voltak (nagy részük még most is az... :) ), úgyhogy a rossz idő pont jó lett egy kis takarításhoz. Egy 1541/II volt az első alany, ha meg már nekiállok, lőhetek pár fotót is...

Ő az „áldozat”...

...amin szépen látszik a sok éves retek. Az a sejtésem, hogy amikor a használatát abbahagyták, akkor is ilyen koszos volt, és így lett elrakva a lomok közé. De ebbe így nem mernék drága lemezt rakni, ki tudja hogy mi lakik belül? De találtam két „érdekességet”:

Ez volt szervizben?

Hát NEM! Ebben előttem még nem járt senki! Sértetlen az eredeti garanciacímke... Ebben a cuccban belül még mindenből az van, ahogyan a gyárból kijött... Valahogy nem akaródzott a címké(ke)t leszedni, de azért ez nem tartott sokáig. (Én, a barbár... :) )

Hát, nincs mit szégyellni, van benne por rendesen. De amúgy semmi különös... A műanyag burkolatból a mechanika külön kivehető a 3 csatlakozó (a fej kábele, a léptetőmotoré, meg a lemezforgató motor tápjai/vezérlése/Write Protect jel) bontása, ill. az előlap leszerelése után, aztán meg kijön az elektronika. A burkolatot bevágtam szokás szerint a csap alá egy kis forróvizes fürdőzésre, a mechanika, ill. az elektronika meg szépen „megecsetelődött”. Ahhoz képest, amire számítottam, semmi gond nincs, olyan mintha új lenne:

Balra fent a 2 db. „SERIAL” feliratú csatlakozó, mellettük jobbra a Sanyo LA8200M a fejvezérlő, amiben az a „pláne”, hogy nem ez a tok szokott itt lenni... Eddig összesen 2 db. 1541-ben láttam ezt, ez a második. Balra lent van a táp kapcsolója, fölötte a táp csatlakozó, afölött meg az egységszámválasztó kapcsoló. Tőlük jobbra meg egy „kiharapott” rész van a nyákon. Ez az összes 1541/II drive-ban megvan, sokáig elképzelésem se volt, hogy mi a búbánat az... Mit vettek onnan ki? Miért érte ezt megcsinálni? Pedig annyira nyilvánvaló, csak éppen a szemem nem verte ki. Ugyanis ott van a képen... Egy kicsit hajtogatok a drótokon, utána egyértelmű lesz egyből:

Ez a nyákdarab van kivágva onnan. Ez az előlapon levő 2 db. LED (Power / Drive), a képen látható módon megszereltették géppel, majd a kész nyákból beszereléskor kitörték, és rögzítették az előlapon. Ügyes! (Csak ehhez kellett pár év, amíg leesett... :) )

A mechanika, némi ecsetelés után:

A lemez befogásához szükséges „tető” is simán leszedhető, ha ki akarom takarítani, akkor le is kell bontani. Jobbra lent látható a fejléptető motor meg a tengelyt megakasztó ütköző, az első sáv elérése után ebbe akad meg, ha még kifele szeretné az elektronika léptetni. Ez az a mechanikus Track00 „érzékelő”, ami azt a kerregő hangot adja... Baloldalt középen a lemezforgató tengelye, a csavar melletti lyukban meg az index érzékelő optocsatoló egyik fele (hogy az adó vagy a vevő, azt meg nem mondom...), a másik fele a „tetőn” lenne, de az hiányzik. (A cucc nem kezeli az indexet, meg csak 1 fejes, ezért lehet azt a trükköt eljátszani, hogy a lemezt „fejjel lefele” is be lehet rakni, így lehet használni a (DS/DD-s) lemez mindkét oldalát. Ehhez csak az írásvédő nyílást kell a lemezen kivágni. Ez annyira elterjedt dolog volt akkoriban (Még szép!), hogy a kivágás elkészítéséhez létezett célszerszám. Egy olyan eszközt kell elképzelni mint egy iratlyukasztó, a lemez megfelelő sarkát bele kellett tolni koppanásig, összenyomni, majd kész is lett a kivágás... Nekem sajnos nem volt ilyen szerszámom, csak láttam belőle párat.) Ezenfelül még az látszik, hogy nem látszik a lemezforgató motor. A régebbi drive-okban ezt egy tacho-s motor oldotta meg egy lapos szíjas hajtással, de ebben már a motor direktben forgatja a lemezt, kiküszöbölve az összes régi problémát ezzel kapcsolatban. (A szíj elöregszik, megnyúlik, nekiáll csúszni, emiatt a lemez lassabban forog a névleges 300 RPM-nél, kész is a R/W hibahegy. A „direktmotort” az elektronika ráadásul quartz időalapról vezérli (ha jól emlékszem...), aminek a pontossága sok-sok év után is rendben van...)

Az összerakás ugyanez visszafele (csak a port nem kell visszavarázsolni... :) ), ezután ilyen lett a végeredmény:

Valahogy egészen máshogy néz ki. Így már bátran meg merem fogni, nem kell attól félnem, hogy elkapok valamit... :)

Már csak az a kérdés, hogy működik?

Na, ez egy hosszabb sztori.

A mechanikában a lemezt itt direktben forgatja egy szép, lapos, kefe nélküli DC motor, amit a hozzá tartozó motorvezérlő IC 300 RPM (Rotate/Min – Fordulat/Perc) sebességen tart. (A nagy méretű drive-okban, de az 1541/II-ben is elterjedt az a módi, hogy egy kefés DC motor forgatja a lemezt egy laposszíjon keresztül, a fordulatszámot a motorvezérlő egy, a motor tengelyére szerelt tachogenerátor segítségével figyeli, ez alapján szabályoz. Meglehetősen sok hibalehetőség...) A motor (itt) össze van építve a meghajtó elektronika nyákjával, ami elég univerzálisnak néz ki, valószínűleg használhatták más típusú drive-okban is. A drive fő elektronikájától (a +12V / GND-n kívül) csak egy vezérlőjelet kap, amivel a forgatás kapcsolható ki/be.

A fejet egy 200 lépéses (lépésenként 1.8°) 4 fázisú léptetőmotor mozgatja. A tengelyén egy megfelelő átmérőjű henger van, amire egy vékony acélszalag van rögzítve. Ezen keresztül mozgatja a fejet a motor, az elfordulást ez alakítja egyenes vonalú mozgássá. (Az utolsó szériás PC-s drive-okon egy vonóorsó oldja meg ugyanezt a feladatot.) A henger átmérője adja meg, hogy 1-1 lépés mekkora elmozdulást okoz a fejen. (Elég pontosnak kell lennie, hogy mekkora tűrésű lehet ez az alkatrész, arról fogalmam sincs. De szerintem NEM tizedmilliméterekről van szó...) Itt úgy van beállítva, hogy 96TPI-re (Track/Inch) jön ki a léptetés. (Érdekesség: A Commodore „nagy sűrűségű” meghajtói, pl. az SFD1001 100TPI-s mechanikával készültek. Fő a kompatibilitás... :) ) Ez az általános, a PC-s drive-ok is ezt a lépésközt használják. DE! Ezzel egy oldalon 80 körüli sávot lehet „megpozicionálni”, mint a HD-s meghajtóknál. Viszont az 1541 csak 40 sávot használhat (valójában csak 35-öt használ a gyári FW), így eshet meg az, hogy fél sávra is lehet a fejet állítani... :) (A PC-s DD-s meghajtók is oldalanként 40 sávot használnak, a léptető mechanika viszont lehet 40 vagy 80 sávos is! (A fej persze ugyanúgy csak 40 sávot tud írni/olvasni...) A – valószínűsíthetően – újabb meghajtók 80 sávos „áttételt” használnak, a gépből ha jön egy fejléptető impulzus, akkor a drive maga önállóan 2 félsávot léptet a fejen. A HD-s meghajtók ezzel szemben csak egyet (természetesen itt mindig 80 sávos a léptető mechanika), ott ezt az OS oldaláról kell megoldani DD-s lemez kezelése esetén. Nem véletlen, hogy a PC-s BIOS-okban pontosan be kell állítani a meghajtó típusát.) A léptetőmotor fázisait az elektronika kapcsolgatja, de csak akkor van rajta gerjesztés, ha a lemez forgató motorja be van kapcsolva. (Szokták ezt úgy csinálni, hogy kikapcsolt állapotban is van gerjesztés, csak alacsonyabb árammal, de itt ezt a trükköt kihagyták a tervezők. A léptetőmotornak van gerjesztés nélkül is egy minimális tartónyomatéka, de nem sok.) Volt az 1541-hez egy olyan SW, ami valamilyen zenét játszott a meghajtóval... (Ezt a trükköt se PC-s meghajtóval csinálták először! :) ) Ott is azért forgott a lemezforgató motor (aminek majdnem akkora volt a hangja mint a léptetőnek...), mert nélküle nincs gerjesztés.

A fej egy kombinált író/olvasó/törlő fej, ami 40 sáv (48TPI) kezelésére van kialakítva. Valójában az olvasó fej (többé-kevésbé) jól olvasna 80 sávot is (Állítólag létezett ilyen másolásvédelemmel ellátott program C64-hez, amit sokszorosításkor egy speciális meghajtóval írtak a lemezre, az 1541 számára fél sávokon is hasznos infóval, de én nem találkoztam még ilyennel...), de a törlőfej a szomszéd „félsávokba” beletöröl, így felírni ilyet ezzel a fejjel nem lehet. (Olyan másolásvédelem viszont van, hogy a lemez forgása közben a megfelelő helyen fél sávot léptetnek, oda írnak, majd vissza. Mindezt annyi idő alatt, hogy a lemez közben csak 1-et fordul. Elég meredek trükk, szó se róla.) Maga a fej az valóban fej és nem fejek, mert csak a lemez egyik oldalát írja/olvassa. (SS/DD – Single-Sided/Double-Density) Ez az oldal a lemez „alja”, tehát az a fele, ami berakáskor az asztal fele néz.

Az elektronika maga egy komplett számítógép (Intelligens periféria, vagy mi...), tele problémával, amolyan Commodore módra. Az alapja egy 1 MHz-en ketyegő 6502-es processzor. (Érdekesség: A C64-ben a 6510, ami SW kompatibilis 6502, 0.985 MHz-en pörög. A hozzá kapcsolt meghajtóban gyorsabb a processzor... :) ) Ez látja el a meghajtó összes funkcióját, szám szerint kettőt: az FDC-t (Floppy Disk Controller) ill. az IFC-t (InterFace Controller, vagy IP: Interface Processor). (A régi Commodore meghajtókban ehhez 2 db. 6502 tartozott, megosztott memóriába dolgoztak, de a két feladatkört külön látták el. Ezek voltak az első, „megvehető” kategóriába tartozó multiprocesszoros rendszerek? :) ) A megoldás viszonylag „egyszerű”: alapból az IFC szoftver fut, viszont időnként jön egy megszakítás, akkor átvált az FDC üzemmódra, megnézi, hogy van-e valami feladat, ha van végrehajtja. (Semmi extra multitaskingot nem kell elképzelni, egyszerű megszakításos rendszerről van szó.) Ezen feladatok végrehajtásához szüksége van pár perifériára, amihez 2 db. 6522 VIA van beépítve. Ezekhez kapcsolódik a drive-ban minden, a soros kommunikáció meghajtói, ill. az író/olvasó elektronika logikája.

A soros kommunikációról itt azt kell tudni, hogy egy rossz viccel egyenértékű kb. A sztori régebben, még az 1540-es meghajtóval kezdődött, amit a VIC20-hoz készített a Commodore. Eredetileg az volt az elképzelés, hogy a 4 vezetékes buszt (ATN, CLOCK, DATA, SRQ) hardveresen fogja a cucc kezelni. Szép elképzelés, azonban egy „kis” hiba csúszott a számításba: a VIA-k soros shift-regisztere hibás, bizonyos esetekben kimaradnak bitek. Ez a hiba a tesztelés késői szakaszában derült csak ki, a VIA áttervezéséhez már nem volt idő. Így a legegyszerűbb utat választották: szoftveresen, bit-banging megoldással helyettesítették a hardveres szinkron átvitelt, ami így jóval lassabb lett. De legalább elkészültek időre... :) A probléma tovább húzódott a C64 megjelenésével, ugyanis ott a CPU-t a videovezérlő a képkiírás alatt bizonyos helyeken hosszabb időre (40+ órajelciklus) megállítja. (Ez a megjelenített területen 8 rasztersoronként esedékes.) Ez a VIC20-nál nem volt, emiatt az 1540 nem is használható a C64-hez, a kommunikáció alatt ezeken a „helyeken” lemarad a meghajtó adatairól. Az 1541-ben emiatt az amúgy is lassú soros kommunikációt még tovább kellett lassítani. A problémát (ti. nem hardveres az átvitel) elég sokáig tologatták, megoldani az 1571-es meghajtóban sikerült csak. De nem ám a VIA-t javították ki... Beépítettek egy 6526 CIA csipet erre a feladatra. De a HW-s átvitel a számítógép oldalán sincs megoldva, a C128-ban lett hozzá meg minden. :) Egyszer majd egy ilyen meghajtót is fotózok, abban is van pár érdekesség.

A kommunikáció úgy zajlik, hogy a „beszélő” (Talker) sorban kirakja a biteket a DATA vonalra, majd a CLOCK vonalon egy impulzussal „érvényesíti” a biteket. Handshake NINCS bitenként, csak a komplett BYTE átvitele után. A 8 rasztersoronkénti CPU-STOP miatt rasztersoronként 1 bitnél többet nem lehet átküldeni, mert a „hallgató” (Listener, esetünkben a számítógép) egyszerűen lemarad róla. De ez a valóságban még ennél is kevesebb, mert a CLOCK impulzus mindkét állapotát stabilan fel kell tudni dolgozni. Nyugodtan számolhatok 2 soronként 1 bittel... Tehát: soronként 0.5 bit, az frame-enként 156. Az másodpercenként 7800 bit. Az 9-cel osztva (8 adatbit + a nyugtázás) 866 BYTE/Sec. Ez az elmélet, de a valóságban jó ha 1-1.5 blokk, azaz 256-384 BYTE átmegy 1 másodperc alatt. Szóval nem siet... :) A soros busz logikai dolgait egyébként az ipari standard IEEE-488 busztól vették „kölcsön” (Egységszámok, eszközök felcímzése, Controller/Listener/Talker, ...), de a fizikai réteg teljesen más. Az eredeti busz párhuzamos, egy marék vezérlő jellel, a Commodore-féle soros meg 4 vezetéken intéz mindent. (ATN, CLOCK, DATA, SRQ.) Ráadásul az 1541 az SRQ-t nem is használja, a meghajtóban be sincs kötve. (Az igazság az, hogy én eddig nem is találkoztam olyan perifériával, ami ezt használta volna. A C64 se kezeli ezt a vonalat, de legalább tudná. A plus/4-ben pl. nincs is kiépítve.)

Az író/olvasó elektronika a fejjel kezdődik.

Az olvasó rész 2 db. sorba kötött differenciális műveleti erősítőben folytatódik, amiknek az erősítése talán 200-szoros? A végeredmény egy 40000-szeres erősítésű tag, ami egy komparátorba van beledrótozva. (Találkoztam olyan Shugart interface-es meghajtóval, amiben 1 db. 200-szoros (?) erősítő volt csak. Ez a 40000-szeres erősítés egy picit lehet, hogy túlzás... :) ) A komparátor kimenetén már az a jel van, ahogy a lemezen „áll” a mágnesezés. A komparátor kimenete belemegy egy egyszerű éldetektorba, ami mindegyik változás után ad egy impulzust. (Tehát mindegy a mágneses irány, ha változik, jön egy impulzus. Az éldetektor egy meglehetősen fapad szerkezet: egy XOR kapu egyik bemenetére bele van kötve a bejövő jel, a másikra meg ugyanez egy soros ellenállással, a minek a kapu felőli „vége” egy kondenzátorral le van földelve. Ez így egy késleltető tag. A XOR kapu csak akkor ad ki logikai magas jelet a kimenetén, ha a bemenetek nem egyforma állapotúak. Minden élváltásnál ez az RC tag időállandójáig fennáll...) Ez elindít egy újraindítható időzítőt, aminek az ideje kb. fél bitidőre van belőve. Ezen időzítő kimenete egy él-vezérelt „D” Flip-flop órajelét szolgáltatja, méghozzá úgy, hogy a beírás az impulzus végén fog megtörténni. A Flip-flop adat bemenetére az erősítők utáni komparátor kimenete van kötve. Tehát a Flip-flop kimenetén kb. fél bitidővel később megjön az az állapot, ami a lemezen levő mágnesezés éppen aktuális állapotát mutatja. Mire jó akkor az egész? Ez a cucc (a komparátor utáni rész eddig) nem más, mint egy többé-kevésbé digitális szűrő (kevésbé, mert az időzítő analóg módon működik), ami a rövid zajokat kiszedi a jelfolyamból. Szóval megvan a lemezen levő mágneses irányunk, szépen kiszűrve belőle minden, ami nem oda való... Ez a jel belemegy újra egy éldetektorba, ami ismét minden változás után produkál a kimenetén egy impulzust. Ezt a jelet megkapja újra egy időzítő, aminek a kimenetén egy mindig ugyanolyan hosszúságú impulzus lesz abban az esetben, ha a lemezen változik a mágneses irány. Ez a jel az olvasóelektronika „analóg” rész kimenete, ez az olvasott adat (READ DATA).

Az író elektronikának 3 bemeneti jele van: az írás engedélyezése (ezzel kapcsolható át írás üzemmódba az író elektronika), maga az írandó adat, ill. ide van kötve még a Write Protect Switch (WPS) kimenete is. Ha a lemez írásvédett, nem lehet átkapcsolni írásba a cuccot. (Tehát hiába kerülném ki az írásvédelem szoftveres vizsgálatát (A drive processzorán futtatható saját program, simán megtehető!), a HW akkor is megakadályozza a lemezre írást.) Az adatjel maga egy „T” Flip-flop-ot vezérel, aminek a kimenete kapcsolja (az írás engedélyezéssel együtt) a fejet, hogy éppen milyen irányú mágneses mezőt „írjon” a lemezre. Az írás abból áll, hogy engedélyezik a felírást, majd amikor a WRITE DATA vonalon jön egy impulzus, a fej átfordítja az ellenkező állapotba a mágnesezést.

Ami fontos magával a tárolással kapcsolatban: a lemezen levő mágnesezés iránya önmagában NEM hordoz semmilyen információt. Információt kizárólag az IRÁNYVÁLTOZÁS ad. Az olvasó elektronika kimenetén akkor jön impulzus, ha változás volt, az író elektronika bemenetére ha jön egy impulzus, megváltozik az éppen aktuálisan felírt mágneses irány. A „fent” emlegetett LA8200M típusú fejvezérlő IC ezeket a funkciókat önmagában tartalmazza: a fej rá van kapcsolva, a kimenetén meg ott a READ DATA jel, ill. a bemenetein meg ott a WRITE DATA, meg az írás engedélyezés. (A régebbi, „nagy” 1541-ben, ill. az összes régi CBM drive-ban ez sima, különálló alkatrészekből van összeépítve.) Az „adat tárolás” az összes drive-on így működik, a szabvány Shugart-interface is ezt a READ DATA jelet szolgáltatja (mágnesesség változásánál impulzus), ill. ugyanezt WRITE DATA-t kell neki adni.

A lemezen „csak úgy” nem lehet az adatokat tárolni, mert ez egy erősen analóg szerkezet, a fej előtt elhaladó lemez „sebessége” sok mindentől függ. Az adatok felírásánál ha 1-es bit jön, akkor jön egy impulzus, megváltozik a mágnesezés iránya. De ha 0-s a felírandó bit, akkor nem történik semmi. De a semmihez nem lehet időzíteni, ha a lemez forgása egy kicsit is elcsúszik, lőttek mindennek. Erre a problémára többfajta megoldás is született. Az egyik a PC oldalon megismert FM / MFM kódolás. (Az FM-nél „szét vannak húzva” az adatbitek, minden érvényes adatbit „közé” be van illesztve egy 1-es bit. Könnyen szinkronizálható, de sok a redundancia. Az MFM esetében az adat értékét (hogy 0 vagy 1) az impulzus „pozíciója” határozza meg. Van egy bitnyi idő, ha az impulzus az „elején” jön akkor 1, ha a „végén”, akkor 0. Vagy valami ilyesmi. Az FM és MFM között kétszeres a bitsűrűség ugyanakkora „frekvenciájú” mágnesességváltozáshoz viszonyítva. (Mondjuk FM-et nem tudom, hogy használ-e valamilyen PC-s drive, a DD-s meghajtók is MFM-esek, de FixMe!)) A Commodore ezek közül egyiket se választotta, ők a GCR mellett tették le a voksukat. Itt is az 1-es bitek az impulzusok, a 0-sak azok hiánya, de a GCR úgy van kialakítva, hogy egymás után NEM LEHET TÖBB 2 db. 0-s bitnél. Amikor 1-es bit jön, akkor jön impulzus, újra lehet szinkronizálni a vételt, 0-s bitnél, amikor kizárólag az időzítőre lehet hagyatkozni, akkor ugyan nem, de ez max. 2 bitidőig áll fent. Ennyit meg biztonságosan lehet időzíteni.

A kódok a következők:

$0: %0000 - %01010
$1: %0001 - %01011
$2: %0010 - %10010
$3: %0011 - %10011
$4: %0100 - %01110
$5: %0101 - %01111
$6: %0110 - %10110
$7: %0111 - %10111
$8: %1000 - %01001
$9: %1001 - %11001
$A: %1010 - %11010
$B: %1011 - %11011
$C: %1100 - %01101
$D: %1101 - %11101
$E: %1110 - %11110
$F: %1111 - %10101

Fontos még a bitsebesség: a DD-s lemezeknél a „bevett szokás” 250Kb/s, azaz 250000 bit másodpercenként. Az 1541 (ill. a többi CBM meghajtó is) több fajta bitsebességgel működik, mivel a lemez külső sávjai hosszabbak, így azokra több adat fér. (A merevlemezeknél ezt a trükköt hány évvel később is „találták föl”? 15? 20? Mindenesetre akkor, amikor már az LBA címzés megjelent (legalábbis meghajtón belül), mert se az OS-ek, se pl. a BIOS nincs felkészítve arra, hogy változnak a szektorszámok a különböző sávokon...) Itt az alap egy 16MHz-es oszcillátor, amit egy osztó tud 16, 15, 14 vagy 13-mal osztani. Majd az így kapott órajelet még továbbosztja 4-gyel, így a 250Kb/s mellett van még 266Kb/s, 285Kb/s, ill. 307Kb/s bitsebesség is.

Az adatok a kiválasztott bitsebességgel GCR kódolással kerülnek rögzítésre, ami annyit tesz, hogy minden 4 bites adatból egy 5 bites GCR kód készül, majd ez kerül a lemezre. Ezt a kódolást oda/vissza a meghajtóban található 6502-es CPU végzi. (A CBM régebbi meghajtóiban ehhez egy külön logika tartozik, ott írás, illetve olvasás alatt „röptében” konvertálódik az adat.) Viszont ezekhez a bitsebességekhez az 1 MHz-es CPU „bitszinten” egy kicsit lassúka, úgyhogy a bitsoros adat meg a CPU közé kell még egy „elektronika”, ami legalább BYTE szinten összeállítja az adatokat, ahhoz már elég a sebessége. Túl sok tartalék még így se marad benne, de azért így már működik... Ez az „elektronika” már teljesen digitális, de még a legrégebbi 1541-ekben is diszkrét TTL elemekből rakták össze. Aztán később belekerült a cucc egy ASIC-be, az 1541/II-ben is ez a tok van.

Ez az ASIC 4 dolgot csinál:

  • A fejléptető motor fázisait állítja elő
  • Az olvasásnál a biteket BYTE-osával összegyűjti
  • Az írásnál a BYTE-okat bitsorrá alakítja
  • A CPU órajelét előállítja

A léptetőmotoros móka egyszerű (de itt volt rá hely): egy sima 2-to-4 demultiplexer, ami kapcsolgatja a fázistekercsek meghajtótranzisztorait. A bemenetét az egyik VIA 2 bitje adja, amin keresztül a CPU választja ki a meghajtandó fázist.

Az olvasáshoz van egy 10 bites shiftregiszter a bejövő adatoknak (soros be, párhuzamos kimenettel), a léptetését 2 esemény válthatja ki: egy 1-es bit érkezése, vagy a bitidőt mérő időzítő lejárása. A belépő adat az 1 lesz, ha a léptetést egy 1-es bit érkezése váltotta ki, 0 ha az időzítő lejárása. Ebből a 10 bitből 8-at megkap az egyik VIA-n keresztül a CPU, ill. a 10 bit bele van vezetve egy 10 bemenetű AND kapuba, aminek a kimenete a szinkront jelzi. A GCR kódolásnál a 4 bites adat van 5 bitessé alakítva, tehát a 32 variációs lehetőségből 16 van használva. A többi kiesik amiatt, mert 2 db. 0-nál tud több is egymás mellé kerülni, de az ”11111” állapot sincs használva. A meghajtó 10 db. 1-est (”1111111111”) szinkronnak használ, ezt megteheti, mivel ezek érvénytelen adatok a GCR kódolás szerint. Ennek az érzékelésére van külön logika, amit a CPU szintén az egyik VIA-n keresztül tud figyelni. A bitidőt mérő időzítő 2 dologtól indulhat újra: lejárt, ill. jött egy 1-es bit. Az időállandója a kiválasztott bitsebességtől függ, amit – minő meglepetés – az egyik VIA 2 bitjén keresztül a CPU állít be. Az olvasáshoz tartozik még egy bitszámláló is, ami minden nyolcadik bit beérkezésénél értesíti a CPU-t. Ez kivételesen nem a VIA-n keresztül történik, hanem a CPU „SO” lábára van rákötve. Ezen a lábon egy impulzus beállítja a státuszregiszter „V” bitjét közvetlenül, így egy igen egyszerű ciklussal lehet várni a BYTE READY állapotra. A bitszámlálót közvetlenül törli a szinkronérzékelő logika, emiatt csak akkor kezdi a beérkező biteket számolni, amikor véget ért a szinkron olvasása.

Az íráshoz van egy 8 bites shiftregiszter (párhuzamos be, soros kimenettel), amit egy bitidőt mérő időzítő léptet. (Az időállandó állítása ugyanaz, mint olvasásnál. Sőt, az időzítő maga is...) A kimeneten egy impulzus generálódik abban az esetben, ha 1-es bit tolódott ki. A bitszámláló ebben az esetben is működik, csak a szinkron írás alatt nem állítja le. Ugyanúgy a CPU „SO” lábát csiklandozza abban az esetben, ha bekerült a kimeneti shiftregiszterbe az adat, a CPU megváltoztathatja a VIA portján az adatot.

A két „fajta” adat (olvasott, illetve írandó) ugyan azon a buszon keresztül közlekedik, a CPU az U8-as VIA „A” portján keresztül olvashatja / írhatja. Írásnál az olvasó shiftregisztert le kell választani erről a buszról, ezt egy 8 bites buszmeghajtóval oldották meg a régi gépekben, az írás engedélyező vezeték ezt a meghajtót kitiltja írás alatt. Viszont a logikában látható egy kis „buktató”: olvasáskor a VIA az olvasó shiftregiszter adatát kapja meg közvetlenül, ami bitidőnként „shiftel” egyet, így hiába van egyszerre meg a 8 adatbit, a CPU-nak 1 bitidő alatt el kellene szednie. Viszont ehhez nem elég gyors. A megoldás az, hogy a 8 bites adatot el kell tárolni addig, ameddig a következő 8 bit meg nem érkezik, tehát tulajdonképpen kell egy „egy BYTE-os FIFO”. Ez lehetne maga az előbb emlegetett „leválasztó” buszmeghajtó, ami ha egy 8 bites tároló lenne Tri-State kimenettel, már meg is oldódna a probléma. De nem így van... :) A tároló maga a VIA egyik speciális üzemmódja. A VIA képes arra, hogy a PORTA mind a 8 vezetékének az állapotát egy vezérlő jelre (CA1 láb, programozható még az él iránya is, amire a tárolás végrehajtódik) „megjegyzi”, a CPU a port olvasásakor meg nem az éppen aktuális állapotot, hanem ezt a tárolt értéket kapja meg. A DOS pontosan így programozza fel a VIA-t, a tároló jel pedig nem más, mint a bitszámláló BYTE READY jele, ami a CPU „SO” lábát is piszkálja.

A „mi” kis 1541/II-nk nyákján a következő „dolgok” vannak ezekhez a feladatokhoz:

  1. R/W erősítő a fej meghajtásához
  2. ASIC; az író/olvasó elektronika digitális része
  3. FDC-hez tartozó VIA
  4. IFC(IP)-hez tartozó VIA
  5. CPU
  6. A CBM DOS-t tartalmazó maszkprogramozott 16KByte-os ROM
  7. 2KByte-os SRAM
  8. Léptetőmotor vonalmeghajtó, ez egy ULN2003, még ha nem is látszik
  9. A VIA-k és az SRAM engedélyező jelét előállító dekóder

Ide kívánkozik még a két VIA regiszterleírása, ill. hogy melyik vonal mire is van használva. (Ez a „leírás” köszönhető egy hosszas levelezésnek... ;) )

Az IFC/IP-hez tartozó VIA (U6) regiszterek kiosztása („tapasztalat”, a kapcsolási rajz, illetve a VIA adatlapja alapján):

  • $1800: "ORB": PortB regiszter (Alapállapot %x0000x0x), írható/olvasható.
    • B7: Bemenet, ATN vonal figyelése. Ha az ATN vonalon ALACSONY szint van, itt "1"-es állapot olvasható.
    • B6/B5: Bemenet, eszközszám. Ez a két bit egy szám 0..3 tartományban, ez hozzáadódik az alap 8-hoz. A tényleges eszközszám így 8..11 tartományba esik. Ezt a DOS csak RESET esetén olvassa be.
    • B4: Kimenet, ATNA, ATN Ack. Ha az ATN vonal alacsony lesz, a meghajtóban levő elektronika a DATA vonalat alacsonyra húzza. Ezzel a bittel „elengedhető” a vonal. (Tulajdonképpen az ATN invertáltja XOR kapcsolatban az ATNA-val húzza a DATA-t alacsonyba.)
    • B3: Kimenet, CLK vonal hajtása. Ha ez a bit "1", a CLK vonal ALACSONY lesz.
    • B2: Bemenet, CLK vonal figyelése. Ha ez a bit "1", a CLK vonalon ALACSONY szint van.
    • B1: Kimenet, DATA vonal hajtása. Ha ez a bit "1", a DATA vonal ALACSONY lesz. (Ill. alacsony lesz az ATN/ATNA bizonyos kombinációjától is.)
    • B0: Bemenet, DATA vonal figyelése. Ha ez a bit "1", a DATA vonalon ALACSONY szint van.
  • $1801: "ORA": PortA regiszter (Alapállapot $00), írható/olvasható. A port „nem használt”, a „párhuzamos” adatátvitelhez szokták felhasználni, de ehhez „ki kell vezetni” a meghajtóból. A port olvasása törli a CA1-es IRQ-t (ATN nyugtázás).
    • B0: TR00 Sense: Régi DOS-ok ezt a portbitet a TR00 érzékelésére használták ("1": A fej a „külső” sávon van, nem lehet tovább kifele mozgatni.) Maga az érzékelő nincs beszerelve, ezért ezt a vonalat alacsonyra kötik direktben. Az „újabb” DOS-ok már nem is figyelik, de a „lekötés” az megmaradt. Funkciójában ez a jel a másik VIA-hoz (FDC) tartozna, de azon csak a CB1 vonal szabad, amit közvetlenül nem lehet olvasni.
  • $1802: "DDRB": PortB adatirány regiszter (Alapállapot $1A), írható/olvasható. A bitek összerendelése ugyanaz mint az "ORB"-nél. Amelyik bit "0", az a vonal bemenet, aminél "1", az kimenet. Az alapállapothoz képest más értéket nincs értelme beállítani, a hardver ezt „igényli”.
  • $1803: "DDRA": PortA adatirány regiszter (Alapállapot $FF), írható/olvasható. A PortA alapesetben kimenetre (!) van programozva, maga az adatregiszter alapból $00. Így a TR00 érzékelő nem is működne, de a DOS nem is kezeli.
  • $1804: "T1L-L" íráskor / "T1C-L" olvasáskor, B7..0. Olvasáskor törli a T1 IRQ-t (megszakítás nyugtázása).
  • $1805: "T1L-H" íráskor / "T1C-H" olvasáskor, B15..8. Ennek beírása újraindítja az időzítőt a beállított értéktől, ill. törli a T1 IRQ-t. Az 1-es 16 bites időzítő (Timer) kezdőértéke ezen regisztereken keresztül állítható be (írás) ill. az időzítő aktuális értéke ellenőrizhető (olvasás).
  • $1806: "T1L-L": írható/olvasható, B7..0. Olvasáskor NEM törli a T1 IRQ-t.
  • $1807: "T1L-H": írható/olvasható, B15..8. Beíráskor NEM indul újra az időzítő, de a T1 IRQ-t törli. Az 1-es időzítő kezdőértéke ezen regisztereken keresztül IS beállítható, ill. ezen érték itt olvasható vissza. Az időzítő üzemmódjának a beállítása az "ACR"-en keresztül történik.
  • $1808: "T2L-L" íráskor / "T2C-L" olvasáskor (B7..0). Olvasása törli a T2 IRQ-t (megszakítás nyugtázása).
  • $1809: "T2C-H" íráskor / olvasáskor (B15..8). Ennek beírása újraindítja az időzítőt a beállított értékről, ill. törli a T2 IRQ-t. A 2-s 16 bites időzítő (Timer) kezdőértéke ezen regisztereken keresztül állítható be, ill. az időzítő aktuális értéke itt olvasható vissza. Az időzítő üzemmódjának a beállítása az "ACR"-en keresztül történik.
  • $180A: "SR": Shift-regiszter. Soros-párhuzamos, ill. párhuzamos-soros átalakító. Írható (kimeneti regiszter) / olvasható (bemeneti regiszter). A regiszter üzemmód beállítása az "ACR"-en keresztül történik.
  • $180B: "ACR": Auxiliary Control Register (Alapállapot: $00): időzítők, ill. Shift-regiszter konfigurálása, írható/olvasható.
    • B7/B6: T1 időzítő üzemmódja ("00": Egyszer fut majd megáll, kimenet (PB7) tiltva)
    • B5: T2 időzítő üzemmódja ("0": kimenet (PB6) tiltva)
    • B4/B3/B2: Shift-regiszter üzemmódja ("000": Shift-regiszter tiltva)
    • B1: PortB Latch vezérlése ("0": normál mód, tárolás tiltva)
    • B0: PortA Latch vezérlése ("0": normál mód, tárolás tiltva)
  • $180C: "PCR": Pheripheral Control Register (Alapállapot: $01), CA1, CA2, CB1, CB2 jelek konfigurálása, írható/olvasható.
    • B7/B6/B5: CB2 üzemmódja ("000": CB2 bemenet / lefutó élre aktív, de maga a CB2 láb az 1541-ben nincs bekötve)
    • B4: CB1 üzemmód ("0": Lefutó élre generál IRQ-t, de a CB1 láb az 1541-ben nincs bekötve)
    • B3/B2/B1: CA2 üzemmódja ("000": CA2 bemenet / lefutó élre aktív, de a CA2 láb az 1541-ben nincs bekötve)
    • B0: CA1 üzemmód ("1": Felfutó élre generál IRQ-t, ez a láb az ATN invertált jelét kapja meg. Ha az ATN aktív lesz, akkor ezen a bemeneten egy felfutó él keletkezik, ami az IRQ-t „élesíti”.
  • $180D: "IFR": Interrupt Flag Register: Amelyik IRQ forrás aktív, a hozzá tartozó bit "1". A CPU innen tudja megállapítani, hogy melyik „egység” (periféria) okozta a megszakítás kérelmet. Törölni (nyugtázni) vagy a megfelelő periféria „megfelelő” elérésével, vagy ebbe a regiszterbe, az adott bitbe 1-et írva lehet.
    • B7: IRQ: Ha ez "1", akkor a VIA IRQ lába aktív.
    • B6: T1 (1-es időzítő) generálja az IRQ-t.
    • B5: T2 (2-es időzítő) generálja az IRQ-t.
    • B4: CB1-es lábon történt esemény generálja az IRQ-t.
    • B3: CB2-es lábon történt esemény generálja az IRQ-t.
    • B2: Shift-regiszter generálja az IRQ-t.
    • B1: CA1-es lábon történt esemény generálja az IRQ-t.
    • B0: CA2-es lábon történt esemény generálja az IRQ-t.
  • $180E: "IER": Interrupt Enable Register: amelyik bit "1", a hozzá tartozó periféria IRQ-ja engedélyezve van. (Alapállapot: $82: CA1 IRQ engedélyezve.) Írható (speciális módon) / olvasható.
    • B7: Set ("1") vagy Clear ("0"): Az engedélyező bitek úgy módosíthatók, hogy a perifériához tartozó bithez "1"-et kell írni. A B7 állapotától függ, hogy beállítás (engedélyezés) vagy törlés (tiltás) lesz.
    • B6: T1 (1-es időzítő) generálhat IRQ-t.
    • B5: T2 (2-es időzítő) generálhat IRQ-t.
    • B4: CB1-es lábon történt esemény generálhat IRQ-t.
    • B3: CB2-es lábon történt esemény generálhat IRQ-t.
    • B2: Shift-regiszter generálhat IRQ-t.
    • B1: CA1-es lábon történt esemény generálhat IRQ-t.
    • B0: CA2-es lábon történt esemény generálhat IRQ-t.
  • $180F: "ORA": PortA regiszter, írható/olvasható. Ugyan az mint a $1801, azzal a különbséggel, hogy az olvasása nem törli a PortA-hoz tartozó IRQ-t.

Ezen VIA Shift-regisztere nem használható, mivel nincs a hozzá tartozó elektronika az 1541-ben kialakítva.

Ennek a VIA-nak csak a CA1-es IRQ-ja használható. (Az IFR-ben lehet több bit is aktív, IRQ-t csak az az esemény tud kiváltani, ami engedélyezve is van.) Az időzítőkhöz tartozó számlálók a CPU órajeléről (1 MHz) járnak, „mérni” lehet velük, de megszakítást nem okozhatnak.

A soros busz felépítése olyan, hogy a „rajta lógó” eszközök csak alacsonyba tudják a vonalakat „kényszeríteni”, magas állapot csak akkor áll elő, ha mindenki „elengedi” az adott vonalat. (Ez egy negatív logikás „huzalozott VAGY” (wired-OR) kapcsolás.) Az ATN kezeléséhez viszont van a meghajtóban egy érdekes logika. A drive a soros busz három vonala (ATN, CLOCK, DATA) közül a CLOCK/DATA párost hajtani is tudja, az ATN-t csak figyelni. A logika azt csinálja, hogy ha az ATN-t a számítógép alacsonyra húzza (eszközcímzés...), akkor a meghajtó a DATA vonalat automatikusan alacsonyra kényszeríti. (Egyszer leírom a soros busz működését is, ez a hardveres „trükk” arra kell, hogy a számítógép fele a meghajtó minden esetben jelezze azt, hogy a buszon van, még akkor is, ha éppen „nem ér rá” a CPU ezzel foglalkozni.) Ahhoz hogy ebben az esetben (ti. ATN alacsony) is lehessen a DATA vonalat használni, „meg kell győzni” ezt a logikát, hogy „engedje el” a DATA-t. Erre a célra van az ATNA vonal ($1800, B4), amikor a CPU „már ráér foglalkozni” a számítógéppel, ezen a vonalon jelez. A DATA alacsonyra hajtása egy XOR kapcsolattól függ, az egyik bemenetén az ATN vonal negáltja van, a másikon az ATNA, a kimenet meg kényszeríti a DATA vonalat alacsonyra. Egy táblázat többet mond minden magyarázatnál:

  • ATN == 1, ATNA == 0: DATA → X (Ez az alapállapot)
  • ATN == 0, ATNA == 0: DATA → 0
  • ATN == 0, ATNA == 1: DATA → X
  • ATN == 1, ATNA == 1: DATA → 0

A „DATA → X” állapotban az ATN kezelő logika „elengedi” a DATA-t, a másik esetben meg alacsonyba kényszeríti. Az tisztán látszik, hogy mivel az ATN-t csak a gép tudja hajtani, az ATNA-t meg csak a drive, így azt az állapotot, hogy a DATA-n lehessen forgalmazni az ATN állapotától függetlenül, csak a meghajtó(ban futó szoftver) tudja garantálni, ebbe a számítógép oldaláról nem lehet beleavatkozni.

Az FDC-hez tartozó VIA (U8) regiszterek kiosztása (kapcsolási rajz, adatlap...):

  • $1C00: "ORB": PortB regiszter (Alapállapot: %x11x0000), írható/olvasható.
    • B7: Bemenet, SYNC. Ha "0", akkor a fej éppen szinkronjelet olvas.
    • B6/B5: Kimenet, DS1/DS0, bitsűrűség beállítása. ("00": 250Kbps, "01": 266.6Kbps, "10": 285.7Kbps, 307.6Kbps.)
    • B4: Bemenet, WPS (Write Protect Switch), lemez írásvédelmi „kapcsoló” állása. ("0": írásvédett lemez, "1": írható.)
    • B3: Kimenet, LED. „DRIVE lámpa”. ("0": kikapcsolva, "1": bekapcsolva.)
    • B2: Kimenet, MTR. Lemez forgatómotor vezérlése. ("0": leállítva, "1": lemez forog.) A fejet léptető motor csak akkor működik, ha a forgató motor BE van kapcsolva!
    • B1/B0: Kimenet, STP0/STP1. Léptetőmotor vezérlése. Ez egy „két bites” szám, ami ha nő, (0,1,2,3,0,...) akkor a fej fél (!) sávonként „befele” lép, ha csökken (2,1,0,3,2,...), akkor „kifele” (az 1-es sáv irányába).
  • $1C01: "ORA": PortA regiszter, írható/olvasható. Az író/olvasó fej fele menő, ill. onnan jövő adatok ezen keresztül kezelhetőek.
  • $1C02: "DDRB": PortB adatirány regiszter (Alapállapot $6F), írható/olvasható. A bitek összerendelése ugyanaz mint az "ORB"-nél. Amelyik bit "0", az a vonal bemenet, aminél "1", az kimenet. Az alapállapothoz képest más értéket nincs értelme beállítani, a hardver ezt „igényli”.
  • $1C03: "DDRA": PortA adatirány regiszter (Alapállapot $00), írható/olvasható. A DOS egy kicsit „érdekesen” kapcsolgatja az irányát; először kapcsolja magát a portot kimenetre, utána váltja át a CB2-t (WRITE módba az elektronika). Így a két regiszterírás közötti idő alatt „összehajt” a VIA ill. az olvasóelektronika. ($F594-nél kezdődő rész). Hogy ez miért jó... „Beépített élettartam”? Akkoriban ez még nem volt divat... A VIA – úgy tűnik – bírja. :)
  • $1C04
  • $1C05
  • $1C06
  • $1C07: "T1" (1-es időzítő), a leírást lásd az IFC/IP VIA $1804/$1805/$1806/$1807 regisztereknél. Ezen VIA 1-es időzítője szolgáltatja a periodikus megszakítást, alapállapotban $3A00 (decimálisan 14848) értékre van beállítva, ami ~67.4Hz.
  • $1C08
  • $1C09: "T2" (2-es időzítő), a leírást lásd az IFC/IP VIA $1808/$1809 regisztereknél.
  • $1C0A: "SR" (Shift-regiszter), a leírást lásd az IFC/IP VIA $180A regiszterénél.
  • $1C0B: "ACR": Auxiliary Control Register (Alapállapot $41), időzítők, ill. Shift-regiszter konfigurálása, írható/olvasható.
    • B7/B6: T1 időzítő üzemmódja ("01": Folyamatosan "pörög", minden alulcsorduláskor újratöltődik)
    • B5: T2 időzítő üzemmódja ("0": kimenet (PB6) tiltva)
    • B4/B3/B2: Shift-regiszter üzemmódja ("000": Shift-regiszter tiltva)
    • B1: PortB Latch vezérlése ("0": normál mód, tárolás tiltva)
    • B0: PortA Latch vezérlése ("1": tárolás mód, CA1 élre tárolja a PortA bemeneteket, a tárolt értéket lehet visszaolvasni)
  • $1C0C: "PCR": Pheripheral Control Register (Alapállapot: $EC), CA1, CA2, CB1, CB2 jelek konfigurálása, írható/olvasható.
    • B7/B6/B5: CB2 üzemmódja ("111": CB2 magas kimenet). Ez a jel a WRITE ENABLE, ha alacsonyra van kapcsolva ("110"), az elektronika átkapcsol ÍRÁS üzemmódba.
    • B4: CB1 üzemmód ("0": Lefutó élre generál IRQ-t, de a CB1 láb az 1541-ben nincs bekötve)
    • B3/B2/B1: CA2 üzemmódja ("110": CA2 alacsony kimenet). Ez a jel a SOE (Set Overflow Enable). A CPU lemezre íráskor / arról olvasáskor a BYTE READY jellel szinkronizál. Ez a CPU "OVF" státuszbitjét állítja be, amikor kell. Ezt a beállítást lehet ezzel a jellel engedélyezni/tiltani (1: engedve, 0: tiltva).
    • B0: CA1 üzemmód ("0": Lefutó élre generál IRQ-t, de nincs engedélyezve. A CA1 a PortA tárolását végzi csak.)
  • $1C0D: "IFR": Interrupt Flag Register, a leírást lásd az IFC/IP VIA $180D regiszterénél.
  • $1C0E: "IER": Interrupt Enable Register (Alapállapot: $C0: T1 IRQ engedélyezve), a leírást lásd az IFC/IP VIA $180E regiszterénél.
  • $1C0F: "ORA": PortA regiszter, a leírást lásd az IFC/IP VIA $180F regiszterénél.

Ezen VIA Shift-regisztere sem használható, mivel nincs a hozzá tartozó elektronika az 1541-ben kialakítva.

Ennek a VIA-nak csak a T1-es IRQ-ja használható. (Az IFR-ben lehet több bit is aktív, IRQ-t csak az az esemény tud kiváltani, ami engedélyezve is van.) Az időzítőkhöz tartozó számlálók a CPU órajeléről (1 MHz) járnak itt is.

A VIA-k sok eseményhez tud(ná)nak megszakítást generálni (IRQ-t, a CPU NMI vonala fixen tápra van kötve, nem maszkolható megszakítás így nem tud bekövetkezni), de a gyári beállításon kívül (IFC/IP-hez az ATN, az FDC-hez meg a T1 időzítő) mást nem szabad engedélyezni! Az IRQ vonal a 6502-nél szintvezérelt, a VIA-k addig tartják aktív (alacsony) szinten, amíg „fel nem lett dolgozva” az adott „esemény”. De a DOS-ban levő IRQ kiszolgáló rutint nem lehet se kibővíteni, se kicserélni (ROM-ban van a vektor), viszont az csak a gyárilag beállított két fajta eseményt figyeli. Ha másik IRQ is engedélyezve van, akkor annak a nyugtázása nem történik meg, az IRQ vonal „beragad”, annak meg egy végtelen IRQ ciklus lesz a jutalma.

Ennyi a VIA regiszterekről... :)

Vissza van még a tápegység mint külön rész, na, az meglehetősen egyszerű darab. Egy két szekunder-körös transzformátor, aminek a kimeneteit egy-egy graetz-híd egyenirányítja, egy jó nagy kondenzátor megszűri, majd két „stab-kocka” stabilizálja. Egy 7812, ill. egy 7805. Ebből lesz két fajta feszültség: +12V a motoroknak, ill. +5V minden másnak. A nagy 1541-ben ez a pakk a drive dobozában van, az 1541/II-ben meg egy külső kis dobozkában. Nekem a gépben levő megoldás szimpatikusabb, de ennek is megvan a hátránya: nagy lesz tőle a doboz, ill. ez is magát az egységet melegíti. (Mivel sima áteresztős stabilizátorról van szó, elég rendesen tud fűteni.)

A lemez tényleges kezelését egy firmware végzi, amit egyszerűen CBM DOS néven hívott a Commodore. Pár verziót megélt... Ez a „program” fut a meghajtóban levő 6502-es processzoron, amit a 2 VIA-n kívül kiegészít még 16KByte ROM (ebben van maga a CBM DOS) ill. némi SRAM. Mivel a DOS megengedi, hogy a RAM-ba saját programot töltsek és futtassak, így a lehetőségeknek szinte csak a képzelet szabna határt... De az igazi határ azért nem ez, hanem a RAM kapacitása, ami 2KByte. :( (A „beolvasok egy komplett sávot, majd csinálok vele amit akarok” típusú ötleteket sajnos el lehet felejteni.)

A lemezen 1-1 sávon változó mennyiségű szektor található:

  • 1 – 17 sáv: 21 db. szektor
  • 18 – 24 sáv: 19 db. szektor
  • 25 – 30 sáv: 18 db. szektor
  • 31 – 35 sáv: 17 db. szektor

1 szektorban 256 BYTE tárolódik, ebből 254 „szabad”. :) 35 sávot használ, a miértre nem ismerem a magyarázatot, mivel a mechanikával simán kezelhető 40. :) A lemez 18-adik sávja kitüntetett szerepű, ugyanis itt van a DIRECTORY, a fájlok „könyvtára”. A tárolás formátuma meglehetősen egyszerű. Az első szektort BAM-nak hívják, ez a szektorok foglaltsági táblája (Block Allocation Map, a szektorokat „Block”-nak becézik). A többi szektor a sávon egy sima lista, a fájlok neveivel, hosszával, ill. a kezdő sáv/szektor adataival, típussal, meg még pár aprósággal. Nincsenek alkönyvtárak, nincs FAT, semmi egyéb... Az, hogy a lemezen melyik fájl „hol van”, az egyrészt a DIRECTORY bejegyzésből derül ki, mivel itt van az, hogy melyik blokkon kezdődik. Az, hogy merre folytatódik, arra a kezdő blokk beolvasásával derül csak fény, ugyanis a blokkok első 2 BYTE-ja a következő blokk „címét” tartalmazza sáv/szektorszám formában. (Emiatt „szabad” csak 254 BYTE egy blokkban, a maradék kettő ehhez a láncoláshoz kell.) Ha nincs több, tehát a most olvasott blokk az utolsó, akkor sávszámnak 00 van beállítva, a „szektorszám” meg azt mondja itt meg, hogy a blokkon belül hány BYTE tartozik még a fájlhoz. Ebből azért látszik egy igen nagy hátrány: a „Random Read” egy kissé nehézkes. Tehát „csak úgy” nem lehet egy fájl tetszőleges pozíciójára odaállni, az elejétől végig kell sétálni a szektorokon... :) Erre a problémára van egy speciális fájltípusa a meghajtónak (.REL), de én még nem használtam. (A .REL típusú fájlról készít a lemezen egy táblázatot, amiben a blokkok elhelyezkedése van letárolva... Hack a javából.) A DIRECTORY-ban a fájlhossz blokk-számban értendő és ráadásul csak tájékoztató jellegű adat, a valódi hossz úgyis csak a végigolvasással derül ki. (Át is lehet írni bármire 0..65535 között, nem befolyásol semmit.) A BAM csak azt tárolja, hogy a lemezen melyik szektor foglalt/szabad. (Ill. még egy fontos dolog: a lemeznek van egy 2 BYTE-os azonosítója (ID), ami az összes szektor fejlécében szerepel. Amikor lemezcsere van, innen (is) értesül a DOS róla, mert jó esetben a másik lemeznek más lesz az ID-je. Azt, hogy éppen mi is az ID értéke, azt a BAM blokk fejlécéből veszi a DOS.) Néha előfordulhat az, hogy a BAM nem a valódi foglaltságot tárolja (íráskor nem lett lezárva a fájl, pl...), ebben az esetben a meghajtóval végre kell hajtani a lemez „validálását” (van rá külön parancs), ami végignézi a DIRECTORY alapján a lemezt, és készít egy „új” BAM-ot.

A szektorok felépítése a következő:

Kezdődik 40 db. 1-es bittel, ez a szinkron. Utána jön GCR-ben a $08-as BYTE (%0101001001), ami a blokk fejlécét azonosítja. Utána jön GCR-ben a fejléc ellenőrző összege, majd a szektor száma, a sáv száma, a lemez ID egyik fele, az ID másik fele, majd 2 db. $0F (%0101010101), ez jelzi a blokk fejléc végét. Ezután 9 db. $55-ös BYTE kerül kiírásra de ez közvetlenül, GCR konverzió nélkül. Ennek nincs információ értéke, sima helykitöltés (Gap). Ezután újra jön 40 db. 1-es bit, mint szinkronjel. Utána már GCR-ben jön egy $07-es BYTE (%0101010111), ez a blokk adatrészét jelöli. (A szinkronjel után ez a kettő fajta adat jöhet, mindkettő 0-s bittel kezdődik. Ez a 0-s bit biztosítja azt, hogy az olvasó elektronika „abbahagyja” a szinkron érzékelést, el engedi indulni a bitszámlálót, ami után már jönni fog normálisan a BYTE READY jel.) Ezután jön 256 db. BYTE GCR-rel kódolva, ez a rész a blokk valódi „adatcsomagja”. Utána jön még egy BYTE, az adatrész ellenőrző összege szintén GCR-ben, majd 2 db. $00 még mindig GCR-ben (%0101001010), ez jelzi az adatblokk végét. Majd ezek után változó mennyiségű $55-ös BYTE már GCR kódolás nélkül, Gap gyanánt. Majd jön a következő blokk fejléc szinkronja, és így tovább annyiszor, ahány szektor van az adott sávon. Magyarázatra szorul még a blokk fejlécét, ill. adatrészét lezáró dupla BYTE. A 6502 egy 8 bites CPU, 10 bites adatokkal nehezen lehet vele bűvészkedni. A GCR konverziókat ezért úgy végzi, hogy összefog 4 BYTE-ot, ami 32 bit. Ezt alakítja 4 db. 10 bites adattá, ami 40 bit. Ez a 40 bit 5 BYTE, ami már „szép egész” adatmennyiség a CPU számára. Ezért a konverziókat ilyen 4 BYTE-os „blokkokban” végzi. Azért vannak a dupla „lezáró” BYTE-ok a fejléc meg az adatrész végén, mert így 4-gyel osztható lesz a GCR-ről visszakódolt adatmennyiség. (A fejlécben 8 GCR adat (10 BYTE), az adatrészben meg 260 GCR adat (325 BYTE), mindegyik 4-gyel (illetve visszafelé 5-tel) osztható.) Az ellenőrző összeg mind a fejlécben, mind az adatrészben úgy számolódik, hogy a BYTE-ok simán össze vannak EOR-olva.

A GCR oda/vissza konvertálása az 1 MHz-es CPU-nak elég „nagy falat”, a blokk írása/olvasása közben nincs is rá idő, ezt előre/utólag oldja meg. (Az 1551-es meghajtó, ami a C264-es szériához készült, ugyanezt a lemezformátumot használja. Abban 2 MHz-es processzor van. Szektor olvasásakor On-the-Fly konvertálja az olvasott adatot GCR-ből binárisba, de az íráshoz ott is előre számol...)

A szektorokat a lemez formázása alkalmával írja így fel a DOS. Amikor valamelyik szektorba adatot akar „menteni”, akkor a következő történik:

Vár egy szektor-fejlécet (szinkron utáni első adat megmondja, hogy fejléc vagy adatrész jön-e), majd beolvassa. Ebből kiderül, hogy melyik sávon van pillanatnyilag a fej. Ha nem erre a sávra van szükség, kiszámolja, hogy merre hányat lépjen a fejjel, megcsinálja a mozgatást, majd kezdi elölről. :) Ha jó a sávszám, akkor ellenőrzi a szektorszámot is. Ha az még nem jó, akkor vár a következő fejlécre... Ha jó a szektorszám is, akkor meg van a keresett blokk. Ha olvasni akarja, akkor vár a következő szinkronjelre, majd beolvassa az adatrészt... Ha írni akarja a szektort, akkor még beolvassa a 9 gap-et, majd átkapcsolja a fejet (meg a körítést) írás üzemmódba, majd a szinkronnal együtt felírja az új adatblokkot. Amikor ezzel végzett, visszakapcsolja a fejet olvasásra. A lényeg: a blokkok fejléceit kizárólag a formázás során írja, minden másfajta írás esetén csak az adatrészt írja felül, szinkronostul. Ill. a Gap-eket se írja újra sose.

Nagy vonalakban valahogy így működik egy 1541. (De 1000 dolgot kihagytam... :( Még egyszer ennyit lehetne róla írni... :) )

Már csak az a kérdés, hogy működik?

Mintha ezt már írtam volna... :) Szóval igen, szépen működik a kipucolt drive, a fejléptetés hangja kellemesen halk, amúgy semmi extra. A doboz tetején levő „sárgasággal” nem tudok foglalkozni, de kár, hogy sokat sütötte a nap úgy, hogy valami (valószínűleg egy lemez) csak részben takarta, így nem egységes... Annyi „probléma” van még vele ezen kívül, hogy a gumiból készült lábak egy kicsit kezdenek szétmállani. De ez a korral jár, bő 20 év ez már csak annyi...

„Irodalom”:

balagesz

---

2011.06.15.
2013.01.05. Wiki-s linkek javítása, VIA-s kiegészítés
2013.06.19. VIA-k leírása, GAP-szám javítása, „irodalom” kiegészítése
2014.02.10. Helyesírási hubák javítása, szektorfelépítés pontosítása, SOE
2015.01.30. DD-s 40/80 sáv pontosítása
2015.08.02. Helyesírási hubák további javítása
2019.12.05. D8.
2020.04.25. „dótok” → „drótok”
2024.08.21. Kép.jav. + elírások

Hozzászólások

Köszi, ez nagyon kellemes olvasmány volt :)

Király. Elsőosztályú cikk egy elsőosztályú vasról! :)
Mintha nem is a HUP-on lennék.
Jöhet a folytatás!
--
"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "

Errol a 4B/5B kodolasrol meg nem is hallottam... Rakerestem, azert latszik par kulonbseg. A tablazat alapjan ha egy $E 5B-s alakja (%11100) melle odaraksz egy $1-est (%01001), akkor egymas melle kerul 3 db. 0. (%1110001001) Ami a GCR-nel nem fordulhat elo. Persze ennel nem is ez volt a cel, ill. itt azert tobb variaciot hasznalnak mint 16...

Köszönöm a cikket!
Egyszerű financiális okokból nekem sajnos mindig csak Datasette jutott. Sosem gondoltam volna, hogy az 1541 esetén odabenn nem egy olyan MFM kódolást használó faék lakik, mint amit később a PC-kben használtunk!

Sajnos en is datasette-juzer voltam sokaig, eletem elso (sajat) meghajtoja egy 1551-es volt. Na, az is egy erdekes szerkezet... (Erdekesen sok dolgot sporoltak ki belole. :) ) Viszont pl. ez is kimaradt: a Commodore drive-jai ugyebar sajat meguk kezelik a fajlrendszert. Ennek megvan az az elonye, hogy a gepnek nem kell ezzel foglalkozni. (Nem kell hozza memoria, stb...) Viszont igy eleg bonyolult maga az eszkoz, emiatt viszonylag draga... (...volt, legalabbis az eredeti nagy meretu, amikor megjelent. Azert ezt is folyamatosan "optimalizaltak", egyre kisebb es olcsobb lett a vegeredmeny.)

Köszönjük, ez nagyon jó volt és olvasmányos. :)

--
Steve Jobsot nagyra becsülöm üzletemberként és sajnálom, mint magánembert.
Viszont mint vallásalapítót, ki nem állhatom.

Nekem egy VIC 1541-II -hez kellene tap, ha esetleg valaki tudna segiteni, a regi sajnos javithatatlanul tonkrement mar evekkel ezelott.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal 

IGY jartam en is... :) Azt a kabelt ne dobd ki, ami a tapbol megy az 1541/II POWER csatlakozojaba. Az a csatlakozo nem tudom, hogy mennyire beszerezheto, de ha megvan a kabel, egy masik tapot ra lehet kotni. +5V / +12V kell csak neki, amit viszonlyag egyszeru szerezni "barhonnan"... :)

Sziasztok!
Az én meghajtómmal van egy "kis" probléma.
AT-s táppal használtam és az én hibámból az 5V és a test összeért. Ezek után az alábbi jelenséget produkálja:
Bekapcsoláskor forog a motor és világít mind a kettő led ameddig ki nem kapcsolom. Belenéztem és azt vettem észre, hogy a DOS-t tartalmazó ROM forrósodik.
Vizsgálatokat végeztem multiméterrel, a feszültségek rendben vannak, a tápfeszhez(4,9V) képest enyhe feszültségesések(4,7 - 4,11V) vannak csak.
A ROM kivétele után csak a 3-as 4-es és 5-ös alkatrész melegszik üzemi hőmérsékletre és a feszültség vissza emelkedik pár tízedet. Azt mondták ha szerencsém van csak a ROM ment tönkre.
Van egy 27C512 típusú EPROM-om és állítólag rá lehetne írni a floppy DOS-át.
Megtaláltam a programot, ráadásul vagy 5 féle az 1541/II-höz. Nem tudom melyiket kellene fel égettetni:
-[CBM] 1541-II Prepared System Rom
-[CBM] 1541-II rom [h]
-[CBM] 1541-II rom v1
-[CBM] 1541-II rom v2
-[CBM] 1541-II SpeedDOS roms

Tud segíteni valaki?

Mivel "kulso" tappal hasznaltad, gondolom 1541-II-rol van szo, mint fent. Ezen a kepen latszik a ROM tipusa: 251968-03. (U4-es pozicio.) A fenti listabol ez talan a "[CBM] 1541-II rom v2" lesz, de a "tuti" az ez, szerintem. Ehhez amugy egy 27C128-as EPROM az idealis, a 27C512-be ez 4-szer belefer. Ha nincs 27C128-ad, akkor a linkelt tartalmat programozd be $0000-atol, $4000-tol, $8000-tol meg $C000-tol is. Igy jonak kellene lennie. (Most nincs idom turni a kapcs. rajzot, de bajt biztos nem okozol vele.) Viszont tenyleg mazlinak kell lennie, hogy csak a ROM szalljon el... Azert majd szamolj be a fejlemenyekrol.

Szerk: Amugy a ROM labkiosztasa szabvanyos, EPROM-ot mar en is hasznaltam helyette, tehat az elvben nincs hiba, valoban kell azzal is mukodnie.

Kapcsolasi rajznak ez talan "hivatalosabb". Hibas tulajdonkeppen barmi lehet sajnos, ha a ROM forrosodott, akkor az tuti kuka. Ha annak a csereje nem vezet eredmenyre, akkor en eloszor az orajeleket neznem meg (U7 8-as lab, ott-e a 16MHz, ill. a 6502 (U3) 37 ill. 39-es laban ott-e az 1MHz), aztan ha ezek megvannak, akkor a RESET kort (6502 (U3) 40-es lab, kikapcsolas utani bekapcskor rovid ideig meg alacsony, utana magas.). Ha az is jo, akkor a ROM _CS laban kellene "nezelodni" (U4 22-es lab, ez egy EPROM-on az _OE, de a mukodes szempontjabol itt lenyegtelen), hogy azon van-e "mozgas". Ezeket szkop hianyaban mondjuk egy TTL szint-teszterrel lehet ellenorizni, ha csak egy multimetered van, akkor merj rajtuk feszultseget. Ha TTL alacsony (0V koruli) vagy TTL magas (3..5V koruli) feszultseget mutat a muszer, az gyanus. Az orajeleken igy tippre olyan 1V korulit fog a muszer "atlagolni", a ROM _CS az inkabb lesz szinte alacsony. De ez csak tipp, egy olyan szint-tesztert erdemes esetleg kesziteni, amivel lehet detektalni szint-atmenetet. (Megfelelo muszer hianyaban nehez amugy jo tippet adni, ha feszultseg-sokkot kapott az elektronika, az vihetett ugye barmit.)

Szia!
Sikerült szereznem a masinába egy ROM-ot és gyönyörűen "muzsikál". :)
Szerencsére nem volt más baja. Most aztán figyelek ám rá, nehogy megint valami baj érje!
Tulajdonképpen dupla szálon futott a floppy project:
-ROM beszerzése az említett gépbe,
-Csere alapon egy 1541 beszerzése.
Ez utóbbi is összejött, úgyhogy két meghajtó van a C64-hez.

Hosszadalmas volt a folyamat.
Először úgy volt, hogy egy EPROM-ra égetik fel nekem a DOS-t aztán az illetőnek nem sikerült az égetőt üzembe helyezni ezért a saját meghajtójából küldte el nekem a ROM-ot aztán majd a sajátjába teszi bele amit nekem szánt. Tényleg nagy mákom volt.

Viszont az 1541-gyel annyi gondom van, hogy amit a PC-ről ráveszek floppyra XM1541 kábel segítségével azt nem olvassa vissza a C64-nek vagy sok nyűglődés árán. Viszont PC-re ugyanúgy visszaolvassa csont nélkül. A régen(kb.20éve) felvett programokat viszont simán betölt a C64-be.
(Az 1541/II-vel minden működik simán: PC <-> 1541/II <-> c64)
PC-n MS-DOS alatt a Star Commander-t használom, a C64-em pedig C64C.

XM1541-es kabellel ~hibas lesz a lemez? Erdekes... Ettol nem kellene "bizonytalannak" lennie a lemezre irasnak, mivel a cucc ugyanugy mukodik... Esetleg azt ki lehet probalni, hogy a SC-ben mindent visszaallitasz alapra, es kiprobalod ugy is. (Tehat minden "gyorsito trukkot" kikapcsolsz, most nincs elottem a stuff, nem tudom mit kell keresni... :) ) Lemezhiba nem lehet? Kiirsz egy d64-et a lemezre -> C64 kuzd vele. Ugyanezt a lemezt ha megformaztatod a C64-el, majd mentesz ra, akkor a visszaolvasassal meg minden rendben?

Megoldódott a probléma: a transfer beállításoknál 1541re állítottam az 157x--1541 helyett. Ezen azért volt, mert úgy olvastam valahol hogy ez egy általános beállítás.
Egyébként amit az 1541 megírt a PCről azt az 1541/II a C64nek simán olvasta. Ezért sem gondoltam beállítási problémára. Ráadásul míg nem volt az 1541 addig a /IIvel írtam a lemezeket.

Szia! Megint én vagyok. Szeretnék tanácsot kérni a meghajtó fej beállításához. Ugyanis a gyári Teszt lemezt nehezen ill. hibásan olvassa, míg egy másik (1541, a régi fajta)simán. Arról hallottam, hogy az ütközőt kell(ene) beállítani. Szkóp híjján van valami gyakorlati tanácsod?
Nándi

A fej (sávon belüli) beállítását elég jól leírják A VC1541-es lemezegység javítása és karbantartása című műben. (Cserébe van benne jó néhány butaság is, de ez most részletkérdés.) De a leírás a régi, "nagy dobozos" 1541-ről, annak is a két régebbi verziójáról szól. Az újabb meghajtókban nem néztem meg, hogy az említett "mérőpontok" hozzáférhetők-e. (Meg ilyet amúgy se csináltam még eddig, ha csak direkt nem csavarozták szét a fejmozgatás alkatrészeit, a fej "csak úgy" nem szokott elállítódni.) A TR00 ütköző beállítását körüljártam nemrég az 1551 javítgatása kapcsán. Az most ne zavarjon, hogy más típusú a meghajtó, az eredeti mechanika ugyanaz mint ami az 1541-ben van, a beállítást segítő program meg "multiplatform" lett, az is működik vele.

A "gyakorlati tanács" első körben annyi lenne, hogy a "régi fajta" 1541-be be kellene tenni a problémás mechanikát. (Eltérő pár csatlakozó, ha ez gondot okoz, akkor szerintem az egész javítási próbának jobb ha nem kezdesz neki, inkább kérj meg rá valakit.) Ezzel kiderül, hogy az elektronika "gyengélkedik-e", vagy tényleg a mechanikának van valami baja. (Ugyanezt a próbát "visszafele" is meg lehet esetleg ejteni; a régi 1541 mechanikáját rácsatlakoztatni az új elektronikájára.)

Köszönöm a tanácsokat!
Még annyit füznék hozzà, hogy ha az 1541-II -vel megformázok egy lemezt és vele màsolok ki programokat rá, semmi gondja. Vagyis a "sajàt" lemezeit rendesen kezeli. Viszont az 1541 már küzd vele. Fordìtva is igaz. Ezért gondoltam a fejre. Így is a mechanika àtültetéssel kezdjek?

Közben írtam egy kiegészítést erre vonatkoztatva, de szerkeszteni már nem sikerült a hozzászólásom. De ezek után tárgytalan. :-D A mechanika csere ezek után annyira nem lényeges.

Ha a TR00 ütközővel van a gond, akkor az "olvasási hiba" olyan lenne, hogy bizonyos fájlok töltése esetén kattogna a mechanika. (Amikor a fej az 1-es sávot akarná elérni, az nem sikerülne neki.) Ha ilyet nem hallasz, akkor nem azzal lesz a gond.

A fej tényleges sávra állítása a fent linkelt műben le van írva, de én ilyet – mint említettem – még nem csináltam. Az ott említett mérőpontok lehet hogy az 1541-II-ben nem találhatók meg, ebben az esetben a beállításhoz mégis át kell majd tenni a mechanikát a "nagy" meghajtóba. (Ha érdekes ez a dolog, esetleg utána nézhetek, de ehhez idő kell.)

Valami olyasmi. Tulajdonképpen ugyan az történik: a léptetőmotor tengelyén levő "fül" nekiütközik a (z állítható) ütközőnek. Csak nem sokszor, tehát nem lesz belőle kerregés, csak egy hangosabb kattanás akkor, amikor a sávra próbál állni. De normál működés közben ezt a hangot nem szabad hallani, szóval azért elég feltűnő, nem hiszem hogy össze lehet keverni. Az 1551-es mókánál említett tesztprogram segítségével ezt le tudod ellenőrizni.

Amúgy a leírásodból nekem nem úgy tűnik, hogy a TR00 ütköző beállítása lenne a baj, de persze lehet hogy valami infót még nem tudok. :)

Ha nem a fej àllàssal van gond, akkor miért olvassa nehezen a màsik meghajtò a /II -sel készìtett lemezeket és fordìtva? A sajàt lemezeit mindegyik hibàtlanul kezeli, plusz az 1541 a gyàri lemezeket is. Ebből gondolom, hogy az ùjabb meghajtòval van a gond.
Viszont az a kattanó hang tényleg. rémlik ....
Lassabban olvassa be a lemez tartalmat is. Főleg ha sok file -bòl àll. Beolvastatáskor az olvasò/ìrò led szabàlytalanul villog, ezzel egyidőben feltűnően többet jàrkàl a fej, nem pedig szép egyenletesen egymàs utàn szeli a track -eket folyamatos led vilàgìtàs mellett ahogy azt kéne. Aztàn van mikor a nagy keresgetésben ùgy dönt koppant egyet aztàn keresget megint és ha megint koppant akkor utana leàll és szabàlyos gyors led villogás van. Most ezt az emlekezetemből ìrtam le.

Nem sokat ertek a dologhoz, de tipp: ha arra vagy kivancsi, hogy hogyan olvasna vegig a fej a savokat, irj egy olyan BASIC progit, ami vegigcimzi es kiolvassa az osszes blokkot. Valami tiz sorbol megvan, a B-R lemezparancscsal kell operalni, a legtobb sorod DATA sor lesz, a savokon levo szektorok szamanak rogzitesevel.

Legrosszabb esetben kimented szalagra :-)

Hint: "B-R:"+STR$(Channel)+STR$(Drive)+STR$(Track)+STR$(Sector)
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Természetesen lehet a fej állásával gond, de mi most két különböző dologról beszélünk. :) A fej "állása" a lemezen levő sávhoz képesti el(nem)térésről szól. Ha ez jó, akkor van értelme a TR00 ütköző beállításának. Ez az egyszerűbb, de a (kibővített) leírásodból pont az tűnik ki, hogy nem a TR00 ütköző pozíciója lesz a ludas a dologban, hanem a fej pozíciója, vagy esetleg maga a fej. Bár a fejhibát első körben kizárnám, ha a saját formázását meg hibátlanul kezeli. De "elméletben" javítani sok értelme nincs, próbáld ki, aztán folytatjuk.