% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[utf8]{inputenc} \usepackage{multicol,babel} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} %\newcommand{\code}[1]{\texttt{#1}} \begin{document} \renewcommand{\figurename}{Tabelle} \title{Bootmanager und FAT--Reparatur:\\\hfill Sechster Fort(h)schritt (Diskbootcopy)} \ifx\shorttitle\undefined\else \shorttitle{Bootmanager 6 — Diskbootcopy} \fi \author{Fred Behringer} \maketitle Im vorliegenden Artikel wird mit den Hilfsmitteln aus Teil 4 dieser Serie ein Forth--Wort, diskbootcopy, entwickelt, das es gestattet, den Bootsektor einer Diskette auf eine andere Diskette per \emph{Knopfdruck} (als Aufruf eben dieses Forth--Wortes oder von der DOS--Ebene aus über eine Batchdatei) zu übertragen. diskbootcopy kann mit Disketten beliebiger (beliebig abgeänderter!) Struktur umgehen und arbeitet auch da, wo RawWrite und Diskcopy versagen. \begin{multicols}{2} \section{Was wurde schon gebracht?} Der Artikel stützt sich hauptsächlich auf Teil 4 der Serie (VD--2/2009). Die drei benötigten Forth--Worte aus früheren Serien--Teilen werden im Listing wiederholt. Das Programm läuft unter allen gängigen DOS--Versionen und in jedem Windows--System, welches nichts gegen simple 16--Bit--DOS--Programme und direkte Festplatten-- oder/und Disketten--Zugriffe einzuwenden hat. Dazu gehören DOS 6.2, DOS 7.0 (aus Windows 95), DOS 7.1 (aus Windows 98), DOS 8.0 (aus Windows ME) und FreeDOS. \section{Ausgangspunkt} In Teil 4 der Serie [FB] habe ich über die Anfertigung und die Verwendung einer \emph{Hilfsdiskette} gesprochen, mit der man den PC booten und dazu veranlassen kann, vor dem endgültigen Booten per Festplatte die Speicher--Endadresse im BIOS--Datenbereich zurückzusetzen und das ROM--BIOS ins freigewordene RAM zu platzieren. \section{Bootsektor kopieren} Von dieser \emph{Hilfsdiskette} wird einzig und allein der Bootsektor benötigt. Ist dieser nach dem anfänglichen Booten von der Hilfsdiskette abgearbeitet, dann hat die Hilfsdiskette ihre Schuldigkeit schon getan. Der Bootcode erledigt alles Weitere und schaltet den PC insbesondere hinüber zum Booten von der Festplatte. Will man die Hilfsdiskette (z.~B.\ zur Weitergabe an einen Forth--Kollegen) kopieren, dann sollte es nur allzu plausibel erscheinen, die Kopierarbeit dem DOS--Programm diskcopy oder, wenn das nicht geht, dem \section{Alleskönner RawWrite} zu überlassen. Aber ach! Von wegen RAW--Write--n! Man kann nicht davon ausgehen, dass bei beliebiger Quelldiskette alles roh (Sektor für Sektor) übertragen wird. Ich habe es mit dem RAWWRITE 0.7 von John Newbigin [JN] versucht und war bass erstaunt: Unmittelbar nach dem Einlegen der \emph{Hilfsdiskette} lieferte rawwritewin.exe die Meldung \emph{Error reading disk}. Beim anschließenden Versuch mit DOS--, FreeDOS-- und Windows--DOS--Disketten kam diese Meldung zwar erst nach 97\% des Lesevorgangs, aber sie kam. Und das bei einem so einfachen Vorgang wie dem Kopieren einer Diskette (bei der es sogar auf nichts weiter als auf den Bootsektor ankommt)! Die bisher entwickelten Forth--Hilfsmittel meiner Serie schaffen es ja auch --- ohne RawWrite! \section{RawWrite geht} allerdings bei einer Hilfsdiskette, die aus einer DOS--formatierten Diskette hervorgegangen ist. (Es geht auch bei anders formatierten Disketten, z.B. bei Tom Oehsers Ein--Disketten--Linux tomsrtbt-1.7 [TO]). Ich hatte aber im Bootsektor der Hilfsdiskette aus Teil 4 alle Bytes außerhalb des Bootcodes ausgenullt (da überflüssig) - und da ging es eben nicht. Im Listing des vorliegenden Artikels biete ich das Forth-Wort \section{Diskbootcopy} an. Das arbeitet (mit Bedien-Anweisungen auf dem Bildschirm) so wie der externe DOS--Befehl diskcopy, nur eben nur auf das Kopieren des Bootsektors ausgerichtet. Natürlich können damit auch andere Aufgaben erledigt werden, bei welchen es nur auf das Kopieren des Bootsektors ankommt (der Rest der Quelldiskette wird nicht angerührt). Und um das Einknopf--Feeling perfekt zu machen, soll hier noch schnell eine Batch--Datei angegeben werden, die (ähnlich diskcopy) von der DOS--Kommandozeile aus aufgerufen werden kann: \begin{small} \begin{verbatim} @echo off forth echo off hex include dbc.fth diskbootcopy bye \end{verbatim} \end{small} Diese Zeile als Batch--Datei verpacken! Das DOS--Programm forth ist dabei das Turbo--Forth--System (bei mir forth.com). Man konstruiere dasselbe für ZF! \section{Wirkung der Batch--Datei} Aus der oben stehenden Zeile mit einem Editor eine Text--Datei mit Namen dbc.txt machen und statt der Endung .txt die Endung .bat anfügen. (dbc soll für diskbootcopy stehen.) Nach Aufruf von dbc.bat (kurz dbc) in der DOS--Kommandozeile passiert Folgendes: @echo off ist der übliche DOS--Batch--Befehl. Mit forth wird das Turbo--Forth--System aufgerufen. Alles, was in der obigen Zeile hinter forth kommt, sind Forth--Worte. Sie werden als Forth--Übergabestring Wort für Wort abgearbeitet, bevor sich der Forth--Prompt meldet. Das Forth--Wort bye leitet schließlich vom Forth--System wieder in die DOS--Ebene zurück. \section{Der Mechanismus dieser Batch--Datei} kann übrigens überall da angewendet werden, wo man nach stereotypem Muster mit einer kurzen Forth--Sequenz einen DOS--Befehl aufbauen möchte, ohne für jeden solchen \emph{konstruierten} DOS--Befehl immer gleich den ganzen Forth--Überbau mitschleppen zu müssen. (Ein einmaliges Zurverfügungstellen des Forth--Systems (bei mir forth.com) im gleichen DOS--Verzeichnis reicht.) Aus BASIC kennt man beispielsweise PEEK und \mbox{POKE}. Nichts ist einfacher, als das in einer solchen Forth--DOS--Batch--Datei nachzuahmen! Aber das ist ein anderes Thema, ein Thema für weitere VD--Vorhaben \ldots Der Einfachheit halber beschränke ich mich hier auf das Wesentliche und arbeite in meiner Vorstellung nur mit \section{3,5$^{\textquotedbl}$--Disketten} in HD-- oder DD--Format. Man beachte aber, dass von \emph{Format} (und Formatierung) gar keine Rede ist und dass es mit dem hier gezeigten Mechanismus auch ohne Weiteres möglich ist, den Bootsektor beispielsweise von einer HD--Diskette auf eine DD--Diskette zu übertragen, oder umgekehrt. --- Der Bootsektor wird also im wortwörtlichen Sinne raw--ge--write--t! \section{Schnellüberprüfung} Ich habe eine DOS--formatierte 3,5$^{\textquotedbl}$--DD--Diskette genommen, die einige DOS--Programme enthielt (gar nicht so leicht, noch eine in der Schublade zu finden), und den Bootsektor der \emph{Hilfsdiskette} auf eben diese DD--Diskette übertragen (per (getdiskbootsect) und (putdiskbootsect) --- oder eben per diskbootcopy). Die Programme der DD--Diskette waren dann, wie nicht anders zu erwarten, nicht mehr ansprechbar. Aber als \emph{Hilfsdiskette} tat die so präparierte DD--Diskette ihren Dienst. Dann habe ich eine weitere DOS--beschriebene DD--Diskette genommen und deren Bootsektor auf die erstere DD--Diskette übertragen. Die dortigen Programme konnten dann wieder so angesprochen werden, als ob nichts gewesen wäre. \end{multicols} \section*{Literatur und Internet--Adressen}% \markright{Listing} \begin{tabular}{ll} {[FB]} Behringer, Fred: & Bootmanager und FAT--Reparatur, Teil 1 bis 5.\\ & Vierte Dimension, Hefte 3--4/2008 und 1--3/2009.\\ {[JN]} Newbigin, John: & \url{http://www.chrysocome.net/rawwrite} \\ {[TO]} Oehser, Tom: & \url{http://www.toms.net/rb/} \end{tabular} \bigskip \section{Listing} \begin{quote} \listinginput{1}{2010-01/dbc.fth} \end{quote} \end{document}