Disk cursus (1) Genic Clubguide, 00-00-00 NIEUWE CURSUS: D I S K C U R S U S ( 1 ) =============================== Zoals beloofd op de vorige ClubGuide start ik vanaf deze ClubGuide met een nieuwe cursus over diskgebruik op MSX. De cursus zal vooralsnog alleen MSXDOS1/Disk Basic 1.0 behandelen. Misschien zal ik over een tijdje ook aandacht besteden aan MSXDOS2, maar dat kan ik nu nog niet beloven. Om te beginnen leg ik u eerst uit hoe een MSX diskette is ingedeeld. DE 3.5 INCH DISKETTE MSX computers maken gebruik van de 3.5" disk. Deze diskette kan enkelzijdig of dubbelzijdig zijn. De offici‰le naam is MF-1DD voor enkelzijdig of MF-2DD voor dubbelzijdig. MF staat voor MicroFloppydisk, DD staat voor Double Density. Elke zijde bevat 80 tracks, die elk weer onderverdeeld zijn in 9 sectoren. In totaal zijn er dus 9 * 80 = 720 sectoren op ‚‚n kant. Elke sector kan 512 bytes bevatten, waardoor de opslag van een dubbelzijdige diskette 2 * 9 * 80 * 512 = 720 kB bedraagt. U heeft misschien wel eens de kreet "Ongeformatteerd 1 MB" op een disk zien staan. Als u de disk formatteert, schrijft de diskdrive de sectoren op de diskette. Er worden ook checksums op de disk gezet, zodat de drive bij elke lees- of schrijfoperatie kan checken of alles goed is gegaan. Dat kost veel diskruimte, u houdt van de 1 MB "slechts" 720 kB over. Wij zullen ons in deze cursus niet bezighouden met wat zich tussen de sectoren afspeelt. De grens ligt bij de sectoren. Het is mogelijk om met directe I/O communicatie tussen de sectoren te lezen/schrijven, dat wordt veel voor het (ont-) beveiligen van diskettes gebruikt. Wij gaan daar niet verder op in. Er zijn een aantal niveaus waarop je een diskette kunt benaderen: sectoren, clusters en bestanden. We beginnen nu met sectoren. SECTOREN LEZEN EN SCHRIJVEN De BIOS routine voor het lezen en schrijven van sectoren doet bij gebruik van de diskdrive al het werk. Als u bijvoorbeeld een bestand wilt lezen geeft u de computer daartoe opdracht via MSX DOS, Disk Basic of BDOS calls. In de diskrom bevinden zich routines die alles herleiden tot het lezen en/of schrijven van sectoren. Die routines roepen steeds de BIOS routine aan om een sector te lezen of te schrijven. De BIOS routine heet PHYDIO (Physical Disk I/O) en staat op adres &H144. De routine gebruikt de volgende registers: A: drivenummer (A = 0, B = 1, etc.) B: aantal sectoren C: media ID (&HF8 voor enkelz. of &HF9 voor dubbelzijdig) HL: RAM adres DE: nummer van eerste sector U kunt met de C-flag aangeven of u wilt lezen of schrijven: NC: lezen C: schrijven Nadat u met LD instrukties de registers van de juiste waarden hebt voorzien kunt u de routine aanroepen met: CALL &H144 Alle registers worden veranderd. Als de routine terugkeert met de carry hoog, dan is er iets fout gegaan. B bevat het aantal nog te laden/saven sectoren en A bevat de foutcode. De volgende foutcodes zijn mogelijk: 0 Protected 2 Not ready 4 Data error 6 Seek error 8 Record not found 10 Write error 12 Bad parameter 14 Out of memory 16 Overig Voor alle duidelijkheid nog even een voorbeeld. Dit voorbeeld leest de bootsector van de disk in drive A in en zet die vanaf adres &HD000. ; DEMONSTRATIE PHYDIO ORG &HC000 ; startadres LD A,0 ; drive A LD BC,&H01F9 ; 1 sector, dubbelzijdige disk (F9) LD HL,&HD000 ; startadres LD DE,0 ; bootsector is sector 0 OR A ; wis carry = lezen CALL &H144 ; roep de routine aan RET NC ; klaar als geen fout CALL &HC0 ; BEEP als fout RET FORMATTEREN De tweede en laatste BIOS call is FORMAT. Deze routine staat op adres &H147 en doet precies hetzelfde als CALL FORMAT. De computer vraagt zoals gebruikelijk om drive en aantal zijden. U roept de routine aan door CALL &H147. In Basic kunt u in plaats van _FORMAT dus ook DEFUSR=&H147: U=USR(0) gebruiken. Bij het formatteren worden er sectoren op de diskette geschreven. Bootsector, FAT en directory worden ge‹nitiali- seerd. DE BOOTSECTOR De eerste sector van een diskette heet de bootsector, in het Nederlands "opstartsector". Deze sector bevat algemene informatie over de diskette en de opstartroutine. Als u de computer opstart met een disk in de drive, dan zal de computer de bootsector inlezen en vanaf adres &HC000 in het RAM geheugen zetten. De computer geeft daarna de besturing over aan de routine die op adres &HC01E begint. Het eerste stuk van de bootsector (0-&H1D) is gereserveerd voor gegevens over de disk. De bytes 00-02 zijn een erfenis van andere systemen waarop de disk kan draaien, zij hebben op MSX geen betekenis. De eerste bytes van de bootsector hebben de volgende betekenis: ------------------------------------------------------------ 00 &HE9 of &HEB (JUMP instruktie voor 8086 processor) 01-02 Eventueel beginadres van de MS-DOS boot strap 03-0A 8 ASCII tekens waarin normaal de merknaam van de drive staat waarop de disk is geformatteerd 0B-0C Aantal bytes per sector (512) 0D Aantal sectoren per cluster (2) 0E-0F Aantal gereserveerde sectoren (2) 10 Aantal FAT's (2) 11-12 Maximum aantal files in de directory (112) 13-14 Totaal aantal sectoren per diskette (720 of 1440) 15 ID-byte (&HF8 of &HF9) 16-17 Aantal sectoren per FAT (2 of 3) 18-19 Aantal sectoren per track (9) 1A-1B Aantal magneetkoppen (= aantal zijdes, 1 of 2) 1C-1D Aantal "verborgen" sectoren (0) 1E-? Bootroutine ------------------------------------------------------------ Tussen haakjes staat steeds de standaardwaarde. De diskette is behalve in sectoren ook nog eens in clusters verdeeld. Een cluster bestaat uit twee sectoren. Er kunnen dus 1024 bytes, oftewel 1 kB, in een cluster worden opgeslagen. U kunt in Basic met het commando DSKF(drive) het aantal vrije clusters van een diskette opvragen. U zult merken dat er bij een geformatteerde dubbelzijdige diskette geen 720 kB vrij is, zoals u zou verwachten. Nee, er is slechts 713 kB. Nu zult u denken: waar is die 7 kB gebleven? Het antwoord is heel simpel: de bootsector (1), FAT (6) en directory (7) gebruiken samen 14 sectoren. In die 7 kB kunnen dus geen bestanden meer worden opgeslagen. Bij diskettes die door Disk Basic V1.0 of MSXDOS1 zijn geformatteerd 'kijkt' de bootroutine (die vanaf &H1C in de bootsector staat) of MSXDOS1 op de disk aanwezig is. Als dat zo is, dan wordt MSXDOS1 vanaf &H100 geladen en geeft de computer de besturing over aan MSXDOS1. In het andere geval wordt de besturing verder door de computer gaat, die zal proberen AUTOEXEC.BAS van de diskette te RUNnen. Als dat ook niet lukt, dan springt de computer naar Basic. COMMERCIELE SOFTWARE Als u met een diskmonitor in de bootsector van commerci‰le software kijkt, dan zult u vaak rare dingen aantreffen. Meestal staan er zeer vreemde dingen, zoals diskettes met 2367 zijdes (!!). De naam van het spel of het nummer van de disk staan ook vaak in de bootsector. Kijkt u maar eens met een sectormonitor in de bootsector van Japanse spellen. U kunt dan ook zien dat Falcom een eigen soort directory gebruikt (zie bijvoorbeeld Ys III, Wanderers from Ys). U kunt van zulke diskettes vaak niet de filelist opvragen. Logisch, want de computer raakt aardig in de war als de FAT volgens de bootsector uit 65536 sectoren bestaat! U krijgt dan bij een FILES of DSKF(0) opdracht de foutmelding Disk I/O error. De disk is dan niet kapot, de diskrom kan alleen niet de juiste opdracht uitvoeren. FAT EN DIRECTORY De volgende keer gaan we verder met de FAT en de directory. Er zal dan een programma op de ClubGuide staan dat van elke file op een disk niet alleen naam, extensie, tijd, datum en filegrootte geeft, maar ook in welke clusters/ sectoren de file staat. Dat is vooral handig om te weten als u met een diskmonitor in de file wilt gaan "knoeien". Als u nog suggesties heeft voor deze cursus, dan kunt u mij een briefje sturen. Ik ga er bijvoorbeeld van uit dat iedereen wel een sectormonitor heeft. Laat het weten als dat niet zo is, dan plaats ik er alsnog ‚‚n op de ClubGuide. Stuur uw vragen, suggesties of opmerkingen naar: Stichting GENIC T.a.v. Stefan Boer Postbus 258 8470 AE Wolvega Tot de volgende keer! Stefan Boer |