\ **************************************************** \ * * \ * DBC.FTH ( in der Serie eigentlich BOOTMA-6.FTH ) * \ * * \ * Zutaten fuer Bootmanager und FAT-Reparatur unter * \ * Turbo-FORTH-83 und ZF * \ * * \ * Fred Behringer - Forth-Gesellschaft - 01.03.2010 * \ * * \ **************************************************** \ ==================================================== \ Bei Arbeiten mit ZF: \ zf [ret] fload dbc.fth - Endung fth nicht vergessen! \ attributs off wegnehmen! attributs in ZF unbekannt. \ Ansonsten scheint auch unter ZF alles gut zu laufen. \ ==================================================== attributs off \ 'off' fuer den Fall, dass kein ANSI.SYS in der \ CONFIG.SYS ist. Oder dann aber ANSI.COM aus dem \ Internet hereingooglen und in das DOS-System \ (in die AUTOEXEC.BAT) legen! Beim Arbeiten mit \ ZF auf jeden Fall wegnehmen! hex \ Der folgende Sektorpuffer wurde schon in frueheren Teilen dieser \ Artikelfolge verwendet und wird hier der Vollstaendigkeit halber \ wiederholt. 210 allot here \ Platz fuer mindestens 1 Sektor = 512d Bytes here 0f and - \ sectbuf an Paragraphenanfang 200 - \ Anfang des Sektorpuffers constant sectbuf \ Liefert Adresse des Sektorpuffers \ ================================================================== \ Vorweg gesagt: Alle Forth- und DOS-Befehle koennen im Vorliegenden \ in beliebiger Mischung gross oder auch klein eingegeben werden. \ ================================================================== \ Glossar \ ------- \ sectbuf : Wiederholung aus VD-Heft 3/2008 \ (getdiskbootsect) : Wiederholung aus VD-Heft 2/2009 \ (putdiskbootsect) : Wiederholung aus VD-Heft 2/2009 \ diskbootcopy : Kopieren des Bootsektors einer beliebigen \ Quelldiskette in eine beliebige Zieldiskette \ Die folgenden Worte (getdiskbootsect) und (putdiskbootsect) werden gleich \ anschliessend, in diskbootcopy, benoetigt. Es sind Wiederholungen aus \ meinem Artikel 'Bootmanager und FAT-Reparatur: Vierte Fort(h)schritte \ (patchbares BIOS im RAM)' aus dem VD-Heft 2/2009. Auf die ausfuehrlichen \ Kommentare, die dort gegeben wurden, darf hier verzichtet werden. \ Das folgende Wort (getdiskbootsect) erwartet im Laufwerk a: eine Diskette, \ von welcher es den Bootsektor (einen MBR gibt es bei Disketten nicht!) holt \ und in den Sektorpuffer sectbuf schreibt. Die Struktur der Diskette (DOS \ oder nicht, HD oder DD) kann beliebig sein. Das System kennt alle fuer den \ Vorgang benoetigten Daten aus den BIOS-Setup-Einstellungen. Das hier der \ Einfachheit halber verwendete Laufwerk a: braucht fuer (getdiskbootsect) \ nicht bootbar zu sein. Man kann auf diesem Weg den Bootsektor einer \ 'Hilfsdiskette' der Art von Teil 4 klonen. Die so hergestellte Kopie der \ Hilfsdiskette braucht fuer die BIOS-Verlegung ins RAM nach Teil 4 der \ Serie nicht wieder von Laufwerk a: aus betrieben zu werden. Man muss aber \ dann sicherstellen, dass das Disketten-Laufwerk, von dem aus der PC spaeter \ gebootet werden soll, dafuer auch wirklich geeignet ist und dass man das \ BIOS entsprechend eingestellt hat. code (getdiskbootsect) ( -- fl ) si push 1 # di mov 3 # si mov ds push es pop begin si dec ah ah xor dl dl xor 13 int dx dx xor 1 # cx mov sectbuf # bx mov 201 # ax mov 13 int u>= if si si xor di dec then 0 # si cmp 0= until si pop di push next end-code \ Das folgende Wort (putdiskbootsect) erwartet im Laufwerk a: eine Diskette, \ in deren Bootsektor es den Inhalt des Sektorpuffers sectbuf legt. Vorsicht! \ Das System kuemmert sich nicht darum, ob die Daten in sectbuf z.B. fuer das \ Uebertragen des Bootsektors von Diskette zu Diskette geeignet sind. \ Andererseits kann nicht viel passieren: Die Quell-Diskette nimmt durch das \ Lesen keinen Schaden und die Ziel-Diskette (mit dem geklonten Bootsektor) \ kann sich nachtraeglich hoechstens als unbrauchbar erweisen - und dann muss \ man eben den Vorgang, diesmal richtig angepackt, wiederholen. code (putdiskbootsect) ( -- fl ) si push 1 # di mov 3 # si mov ds push es pop begin si dec ah ah xor dl dl xor 13 int dx dx xor 1 # cx mov sectbuf # bx mov 301 # ax mov 13 int u>= if si si xor di dec then 0 # si cmp 0= until si pop di push next end-code \ Das folgende Wort diskbootcopy fasst die beiden Worte (getdiskbootsect) \ und (putdiskbootsect) zusammen und fuegt Fehlerabsicherungen und \ Bedienungsanweisungen als Bildschirmausgaben hinzu. : diskbootcopy ( -- ) cr ." Quelldiskette (beliebiger Struktur) in Laufwerk a: legen" cr ." und Eingabetaste druecken!" begin key d = until cr (getdiskbootsect) if cr ." Lesefehler! Gesamtvorgang wiederholen! Das heisst also:" cr ." Eingabetaste druecken und wieder dbc.bat [ret] eingeben! cr bye then cr ." Quelldiskette aus dem Laufwerk nehmen," cr ." Zieldiskette" cr ." (beliebiger Struktur, beliebiger Kapazitaet, " ." formatiert oder nicht)" cr ." in Laufwerk a: legen und Eingabetaste druecken!" begin key d = until cr (putdiskbootsect) if cr ." Schreibfehler! Gesamtvorgang wiederholen! Das heisst:" cr ." Eingabetaste druecken und wieder dbc.bat [ret] eingeben!" cr bye then cr ." Kopiervorgang erfolgreich beendet. Zieldiskette entnehmen!" cr cr ." Etwa vergessen, von der Quell- zur Ziel-Diskette zu wechseln?" cr ." Macht nichts! Die (im Laufwerk vergessene) Quell-Diskette hat " cr ." sich durch das Wiederbeschreiben mit dem eigenen Bootsektor" cr ." nicht veraendert. Den Gesamtvorgang dann einfach wiederholen!" cr cr ." Ob Vorgang erledigt oder Wiederholung: Eingabetaste druecken!" begin key d = until cr bye ;