€h’’’’ž’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ž’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’A0£ #’AÉ£ # ¤Ÿ)£ # ¤O+£ # ķÕ/£ #¤ĀL8£ # !"#%¤¢%<£ #2345678:¤5?£ #=¤ØA£ #>¤D C£ #?@AB큉\L£ #CDEFGHIK¤-IT£ #\]^_`abd¤Š“h£ #pqrstuvx¤ē¬{£ #Ÿ ”¢£¤„§¤V €£ #ĢĶĪϤģ;…£ #ŠŃŅÓŌÕÖŲ¤ķ³™£ #ąįāćäåęčķBž£ #¤D  £ #¤ß”£ #ķ]p­£ #¤ē²£ #45678ķĶ0·£ #9:;<=>?A¤G»£ #G¤“½£ #H¤Ū¾£ #IJ¤BĄ£ #KL¤F Ā£ #MNO¤›Ć£ #P¤lÅ£ #Q¤žĘ£ #R¤†Č£ #STUVW¤Ź£ #X...tools...bootblokbootblok.sbuildbuild.cbuild.schangeme changemem diskfix.asm fs fsck fsck.cfsck.sfsck1.sfsckoldfsckold.cinitinit.cinit.skernelmakefilemmpasswdproto.at.ramproto.ramproto.userproto.usrrctoolsxpr.attoolsxpr.di toolsxpr.us!ttysøĄŽŲ1öøą/ŽĄ1’¹ņ„źą/ŒŹŽŚ1ĄŽĄŽŅ¼ø9&£x&‰zøĶø1Ū1ŅĶ»ečŃ1ĄĶ1ĄŽĄø»¹ŗĶsĒ, 1ĄŽĄø.&£xĶčB‹*ƒĆŃćŃćŃćŃćŃćŽĆ1Ū*“Ķrs”*;ųrÕŗņø īś‹,”śŽŲŽĄŽŠ.’.ü‹6,”*1Ņ÷ö‰Į‰Ó”*šH1Ņ÷6,8Čt)ÖN”*‰ĀņJŃąŃā8ōtŠź0ö)ÖN‰š1ŅˆĪ€ęˆĶŠķˆŁžĮ0ŅĆP»Dč 1É÷&āśĶŠ„ĄuĆ“CS³0’Ķ[ėģß *’Pöß’TöRead error. Automatic reboot. Booting MINIX 1.2. Copyright 1987 Prentice-Hall, Inc. | When the PC is powered on, it reads the first block from the floppy | disk into address 0x7C00 and jumps to it. This boot block must contain | the boot program in this file. The boot program first copies itself to | address 192K - 512 (to get itself out of the way). Then it loads the | operating system from the boot diskette into memory, and then jumps to fsck. | Loading is not trivial because the PC is unable to read a track into | memory across a 64K boundary, so the positioning of everything is critical. | The number of sectors to load is contained at address 504 of this block. | The value is put there by the build program after it has discovered how | big the operating system is. When the bootblok program is finished loading, | it jumps indirectly to the program (fsck) which address is given by the | last two words in the boot block. | | Summary of the words patched into the boot block by build: | Word at 504: # sectors to load | Word at 506: # DS value for fsck | Word at 508: # PC value for fsck | Word at 510: # CS value for fsck | | This version of the boot block must be assembled without separate I & D | space. LOADSEG = 0x0060 | here the boot block will start loading BIOSSEG = 0x07C0 | here the boot block itself is loaded BOOTSEG = 0x2FE0 | here it will copy itself (192K-512b) DSKBASE = 120 | 120 = 4 * 0x1E = ptr to disk parameters final = 504 fsck_ds = 506 fsck_pc = 508 fsck_cs = 510 .globl begtext, begdata, begbss, endtext, enddata, endbss | asld needs these .text begtext: .data begdata: .bss begbss: .text | copy bootblock to bootseg mov ax,#BIOSSEG mov ds,ax xor si,si | ds:si - original block mov ax,#BOOTSEG mov es,ax xor di,di | es:di - new block mov cx,#256 | # words to move rep movw | copy loop | start boot procedure jmpi start,BOOTSEG | set cs to bootseg start: mov dx,cs mov ds,dx | set ds to cs xor ax,ax mov es,ax | set es to 0 mov ss,dx | set ss to cs i.e., stack in high core mov sp,#1536 | initialize sp to high core | initialize disk parameters mov ax,#atpar | tenatively assume 1.2M diskette seg es mov DSKBASE,ax seg es mov DSKBASE+2,dx | print greeting mov ax,#2 | reset video int 0x10 mov ax,#0x0200 | BIOS call in put cursor in ul corner xor bx,bx xor dx,dx int 0x10 mov bx,#greet call print | Determine if this is a 1.2M diskette by trying to read sector 15. xor ax,ax int 0x13 xor ax,ax mov es,ax mov ax,#0x0201 mov bx,#0x0600 mov cx,#0x000F mov dx,#0x0000 int 0x13 jnb L1 | Error. It wasn't 1.2M. Now set up for 360K. mov tracksiz,#9 | 360K uses 9 sectors/track xor ax,ax mov es,ax mov ax,#pcpar seg es mov DSKBASE,ax int 0x13 | diskette reset L1: | Load the operating system from diskette. load: call setreg | set up ah, cx, dx mov bx,disksec | bx = number of next sector to read add bx,#2 | diskette sector 1 goes at 1536 ("sector" 3) shl bx,#1 | multiply sector number by 32 shl bx,#1 | ditto shl bx,#1 | ditto shl bx,#1 | ditto shl bx,#1 | ditto mov es,bx | core address is es:bx (with bx = 0) xor bx,bx | see above add disksec,ax | ax tells how many sectors to read movb ah,#2 | opcode for read int 0x13 | call the BIOS for a read jb error | jump on diskette error mov ax,disksec | see if we are done loading cmp ax,final | ditto jb load | jump if there is more to load | Loading done. Finish up. mov dx,#0x03F2 | kill the motor mov ax,#0x000C out cli mov bx,tracksiz | fsck expects # sectors/track in bx mov ax,fsck_ds | set segment registers mov ds,ax | when sep I&D DS != CS mov es,ax | otherwise they are the same. mov ss,ax | words 504 - 510 are patched by build seg cs jmpi @fsck_pc | jmp to fsck | Given the number of the next disk block to read, disksec, compute the | cylinder, sector, head, and number of sectors to read as follows: | ah = # sectors to read; cl = sector #; ch = cyl; dh = head; dl = 0 setreg: mov si,tracksiz | 9 (PC) or 15 (AT) sectors per track mov ax,disksec | ax = next sector to read xor dx,dx | dx:ax = 32-bit dividend div si | divide sector # by track size mov cx,ax | cx = track #; dx = sector (0-origin) mov bx,dx | bx = sector number (0-origin) mov ax,disksec | ax = next sector to read add ax,si | ax = last sector to read + 1 dec ax | ax = last sector to read xor dx,dx | dx:ax = 32-bit dividend div tracksiz | divide last sector by track size cmpb al,cl | is starting track = ending track je set1 | jump if whole read on 1 cylinder sub si,dx | compute lower sector count dec si | si = # sectors to read | Check to see if this read crosses a 64K boundary (128 sectors). | Such calls must be avoided. The BIOS gets them wrong. set1: mov ax,disksec | ax = next sector to read add ax,#2 | disk sector 1 goes in core sector 3 mov dx,ax | dx = next sector to read add dx,si | dx = one sector beyond end of read dec dx | dx = last sector to read shl ax,#1 | ah = which 64K bank does read start at shl dx,#1 | dh = which 64K bank foes read end in cmpb ah,dh | ah != dh means read crosses 64K boundary je set2 | jump if no boundary crossed shrb dl,#1 | dl = excess beyond 64K boundary xorb dh,dh | dx = excess beyond 64K boundary sub si,dx | adjust si dec si | si = number of sectors to read set2: mov ax,si | ax = number of sectors to read xor dx,dx | dh = head, dl = drive movb dh,cl | dh = track andb dh,#0x01 | dh = head movb ch,cl | ch = track to read shrb ch,#1 | ch = cylinder movb cl,bl | cl = sector number (0-origin) incb cl | cl = sector number (1-origin) xorb dl,dl | dl = drive number (0) ret | return values in ax, cx, dx |-------------------------------+ | error & print routines | |-------------------------------+ error: push ax mov bx,#fderr call print | print msg xor cx,cx err1: mul 0 | delay loop err1 int 0x19 print: | print string (bx) movb al,(bx) | al contains char to be printed testb al,al | null char? jne prt1 | no ret | else return prt1: movb ah,*14 | 14 = print char inc bx | increment string pointer push bx | save bx movb bl,*1 | foreground color xorb bh,bh | page 0 int 0x10 | call BIOS VIDEO_IO pop bx | restore bx jmp print | next character disksec:.word 1 tracksiz: .word 15 | changed to 9 for 360K diskettes pcpar: .byte 0xDF, 0x02, 25, 2, 9, 0x2A, 0xFF, 0x50, 0xF6, 1, 3 | for PC atpar: .byte 0xDF, 0x02, 25, 2,15, 0x1B, 0xFF, 0x54, 0xF6, 1, 8 | for AT fderr: .asciz "Read error. Automatic reboot.\r\n" greet: .asciz "\rBooting MINIX 1.2. Copyright 1987 Prentice-Hall, Inc.\r\n" | Don't forget that words 504 - 510 are filled in by build. The regular | code had better not get that far. .text endtext: .data enddata: .bss endbss:  „s ‰ć‹ƒĆ‰Č@ŃąŲ£PSQčƒÄPč'U‰åPƒ~t ø`PøDPč§ ^^č€ ‹^’wčø ^‹^’wč}^ĒFžƒ~ž}‹FžŃą‰Ć^’7’vžčŃ^^’FžėŽč~øbPči ^’6ī’6ģ’6ī’6ģø¢PčQ ƒÄ ’6ź’6čøČPč? ƒÄ’6ź’6čč‹^^čTč"1ĄPč‚^‰ģ]ĆU‰åģ1ĄP’včw^^‰Fžƒ~ž} ’vøģPčķ ^^øP†üżP’vžčlƒÄ‰Füƒ~ü} ’vøųPčĘ ^^ƒ~ü~ ’vü†üżPč^^ƒ~üĄčĀ’vžč¬^‰ģ]ĆU‰åģ 1ĄP’vč^^‰Fžƒ~ž} ’vø Pčx ^^’vFņPFōPFöPFüP’vžčƒÄ ƒ~üt»‹Fö1Ņ÷ó Ņt ’vøPč< ^^‹FōFöFņ‰Fš»‹Fš1Ņ÷ó‰Vīƒ~īv ø+FīPė1ĄPFģ‹FņFģ‰Fņ‹FšFģ‰Fšƒ~})¹»”ģ’6īč 1ŪYFšŁQ¹»č£ģī¹»”č’6źč÷1ŪYFšŁQ¹»čå£čź¹‹FÓą‰Ć‹Fö‰‡Ą‹FÓą‰Ć‹Fō‰‡Ā‹FÓą‰Ć‹Fņ‰‡Ä‹FÓą‰Ć‹Fü‰‡Ęƒ~}?¹‹FÓą‰ĆƒæĘtøPėø P‹FŃą‰Ć’vš’vš’vņ’vō’vö’·øXPč1 ƒÄ‹FōFö‰Fźƒ~źvm~źs’vźėøP¹»Xč5‰Fų’vų†źżP’vžčxƒÄ‰Fśƒ~ś} ’vø¢PčŅ^^ƒ~ś~ ’vś†źżPč^^¹»‹Fų’vźčź[)Ɖ^źėƒ~ņv@~ņs’vņėøP¹»Xč‰Fų’vųøšPčÕ^^¹»‹Fų’vņč¤[)Ɖ^ņėŗ’vžčd^‰ģ]ĆU‰åƒģ<øPFČP’včŃƒÄ‰Fʃ~Ęt ’vø¶Pč+^^¹»‹FĢčY‰Fă~Ä tƒ~Ä0t ’vøĪPč^^‹FŹ% ¹»č/‹^‰‹FÄ-PFŠP’včmƒÄ‰FʋFÄ-9FĘt ’vøčPčĀ^^‹FŠ‹^‰‹FŌ‹^ ‰‹FŲ‹^ ‰‰ģ]ĆU‰åƒģø+š ‰Fž‹Fž9F’vė’vžFü‹Fü‰Fś‹š Ćš‰^ų‹F‰Fö’vü’NüX Ąt’vöƒFö[‹vųŠˆƒFųėą‹Fśš >š uøšP’6ņ čÅ^^čg‹F9Fśu‰ģ]ƋF+Fś‰F‹^‰š ĒFųš’v’NX Ąt’vöƒFö[‹vųŠˆƒFųėą‰ģ]ĆU‰åƒ>š u‰ģ]ĆøšP’6ņ čb^^č‰ģ]ĆU‰åPĒFžš~žš s ‹^žĘƒFžėķĒš ’ņ ‰ģ]ĆU‰åģ ’6ī’6ģ1ĄPøPčĘƒźƒŪu Ó Ūt øPøüPčh^^‹ģ‹īĆƒŃ‰^ü‰NžĒFś¹‹Fü‹^žćŃūŃŲāś‰Fųƒ>ęt¹‹ąÓė^ų‰^öė‹Fų‰Fö’v’v1ĄPøPčk‰†ōż†öżP1ĄPčG^^‹†ōż‰Fī‹Fö‰Fš‹Fś‰Fņ‹Fų‰Fō†öżP1ĄPčg^^‰ģ]ĆU‰åƒģ1Ą‹ĄĆ‰^ģ‰Fī‹Fģ‹^īƒÓSPčö^^¹ÓąP’vī’vģčå^^[Ɖ^ž¹»‹Fžč¹=oRt ø>Pø Pčm^^ĒFžƒ~ž|鹋FžÓą‰Ć‹‡Ą‰Fś‹FžÓą‰Ć‹‡Ā‰Fų‹FžÓą‰Ć‹‡Ä‰Fö‹FžÓą‰ĆƒæĘt¹‹FśÓč‰Fō‹FöFųÓč‰FņėĒFō‹FųFśFö¹Óč‰Fņ1ɋFōÓč%’¹‹^žÓćP‰Ų™FģVīRPčtƒÄ¹‹FōÓč%’¹‹^žÓćP‰Ų™FģVīƒŅRPčIƒÄ1ɋFņÓč%’¹‹^žÓćP‰Ų™FģVīƒŅRPčƒÄ¹‹FņÓč%’¹‹^žÓćP‰Ų™FģVīƒŅRPčōƒÄ’Fžé䞃>ĘuĒFš`ė‹ĄĆ¹Óė‰^š‹Fš%’P1ĄPøPč¼ƒÄ¹‹FšÓč%’P1ĄPøPč£ƒÄ‰ģ]ĆU‰åģ6džāżĒ†äż¹»‹†āż’¶äżč‹ĀĄÄ1ÉZŲʹ»Rčö‰†āż†äż‹†āż‹žäż-ƒŪ‰†Öż‰žŲż1Ą‹žÖż‹ŽŲżČĮ‰žÖż‰ŽŲż¹»‹†āż’¶äżčÆ‹ŹČĢ1ÉZŲʹ»Rč’‰†āż†äż‹†āż‹žäż-ƒŪ‰†Žż‰žąż1Ą‹žŽż‹ŽążŠĮ‰žŽż‰Žąż¹»‹†āż’¶äżčK‹ŅŠŌ1ÉZŲʹ»Rč.‰†āż†äż‹Ų‰^ž‹Üډ^ü¹‹†āż‹žäżćŃūŃŲāś‰†āż‰žäżƒ>Žu‹FüFž‰FüĒFž¹‹FžÓč‰Fž‹FüÓč‰Fü‹†āż‰†ųż‹Fž‰†öż‹Fü‰†ōż‹†ųż%’¹»č« ‰†ņż¹‹†ųżÓč%’¹»č’ ‰†šż‹†öż%’¹»č~ ‰†īż¹‹†öżÓč%’¹»če ‰†ģż‹†ōż%’¹»čQ ‰†źż¹‹†ōżÓč%’¹»č8 ‰†čż‹†Žż‰†Śż‹†ąż‰†Üż‹†Öż‹žŲżƒÓSPč)^^¹ÓąP’¶Ųż’¶Öżč^^[Ɖžęż¹»‹†ężčč =ŚŚt øZPø@Pčœ^^‹†Śż‹žÜżƒÓSPčŪ^^¹ÓąP’¶Üż’¶ŚżčČ^^[Ɖžęż¹»‹†ężčš =ŚŚt øvPø\PčN^^‹†Śż‹žÜżƒÓ’¶ņżSPčփÄ‹†Śż‹žÜżƒÓ’¶šżSP較Ä‹†Śż‹žÜżƒÓ’¶īżSP袃Ä‹†Śż‹žÜżƒÓ’¶ģżSP舃Ä‹†Śż‹žÜżƒÓ’¶źżSPčnƒÄ‹†Śż‹žÜż ƒÓ’¶čżSPčTƒÄ‰ģ]ĆU‰åģ†žP’v’v1ĄPøPčń PčŲ^^†žP’v’v1ĄPøPčŗ [Ó1ĄŠP¹»XčŸ ‰ģ]ĆU‰åģ†žP’v’v1ĄPøPč¤ Pč‹^^’v†žP’v’v1ĄPøPčj [ÓXˆ†žP’v’v1ĄPøPčk Pč›^^‰ģ]ĆU‰å’v’vøxPčüƒÄøPčQ^‰ģ]ĆU‰åø¶P’vč$^^£ō ’6ō čŅ^øP’vč2 ^^£ō ‰ģ]ĆU‰å‹F™¾1’‰Ć‰Š1ÉQčŅ RP’6ō č¾ƒÄøP’v’6ō č ƒÄ=t ø˜Pø†Pčq’^^‰ģ]ĆU‰å‹F™¾1’‰Ć‰Š1ÉQč‰ RP’6ō čuƒÄøP’v’6ō č ƒÄ=t ø¬PøšPč(’^^‰ģ]ĆU‰å‰ģ]ĆU‰åFP’v’včAƒÄ‹^öG@t’vč‚^‰ģ]ĆU‰åFP’v’6ĪčƒÄ‹ĪöG@t’6ĪčX^‰ģ]ĆU‰åƒģ2‹F‰Fž‹^Š0ä˜ Ąué‹^Š0ä˜=%t’v’vƒF[Š0ä˜PčĀ^^ėĢĒFśĒFųĒFöĘFķ ƒF‹^Š0ä˜=-u ĒFö’’ƒF‹^Š0ä˜=0uĘFķ0ƒF‹^Š0ä˜=0|.‹^Š0ä˜=9!‹^Š0ä˜-0÷föPø ÷fś[Ɖ^śƒFėŋ^Š0ä˜=.u<ƒF‹^Š0ä˜=0|+‹^Š0ä˜=9‹^Š0ä˜-0Pø ÷fų[Ɖ^ųƒFėȋ^Š0ä˜PéÕƒFž‹^ž‹Gž™‰Fņ‰VōĒFü éĆƒFž‹^ž‹Gž™‰Fņ‰Vō¹»‹Fņ’vōč»[%’’ćS¹»č©‰FņFōĒFü 郃Fž‹^ž‹Gž™‰Fņ‰Vō‹Fņ‹^ō-ƒŪu!ĄtC Ū}'¹»‹Fņ’vōčd[%’’ćS¹»čR‰FņFōĒFüé,ƒFž‹^ž‹Gž™‰Fņ‰Vō‹Fņ‹^ō-ƒŪu!ĄtC Ū}'¹»‹Fņ’vōč [%’’ćS¹»čū‰FņFōĒFüéՃFž‹^ž‹Gü’wž‰FņFōĒFü 麃Fž‹^ž‹Gü’wž‰FņFōĒFü韃Fž‹^ž‹Gü’wž‰FņFōĒFü鄃Fž‹^ž‹GžˆFńŠFń0䘒vPčz^^ƒFéżƒFž‹^ž‹Gž‰Fī’v’vīčį^PŠFķ0ä˜P’vų’vś’vīčŽƒÄ ƒFéJż’vø%Pč2^^’v’vƒF[Š0ä˜Pč^^é%ż¾ōZéFįP’vü’vō’vņč1ƒÄ’vFįPčy^PŠFķ0ä˜P’vų’vśFįPč%ƒÄ ƒFéįü‰ģ]ĆU‰åƒģĒFš‹F‹^-ƒŪu Ć Ūu‹^ Ę0‹F @‰Ćʉģ]ƃ~ u-‹F‹^-ƒŪu!ĄtC Ū}‹^‹F÷Ų÷Ū‰^‰F’FšĒFīƒ~ī } ‹vīĘBō’FīėīĒFīƒ~ u<’v’v1ĄPø PčI‹vīˆRō‹vīŠBō0䘙‹^‹N)ĆŃQS1ĄPø Pč?‰F‰Nƒ~u;¹»‹F’vč’[%ć‹vīˆBō¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^ƒ~u;¹»‹F’vč¾[%ć‹vīˆBō¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^’Fī‹F‹^-ƒŪu Ć Ūté"’ĒFņ‹FīH‰Fģƒ~ģ|`‹vģŠBō0ä˜ Ąuƒ~ņu ‹vģĘBō ė?‹vģŠBō0ä˜= }‹vģZō‰^ź‹^źŠ0ä˜0ˆė‹vģZō‰^ź‹^źŠ0ä˜7ˆ’Fņ’Nģ뚃~štø-PFōP’vī’Fī[XĆXˆ‹FīH‰Fģƒ~ģ|‹vģ‹^ ŠBōˆƒF ’Nģėę‹^ ʉģ]ĆU‰åPP‹F ‰Fžƒ~~‹F9F ~‹F‰Fž‹Fž‰Füƒ~~‹Fž9F~’NŠF 0䘒vPču^^ėä‹^Š0ä˜ Ąt#’vž’NžX Ąt’v’vƒF[Š0ä˜PčF^^ėу~}ŠF 0ä˜=0u’vø.Pč'^^’F‹Fü÷Ų9F}’FŠF 0䘒vPč^^ėā‰ģ]ĆU‰åƒģĒFü‹^öGtø’’Péü‹^öGuø’’Péģ‹^öGt#‹^øPFP’7čhƒÄ‰Fž‹^ĒG’Füėd‹^ƒĆ‰^ś‹vś1ĄŠFP’7ƒ[Xˆ‹^ƒĆ‰^ś‹@‰‹^ś?|2‹^öG€u)‹^‹v‹~’w’t’5čƒÄ‰Fž‹^‹v‹G‰D’Füƒ~ütGƒ~ž~ ‹^‹Fž9Gt.ƒ~ž}‹^ƒĆ‰^ś‹ ‰ė‹^ƒĆ‰^ś‹ ‰ø’’Pė‹^ĒG¹»ŠF0äčņPX‰ģ]ĆU‰å’v’vøPøPčŪƒÄ‰ģ]ĆU‰å1ĄPPPPP’vøP1ĄPčƒÄ‰ģ]ĆU‰åPP‹^öGu ‹^öGu1ĄPė`‹^ƒ1ĄPėR‹^‹v‹~’w’t’5čƒÄ‰Fž‹^‹G9Fžu‹^ĒG‹^‹v‹G‰D’vžė‹^ƒĆ‰^ü‹ ‰ø’’PX‰ģ]ĆU‰å1ĄPPPPP’vøPøPčįƒÄ‰ģ]ĆU‰åP‹^‰ü(‹^‰)‹^‰)‹^ ‰ž(øPøPčI^^‰Fžƒ~žt‹Fž™RPė’6)’6)XZ‰ģ]ĆU‰å’v’vøPøP趃ĉģ]ĆU‰åP1ĄPP’vP’v’vøPøPčVƒÄ‰Fž‹Fž‰ģ]ĆU‰åPĒFž’vƒF[Š0ä˜ Ąt’Fžėź‹Fž‰ģ]ĆU‰å1ĄPP’vP’v’vøPøPčƒÄ‰ģ]ĆU‰å‹^‰ü(‹^ ‰ž(‹^ ‰)‹^‰)‹^‰)‹^‰)’v’včd^^‰ģ]ĆU‰åPP’v č˜^‰Fž‹^ž‰ü(‹^‰ž(‹^ ‰)ĒFü)ƒ~ž ’vž’NžX Ąt’v ƒF [‹vüŠˆƒFüėą’v’vč^^‰ģ]ĆU‰åP‹^‰ś(øų(P’vča^^‰Fžƒ~žt’vžėƒ>ś(}‹ś(÷Ū‰ö(ø’’Pė’6ś(X‰ģ]ĆU‰åPĒFž’vƒF[Š0ä˜ Ąt’Fžėź‹Fž@‰ģ]ùė ¹ė¹ėU‰å‹F‹^Ķ ]Ć­“­‘I|­9Š­u÷“…Ūuč”’ć_9Ėtƒūt ƒūuƒłu Z’ēƒłu1ŅR’ēPčhU‰åW)’‹V ‹F‹^‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×č…’t÷Ś÷؃Ś_]‰ŃĀ…Ūu‰Ć‰Š)Ņ÷ń“÷ń‰Ń‰Ś)ŪĆUWV)’„’u&GWˆßˆėˆĶ(É‰ĶˆÅ(ɈąˆŌˆņ(öRPQ‰é9Śr ø’’ė WWRP‰Š)Ņ÷ó‰Å÷į_)ĒƒŅ‰Ö‰Ų÷嚃Ņ^)ʃŅX)Šy MĻŽėō‰ł‰ó_…’tˆéˆŻˆūˆĒ‰č)Ņ^_]Ć÷ę‰Į‰ų÷ćĮ‰š÷ćŹĆ‰ę‹\‹D™9Āu1!Ņ}÷Ūt)1Ņ‹L‹D!Ą}÷Ų÷ŁŠ÷ó‘÷ó1ۃ|}÷Ū÷ڃŪ‰Ē1Ū!’}÷ß÷\ߋD‹T!Ņ}÷Ś÷ŲڹŃąŃŅŃÓ9ßwr»9Tvāķė¹+Tū@āć미ėø3ėøJėøaėøxė øŽėø„ė»SPøPččuūU‰åĒ)‹^‰)‹^‰)‹^‰)ø)PøPø»)¹Ķ ‰ģ]Ć$,4< kernelmm fs init fsck seven file names expected. ----- ----- Operating system size %29D %5X Total size including fsck is %D. can't open read error on file can't open separate I & D but text size not multiple of 16 bytes. File: %s text=%5u data=%5u bss=%5u tot=%5u hex=%4x %s Separate I & Dread error on file file header too short: bad header length. File: header too short: MINIX is not multiple of 16 byteskernel data space: no magic #mm data space: no magic #fs data space: no magic #Build: %s%s block read errorblock write errorö$ö$Bö ö ®øĀŅ D)ODX_czd"o{su;xŅError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow /* This program takes the previously compiled and linked pieces of the * operating system, and puts them together to build a boot diskette. * The files are read and put on the boot diskette in this order: * * bootblok: the diskette boot program * kernel: the operating system kernel * mm: the memory manager * fs: the file system * init: the system initializer * fsck: the file system checker * * The bootblok file goes in sector 0 of the boot diskette. The operating system * begins directly after it. The kernel, mm, fs, init, and fsck are each * padded out to a multiple of 16 bytes, and then concatenated into a * single file beginning 512 bytes into the file. The first byte of sector 1 * contains executable code for the kernel. There is no header present. * * After the boot image has been built, build goes back and makes several * patches to the image file or diskette: * * 1. The last 4 words of the boot block are set as follows: * Word at 504: Number of sectors to load * Word at 506: DS value for running fsck * Word at 508: PC value for starting fsck * Word at 510: CS value for running fsck * * 2. Build writes a table into the first 8 words of the kernel's * data space. It has 4 entries, the cs and ds values for each * program. The kernel needs this information to run mm, fs, and * init. Build also writes the kernel's DS value into address 4 * of the kernel's TEXT segment, so the kernel can set itself up. * * 3. The origin and size of the init program are patched into bytes 4-9 * of the file system data space. The file system needs this * information, and expects to find it here. * * Build is called by: * * build bootblok kernel mm fs init fsck image * * to get the resulting image onto the file "image". */ #define PROGRAMS 5 /* kernel + mm + fs + init + fsck = 5 */ #define PROG_ORG 1536 /* where does kernel begin in abs mem */ #define DS_OFFSET 4L /* position of DS written in kernel text seg */ #define SECTOR_SIZE 512 /* size of buf */ #define READ_UNIT 512 /* how big a chunk to read in */ #define KERNEL_D_MAGIC 0x526F /* identifies kernel data space */ #define FS_D_MAGIC 0xDADA /* identifies fs data space */ #define CLICK_SHIFT 4 #define KERN 0 #define MM 1 #define FS 2 #define INIT 3 #define FSCK 4 /* Information about the file header. */ #define HEADER1 32 /* short form header size */ #define HEADER2 48 /* long form header size */ #define SEP_POS 1 /* tells where sep I & D bit is */ #define HDR_LEN 2 /* tells where header length is */ #define TEXT_POS 0 /* where is text size in header */ #define DATA_POS 1 /* where is data size in header */ #define BSS_POS 2 /* where is bss size in header */ #define SEP_ID_BIT 0x20 /* bit that tells if file is separate I & D */ #ifdef MSDOS # define BREAD 4 /* value 0 means ASCII read */ #else # define BREAD 0 #endif int image; /* file descriptor used for output file */ int cur_sector; /* which 512-byte sector to be written next */ int buf_bytes; /* # bytes in buf at present */ char buf[SECTOR_SIZE]; /* buffer for output file */ char zero[SECTOR_SIZE]; /* zeros, for writing bss segment */ long cum_size; /* Size of kernel+mm+fs+init */ long all_size; /* Size of all 5 programs */ struct sizes { unsigned text_size; /* size in bytes */ unsigned data_size; /* size in bytes */ unsigned bss_size; /* size in bytes */ int sep_id; /* 1 if separate, 0 if not */ } sizes[PROGRAMS]; char *name[] = {"\nkernel", "mm ", "fs ", "init ", "fsck "}; main(argc, argv) int argc; char *argv[]; { /* Copy the boot block and the 5 programs to the output. */ int i; if (argc != PROGRAMS+3) pexit("seven file names expected. ", ""); IOinit(); /* check for DMAoverrun (DOS) */ create_image(argv[7]); /* create the output file */ /* Go get the boot block and copy it to the output file or diskette. */ copy1(argv[1]); /* Copy the 5 programs to the output file or diskette. */ for (i = 0; i < PROGRAMS; i++) copy2(i, argv[i+2]); flush(); printf(" ----- -----\n"); #ifdef PCIX printf("Operating system size %29ld %5lx\n", cum_size, cum_size); printf("\nTotal size including fsck is %ld.\n", all_size); #else printf("Operating system size %29D %5X\n", cum_size, cum_size); printf("\nTotal size including fsck is %D.\n", all_size); #endif /* Make the three patches to the output file or diskette. */ patch1(all_size); patch2(); patch3(); exit(0); } copy1(file_name) char *file_name; { /* Copy the specified file to the output. The file has no header. All the * bytes are copied, until end-of-file is hit. */ int fd, bytes_read; char inbuf[READ_UNIT]; if ( (fd = open(file_name, BREAD)) < 0) pexit("can't open ",file_name); do { bytes_read = read(fd, inbuf, READ_UNIT); if (bytes_read < 0) pexit("read error on file ", file_name); if (bytes_read > 0) wr_out(inbuf, bytes_read); } while (bytes_read > 0); flush(); close(fd); } copy2(num, file_name) int num; /* which program is this (0 - 4) */ char *file_name; /* file to open */ { /* Open and read a file, copying it to output. First read the header, * to get the text, data, and bss sizes. Also see if it is separate I & D. * write the text, data, and bss to output. The sum of these three pieces * must be padded upwards to a multiple of 16, if need be. The individual * pieces need not be multiples of 16 bytes, except for the text size when * separate I & D is in use. The total size must be less than 64K, even * when separate I & D space is used. */ int fd, sepid, bytes_read, count; unsigned text_bytes, data_bytes, bss_bytes, tot_bytes, rest, filler; unsigned left_to_read; char inbuf[READ_UNIT]; if ( (fd = open(file_name, BREAD)) < 0) pexit("can't open ", file_name); /* Read the header to see how big the segments are. */ read_header(fd, &sepid, &text_bytes, &data_bytes, &bss_bytes, file_name); /* Pad the total size to a 16-byte multiple, if needed. */ if (sepid && ((text_bytes % 16) != 0) ) { pexit("separate I & D but text size not multiple of 16 bytes. File: ", file_name); } tot_bytes = text_bytes + data_bytes + bss_bytes; rest = tot_bytes % 16; filler = (rest > 0 ? 16 - rest : 0); bss_bytes += filler; tot_bytes += filler; if (num < FSCK) cum_size += tot_bytes; all_size += tot_bytes; /* Record the size information in the table. */ sizes[num].text_size = text_bytes; sizes[num].data_size = data_bytes; sizes[num].bss_size = bss_bytes; sizes[num].sep_id = sepid; /* Print a message giving the program name and size, except for fsck. */ if (num < FSCK) { printf("%s text=%5u data=%5u bss=%5u tot=%5u hex=%4x %s\n", name[num], text_bytes, data_bytes, bss_bytes, tot_bytes, tot_bytes, (sizes[num].sep_id ? "Separate I & D" : "")); } /* Read in the text and data segments, and copy them to output. */ left_to_read = text_bytes + data_bytes; while (left_to_read > 0) { count = (left_to_read < READ_UNIT ? left_to_read : READ_UNIT); bytes_read = read(fd, inbuf, count); if (bytes_read < 0) pexit("read error on file ", file_name); if (bytes_read > 0) wr_out(inbuf, bytes_read); left_to_read -= count; } /* Write the bss to output. */ while (bss_bytes > 0) { count = (bss_bytes < SECTOR_SIZE ? bss_bytes : SECTOR_SIZE); wr_out(zero, count); bss_bytes -= count; } close(fd); } read_header(fd, sepid, text_bytes, data_bytes, bss_bytes, $&'()*+,-./01file_name) int fd, *sepid; unsigned *text_bytes, *data_bytes, *bss_bytes; char *file_name; { /* Read the header and check the magic number. The standard Monix header * consists of 8 longs, as follows: * 0: 0x04100301L (combined I & D space) or 0x04200301L (separate I & D) * 1: 0x00000020L (stripped file) or 0x00000030L (unstripped file) * 2: size of text segments in bytes * 3: size of initialized data segment in bytes * 4: size of bss in bytes * 5: 0x00000000L * 6: total memory allocated to program (text, data and stack, combined) * 7: 0x00000000L * The longs are represented low-order byte first and high-order byte last. * The first byte of the header is always 0x01, followed by 0x03. * The header is followed directly by the text and data segments, whose sizes * are given in the header. */ long head[12]; unsigned short hd[4]; int n, header_len; /* Read first 8 bytes of header to get header length. */ if ((n = read(fd, hd, 8)) != 8) pexit("file header too short: ", file_name); header_len = hd[HDR_LEN]; if (header_len != HEADER1 && header_len != HEADER2) pexit("bad header length. File: ", file_name); /* Extract separate I & D bit. */ *sepid = hd[SEP_POS] & SEP_ID_BIT; /* Read the rest of the header and extract the sizes. */ if ((n = read(fd, head, header_len - 8)) != header_len - 8) pexit("header too short: ", file_name); *text_bytes = (unsigned) head[TEXT_POS]; *data_bytes = (unsigned) head[DATA_POS]; *bss_bytes = (unsigned) head[BSS_POS]; } wr_out(buffer, bytes) char buffer[READ_UNIT]; int bytes; { /* Write some bytes to the output file. This procedure must avoid writes * that are not entire 512-byte blocks, because when this program runs on * MS-DOS, the only way it can write the raw diskette is by using the system * calls for raw block I/O. */ int room, count, count1; register char *p, *q; /* Copy the data to the output buffer. */ room = SECTOR_SIZE - buf_bytes; count = (bytes <= room ? bytes : room); count1 = count; p = &buf[buf_bytes]; q = buffer; while (count--) *p++ = *q++; /* See if the buffer is full. */ buf_bytes += count1; if (buf_bytes == SECTOR_SIZE) { /* Write the whole block to the disk. */ write_block(cur_sector, buf); clear_buf(); } /* Is there any more data to copy. */ if (count1 == bytes) return; bytes -= count1; buf_bytes = bytes; p = buf; while (bytes--) *p++ = *q++; } flush() { if (buf_bytes == 0) return; write_block(cur_sector, buf); clear_buf(); } clear_buf() { register char *p; for (p = buf; p < &buf[SECTOR_SIZE]; p++) *p = 0; buf_bytes = 0; cur_sector++; } patch1(all_size) long all_size; { /* Put the ip and cs values for fsck in the last two words of the boot blk. * If fsck is sep I&D we must also provide the ds-value (addr. 506). * Put in bootblok-offset 504 the number of sectors to load. */ long fsck_org; unsigned short ip, cs, ds, ubuf[SECTOR_SIZE/2], sectrs; if (cum_size % 16 != 0) pexit("MINIX is not multiple of 16 bytes", ""); fsck_org = PROG_ORG + cum_size; /* where does fsck begin */ ip = 0; cs = fsck_org >> CLICK_SHIFT; if (sizes[FSCK].sep_id) ds = cs + (sizes[FSCK].text_size >> CLICK_SHIFT); else ds = cs; /* calc nr of sectors to load (starting at 0) */ sectrs = (unsigned) (all_size / 512L); read_block(0, ubuf); /* read in boot block */ ubuf[(SECTOR_SIZE/2) - 4] = sectrs + 1; ubuf[(SECTOR_SIZE/2) - 3] = ds; ubuf[(SECTOR_SIZE/2) - 2] = ip; ubuf[(SECTOR_SIZE/2) - 1] = cs; write_block(0, ubuf); } patch2() { /* This program now has information about the sizes of the kernel, mm, fs, and * init. This information is patched into the kernel as follows. The first 8 * words of the kernel data space are reserved for a table filled in by build. * The first 2 words are for kernel, then 2 words for mm, then 2 for fs, and * finally 2 for init. The first word of each set is the text size in clicks; * the second is the data+bss size in clicks. If separate I & D is NOT in * use, the text size is 0, i.e., the whole thing is data. * * In addition, the DS value the kernel is to use is computed here, and loaded * at location 4 in the kernel's text space. It must go in text space because * when the kernel starts up, only CS is correct. It does not know DS, so it * can't load DS from data space, but it can load DS from text space. */ int i, j; unsigned short t, d, b, text_clicks, data_clicks, ds; long data_offset; /* See if the magic number is where it should be in the kernel. */ data_offset = 512L + (long)sizes[KERN].text_size; /* start of kernel data */ i = (get_byte(data_offset+1L) << 8) + get_byte(data_offset); if (i != KERNEL_D_MAGIC) { pexit("kernel data space: no magic #",""); } for (i = 0; i < PROGRAMS - 1; i++) { t = sizes[i].text_size; d = sizes[i].data_size; b = sizes[i].bss_size; if (sizes[i].sep_id) { text_clicks = t >> CLICK_SHIFT; data_clicks = (d + b) >> CLICK_SHIFT; } else { text_clicks = 0; data_clicks = (t + d + b) >> CLICK_SHIFT; } put_byte(data_offset + 4*i + 0L, (text_clicks>>0) & 0377); put_byte(data_offset + 4*i + 1L, (text_clicks>>8) & 0377); put_byte(data_offset + 4*i + 2L, (data_clicks>>0) & 0377); put_byte(data_offset + 4*i + 3L, (data_clicks>>8) & 0377); } /* Now write the DS value into word 4 of the kernel text space. */ if (sizes[KERN].sep_id == 0) ds = PROG_ORG >> CLICK_SHIFT; /* combined I & D space */ else ds = (PROG_ORG + sizes[KERN].text_size) >> CLICK_SHIFT; /* separate */ put_byte(512L + DS_OFFSET, ds & 0377); put_byte(512L + DS_OFFSET + 1L, (ds>>8) & 0377); } patch3() { /* Write the origin and text and data sizes of the init program in FS's data * space. The file system expects to find these 3 words there. */ unsigned short init_text_size, init_data_size, init_buf[SECTOR_SIZE/2], i; unsigned short w0, w1, w2; int b0, b1, b2, b3, b4, b5, mag; long init_org, fs_org, fbase, mm_data; init_org = PROG_ORG; init_org += sizes[KERN].text_size+sizes[KERN].data_size+sizes[KERN].bss_size; mm_data = init_org - PROG_ORG +512L; /* offset of mm in file */ mm_data += (long) sizes[MM].text_size; init_org += sizes[MM].text_size + sizes[MM].data_size + sizes[MM].bss_size; fs_org = init_org - PROG_ORG + 512L; /* offset of fs-text into file */ fs_org += (long) sizes[FS].text_size; init_org += sizes[FS].text_size + sizes[FS].data_size + sizes[FS].bss_size; init_text_size = sizes[INIT].text_size; init_data_size = sizes[INIT].data_size + sizes[INIT].bss_size; init_org = init_org >> CLICK_SHIFT; /* convert to clicks */ if (sizes[INIT].sep_id == 0) { init_data_size += init_text_size; init_text_size = 0; } init_text_size = init_text_size >> CLICK_SHIFT; init_data_size = init_data_size >> CLICK_SHIFT; w0 = (unsigned short) init_org; w1 = init_text_size; w2 = init_data_size; b0 = w0 & 0377; b1 = (w0 >> 8) & 0377; b2 = w1 & 0377; b3 = (w1 >> 8) & 0377; b4 = w2 & 0377; b5 = (w2 >> 8) & 0377; /* Check for appropriate magic numbers. */ fbase = fs_org; mag = (get_byte(mm_data+1L) << 8) + get_byte(mm_data+0L); if (mag != FS_D_MAGIC) pexit("mm data space: no magic #",""); mag = (get_byte(fbase+1L) << 8) + get_byte(fbase+0L); if (mag != FS_D_MAGIC) pexit("fs data space: no magic #",""); put_byte(fbase+4L, b0); put_byte(fbase+5L, b1); put_byte(fbase+6L, b2); put_byte(fbase+7L, b3); put_byte(fbase+8L ,b4); put_byte(fbase+9L, b5); } int get_byte(offset) long offset; { /* Fetch one byte from the output file. */ char buff[SECTOR_SIZE]; read_block( (unsigned) (offset / SECTOR_SIZE), buff); return(buff[(unsigned) (offset % SECTOR_SIZE)] & 0377); } put_byte(offset, byte_value) long offset; int byte_value; { /* Write one byte into the output file. This is not very efficient, but * since it is only called to write a few words it is just simpler. */ char buff[SECTOR_SIZE]; read_block( (unsigned) (offset/SECTOR_SIZE), buff); buff[(unsigned) (offset % SECTOR_SIZE)] = byte_value; write_block( (unsigned)(offset/SECTOR_SIZE), buff); } pexit(s1, s2) char *s1, *s2; { printf("Build: %s%s\n", s1, s2); exit(1); } /*=========================================================================== * The following code is only used in the UNIX version of this program. *===========================================================================*/ #ifndef MSDOS create_image(f) char *f; { /* Create the output file. */ image = creat(f, 0666); close(image); image = open(f, 2); } read_block(blk, buff) int blk; char buff[SECTOR_SIZE]; { lseek(image, (long)SECTOR_SIZE * (long) blk, 0); if (read(image, buff, SECTOR_SIZE) != SECTOR_SIZE) pexit("block read error", ""); } write_block(blk, buff) int blk; char buff[SECTOR_SIZE]; { lseek(image, (long)SECTOR_SIZE * (long) blk, 0); if (write(image, buff, SECTOR_SIZE) != SECTOR_SIZE) pexit("block write error", ""); } IOinit() {} /* dummy */ #else /*MSDOS*/ /*=========================================================================== * This is the raw diskette I/O for MSDOS. It uses diskio.asm or biosio.asm *==========================================================================*/ #define MAX_RETRIES 5 char *buff; char buff1[SECTOR_SIZE]; char buff2[SECTOR_SIZE]; int drive; IOinit() /* check if no DMAoverrun & assign the buffer */ { if (DMAoverrun(buff1)) buff = buff2; else buff = buff1; } read_block (blocknr,user) int blocknr; char user[SECTOR_SIZE]; { /* read the requested MINIX-block in core */ int retries,err,i; char *p; retries = MAX_RETRIES; do err = absread (drive, blocknr, buff); while (err && --retries); if (!retries) dexit ("reading",drive,blocknr,err); p=buff; i=SECTOR_SIZE; while (i--) *(user++) = *(p++); } write_block (blocknr,user) int blocknr; char user[SECTOR_SIZE]; { /* write the requested MINIX-block to disk */ int retries,err,i; char *p; p=buff; i=SECTOR_SIZE; while (i--) *(p++) = *(user++); retries = MAX_RETRIES; do err = abswrite (drive, blocknr, buff); while (err && --retries); if (!retries) dexit ("writing",drive,blocknr,err); } dexit (s,drive,sectnum,err) int sectnum, err,drive; char *s; { extern char *derrtab[]; printf ("Error %s drive %c, sector: %d, code: %d, %s\n", s, drive+'A',sectnum, err, derrtab[err] ); exit (2); } create_image (s) char *s; { char kbstr[10]; if (s[1] != ':') pexit ("wrong drive name (dos): ",s); drive = (s[0] & ~32) - 'A'; if (drive<0 || drive>32) pexit ("no such drive: ",s); printf("Put a blank, formatted diskette in drive %s\nHit return when ready",s); gets (kbstr,10); puts(""); } char *derrtab[14] = { "no error", "disk is read-only", "unknown unit", "device not ready", "bad command", "data error", "internal error: bad request structure length", "seek error", "unknown media type", "sector not found", "printer out of paper (??)", "write fault", "read error", "general error" }; #endif /*MSDOS*/ É_name ® _name: Ā_1 Ā_2 Ā_3 Ā_4 Ā_5 É_main † _main: ƒ ‚ € ĶÅ,#8 je I0013 Ąį_7 € Ąį_6 € Ó_pexit Š Š • Ó_IOinit Æ Į14Ē Ó_create_image Š Æ Į2Ē Ó_copy1 Š ¼ I0018: ĶĘ,#5 jge I0015 — sal į1 Äį4 » ÄåĪ ĮĒ ” Ó_copy2 Š Š ÜĘ ĢI0018 I0015: Ó_flush Ąį_8 € Ó_printf Š Į_cum_ļze+2 Į_cum_ļze Į_cum_ļze+2 Į_cum_ļze Ąį_9 € Ó_printf Äņ,#10 Į_all_ļze+2 Į_all_ļze Ąį_10 € Ó_printf ¤ Į_all_ļze+2 Į_all_ļze Ó_patch1 Š Š Ó_patch2 Ó_patch3 ‡ € Ó_exit Š … „  É_copy1 _copy1: ƒ ‚ ×ņ,#516 ‡ € ˆ Ó_open Š Š ” ĶĘö jge I0027 ˆ Ąį_11 € Ó_pexit Š Š I0027: Ąį512 € Ūä-51Ī € ” Ó_read ¤ ¬ ĶĻö jge I0029 ˆ Ąį_12 € Ó_pexit Š Š I0029: ĶĻö jle I0026 ¹ Ūä-51Ī € Ó_wr_out Š Š I0026: ĶĻö jg I0027 Ó_flush ” Ó_close Š … „  É_copy2 _copy2: ƒ ‚ ×ņ,#544 ‡ € “ Ó_open Š Š ” ĶĘö jge I0033 “ Ąį_13 € Ó_pexit Š Š I0033: “ Ūä-1Å € Ūä-12(ń) € Ūä-10(ń) € ŪäĻ € ” Ó_read_header Äņ,#12 ĶĻö je I0036 Ąā16 Ąä-10(ń) Ėēī šv ģ or ēī je I0036 “ Ąį_14 € Ó_pexit Š Š I0036: Ąä-12(ń) Ää-10(ń) Ää-1Å Ą-1Ī,ė Ąā16 Ąä-1Ī Ėēī šv ģ Ą-1Ō,ī Ķ-1Ōö jbe I003A 6 ×ä-1Ō € ĢI003B I003A: ‡ € I003B: Ć-20(ń) Ąä-1Å Ää-20(ń) Ą-1Å,ė Ąä-1Ī Ää-20(ń) Ą-1Ī,ė ĶÅ,#4 jge I003D Ąć4 Ąā4 Ąä_cum_ļze Į_cum_ļze+2 – Ėåģ Ćķ Ää-1Ī adc ęģ Įķ Ąć4 Ąā4 – Ą_cum_ļze,ė Ć_cum_ļze+2 I003D: Ąć4 Ąā4 Ąä_all_ļze Į_all_ļze+2 – Ėåģ Ćķ Ää-1Ī adc ęģ Įķ Ąć4 Ąā4 – Ą_all_ļze,ė Ć_all_ļze+2 Ąć3 ¢ sal äcl » Ąä-10(ń) Ą_ļzesĒ,ė ¢ sal äcl » Ąä-12(ń) Ą_ļzes+2Ē,ė ¢ sal äcl » Ąä-1Å Ą_ļzes+4Ē,ė ¢ sal äcl » £ Ą_ļzes+6Ē,ė ĶÅ,#4 jge I00310 Ąć3 ¢ sal äcl » Ķ_ļzes+6Ēö je I00313 Ąį_16 € ĢI00314 I00313: Ąį_17 € I00314: ¢ sal į1 » Į-1Ī Į-1Ī Į-1Å Į-12(ń) Į-10(ń) Į_nameĒ Ąį_15 € Ó_printf ‘ I00310: Ąä-12(ń) Ää-10(ń) Ą-22(ń),ė I00316: Ķ-22(ń)ö jbe I00322 Ķ-22(ń),#512 jae I00319 Į-22(ń) ĢI0031A I00319: Ąį512 € I0031A:  ž  – ĄŲ,ė ĮŲ Ūä-53Å € ” Ó_read ¤ ĄŠ,ė ĶŠö jge I0031C “ Ąį_18 € Ó_pexit Š Š I0031C: ĶŠö jle I0031F ĮŠ Ūä-53Å € Ó_wr_out Š Š I0031F:  ž ĄäŲ Į-22(ń) – ‰ ×åė Ą-22(ń),ģ ĢI00316 I00322: Ķ-1Åö jbe I00321 Ķ-1Å,#512 jae I00325 Į-1Å ĢI00326 I00325: Ąį512 € I00326:  ž  – ĄŲ,ė ĮŲ Ąį_zero € Ó_wr_out Š Š  ž ĄäŲ Į-1Å – ‰ ×åė Ą-1Å,ģ ĢI00322 I00321: ” Ó_close Š … „  É_read_header _read_header: ƒ ‚ ×ņ,#60 Ąį8 € Ūä-5Ī € ˆ Ó_read ¤ Ą-5Ō,ė Ķ-5Ō,#8 je I0043 Į1Å Ąį_19 € Ó_pexit Š Š I0043:  ž Ąä-52(ń) – Ą-60(ń),ė Ķ-60(ń),#32 je I0046 Ķ-60(ń),#48 je I0046 Į1Å Ąį_20 € Ó_pexit Š Š I0046: Ąä-5Å Öį32  ž – Æ ° Ąä-60(ń) ×į8 € Ūä-4Ō € ˆ Ó_read ¤ Ą-5Ō,ė Ąä-60(ń) ×į8 Ķ-5Ō,ė je I004A Į1Å Ąį_21 € Ó_pexit Š Š I004A: Ąä-4Ō › ° Ąä-4Å Ąå10(ń) ° Ąä-40(ń) Ąå12(ń) ° … „  É_wr_out _wr_out: ƒ ‚ ×ņ,#14 Ąį512 ×ä_buf_bytes ” — ĶĪ,ė jg I0053 “ ĢI0054 I0053: ” I0054: ĆĻ £ ĄŠ,ė Ąå_buf_bytes Äā_buf ĄŲ,ģ ¢ Ą-10(ń),ė I0056: ¹ óĻ  ™ je I0055 Į-10(ń) Ä-10(ń),#1 ‰ ĄčŲ Œ Ź(ļ),al ÄŲ,#1 ĢI0056 I0055: ĄäŠ Ä_buf_bytes,ė Ķ_buf_bytes,#512 ŁI0059 Ąį_buf € Į_cur_sector Ó_write_block Š Š Ó_clear_buf I0059: ĄäĪ ĶŠ,ė ŁI005C … „  I005C: ĄäĪ ×äŠ ĄĪ,ė Æ Ą_buf_bytes,ģ ĄŲ,#_buf I005F: “ óĪ  ™ je I005E Į-10(ń) Ä-10(ń),#1 ‰ ĄčŲ Œ Ź(ļ),al ÄŲ,#1 ĢI005F I005E: … „  É_flush _flush: ƒ ‚ Ķ_buf_bytesö ŁI0063 … „  I0063: Ąį_buf € Į_cur_sector Ó_write_block Š Š Ó_clear_buf … „  É_clear_buf _clear_buf: ƒ ‚ € ĄĘ,#_buf I0075: ĶĘ,#_buf+512 jae I0072 § ŹĒö ÄĘ,#1 ĢI0075 I0072: Ą_buf_bytesö Ü_cur_sector … „  É_patch1 _patch1: ƒ ‚ ×ņ,#524 Į_cum_ļze+2 Į_cum_ļze ‡ € 6 € Ó.rmi4 ×ē#0 sbb ā0 Ł1f or åī 1: or åģ je I0083 Ąį_23 € Ąį_22 € Ó_pexit Š Š I0083: Ąå_cum_ļze Ąę_cum_ļze+2 Äā1536 adc ć0 ĄĻ,ģ ĄĘ,ķ ĄŠö Ąć4 £ § © 2: sar ā1 rcr į1 Ø 1: ĄŲ,ė Ķ_ļzes+38ö je I0086 Ąć4 Ąå_ļzes+32 shr åcl ÄåŲ Ą-10(ń),ģ ĢI0087 I0086: ĄäŲ Ą-10(ń),ė I0087: “ ˆ ‡ € Ąį512 € Ó.dvi4 Ą-524(ń),ė Ūä-522(ń) € ‡ € Ó_read_block Š Š Ąä-52Å Äį1 Ą-1Ō,ė Ąä-10(ń) Ą-1Ī,ė ĄäŠ Ą-1Å,ė ĄäŲ Ą-12(ń),ė Ūä-522(ń) € ‡ € Ó_write_block Š Š … „  É_patch2 _patch2: ƒ ‚ ×ņ,#20 ‡ Ąå_ļzes Äā512 adc į0 Ą-20(ń),ģ Ą-1Ō,ė Ąä-20(ń) Ąå-1Ō Äį1 adc ā0 ¦ € Ó_get_byte Š Š Ąć8 sal äcl € Į-1Ō Į-20(ń) Ó_get_byte Š Š ‰ Äåė ĄĘ,ģ  ž — – Ķį21103 je I0093 Ąį_25 € Ąį_24 € Ó_pexit Š Š I0093: ¼ I0098: ĶĘ,#4 jge I0095 Ąć3 — sal äcl » Ąä_ļzesĒ ĄŠ,ė — sal äcl » Ąä_ļzes+2Ē ĄŲ,ė — sal äcl » Ąä_ļzes+4Ē Ą-10(ń),ė — sal äcl » Ķ_ļzes+6Ēö je I009A Ąć4 ĄäŠ shr äcl Ą-12(ń),ė Ąä-10(ń) ÄäŲ shr äcl Ą-1Å,ė ĢI009B I009A: Ą-12(ń)ö ĄäŲ ÄäŠ Ää-10(ń) Ąć4 shr äcl Ą-1Å,ė I009B: Ėęķ Ąä-12(ń) shr äcl „  § sal åcl € Ąäģ cwd Ää-20(ń) adc ē-1Ō œ € Ó_put_byte ¤ Ąć8 Ąä-12(ń) shr äcl „  § sal åcl € Ąäģ cwd Ää-20(ń) adc ē-1Ō Äį1 adc ē#0 œ € Ó_put_byte ¤ Ėęķ Ąä-1Å shr äcl „  § sal åcl € Ąäģ cwd Ää-20(ń) adc ē-1Ō Äį2 adc ē#0 œ € Ó_put_byte ¤ Ąć8 Ąä-1Å shr äcl „  § sal åcl € Ąäģ cwd Ää-20(ń) adc ē-1Ō Äį3 adc ē#0 Įdx € Ó_put_byte ¤ ÜĘ ĢI0098 I0095: Ķ_ļzes+6ö ŁI009D Ą-1Ī,#96 ĢI009E I009D: Ąå_ļzes Äā1536 Ąć4 shr åcl Ą-1Ī,ģ I009E: Ąä-1Ī „ € ‡ € Ąį516 € Ó_put_byte ¤ Ąć8 Ąä-1Ī shr äcl „ € ‡ € Ąį517 € Ó_put_byte ¤ … „  É_patch3 _patch3: ƒ ‚ ×ņ,#566 Ą-542(ń),#1536 Ą-540(ń)ö Ąć4 Ąā4 Ąä-542(ń) Į-540(ń) – Ąå_ļzes+2 Äå_ļzes Äå_ļzes+4 Ėęķ Ćī Ääģ adc ēķ Ąć4 Ąā4 œ – Ą-542(ń),ė Ć-540(ń) Ąä-542(ń) Ąå-540(ń) ×į1024 sbb ā0 Ą-55Å,ė Ą-552(ń),ģ ‡ Ąå-55Å Ąę-552(ń) Äå_ļzes+8 adc ęė Ą-55Å,ģ Ą-552(ń),ķ Ąć4 Ąā4 Ąä-542(ń) Į-540(ń) – Ąå_ļzes+10 Äå_ļzes+8 Äå_ļzes+12 Ėęķ Ćī Ääģ adc ēķ Ąć4 Ąā4 œ – Ą-542(ń),ė Ć-540(ń) Ąä-542(ń) Ąå-540(ń) ×į1024 sbb ā0 Ą-54Ī,ė Ą-54Å,ģ ‡ Ąå-54Ī Ąę-54Å Äå_ļzes+16 adc ęė Ą-54Ī,ģ Ą-54Å,ķ Ąć4 Ąā4 Ąä-542(ń) Į-540(ń) – Ąå_ļzes+18 Äå_ļzes+16 Äå_ļzes+20 Ėęķ Ćī Ääģ adc ēķ Ąć4 Ąā4 œ – Ą-542(ń),ė Ć-540(ń) Ąå_ļzes+24 ĄĘ,ģ Ąå_ļzes+28 Äå_ļzes+26 ĄĻ,ģ Ąć4 Ąä-542(ń) Ąå-540(ń) © 2: sar ā1 rcr į1 Ø 1: Ą-542(ń),ė Ą-540(ń),ģ Ķ_ļzes+30ö ŁI00A3 £ ÄäĘ ¬ ¼ I00A3: Ąć4 — shr äcl ” £ shr äcl ¬ Ąä-542(ń) Ą-520(ń),ė — Ą-522(ń),ė £ Ą-52Å,ė Ąä-520(ń) „  ž call Ś Ą-52Ī,ė Ąć8 Ąä-520(ń) shr äcl „  ž – Ą-52Ō,ė Ąä-522(ń) „  ž – Ą-530(ń),ė Ąć8 Ąä-522(ń) shr äcl „  ž – Ą-532(ń),ė Ąä-52Å „  ž – Ą-53Å,ė Ąć8 Ąä-52Å shr äcl „  ž – Ą-53Ī,ė Ąä-54Ī Ą-550(ń),ė Ąä-54Å Ą-54Ō,ė Ąä-55Å Ąå-552(ń) Äį1 adc ā0 ¦ € Ó_get_byte Š Š Ąć8 sal äcl € Į-552(ń) Į-55Å Ó_get_byte Š Š ‰ Äåė Ą-53Ō,ģ  ž Ąä-53Ō – Ķį56026 je I00A6 Ąį_27 € Ąį_26 € Ó_pexit Š Š I00A6: Ąä-550(ń) Ąå-54Ō Äį1 adc ā0 ¦ € Ó_get_byte Š Š Ąć8 sal äcl € Į-54Ō Į-550(bp) Ó_get_byte Š Š ‰ Äåė Ą-53Ō,ģ  ž Ąä-53Ō – Ķį56026 je I00A9 Ąį_29 € Ąį_28 € Ó_pexit Š Š I00A9: Ąä-550(ń) Ąå-54Ō Äį4 adc ā0 Į-52Ī ¦ € Ó_put_byte ¤ Ąä-550(ń) Ąå-54Ō Äį5 adc ā0 Į-52Ō ¦ € Ó_put_byte ¤ Ąä-550(ń) Ąå-54Ō Äį6 adc ā0 Į-530(ń) ¦ € Ó_put_byte ¤ Ąä-550(ń) Ąå-54Ō Äį7 adc ā0 Į-532(ń) ¦ € Ó_put_byte ¤ Ąä-550(ń) Ąå-54Ō Äį8 adc ā0 Į-53Å ¦ € Ó_put_byte ¤ Ąä-550(ń) Ąå-54Ō Äį9 adc ā0 Į-53Ī ¦ € Ó_put_byte ¤ … „  É_get_byte _get_byte: ƒ ‚ ×ņ,#512 Ūä-512(ń) € “ ˆ ‡ € Ąį512 € Ó.dvi4 € Ó_read_block Š Š Ūä-512(ń) € “ ˆ ‡ € Ąį512 € Ó.rmi4 ‰ Äåī ‡ Œ €  ž  – … „  É_put_byte _put_byte: ƒ ‚ ×ņ,#512 Ūä-512(ń) € “ ˆ ‡ € Ąį512 € Ó.dvi4 € Ó_read_block Š Š ĮŌ Ūä-512(ń) € “ ˆ ‡ € Ąį512 € Ó.rmi4 ‰ Äåī  ŗ Ūä-512(ń) € “ ˆ ‡ € Ąį512 € Ó.dvi4 € Ó_write_block Š Š … „  É_pexit _pexit: ƒ ‚ “ ˆ Ąį_30 € Ó_printf ¤  € Ó_exit Š … „  É_create_image _create_image: ƒ ‚ Ąį438 € ˆ Ó_creat Š Š Ą_image,ė Į_image Ó_close Š “ € ˆ Ó_open Š Š Ą_image,ė … „  É_read_block _read_block: ƒ ‚ ¢ cwd Ąč#512 Ėéš » Ąäī Ėęķ Įķ Ó.mli4 œ € Į_image Ó_lseek Äņ,#8 Ąį512 € “ Į_image Ó_read ¤ Ķį512 je I00F3 Ąį_32 € Ąį_31 € Ó_pexit Š Š I00F3: … „  É_write_block _write_block: ƒ ‚ ¢ cwd Ąč#512 Ėéš » Ąäī Ėęķ Įķ Ó.mli4 œ € Į_image Ó_lseek Äņ,#8 Ąį512 € “ Į_image Ó_write ¤ Ķį512 je I0103 Ąį_34 € Ąį_33 € Ó_pexit Š Š I0103: … „  É_IOinit _IOinit: ƒ ‚ … „  É_ļzes ³ _ļzes: .zerow 40/2 É_all_ļze _all_ļze: .zerow 4/2 É_cum_ļze _cum_ļze: .zerow 4/2 É_zero _zero: .zerow 512/2 É_buf _buf: .zerow 512/2 É_buf_bytes _buf_bytes: .zerow 2/2 É_cur_sector _cur_sector: .zerow 2/2 É_image _image: .zerow 2/2 ® _1: Ā27402 Ā29285 Ā25966 Ā108 _2: Ā28013 ² ² ø _3: Ā29542 ² ² ø _4: Ā28265 Ā29801 ² ø _5: Ā29542 Ā27491 ² ø _6: Ā25971 Ā25974 Ā8302 Ā26982 Ā25964 Ā28192 Ā28001 Ā29541 Ā25888 Ā28792 Ā25445 Ā25972 Ā11876 Ā32 _7: ø _8: ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² ² Ā11552 Ā11565 Ā11565 ² ² Ā11552 Ā11565 Ā11565 Ā10 _9: Ā28751 Ā29285 Ā29793 Ā28265 Ā8295 Ā31091 Ā29811 Ā28005 Ā29472 Ā31337 Ā8293 Ā9504 Ā14642 Ā8260 ² ² Ā13605 Ā2648 ø _10: Ā21514 Ā29807 Ā27745 Ā29472 Ā31337 Ā8293 Ā28265 Ā27747 æ17 Ā28265 Ā8295 Ā29542 Ā27491 Ā26912 Ā8307 Ā17445 Ā2606 ø _11: Ā24931 Ā10094 Ā8308 Ā28783 Ā28261 Ā32 _12: Ā25970 Ā25697 Ā25888 Ā29298 Ā29295 Ā28448 Ā8302 Ā26982 Ā25964 Ā32 _9;<13: Ā24931 Ā10094 Ā8308 Ā28783 Ā28261 Ā32 _14: Ā25971 Ā24944 Ā24946 Ā25972 Ā18720 Ā9760 Ā17440 Ā25120 Ā29813 Ā29728 Ā30821 Ā8308 Ā26995 Ā25978 Ā28192 Ā29807 Ā27936 Ā27765 Ā26996 Ā27760 Ā8293 Ā26223 Ā12576 Ā8246 Ā31074 Ā25972 Ā11891 ² Ā26950 Ā25964 .word 8250 ø _15: Ā29477 ² Ā25972 Ā29816 Ā9533 Ā30005 ² Ā24932 Ā24948 Ā9533 Ā30005 ² Ā29538 Ā15731 Ā13605 Ā8309 Ā29728 Ā29807 Ā9533 Ā30005 ² Ā25960 Ā15736 Ā13349 Ā8312 Ā9504 Ā2675 ø _16: Ā25939 Ā24944 Ā24946 Ā25972 Ā18720 Ā9760 Ā17440 ø _17: ø _18: Ā25970 Ā25697 Ā25888 Ā29298 Ā29295 Ā28448 Ā8302 Ā26982 Ā25964 Ā32 _19: Ā26982 Ā25964 Ā26656 Ā24933 Ā25956 Ā8306 Ā28532 Ā8303 Ā26739 Ā29295 Ā14964 Ā32 _20: Ā24930 Ā8292 Ā25960 Ā25697 Ā29285 Ā27680 Ā28261 Ā29799 Ā11880 Ā17952 Ā27753 Ā14949 Ā32 _21: Ā25960 Ā25697 Ā29285 Ā29728 Ā28527 Ā29472 Ā28520 Ā29810 Ā8250 ø _22: Ā18765 Ā18766 .word 8280 Ā29545 Ā28192 Ā29807 Ā27936 Ā27765 Ā26996 Ā27760 Ā8293 Ā26223 Ā12576 Ā8246 Ā31074 Ā25972 Ā115 _23: ø _24: Ā25963 Ā28274 Ā27749 Ā25632 Ā29793 Ā8289 Ā28787 Ā25441 Ā14949 Ā28192 Ā8303 Ā24941 Ā26983 Ā8291 Ā35 _25: ø _26: Ā28013 Ā25632 Ā29793 Ā8289 Ā28787 Ā25441 Ā14949 Ā28192 Ā8303 Ā24941 Ā26983 Ā8291 Ā35 _27: ø _28: Ā29542 Ā25632 Ā29793 Ā8289 Ā28787 Ā25441 Ā14949 Ā28192 Ā8303 Ā24941 Ā26983 Ā8291 Ā35 _29: ø _30: Ā30018 Ā27753 Ā14948 Ā9504 Ā9587 Ā2675 ø _31: Ā27746 Ā25455 Ā8299 Ā25970 Ā25697 Ā25888 Ā29298 Ā29295 ø _32: ø _33: Ā27746 Ā25455 Ā8299 Ā29303 Ā29801 Ā8293 Ā29285 Ā28530 Ā114 _34: .word 0 .text : Increase default stack size from 2K. b=../commands/bin t=../test chmem =30000 $b/asld chmem =2000 $b/cc chmem =52000 $b/cem chmem =30000 $b/cg chmem =32000 $b/cpdir chmem =40000 $b/cpp chmem =40000 $b/dd chmem =50000 $b/diff chmem =8000 $b/df chmem =32000 $b/dosread chmem =50000 $b/find chmem =50000 $b/fix chmem =8000 $b/grep chmem =8000 $b/gres chmem =64000 $b/libpack chmem =64000 $b/libupack chmem =20000 $b/make chmem =64000 $b/mined chmem =8000 $b/mkdir chmem =16000 $b/mkfs chmem =8000 $b/mv chmem =20000 $b/opt chmem =8000 $b/pr chmem =50000 $b/readfs chmem =8000 $b/rm chmem =8000 $b/rmdir chmem =8000 $b/sh chmem =30000 $b/sort chmem =2000 $b/tail chmem =2000 $b/time chmem =8000 $t/t10a chmem =8000 $t/t11a chmem =8000 $t/t11b for i in 1 2 3 4 5 6 7 8 9 10 do chmem =8000 ../test/test$i done : The default stack size is 1K. The following commands need more. b=../commands/bin t=../test chmem =2000 $b/cc chmem =2000 $b/time chmem =2000 $b/tail chmem =40000 $b/cpp chmem =52000 $b/cem chmem =20000 $b/opt chmem =30000 $b/cg chmem =30000 $b/sort chmem =30000 $b/asld chmem =16000 $b/mkfs chmem =20000 $b/dd chmem =8000 $b/rmdir chmem =8000 $b/mkdir chmem =32000 $b/dosread chmem =20000 $b/make chmem =8000 $b/gres chmem =8000 $b/grep chmem =8000 $b/sh chmem =8000 $b/gres chmem =8000 $b/mv chmem =8000 $b/rm chmem =8000 $b/pr chmem =64000 $b/libpack chmem =64000 $b/libupack chmem =64000 $b/mined chmem =8000 $t/test0 chmem =8000 $t/test1 chmem =8000 $t/test2 chmem =8000 $t/test3 chmem =8000 $t/test4 chmem =8000 $t/test5 chmem =8000 $t/test6 chmem =8000 $t/test7 chmem =8000 $t/test8 chmem =8000 $t/test9 chmem =8000 $t/test10 chmem =8000 $t/test11 chmem =8000 $t/t10a chmem =8000 $t/t11a chmem =8000 $t/t11b chmem =8000 $b/df title 'Diskfix' ; Author: Adri Koppes ; (c) 1986 ; ; ; This program changes all Dos partitions on a winchester ; to Minix partitions. ; It must be called with the drive to change ; (either 0 or 1). SECTOR_SIZE equ 512 ;size of one disk-sector STACK_SIZE equ 256 ;size of stack PR_STRING equ 9 ;function-code to print a string DISK_IO equ 13H ;interrupt-number to do diskio DOS equ 21H ;interrupt-number for doscalls DOS_TYPE equ 1 ;type of dos-partition MINIX_TYPE equ 40H ;type of minix-partition PART_OFFSET equ 01C2H ;offset of partition-table NR_OF_PART equ 4 ;number of partitions PART_LEN equ 10H ;length of partition in bytes dseg segment para public 'data' buf db SECTOR_SIZE dup (?) ;sector buffer drive dw ? ;drive-number to use us_mes db 'Usage: diskfix ( = 0 or 1)',0DH,0AH,'$' rd_mes db 'Error reading partition-table',0DH,0AH,'$' wr_mes db 'Error writing partition-table',0DH,0AH,'$' dseg ends sseg segment stack 'stack' dw STACK_SIZE/2 dup (?) ;stack space sseg ends cseg segment para public 'code' assume cs:cseg,ds:dseg,es:nothing,ss:sseg main proc far ;main program cli ;no interrupts now mov ax,sseg ;setup stack mov ss,ax mov sp,STACK_SIZE sti ;interrupts back on push ds ;setup return to dos mov ax,0 push ax mov ax,ds ;setup data segments mov es,ax mov ax,dseg mov ds,ax call parse ;parse command line push ds pop es call rd_part ;read partition-table from disk jc rd_err ;check if error occurred call change ;change partition types call wr_part ;write partition-table to disk jc wr_err ;check if error occurred jmp done ;exit program usage: mov dx,offset us_mes ;get usage string call print ;and print it add sp,2 ;adjust stack pointer jmp done ;and exit program rd_err: mov dx,offset rd_mes ;get error string call print ;and print it jmp done ;exit program wr_err: mov dx,offset wr_mes ;get error string call print ;and print it done: ret ;exit program main endp ;end of main program print proc near ;procedure to print a string mov ah,PR_STRING ;pointer to the string is in dx int DOS ret print endp rd_part proc near ;procedure to read the partition-table mov ax,0201h ;read one sector mov bx,offset buf ;into buf mov cx,1 ;starting at first sector mov dx,drive ;of `drive' int DISK_IO ;perform diskio ret rd_part endp wr_part proc near ;procedure to write the partition-table mov ax,0301h ;write one sector mov bx,offset buf ;from buf mov cx,1 ;starting at first sector mov dx,drive ;of `drive' int DISK_IO ;perform diskio ret wr_part endp change proc near ;procedure to change partition types mov di,offset buf+PART_OFFSET ;di = pointer to first partition-type mov cx,NR_OF_PART ;cx = number of partitions next: mov al,[di] ;get partition-type cmp al,DOS_TYPE ;is it DOS? jne again ;no, do next mov byte ptr [di],MINIX_TYPE ;yes, change type to MINIX again: add di,PART_LEN ;increment pointer loop next ;do next ret change endp parse proc near ;procedure to parse command line mov al,es:82H ;get one character cmp al,'0' ;is it a 0? jne parse1 ;no, continue mov drive,80H ;set drive to winchester 0 jmp parse2 ;exit procedure parse1: cmp al,'1' ;is it a 1? jne usage ;print a error message mov drive,81H ;set drive to winchester 1 parse2: ret parse endp cseg ends end main  VŁļaė‹&ŅZčėžėžU‰åPčsčo¹‹°eÓćĆņe‰šeƒ0uøPė1ĄPīeĒģeƒ>®e|ƒ>®eE|ĒFžš’ė‹®eŃ拇ŌZ’ЉFžƒ>ģet릒vž’6°ečõ^^ƒ>āet“č+ėŽU‰åPƒ>čeué§ĒFžņe~žņir鋋^ž€=u{‹Fž-ņe»@™÷ū£°e‹^ž’w6¹»XčÅS%’¹»č¹S£®e‹^ž¹‹G6Óų¹»č¢S%’¹»č–S£Īe‹^ž‹_8‰Ōe‹^ž‹_:‰Še‹^žĘG<‹^žĘG=’če‰ģ]ƃFž@ék’ø€Pø VPčČJ^^øŹePøtPč@N^^ Ąt ø€PøĄVPčŖJ^^‹Źe‰°e‹Ģe‰®e‰ģ]ĆU‰å‹^‰“eø²eP’včN^^‰ģ]ĆU‰åƒģč‚čččiĒFüƒ~ü}m¹‹FüÓą‰ĆĆņe‰šeøPøPč24^^‰Fž‹še‹Fž‰G’vžčc7^‹še‹Fž‰G‹šeĒG.‹šeĒG0‹šeĘG2‹šeĘG3‹šeĒ’’ƒFüė‰ģ]ĆU‰åƒģ ĒrlĒvlølĒtlœ¹ĒFžøl~žØ½s5‹^žĒ‡‹^žĒ‡’’‹^žĆ ‹vž‰œ‹^žĆōū‹vž‰œFž ėÄĒŗpĒœ½ĒFžøl~žØ½réČč‹Q¹Óą1Ū‰Fö‰^ų‹Fž‰Fü‹Fü-‰Fś1ĄP»‹Fö’vü’vųčÖQ[YZĮځįā’’1ĄRQP¹»‹Fö’vś’vųč°Q[YZĮځįā’’RQčMQ ĄtN~žøluĒvlÄpĒĘtė9~žœ¹uĒtlµĒ¹ė$‹^ž‹vžĆ ‹“‰œ‹^ž‹vžĆōū‹“‰œFž é.’ĒFžøl~žØ½s‹^ž‹vž‹‡‰„Fž ėä‹vl‰xl‰ģ]ĆU‰åƒģ‹”V‰^ī‹–V‰^ģ‹˜V‰^ź1ĄPøPøPčØ5ƒÄ‰Fžø2P’vžøņ\Pč"GƒÄĒFōņ\‹^ō’w¹»XčĄP=t ø€PøHWPč!H^^‹^ō‹vō’w¹»‹D č™P¹»čP‰ĮXÓą¹»č‚P‰Fś~ś~ ’vśøtWPčßG^^¹»‹Fśč`P¹Óą‰FšøP’vžčź6^^Ē“eB¹»‹Fģč:P£¶e¹»‹Fźč+P£øe‹FģFīFźFš¹»čP£ŗe‹^eø²eP1ĄPčśJ^^ Ąt ø€Pø–WPč_G^^Ē“eǶe1Ą1Ū‹NģNīŲPQ¹»XčČO1ŪYFźŁQ¹»č¶O£¼e¾e¹‹¾ećŃąŃÓāś£¼e‰¾e‹^ś‰ŗeø²ePøü’Pč‚J^^ Ąt ø€Pø¬WPčēF^^øĘWPčzJ^ĒFņ¹»‹Fś’vņčXO[9Ćré³1ĄP’vņøPč’3ƒÄ‰FžøP’vņøPčė3ƒÄ‰FüøP’vž’vüčfEƒÄ‹^üʇ øĆP’vžč£5^^øĆP’vüč—5^^1Ą¾1’‹^ņčäORP1ĄPøPčO‰Fö‰Nų’vų’vö1ĄPøPčÓOƒźƒŪu Ó Ūu1ĄP’vų’vöøžWPč¹IƒÄ‹Fņ‰Fņé6’ø XPč£I^‰ģ]ĆU‰åPPĒFžņ\~žģ]s‹^žĒG&’’ƒFž2ėėĒFžņ\‹^žĒG&1ĄP’vžč7/^^øPøPčÆ/^^‰Fü‹^ü‹%š=@u#‹^üŠG 0ä˜=|‹^ž’w¹»XčN=t ø€PøJXPč€E^^‹^ž‹Fü‰G*’vüč¤2^‹^ž‹Fü‰G(‹^žĘG0øPčĻ)^ Ąt ø€Pø€XPčGE^^‰ģ]ĆU‰åƒģ øP’6Īe’6ŅečžDƒÄ Ąt’6,eéFųPFöPøPčx7ƒÄ‰Füƒ~üt’vüéņ‹še’7¹»”ŠečzM%’ [!Áˀ‰^ś1ĄP’vśø.ePčNƒÄ‰Fž‹,e‰^üƒ~üt ƒ~üļt’vü駃~üļuj‹^ž‹%šPėX1ĄPøP’vžčŹ<ƒÄ‰Füƒ~üuF’vžč”'^ė=ĒFüė’ė61ĄPøP’vžč”<ƒÄ‰Füƒ~ütė‹^žøP’wčœ^^‰Fü뾤XZéŗLƒ~üt ’vžč¾.^’vüė%‹še‹FöŃąƋFų‰G‹^ųĒG‹^ų‹Fž‰G’vöX‰ģ]ĆU‰åPƒ>īeuø’’PėmøP’6Īe’6ŌečXCƒÄ Ąt’6,eėQ‹še’7¹»”ŠečVL%’ [!ĆS¹»”ŠečCL%š[ Ų‰Fž¹»”Ņeč.LP’vžø.ePčƒÄPč.^’6,eX‰ģ]ĆU‰åƒģFģP’vč¶^^‰Fžƒ~žu1ĄP鼍FģP’vžčÖ^^‰Füƒ~üt魃>,ežt飋^ž’v’w č(.^^‰Füƒ~üu ’vžč«-^1ĄP餋^üƒĆ ‰^ź‹^źŠ0ä˜@ˆ‹^ü‹F‰GøP’vüč/^^‹^üøPƒĆ"SFģP’vžčŒƒÄ‰Fśƒ~śtI’vžčT-^‹^üƒĆ ‰^ź‹^źŠ0ä˜Hˆ‹^üĘG&’vüč2-^‹^ś‰,e1ĄPė%ƒ~ütĒFśļ’ė‹,e‰^ś’vžč -^‹^ś‰,e’vüX‰ģ]ĆU‰åƒģ ƒ>Še|ƒ>Še~øź’Pé'øP’6Īe’6Ņeč»AƒÄ Ąt’6,eé ‹Še1ĄŠ‡ XP¹»XčµJ‰FųFüPFöP’vųč~4ƒÄ‰Fśƒ~śt’vśéŅø.ePčö^‰Fžƒ~žu’6,eéŗ1ĄP’vų’vžč:ƒÄ‰Fśƒ~śt ’vžčU,^’vśé•‹^ž‹%šPė^öFųt_’vžč7,^øė’Pėw‹šeƒ4u ‹^ž‹6še‹G‰D4¹»‹FųčJ‹^žP’wčĒ^^ė!¹»‹FųčśI‹^žP’wč­^^ė¾øXZéĪI‹še‹FöŃąƋFü‰G‹^üĒG‹^ü‹Fž‰G’vöX‰ģ]ĆU‰åƒģ ’6Īeč4^‰Fžƒ~žu’6,e馋^ž‹G‰Fü‹^ü‹%š¹»čƒI‰Fų¹»‹FųčtI= t¹»‹FųčcI=`u3¹»‹FųčRI=`uč<’vüč¾)^ Ąu ‹^ü’wčą2^‹^ü’wč^‹^ž‹_€'t(‹^žötøPėøPFś‹^žøP’vś’wčjƒÄ‹^žƒĆ‰^ö‹H‰‹^öƒ?u ‹^ž’wčŃ*^‹še‹ĪeŃįĖĒG1ĄPX‰ģ]ĆU‰åƒģ’6Īeč3^‰Fžƒ~žu’6,e鲋^ž‹_€'uøć’P韒6ŠeėK‹Ōe‰^ś‹Öe‰^üėB‹^ž‹G‹OŌeÖe‰Fś‰Nüė)‹^ž‹_‹G‹OŌeÖe‰Fś‰Nüė øź’PėN¾ČX[éH‹Fś‹^ü-ƒŪu!ĄtC Ū}øź’Pė*‹^ž‹_ĘG)‹^ž‹Fś‹Nü‰G‰O‹^ś‰¼e‹^ü‰¾e1ĄPX‰ģ]ĆU‰å1ĄPč^‰ģ]ĆU‰åƒģ*ƒ>°eut¹»”ĪečĀG©’tc¹‹ĪeÓūS¹»Xč©G%’¹»čG‰F⹋ĪeÓūS¹»Xč†G%¹»čzG‰Fą¹»”ĪečkG%?¹»č_G£Īeė ‹°e‰^āĒFąƒ>Šeu1ĄPéæƒ>°etƒ>Še}øź’PéŖ’6ĪečŠ1^‰Füƒ~üu’6,eé’ƒ~uøPėøP‹^ü‹[…Ćuø÷’Péq‹^ü‹G’w‰FģFī‹Fģ‹^ī-ƒŪu!ĄtC Ū}øź’PéD‹^ü‹G‰Fž‹^ž‹G’w‰FōFöĒFźĒFšĒFę‹^ž‹%š¹»čŽF‰Fä¹»‹FäčF=`u‹Fō‹^ö-ƒŪu Ć Ūu ĒFō’’ĒFö’Ēp\¹»‹FäčJF= uT‹^ž’6Ōe’6°e’6Še’vī’vģ’w’vč5ƒÄ‰Fźƒ~ź}é¹»‹Fźč F‰Fš‹Fź™FģVī‰Fģ‰VīĒFźéŽƒ~tér¹»‹FäčÜE=`ta‹^ž’vī’vģ’w čż%^‰Ć”Še™‹O ‹w)ĮÖX[)Čóu!ĄtC Ū~øå’Pé‹Fģ‹^ī+Fō^öu!ĄtC Ū~1ĄP’vö’vō’vžč‘ ƒÄ‹^ž€'t&FģP’6Še’vę’v’vžčkƒÄ ‰Fźƒ~ź’vźéŃ>Šeué*’vī’vģ1ĄPøPč6F‰Vņ¹»”ŠečE»+^ņ9Ćv¹»”ŠečEPėø+FņP¹»XčōD‰Fčƒ~č}ø+Fņ¹»čÜD‰Fčƒ~uG‹Fō‹^ö+Fģ^ī‰Fų‰^ś‹Fų‹^ś-ƒŪu!ĄtC Ū锋Fč™+FųVśu!ĄtB Ņ~‹Fų‰Fč’vā’vą’6Ōe’v’vč’vņ’vī’vģ’vžčšƒÄ‰Fźƒ~źtėLƒ>p\}ėC‹^čŌe‰Ōe‹Še+^艊e¹»‹Fč’všč1D[Ɖ^š‹Fč™FģVī‰Fģ‰VīĒFęéĢžƒ~u]¹»‹FäčD= t7¹»‹FäčšC=`t&‹Fģ‹^ī+Fō^öu!ĄtC Ū~‹^ž‹Fģ‹Nī‰G‰Očr9‹^ž‰G‰W ‹^žĘG&ė\‹^ž€'tS‹^ž‹Fģ‹Nī+GOu!ĄtA É|9‹^žĒGĒGĒFģĒFīøP’vžčž-^^‰Fރ~Žt ‹^ŽĒGĒG‹^ü‹Fģ‹Nī‰G‰Oƒ~u^‹^ž€)uU’vī’vģ1ĄPøPč/DƒźƒŪu Ó Ūu7¹»‹Fäč C=€t¹»‹FäčūB=@u‹^ž‰āe‹^ģ‰äe‹^ī‰ęe¹»‹FäčÕB=€u‹^žĘG)ƒ>p\t‹p\‰^źƒ>p\˜u¹»‹FščØB‰Fźƒ~źu’všė ¹»‹FźčŽBP¹»XčƒBPX‰ģ]ĆU‰åƒģ‹^‹%š=`t1ĄPėøPFöƒ~öt’v’v1ĄPøPčmB‰Fō‹^‹G‰Fņė’v’v’včmƒÄ‰Fō‹^‹G ‰Fņƒ~öuFƒ~ōu@ƒ~u1ĄPPø’’Pč¾&ƒÄ‰Fž’vžčÆ ^éu’v’v’vč@ƒÄ‰Fžƒ~žu]’6,eé ƒ~u ~ uøPė1ĄPFųƒ~u%ƒ~ u‹^‹F‹N+GOu!ĄtA É|ĒFų’vų’vō’vņč?&ƒÄ‰Fžƒ~u4~ t-ƒ~öu'‹^‹F‹N+GOu!ĄtA É| ƒ~ u’vžčż^ƒ~u1ĄPėøPFśø÷f ‰Ć^ž’vśS¹»‹F čAP’v’v’vč¢ƒÄ ‰Füƒ~u‹^žĘ‡ ¹»‹F čé@F =uøPėøPFų’vų’vžčg'^^’vüX‰ģ]ĆU‰åƒģ’vču!^‰Fģ’v’v1ĄPøPčĘ@‰Fī‰Nš‹F왉Į‹Fī‹^šćŃūŃŲāś‰Fņ‰^ō‹F왉Į‹Fņ‹^ōćŃąŃÓāś‹Nī‹Vš)ĮډNź‹Fņ‹^ō-ƒŪu!ĄtC Ū}_‹^ƒĆS¾1’‹^ņ‹Fōč,A[Ƌ‰Füƒ~üu1ĄP铹»‹Fģ’vüč@¹»č@‰ĮXÓąP¹»‹Fźčö?[Ɖ^ś’vśé~‹Fņ‹^ō-ƒŪ‰Fö‰^ų‹Fö‹^ų-ƒŪu!ĄtC Ū} ‹^‹G‰Füé„‹^‹G‰Füƒ~üu1ĄPé4‹Fö‹^ų-ƒŪ‰Fö‰^ų¹»‹Fģ’vüč?¹»čv?‰ĮXÓą‰Fś‹^1ĄP’vś’w č$ƒÄ‰Fž’vž’vų’vö1ĄPøPčk?¾1’‰Ć‰Čč2@[Ƌ‰FüøBP’vžčÄ%^^’vų’vö1ĄPøPč@‰Vö‰^ųƒ~üu1ĄP阹»‹Fģ’vüčõ>¹»čģ>‰ĮXÓą‰Fś‹^1ĄP’vś’w č‘#ƒÄ‰Fž¾1’‹^ö‹Fų’vžč¶?[Ƌ‰FüøBP’vžčH%^^ƒ~üu1ĄPė3¹»‹Fģ’vüč>¹»č‡>‰ĮXÓąP¹»‹Fźču>[Ɖ^ś’vśX‰ģ]ĆU‰åƒ~u2Ęv\Ēx\‹F ™£|\‰~\‹^ˆw\‹^‰z\1Ą‹^‰€\£‚\ė0‹^ˆv\‹^‰x\1Ą‹^‰|\£~\Ęw\Ēz\‹F ™£€\‰‚\1Ą‹^ ‰„\£†\ør\Pč7^”t\‰ģ]ĆU‰åƒģ‹āe‰^žĒāe’6ęe’6äe’vžč’üƒÄ‰Fśƒ~śu‰ģ]Ƌ^ž1ĄP’vś’w č]"ƒÄ‰FüøP’vüč-$^^‰ģ]ĆU‰åøPč¦õ^‰ģ]ĆU‰åƒģ‹^ĘG&ĒFģ’vč$^‰Fž’v’v1ĄPøPču=QP‹Fž™‰ĮX[ćŃūŃŲāś‰Fš‰^ņ‹Fš‹^ņ-ƒŪu!ĄtC Ū}/‹^’v ƒĆS¾1’‹^š‹Fņč>[Əč±2‹^‰G‰W 1ĄPé‹Fš‹^ņ-ƒŪ‰Fō‰^öĒFźĒFč‹Fō‹^ö-ƒŪu!ĄtC Ū} ‹^ƒĆ‰^śéā‹^‹G‰Füƒ~üu/‹^‹v’w’t č{$^^‰Füƒ~üu’6,eé–‹^‹Fü‰GĒFč‹Fō‹^ö-ƒŪ‰Fō‰^ö’vö’vō1ĄPøPčx<‰Fī’vö’vō1ĄPøPčI=‰Vō‰^ö~ī|øå’Pé?¹»‹Fž’vüč<¹»č<‰ĮXÓą‰Fųƒ~čtøPė1ĄP‹^’vų’w č­ ƒÄ‰Fģƒ~čt’vģč˜^‹FīŃą‰Ć^ģ‰^ś‹^śƒ?uD‹^‹v’w’t č #^^‹^ś‰ĒFźƒ~ģt‹^ģʇ ‹^śƒ?uøBP’vģč*"^^’6,e阸BP’vģč"^^‹^ś’7¹»‹Fžčh;¹»č_;‰ĮXÓą‰Fųƒ~źtøPė1ĄP‹^’vų’w čųƒÄ‰Fģƒ~źt’vģčć^¾1’‹^ō‹Fö’v ’vģč <[Əč½0‹^‰G‰W ‹^ģʇ øBP’vģčŽ!^^1ĄPX‰ģ]ĆU‰åƒģ’včœ^‰Fņƒ~ņu‰ģ]ƋFņ™‰Įø1ŪćŃąŃÓāś‰Fī‰^šƒ~ u"’v’v’vš’vīčÅ:‹vī‹~š‰Ć‰Čč‹;‰F‰V‹F‹^’ƒÓ‰Fō‰^ö’vö’vō’vš’vīč‘:QP’v’v’vš’vīč€:[Z)ĆŹu Ś Ņt‰ģ]Ć’vö’vō’vč|łƒÄ‰Fśƒ~śu‰ģ]ù»‹Fņ’vśč:¹»č:‰ĮXÓčP¹»‹Fņč:¹»č÷9‰ĮXÓą-‰Fų‹Fś‰Fü‹Fų9Füw4‹^øP’vü’w čŠƒÄ‰Fž’vžč{^øP’vžčS ^^‹Fü‰Füėĉģ]ĆU‰åƒģ’v’v’včÓųƒÄ‰Füƒ~üté‹^‹G‹O-ƒŁu Į Éu‹^’w čš^‰Fī‹^ī‹G‰Fųė ‹^‹G‰Fų‹^’vų’w č'!^^‰Fųƒ~ųu1ĄPéä’vų’v’v’vč„ūƒÄ‰Fšƒ~št‹^’vų’w čŌ!^^‹^š‰,e1ĄP鮋^‹F‹N+GOu Į ÉtøP’v’v’včėżƒÄ’včŠ^‰Fņ¹»‹Fņ’vųč·8¹»č®8‰ĮXÓą‰Fś‹Fņ™‰Įø1ŪćŃąŃÓāś‰Fō‰^ö’v’v’vö’vōč‡9SR1ĄPøPč—8Fś‰Fü‹^øP’vü’w čƒÄ‰Fž’vžč ^’vžX‰ģ]ĆU‰åPPĒFž‹F‰Fü‹^üĒƒFü’Nžuš‹^ʇ ‰ģ]ĆU‰åƒģ‹še‰^žFöPFšPøPčŁ!ƒÄ‰Fśƒ~śt’vśéś‹^ž‹FšŃąƋFö‰G‹^öĒGFōPFņPøPč !ƒÄ‰Fśƒ~śt‹^ž‹FšŃąĆĒG‹^öĒG’vśéŖ‹^ž‹FņŃąƋFō‰G‹^ōĒG‹^ž‹_‹G ‰Fųø€P’vųčŌ^^‰Füƒ~üu4‹^ž‹FšŃąĆĒG‹^öĒG‹^ž‹FņŃąĆĒG‹^ōĒG’6,eė=‹^üĘG'‹^ö‹Fü‰G’vüčĄ^‹^ō‹Fü‰GøP’vüč^^‹^š‰¶e‹^ņ‰øe1ĄPX‰ģ]ĆU‰åƒ~u[‹^ ‹v‹‹O+DLu!ĄtA É}éŲøP’včN!^^=t%ƒ~t1ĄPčÄ^ƒ>źe~øPøP’včƒÄ1ĄP頁~ ~øå’Pé’øP’vč!^^=u-ĒŒ\@”še-ņe»@™÷ū£Ž\ǐ\øŠ\P1ĄPč71^^øą’PėT‹F ™‹^ W-ƒŚu!ĄtB Ņ~ 1ĄPč6^1ĄPė+‹^ ‹‹O-ƒŁu Į ÉuøPøP’včaƒÄøPX‰ģ]ĆU‰åƒ~u’źe‹šeĘG<¹‹ĪeÓć ®e‹6še‰\6‹še‹Ōe‰O8‹še‹Še‰O:‹F÷Ų‹šeˆG>Ēģe‰ģ]ĆU‰åPĒFžņe~žņirés‹^ž€<ud‹^ž’w6¹»Xčd5%’P¹»‹FčT5[9Ću?‹^ž‹vž¹‹D6ÓųŃąƋ_‹F9Gu"‹Fž-ņe»@™÷ū1ŪSPč^^’źe’Nu‰ģ]ƃFž@ėƒ‰ģ]ĆU‰åPƒ~|ƒ~| ’vøŌXPč],^^¹‹FÓą‰ĆĆņe‰^ž‹^ž€<t ‹^ž€=u‰ģ]Ƌ^ž€JLMNOPQRSTUVWXYZ[>u ‹^žĘG=’čeė‹^žĘG<‹^ž‹F‰G:’v’včqį^^‰ģ]ĆU‰åƒģ ƒ>°e~ø’’Pé2‹Īe‰^üƒ~ü|ƒ~ü| ’vüøąXPčĪ+^^¹‹FüÓą‰ĆĆņe‰^ž‹^ž€<u1ĄPéó‹^žŠG>0ä˜÷Ų‰Fśƒ~śu飋^ž¹‹G6Óų¹»č4%’¹»č4‰Fųƒ~ų|ƒ~ų| ø€PøīXPč[+^^‹^ž‹FųŃąƋG‰Fö‹^ö‹_‹G‰Fō1ɋFōÓč%’¹»č¹3£Ž\‹^ü‰\ĒŒ\øŠ\P’vśčš.^^ Ąt ø€PøüXPč’*^^‹Fü9Ž\t,’6\’6Ž\črž^^øŹeP’vśčb.^^ ĄtŚø€Pø YPčĢ*^^ėĖøü’P’vüčGž^^1ĄPX‰ģ]ĆU‰å’včx^¹‹¦\Ó拇^[»Ø\S’6¢\’Š^^”®\‰ģ]ĆU‰å’včN^¹‹¦\Ó拇b[»Ø\S’6¢\’Š^^‰ģ]ĆU‰å’vč'^ƒ~uøPėøPŖ\1ɋFÓč%’¹»čĮ2£¬\‹^‰²\‹^ ‰“\‹^‰®\‹^‰ŗ\‹^ ‰°\¹‹¦\Ó拇`[»Ø\S’6¢\’Š^^>®\üu’6¢\čŽü^”®\‰ģ]ĆU‰åPP’6ĪečÄ^‰Fžƒ~žu’6,e釋^ž‹G‰Fü‹^ü‹%š= tøē’Pėk‹^ü’wčg^ĒŖ\‹°e‰®\‹¤\‰¬\‹Ņe‰°\æ²\¾Ōe¹ņ„¹‹¦\Ó拇`[»Ø\S’6¢\’Š^^>Ŗ\üu’6¢\čņū^æ¼e¾²\¹ņ„’6®\X‰ģ]ĆU‰å¹‹FÓč%’¹»č«1£¦\1ɋFÓč%’¹»č•1£¤\ƒ>¦\t ‹–[9¦\| ’6¦\øYPčē(^^¹‹¦\Ó拟d[‰¢\‹¤\‰¬\‰ģ]ĆU‰åP‹^‹G‰Fž’v’vč<,^^ Ąt ø€Pø&YPč”(^^‹^‹Fž9Gt‹^‹v’w’tčü^^’v’vč’+^^ė׉ģ]ĆU‰åPP‹še¹‹G4Óč%’¹»čä0‰Fü¹‹FüÓą‰Ć‹‡d[‰Fž‹še1ɋG4Óč%’¹»č¹0‹^‰G’v’vžčS’^^‰ģ]ĆU‰å‹^ĒG‰ģ]ĆU‰åƒģFīP’vč9^^‰Fžƒ~žu1ĄPė$€~īu’vžėFīP’vžčO^^‰Fü’vžčN^’vüX‰ģ]ĆU‰åƒģ‹^€?/u ‹še’wė‹še’wFž’vžčĖ^’v’včW^^‰Füƒ~üu ’vžč^1ĄPė;‹^ü€?u’vžė.’v’vžčŻ^^‰Fś’vžčÜ^ƒ~śu1ĄPė‹Fü‰F‹Fś‰Fžė„X‰ģ]ĆU‰åƒģ‹F‰Fü‹F‰Fś‹^śŠ0䘉Fžƒ~ž/uƒFśėé~ś®es4ƒ~ž/t.ƒ~žt(‹^ƒĆ9^üs ‹^ü‹FžˆƒFüƒFś‹^śŠ0䘉FžėŃ~ž/u~ś®esƒFś‹^śŠ0䘉Fžėā‹^ƒĆ9^üs ‹^üĘƒFüėé~ś®er Ē,e™’1ĄPė’vśX‰ģ]ĆU‰åƒģ ‹^€?u‹^‹v’w"’t čT^^Pé1ĄPFōP’v’v迃ĉFųƒ~ųt ‹^ų‰,e1ĄPéߋ^’vō’w č^^‰Fžƒ~žu1ĄPéĀ‹^žƒ"tér‹^ƒ"ui‹F@‰Ć€?.u^ĒFś$]~śģ]sR‹^ś‹vž‹D 9G&u>’vžča^‹^ś‹_*‹G ‰Fö‹^ś‹_*’w"’vöč¬^^‰Fü’v’vüč-’^^‰Fž’vüč,^ėƒFś2ė§‹^ž€(u8ĒFśņ\~śģ]sė‹^ś‹Fž9G*u’vžčż^‹^śøP’w&čV^^‰FžėŃFś2ėĶ’vžX‰ģ]ĆU‰åƒģ‹^‹%š=@tøģ’Pé6ƒ~ uøPėøPFų1ĄP’vų’včOƒÄ‰Fśƒ~śt’vśé‹^’w’w1ĄPøPčØ-‰FšĒFņĒFģĒFōĒFö‹^‹Fō‹Nö+GOu!ĄtA É|é’vö’vō’vč‚ģƒÄ‰Fī‹^1ĄP’vī’w čźƒÄ‰Fü‹Fü‰Fž‹^üĆ9^žr飋Fņ‰Fņ‹Fš9Fņvƒ~ té‰ĒFģ遃~ t_‹^žƒ?tW‹^žøP’vƒĆSčę"ƒÄ Ąt?ƒ~ u‹^žĒ‹^üʇ čc"‹^‰G‰W ė ‹^ž‹‹^‰øAP’vüč0^^1ĄPéūƒ~ u‹^žƒ?uĒFģėƒFžéN’ƒ~ģtė!øAP’vüčś^^‹Fō‹^öƒÓ‰Fō‰^öéŪžƒ~ tøž’P驃~ģu=‹Fņ‰Fņƒ~ņuøå’P鍋^’w’w’včiņƒÄ‰Füƒ~üu’6,eėl‹Fü‰Fž‹^žøP’vƒĆSč0"ƒÄ‹^‹‹^ž‰‹^üʇ øAP’vüčc^^čr!‹^‰G‰W ‹^ĘG&‹Fš9Fņv1Ą¾1’‹^ņč•,‹^‰G‰W1ĄPX‰ģ]ĆU‰åƒģƒ>īeuø’’PéAøP’6Īe’6ŌečL"ƒÄ Ąt’6,eé$ø.ePčC^‰Föƒ~ö’u’6,eé ĒFųĒFšĒFśņ\~śģ]s%‹^ś‹Fö9G&uĒFš‹^śƒ&’u‹Fś‰FųƒFś2ėԃ~štøš’Péă~ųuøé’Pé·‹^ų‹Fö‰G&1ĄP’vųč· ^^‹^ų‹Fö‰G&‹^ų’w¹»XčĮ*=u#‹^ųƒ?r‹^ųƒr‹^ųƒr ‹^ųƒs‹^ųĒG&’’øź’PéSøP’6Še’6Öeč^!ƒÄ Ąt‹^ųĒG&’’’6,eé.ø.ePčÉł^‰Fžƒ~žu‹^ųĒG&’’’6,eéĒFņ‹^žƒ$~ĒFņš’‹^ž‹%š‰Fō~ō`t~ō uĒFņģ’ĒFüƒ~ņuøP’vöč_ ^^‰Füƒ~üu‹,e‰^ņƒ~üt ‹^üƒ?uĒFņź’ĒFīƒ~ņu’vöč²^ ĄtĒFņé’ĒFīƒ~ņu‹^ž‹%š=@u‹^ü‹%š=@tĒFņ쒃~ņt2’vžč‚ ^’vüč{ ^ƒ~īt’vöč¤^č6’vöč^‹^ųĒG&’’’vņė&‹^žĘG(‹^ų‹Fž‰G*‹^ų‹Fü‰G(‹^ų‹ŅeˆO01ĄPX‰ģ]ĆU‰åƒģ ƒ>īeuø’’PéøP’6Īe’6ŅečņƒÄ Ąt’6,eéėø.ePčé^‰Fųƒ~ų’u’6,eéÓĒFöĒFžģ]~ž,cs&‹^žƒ$~‹^ž‹Fų9G u ‹^ž‹FöG$‰FöƒFž*ėӃ~ö~øš’PéĒFüĒFśņ\~śģ]s‹^ś‹Fų9G&u‹Fś‰FüėƒFś2ėąƒ~üt’vųčž^ Ąt ø€Pø:YPčŠ^^č’vųčž^ƒ~üuøź’Pė1‹^ü‹_*ĘG(‹^ü’w*č- ^‹^ü’w(č# ^‹^üĒG*‹^üĒG&’’1ĄPX‰ģ]ĆU‰åPP’včq÷^‰Fžƒ~žuø’’Pė3‹^ž‹%š=`tĒ,eń’’vžčÖ ^ø’’Pė‹^ž‹G‰Fü’vžčĄ ^’vüX‰ģ]ĆU‰åƒģøP’6Īe’6ŌečŒƒÄ Ąt’6,eéEø.ePč’ö^‰Füƒ~üu’6,eé-ĒFś‹^ü€ uĒFśį’ƒ~śu‹^ü‹%š=@u ƒ>īeuĒFś’’ƒ~śt ’vüč> ^’vśéčøP’6Še’6ÖečƒÄ Ąt’vüč ^’6,eéčFģPø.ePčĆö^^‰Fžƒ~žu‹,e‰^śƒ~śu5FģP’vžčÜ÷^^‰Fźƒ~źu‹,e‰^śƒ~śžuĒFśė ’vźčĮ^ĒFśļ’ƒ~śu‹^ü‹vž‹D 9G tĒFśī’ƒ~śu‹^üøPƒĆ"SFģP’vžč­ųƒÄ‰Fśƒ~śu‹^üƒĆ ‰^č‹^čŠ0ä˜@ˆ‹^üĘG&’vüčZ^’vžčS^’vśX‰ģ]ĆU‰åƒģøP’6Īe’6ŅečƒÄ Ąt’6,e鹍FźPø.ePč×õ^^‰Füƒ~üu’6,eéœĒFśFźP’vüčńö^^‰Fžƒ~žu‹,e‰^śƒ~śt ’vüčŻ^’vśėi‹^ž‹%š=@u ƒ>īeuĒFś’’ƒ~śuøPFųPFźP’vüčĢ÷ƒÄ‰Fśƒ~śu‹^žƒĆ ‰^č‹^čŠ0ä˜Hˆ‹^žĘG&’vžčy^’vüčr^’vśX‰ģ]ĆU‰åƒģ‹^‹G ‰Fģ’vč^‰Fš‹Fš™‰Įø1ŪćŃąŃÓāś‰Fų‰^ś‹^€'u ‹^ĒGĒGĒFüĒFž‹^‹Fü‹Nž+GOu!ĄtA É}W’vž’vü’vč7äƒÄ‰Föƒ~öt+¹»‹Fš’vöčŻ$¹»čŌ$‰ĮXÓč‰Fō’vō’vģčŽ ^^‹Fü‹^žFų^ś‰Fü‰^žė‹^’w’vģčl ^^‹^‹G‰Fōƒ~ōtn¹»‹Fš’vōč$¹»čx$‰ĮXÓą‰Fö1ĄP’vö’vģč ƒÄ‰Fī‹Fī‰Fņ‹^īĆ9^ņs‹^ņ’7’vģč ^^ƒFņėįøBP’vīčĖ ^^’vō’vģčļ ^^’včÆ^‰ģ]ĆU‰åƒģ’vč@^‰Fü‹^ü’w¹»”rlčõ#[Ƌvü\ƒūrø’’Pé ‹^üƒw ‹^üƒv ø€PøDYPč4^^ĒFž¹»‹Fžč°#‹^ü9Gv.¹»‹Fž1ŅRč™#P’včKƒÄ‹^ü‹NžŃįˉG’Fžė¾‹^ü‹G‰FśĒFž¹»‹Fžč]#‹^ü9Gv.¹»‹Fž1ŅRčF#FśP’včųƒÄ‹^ü‹NžŃįˉG’Fžė¾‹^ü‹G‰Fų‹^ų‹ ‰‹^ü‹G‰Fų‹^ų‹ ‰¹»”rlčõ"‹^ü‹vü‹_\ĆS¹»XčÜ"£rl1ĄPX‰ģ]ĆU‰åƒģ’včś^‰Fü¹»”rlčµ"‹^ü‹vü‹_\)Ć÷ŪS¹»Xčš"£rlĒFž¹»‹Fžč†"‹^ü9Gv‹^ü‹FžŃąĆøĆP’wč ^^’FžėŃĒFž¹»‹FžčR"‹^ü9Gv‹^ü‹FžŃąĆøÄP’wčŅ^^’FžėŃ1Ą‰ģ]ĆU‰åƒģ‹F9F rĒF ¹ ‹F Óč¹»č"‰Fō¹ ‹FōÓą¹»’v čī![)ĆS¹»Xčą!‰Fš»‹Fš™÷ū‰Fņƒ~ņu’vė‹FP¹»Xčµ!‰Fī’vī’NīX Ąué‹FōŃą‰Ć^‹‰Fģ‹FņŃą‰Ć^ģ‰^ü‹^ģĆ‰^ś‹Fś9Füu顋^ü’7¹»Xčd!‰Fžƒ~ž’uéžĒFųƒ~ų|鐹»‹Fų’vžč;!¹»č2!‰ĮXÓčØui‹Fü+Fģ»™÷ū¹ÓąFų¹ ‹^ōÓćƉ^ö¹»‹Föčü 9Fw ‹^śƒĆž‰^üė2‹Fü‰Fź‹^ź‹NųøÓą ‰‹^ģʇ ¹»‹FöčĆ Pė1’Fųég’ƒFüé5’’Fō¹»‹Fōč¤ 9FuĒFōĒFņéąž1ĄPX‰ģ]ĆU‰åƒģ ¹ ‹FÓč¹»čs ‰Fž¹ ‹FžÓą¹»’vč\ [)ĆS¹»XčN ‰Fü»‹Fü™÷ū‰Fś‹Fü™÷ū‰Vų‹FžŃą‰Ć^‹‰Föƒ~öu‰ģ]ƋFśŃą‰Ć^ö‹Nų‹ÓųØu¹»‹FčüPøXYPče^^‹FśŃą‰Ć^ö‰^ō‹NųøÓą÷Š#‰‹^öʇ ‰ģ]ĆU‰åPĒFžņ\~žģ]s‹^ž‹F9G&u’vžė ƒFž2ėć¹»‹Fč™Pø†YPč^^‰ģ]ĆX‰ģ]ĆU‰åPP‹^‹G‰Fü~üuøPė&ĒFžņ\~žģ]s‹^ž‹Fü9G&uøPė ƒFž2ėā1ĄPX‰ģ]ĆU‰åP‹^’w čh’^‰Fž‹^ž‹G ‰ģ]ĆU‰åPPƒ~u7‹^‹G&‰Fü1ĄPøP’w&čĄƒÄ‰Fžø2P’vž’vč;ƒÄ‹^‹Fü‰G&ė,‹^øPP’w&č‘ƒÄ‰Fžø2P’v’vžč ƒÄ‹^žĘ‡ ‹^ĘG1øÅP’vžčB^^‰ģ]ĆU‰åƒģĒFüĒFžģ]~ž,cs>‹^žƒ$~)‹^ž‹F9G u$‹^ž‹F9G"u‹^žƒĆ$‰^ś‹@‰’vžėK‹Fž‰FüƒFž*뻃~üu Ē,eé’1ĄPė.‹^ü‹F‰G ‹^ü‹F‰G"‹^üĒG$ƒ~’t 1ĄP’vüč ^^’vüX‰ģ]ĆU‰åPƒ~u‰ģ]Ƌ^ƒĆ$‰^ž‹H‰‹^žƒ?uD‹^€ u&’včdų^‹^Ē‹^ĘG'‹^‹v’w"’t č^^‹^€&u øP’včœ^^‰ģ]ĆU‰åƒģ ’včÄż^‰Fü‹^ü‹vü‹‹vü1ÉQ’wPƒĘVčFūƒÄ‰Fōƒ~ōté†Ē,eé’‹^ü¹‹G&Óč¹»čF¹»č=%’¹»č1‰Fś‹^ü1ɋG&Ó蹻蹻č%’¹»č‰Fų‹^ü&u ø“YPč’^ė’vų’vśøŽYPčļƒÄ1ĄPėh‹Fō‰Fö’vöø’’Pč*ž^^‰Fžƒ~žu‹^ü’vōƒĆSč(ü^^ė9‹F‹^ž‰‹^žĘG ‹še‹vž‹G0‰D‹še‹vžŠG3ˆD ‹^ž‹F‰G ’vžč ^’vžX‰ģ]ĆU‰åP‹^ĒGĒGč ‹^‰G‰W ‹^ĘG&ĒFžƒ~ž }‹^‹FžŃąĆĒG’Fžėę‰ģ]ĆU‰åP’včQü^‰Fž‹^ž’vƒĆSčū^^‰ģ]ĆU‰åƒģ‹^’w č+ü^‰Fś‹^‹G"-» 1Ņ÷ó‹^śGG‰Fų‹^1ĄP’vų’w 考ĉFž‹^‹G"-» 1Ņ÷ó¹Óā‰Ó^ž‰^üƒ~uø P’vü’včŲƒÄėø P’v’vüčĘƒÄ‹^žĘ‡ ø@P’vžč^^‹^ĘG&‰ģ]ĆU‰åP‹^ƒĆ$‰^ž‹@‰‰ģ]ĆU‰åƒģ‹F%¹Óą‰Ć‹‡xl‰Fžƒ~’tSƒ~žtM‹^ž‹F9‡u5‹^ž‹F9‡u)‹^ž€æ u’rl‹^žĆ ‰^ś‹^śŠ0ä˜@ˆ’vžét‹^ž‹‡‰Fžė­ƒ>rlu øPøžYPč0^^’rl‹vl‰^ž‹^žŠ‡ 0ä˜ Ą~‹^žƒæt ‹^ž‹‡‰Fžė܃~žt‹^žŠ‡ 0ä˜ Ą~ ø€PøZPčą^^‹^ž‹‡%¹Óą‰Ć‹‡xl‰Fü‹Fž9Füu‹^ž‹vž‹„%¹Óą‰Ę‹‡‰„xlė2‹^üƒæt(‹^ü‹Fž9‡u‹^ž‹vü‹‡‰„ė ‹^ü‹‡‰FüėĪ‹^ž€æ u‹^žƒæ’t øP’vžčŽ^^‹^ž‹F‰‡‹^ž‹F‰‡‹^žĆ ‰^ś‹^śŠ0ä˜@ˆ‹^ž‹‡%¹Óą‰Ć‹vž‹‡xl‰„‹^ž‹‡%Óą‰Ć‹Fž‰‡xlƒ~’tƒ~u 1ĄP’vžčm^^’vžX‰ģ]ĆU‰åƒģƒ~u‰ģ]Ƌ^Ć ‰^ś‹^śŠ0ä˜Hˆ‹^Ї 0ä˜ Ą~‰ģ]Ć’rl‹^‹‡‰Fž‹‡‰Füƒ~üt ‹^ü‹Fž‰‡ė‹^ž‰vlƒ~žt ‹^ž‹Fü‰‡ė‹^ü‰tl¹»‹FčŚ؀t8‹^LJ‹^‹vl‰ƒ>vlu ‹^‰tlė ‹vl‹F‰‡‹^‰vlė6‹^‹tl‰‹^LJƒ>tlu ‹^‰vlė ‹tl‹F‰‡‹^‰tl¹»‹Fč\Ø@t ‹^€æ u‹^ƒæ’t øP’vč9^^¹»‹Fč,=Åu ‹^LJ’’‰ģ]ĆU‰åƒģ ’včCų^‰Fś‹^ś‹G-+F÷Ų‰Fü‹vś‹~ś‹D+E’vü’wPƒĘVč³õƒÄ‰Fžƒ~žté†Ē,eä’‹^ś¹‹G&Ó蹻賹»čŖ%’¹»čž‰Fų‹^ś1ɋG&Óč¹»čˆ¹»č%’¹»čs‰Fö‹^ś&u ø"ZPčl^ė’vö’vųøFZPč\ƒÄ1ĄPė ‹^ś‹G-FžPX‰ģ]ĆU‰åPƒ~u‰ģ]Ć’včV÷^‰Fž‹^ž‹G-+F÷ŲPƒĆSč}ö^^‰ģ]ĆU‰åƒģ‹^ƒæ’u錋^1Ą¾1’‹ŸčÕ‰Fś‰Vü‹^’vøPøP’vü’vś’·’včĒćƒÄ‰Fžƒ~ž}K‹^‹‡‰Fųƒ~ž˜t+‹^1ɋFųÓč%’¹‹VųÓźā’’·PRø`ZPč„ƒÄė ‹^LJ’’‹^ž‰p\‹^ʇ ‰ģ]ĆU‰åPĒFžøl~žØ½s‹^ž‹F9‡u ‹^žĒ‡’’Fž ėŻ‰ģ]ĆU‰åPP‹^Ē’’ĒFüƒ~ü} ‹še‹FüŃąƃu ‹Fü‹^‰ė’FüėŚ‹^ƒ?}øč’PėAĒFžņi~žrls1‹^žƒu"‹F‹^ž‰‹^žĒGĒG‹Fž‹^‰1ĄPė ƒFž ėČøé’PX‰ģ]ĆU‰åĒ,e÷’ƒ~|ƒ~|1ĄPė‹še‹FѹƒwX‰ģ]ĆU‰åPĒFžņi~žrls5‹^žƒt&‹^ž‹F9Gu‹^ž’7¹»‹Fč9[…Ćt’vžė ƒFž ėÄ1ĄPX‰ģ]ĆU‰åPƒ>°euc¹‹ĪeÓćĆņe‰^ž‹še’wčõö^ƒ>Šet ‹še’wė‹^ž’w‹šeX‰G‹še’wčył^ƒ>Šet1ĄPė‹^ž’w0‹šeX‰G01ĄPė‹še’6Īe’6ŅeƒĆSč;ƒÄPX‰ģ]ĆU‰åPƒ>īeuø’’Pė‹še’6Īe’6ŅeƒĆSčƒÄ‰Fž’vžX‰ģ]ĆU‰åPPøP’v’vč6 ƒÄ Ąt’6,eėdø.ePčŖć^‰Fžƒ~žu’6,eėM‹^ž‹%š=@tĒFüģ’ė1ĄPøP’vžčµƒÄ‰Füƒ~üt ’vžčõõ^’vüė‹^’7čēõ^‹Fž‹^‰1ĄPX‰ģ]ĆU‰åPPøP’6Īe’6Ōeč¬ ƒÄ Ąt’6,eė4ø.ePč ć^‰Fžƒ~žu’6,eė’6Öe1ĄP’vžčIƒÄ‰Fü’vžč…õ^’vüX‰ģ]ĆU‰åP’6Īe诿^‰Fžƒ~žu’6,eė‹^ž’6Ōe’vž’wč ƒÄPX‰ģ]ĆU‰åƒģ&^ą‰^ž‹^’w ¹»Xč3‹^ž‰‹^‹vž‹G"‰D‹^‹vž‹‰D‹^1ĄŠG P¹»Xč‹^ž‰G‹^‹vž‹G‰D‹^1ĄŠG P¹»Xčß‹^ž‰G ‹^’w¹»XčÉ‹^ž‰G ‹^‹vž‹G‹_‰D‰\‹^€'u-ƒ~t'‹^ƒ?u‹^žƒĆ‰^Ś‹^Ś‹v‹‹O+DL‰‰O‹^‹vž‹G‹_ ‰D‰\‹^‹vž‹G‹_ ‰D‰\‹^‹vž‹G‹_ ‰D‰\‹F‰FÜ1ĄP’vžøP’vÜ’6°eøPčĄÓƒÄ ‰FŽ‹Fމģ]ĆU‰åPPøP’6Īe’6ŅečéƒÄ Ąt’6,e選.ePč\į^‰Fžƒ~žu’6,eėj‹^ž‹6še‹D09Gtƒ>īeuĒFü’’ė ’vžčS^‰Füƒ~üt ’vžč§ó^’vüė1‹^ž‹%ņP¹»”Šeč“%’ [ Ų‹^ž‰‹^žĘG&’vžčtó^1ĄPX‰ģ]ĆU‰åPPƒ>īeuø’’PėhøP’6Īe’6Ōeč4ƒÄ Ąt’6,eėLø.ePčØą^‰Fžƒ~žu’6,eė5’vžč¼^‰Füƒ~üu‹^ž‹Še‰O‹^ž‹ŅeˆO ‹^žĘG&’vžčõņ^’vüX‰ģ]ĆU‰åP‹še‹÷ЉFž¹»”ĪečŲ%’÷Š‹še‰¹»‹FžčĮ‰ģ]ĆU‰åPPøP’6Īe’6ŅečŒƒÄ Ąt’6,eė>ø.ePčą^‰Fžƒ~žu’6,eė'¹»”ŠeŗRčuP’vžčƒÄ‰Fü’vžč[ņ^’vüX‰ģ]ĆU‰åƒģ‹^‹‰Fžƒ~t ‹še’w.ė‹še’w0Fōƒ~t ‹šeŠG20ä˜Pė ‹šeŠG30ä˜PFņƒ~ōuĒFüėO‹^‹G9FōuĒFöė‹^ŠG 0ä˜9FņuĒFöėĒFö¹»‹Fö’vžčɹ»čĄ‰ĮXÓč%‰FüĒFų‹Fü F9FütĒFųó’ĒFśIöFt ‹Fž…FśuĒFųó’ƒ~ųuöFt ’vč ^‰Fų‹Fų‰ģ]ĆU‰åP‹^’w č“ļ^‰Fž‹^ž€0tøā’Pė1ĄPX‰ģ]ĆU‰åPPøP’6Īe’6ÜečƒÄ Ąt’6,eė_ø.eP膮^‰Fžƒ~žu’6,eėHĒFü‹^ž‹6še‹D09Gt ƒ>īeuĒFü’’ƒ~üu‹^ž‹Ųe‹Śe‰O‰W ‹^žĘG&’vžčĄš^’vüX‰ģ]ĆU‰åčh£¼e‰¾e1Ą‰ģ]ĆU‰åPƒ>īeuø’’Pė;ĒĀ\‹Ōe’6Öe‰Ź\Ģ\øĄ\Pøż’Pčt ^^‰Fžƒ~žt ’vžø”ZPčÕ^^1ĄPX‰ģ]ĆU‰åƒģFšP’6°eč‘^^‹^š‰¶e‹^ņ‰øe‹^ō‰ŗe‹^ö‰¼e‹^ų‰¾e‹^ś‰Ąe‹^ü‰Āe‹^ž‰Äe1Ą‰ģ]ĆU‰åƒģ ¹»”Īeč÷ %æ’¹»čė ‰Fž‹še‰^ü’vžč@ų^=u’6,e鎋Fž9ĪeuFśPøŠeP1ĄPč‘÷ƒÄ‰Fųƒ~ųt3’vųėfƒ>Še|ƒ>Še|ø÷’PėR‹Še9^žu’6ŠeėC‹Še‰Īeč½Ć‹^ü‹FžŃąƋvü‹ŠeŃįĪ‹G‰D‹^ü‹ŠeŃįĖ‹_ƒĆ‰^ö‹@‰’6ŠeX‰ģ]ĆU‰åƒģøPčcķ^‰Fśč׋^ś‰G,‰W.‹^ś€0u‹^śĘG1ĒFžģ]~ž,cs$‹^žƒ$~‹^ž€&u øP’vžčįš^^ƒFž*ėÕĒFśņ\~śģ]s$‹^śƒ&’t‹^ś€1u øP’vśč‘ķ^^ƒFś2ėÕĒFüøl~üؽs8‹^ü‹‡‰Fųƒ~ų’t!‹^ü€æ u1ɋFųÓ訒u øP’vüčrõ^^Fü ėĮĒFüøl~üؽs8‹^ü‹‡‰Fųƒ~ų’t!‹^ü€æ u1ɋFųÓ訒t øP’vüč.õ^^Fü ėĮ1Ą‰ģ]ĆU‰åƒģ ƒ>°etø’’P锹‹ĪeÓćĆņe‰^ü‹ŠeÓćĆņe‰^śĒFų@’vų’NųX Ąt’vüƒFü[‹vśŠˆƒFśė๋ŠeÓćĆņe‰^žĒFųƒ~ų}-‹^ž‹FųŃąƃt‹^ž‹FųŃąƋ_ƒĆ‰^ö‹@‰’FųėĶ‹^ž’wčš^‹^ž’wčš^1ĄPX‰ģ]ĆU‰åPPƒ>°etø’’Pėu¹‹ĪeÓćĆņe‰še‹Īe‰^ü‹še€<u ‹še€>u’źe‹^ü‰ĪečŒÖ‹šeĘG<ĒFžƒ~ž}‹^ž‰ĪečBĮ’Fžėė‹še’wčēģ^‹še’wčÜģ^1ĄPX‰ģ]ĆU‰åPƒ>°etø’’PėI¹‹ĪeÓćĆņe‰^žƒ>®eu‹^ž‹Še‰O.‹^ž‹Ņe‰O0ƒ>®e.u‹^ž‹ŅeˆO3‹^ž‹ŠeˆO21ĄPX‰ģ]ĆU‰åƒ>°e~ø’’Pė’6Še’6ĪečZÕ^^Ēģe1ĄPX‰ģ]ĆU‰åPPĒŚ\øŲ\Pøż’Pč5^^‰Fžƒ~žt ’vžø¤ZPč–^^øPčQź^‰Fü‹^ü‹ā\‹ä\‰O,‰W.‹^ü€0u‹^üĘG1”ā\‹ä\‰ģ]ĆU‰å’vƒF[Š0ä˜P’vƒF[Š0ä˜[9Ćt1ĄPė ’NuÖøPX‰ģ]ĆU‰åƒģƒ~‰ģ]Ć»‹F™÷ū ŅuN»‹F™÷ū ŅuA»‹F™÷ū Ņu4»‹F™÷ū‰Fž‹F‰Fü‹F‰Fś’vśƒFś[’7’vüƒFü[X‰’Nžuęė*‹F‰Fž‹F‰Fü‹F‰Fś’vśƒFś[‹vüŠˆƒFü’Nžuč‰ģ]ĆU‰åƒģƒ~u-ƒ~'ĒFž.eĒFüŌe’vüƒFü[‹vžŠˆƒFž’Nuč1ĄPėF~€~ Ē,e™’ø’’Pė3‹F‰Fś¹»‹FŗRŗ.eRč·P’vś’6°eøPčAŹƒÄ £,e’6,eX‰ģ]ĆU‰åøź’‰ģ]ĆU‰åƒ>š\t‰ģ]ĆĒš\’vø“ZPč~^^¹»‹Fčc=€t ’vøĢZPča^^øŠZPčX^č ū蚉ģ]ĆU‰å€~uč4‰ģ]Ć1ĄŠFPøĄ½P’6$¾’$¾[XĆXˆƒ>$¾duč €~ uč‰ģ]ĆU‰åƒ>$¾u‰ģ]ĆĒŖ½Ē®½Ē¬½Ēŗ½Ą½‹$¾‰°½øØ½Pøł’PčĀ^^Ē$¾‰ģ]ĆU‰å1ĄPPPP’v’vøPøž’PčŒƒÄ‰ģ]ĆU‰å1ĄPPPPP’vøPøž’PčmƒÄ‹2¾‹v‰‰ģ]ĆU‰å‹^‰,¾‹^‰.¾‹^‰6¾øPøž’PčŌ^^‰ģ]ĆU‰å1ĄPPP’v’v’vøPøž’PčƒÄ‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’Pč÷ƒÄ‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’Pčփĉģ]ĆU‰å‹^ĒG’vøž’PčŹ^^ Ąt ø€Pø˜[Pč/ž^^‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’P艃Ä‹^‹,¾‹.¾‰‰W‹^‹0¾‹2¾‰O‰W‹^‹4¾‹6¾‰O‰W ‹^‹8¾‹:¾‰O ‰W‰ģ]ĆU‰å1ĄPPPPPPø Pøž’Pč)ƒÄ‰ģ]ĆU‰å1ĄPPP’v ’v’v’vøPčƒÄ‰ģ]ĆU‰å‹^‰,¾‹^ ‰.¾‹^ ‰0¾‹^‰2¾‹^‰4¾‹^‰6¾’v’včd^^‰ģ]ĆU‰åPP’v č˜^‰Fž‹^ž‰,¾‹^‰.¾‹^ ‰0¾ĒFü2¾ƒ~ž ’vž’NžX Ąt’v ƒF [‹vüŠˆƒFüėą’v’vč^^‰ģ]ĆU‰åP‹^‰*¾ø(¾P’vča^^‰Fžƒ~žt’vžėƒ>*¾}‹*¾÷Ū‰&¾ø’’Pė’6*¾X‰ģ]ĆU‰åPĒFž’vƒF[Š0ä˜ Ąt’Fžėź‹Fž@‰ģ]ùė ¹ė¹ėU‰å‹F‹^Ķ ]ĆU‰åƒģ$^‰^ų‹^€?uéc‹^€?%t’vƒF[Š0ä˜Pčƒü^ėŁĒFžƒF‹^Š0ä˜=0|+‹^Š0ä˜=9‹^Š0ä˜-0Pø ÷fž[Ɖ^žƒFėȋFų‰Fī‹Fų‰Fō‹^Š0ä˜P醒vųƒFų[‹‰Fü‹Fü™‰Fš‰VņĒFś én’vųƒFų[‹‰Fü¹»‹Füč/‰Fö1Ą‹^ö‰^š‰FņĒFśé?’vųƒFų[‹‰Fü¹»‹Füč‰Fö1Ą‹^ö‰^š‰FņĒFśé’vīƒFī[‹’w‰FšFņĒFś ‹Fī‰Fųéļ’vīƒFī[‹’w‰FšFņĒFś‹Fī‰FųéĪ’vīƒFī[‹’w‰FšFņĒFś‹Fī‰Fųé­’vųƒFų[‹‰Fü’vüč4ū^ƒF酾’vōƒFō[‹‰Fą‹Fō‰Fų‹Fą‰FŽ’vąƒFą[Š0äˆFݘ Ąt ŠFŻ0ä˜Pčõś^ė߃F‹Fą+FŽH+Fž÷Ų‰Füƒ~üé/ž’vü’NüX Ąué!žø PčĮś^ėčø%Pč·ś^’vƒF[Š0ä˜P脜^éśż¾¬[ZéƍFāP’vś’vņ’vščUƒÄ‰Fü‹Fž+Fü‰Fśƒ~ś~’vś’NśX Ąt ø Pčcś^ėė‹FüH‰Fśƒ~ś|‹vśŠBā0ä˜PčFś^’NśėēƒF钿‰ģ]ĆU‰åƒģ ĒFų‹F‹^-ƒŪu Ć Ūu ‹^ Ę0øPéČ‹F‹^-ƒŪu!ĄtC Ū}ƒ~ u‹^‹F÷Ų÷Ū‰^‰F’FųĒFüƒ~ü }‹^ü^ Ę’FüėģĒFüƒ~ u@’v’v1ĄPø Pčė‹^ü^ ˆ‹^ü^ Š0䘙‹^‹N)ĆŃQS1ĄPø P诉F‰Nƒ~u=¹»‹F’vč[%ć‹^ü^ ˆ¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^ƒ~u=¹»‹F’včZ[%ć‹^ü^ ˆ¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^’Fü‹F‹^-ƒŪu Ć Ūté’ĒFś‹FüH‰Fžƒ~ž|b‹^ž^ €?uƒ~śu ‹^ž^ Ę ėA‹^ž^ Š0ä˜= }‹^ž^ ‰^ö‹^öŠ0ä˜0ˆė‹^ž^ ‰^ö‹^öŠ0ä˜7ˆ’Fś’Nžė˜ƒ~ųtø-P’v ’vü’Fü[XĆXˆ’vüX‰ģ]ÌŲĆøX¾ĆśWø )’ŽĄ&Ǥ„1Ū&‹ū¤„u= uę_ūĆ[1ĄYZ^_9×w r9ĪwtH’ć@’ćƋ+\;\w Ńć‹X…Ūu ‰Ó…Ūuč«’歓­‘I|­9Š­u÷“…Ūuč”’ć_9Ėtƒūt ƒūuƒłu Z’ēƒłu1ŅR’ēPčhU‰åW)’‹V ‹F‹^‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×č…’t÷Ś÷؃Ś_]‰ŃĀ…Ūu‰Ć‰Š)Ņ÷ń“÷ń‰Ń‰Ś)ŪĆUWV)’„’u&GWˆßˆėˆĶ(É‰ĶˆÅ(ɈąˆŌˆņ(öRPQ‰é9Śr ø’’ė WWRP‰Š)Ņ÷ó‰Å÷į_)ĒƒŅ‰Ö‰Ų÷嚃Ņ^)ʃŅX)Šy MĻŽėō‰ł‰ó_…’tˆéˆŻˆūˆĒ‰č)Ņ^_]Ć÷ę‰Į‰ų÷ćĮ‰š÷ćŹĆ‰ę‹\‹D™9Āu1!Ņ}÷Ūt)1Ņ‹L‹D!Ą}÷Ų÷ŁŠ÷ó‘÷ó1ۃ|}÷Ū÷ڃŪ‰Ē1Ū!’}÷ß÷\ߋD‹T!Ņ}÷Ś÷ŲڹŃąŃŅŃÓ9ßwr»9Tvāķė¹+Tū@āć미Š[ėøē[ėøž[ėø\ėø,\ė øB\ėøY\ė»SPøPččĮ©U‰åĒB¾‹^‰D¾‹^‰F¾‹^‰J¾ø@¾PøPø»@¾¹Ķ ‰ģ]ĆŚŚget_work couldn't revive anyonefs receive errorZONE_NUM_SIZE != 2SUPER_SIZE > BLOCK_SIZEBLOCK_SIZE % INODE_SIZE != 0NR_FDS > 127NR_BUFS < 6inode size != 32Diskette in drive 0 is not root file systemRAM disk is too big. # blocks = FS Can't report to MMCan't report size to MEMLoading RAM disk from root diskette. Loaded: 0K %3DK %c RAM disk loaded. Please remove root diskette. Root file system corrupted. Possibly wrong diskette.init: can't load root bit mapsĶ —@`—€n¹  g @T `˜ \  ' @ revive errunpause err 1unpause err 2unpause err 3unpause err 4bad major devrw_dev: can't senddo_umounttoo many map blocksfreeing unused block or inode--check file syscan't find superblock for device (in decimal)Out of i-nodes on root device (RAM disk) Out of i-nodes on device %d/%d All buffers in useNo free bufferNo space on root device (RAM disk) No space on device %d/%d Unrecoverable disk error on device %d/%d, block %d do_stime errorclock_time errFile system panic: %s %d ,eL8I~Hµ œ ć LĪą,M.L}?ąE „B,CLĮ@ą L)l+ÄILóELLAL[ELLįCLLcGLLLL•FƒDFLLÄILLLLLLL3"LLLLL«C@LLL L#JLś#G#ś#ü’ś#G#ś#ū’ś#G#ś#ś’ś#G#ś#ł’ś##ś#ł’ś#G#ś#ų’sys_copy can't send QD“POÕPXöPcQd7PoVPs2Qx…PError: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow  ą9-ƒ,‰Ś1Ą» I¹u)ŁŃł‰ƒĆāł‰pu҉ru¼ič1‰Ćśŗ`ŽŚŽĀŽŅź`‹puėÄ1ĄčŠF“³UĶ]é™0äĶĆ1Ąč…Ķéˆ1ĄčyĒā9‹~ ‰>ä9‹F1Ņ÷6ruˆįŠÉŠÉˆÅ‰Š1Ņ÷6puˆĘŃžĮŠvu‹^ˆČF žČ:pu~ĒF Šf€ÄŠF £ą9Ķ€üu”ą90äā9‹6ā9;6ä9t ’FFė–ė [U‰åWV)Ä’ćfü^_]ĆU‰åƒ~ uø Pč=’^’vč6’^‰ģ]ĆU‰åPč=’¹»čŅ6%’¹»čĘ6‰Fžƒ~ž uĒFž ’vžč“’^‹Fž‰ģ]ĆU‰åƒģ,^܉^ڃ~ t4‹F‹^-ƒŪu!ĄtC Ū}‹^‹F÷Ų÷Ū‰^‰F’N ėĒF ĒFüĒFžƒ~ž }a‹FüŃą‰Fü‹F‹^-ƒŪu!ĄtC Ū}’Fü¹‹F‹^ćŃąŃÓāś‰F‰^‹F9Fü|‹Fü+F‰Fü‹F‹^ƒÓ‰F‰^’Fžė™‹^ü‹vڊ‡,;ˆƒFŚ’N ‹F‹^-ƒŪu Ć Ūtée’’v ’N X Ą~ ’včŗž^ėģƒ~ t ‹^ŚĘ-ƒFŚ^Ü9^ŚvƒFŚ’‹^ڊ0ä˜P菾^ėå‰ģ]ĆU‰åƒ~t‹F- ¹»čn5=^wƒ~\t’vč_ž^øP錸\PčPž^’vėtø0PčCž^ėqøbPč9ž^ėgønPč/ž^ė]ørPč%ž^ėSøtPčž^ėIøfPčž^ė?ø\Pčž^ė5¹»‹Fŗ0RŗR1ŅRŗRčē4%’1ŪSPč3žƒÄ øPė ¾:Zé¶4øPX‰ģ]ĆU‰åƒģ‹F‰Fž‹^ž€?ué ‹^žŠ0ä˜Péšø P蜿^‹^žŠ0ä˜P菿^é߃Fž‹^ž€?-uƒFž‹^ž€?0uø0Pėø PFųĒFś‹^žŠ0ä˜-0¹»čK4= w$ø ÷fś‰Fś’vś’vžƒFž[Š0ä˜-0[Ɖ^śėƋ^ž€?lu*ƒFž‹^žŠ0ä˜-a¹»č4=w ‹^žŠ0ä˜ą’ˆ‹^žŠ0ä˜-A¹»čÜ3=v1ĄPėøPFö‹^žŠ0ä˜Péó’vś’vö’vƒF[’7č&ž^^[)Ɖ^śéÜ’vų’vś1ĄPøP’vƒF[1ĄP’7čŚüƒÄ ĒFśé“’vų’vś1ĄPøP’vƒF[’w’7č²üƒÄ ĒFśéŒ’vų’vś1ĄPøP’vƒF[1ĄP’7čŠüƒÄ ĒFśéd’vų’vś1ĄPøP’vƒF[’w’7čbüƒÄ ĒFśé<’vų’vśøPø P’vƒF[‹™RPč9üƒÄ ĒFśé’vų’vśøPø P’vƒF[’w’7čüƒÄ ĒFśéź’vų’vś1ĄPø P’vƒF[1ĄP’7ččūƒÄ ĒFśéĀ’vų’vś1ĄPø P’vƒF[’w’7čĄūƒÄ ĒFśéš’vų’vś1ĄPøP’vƒF[1ĄP’7č˜ūƒÄ ĒFśės’vų’vś1ĄPøP’vƒF[’w’7čqūƒÄ ĒFśėL’vƒF[‹‰Fü‹^ü€?t7’vś’vö’vüƒFü[Š0ä˜Pč_ü^^[)Ɖ^śė׋^žŠ0ä˜PčŃś^ė¾>:Zé®1’vś’NśX Ą~’vųč¶ś^ėģ¾~:Zé“1ƒFžéėü‰ģ]ĆU‰åFP’včĪü^^‰ģ]ĆU‰åPĒ2iuĒ&i‹&i’6&i‰(i*i‹*i’6*i‰,i.iĒFžƒ~ž}‹FžŃą‰ĆLJi’FžėčĒ6iĒiĒXuĒ8i‰ģ]ĆU‰å’vƒF[‹vŠˆƒF’Nuč‰ģ]ĆU‰å’vø>;PčX’^^øB;PčO’^ø’’Pč/ł^‰ģ]ĆU‰åƒ~|ƒ~ t ƒ~ t1ĄPėøPX‰ģ]ĆU‰åPPƒ>iu øJ;Pč ’^1ĄPėi’vøL;Pčüž^^ƒ>itøR;Pčģž^øPėH蟳‰Fü‹Fü‰Fžƒ~üqtƒ~žQuøPč®ų^’vžč}’^ Ąučtł‰Fžėķƒ~üntƒ~üNu1ĄPėøPX‰ģ]ĆU‰åƒģĒFž‹^Š0ä˜=0|3‹^Š0ä˜=8}&¹‹FžÓą‰Fž’vž’vƒF[Š0ä˜-0[Ɖ^žėĄ‹Fž‰ģ]ĆU‰åP‹F‰FžøX;Pč5ž^ƒ>it_øZ;Pč&ž^’Nt8čŚų‹^žˆ‹^žŠ0ä˜P菞^ Ąt‹^žĘ‹F9Fžw1ĄPė)øPė#ƒFžėƋ^žĘčœųP虾^ ĄuėņøPė1ĄPX‰ģ]ĆU‰åƒģ‹2i‰^ž‹F-»1Ņ÷ó÷f¹Óą‰Ć2i‰2i‹Fž‰Fü‹2i9^üs ‹^üĒƒFüėź‹Fž‰ģ]ĆU‰åPĒFž‹^€?uė:‹^Š0ä˜- ¹»čģ.=^w ‹^Š0ä˜Pėø?Pø`;Pč2ż^^ƒF’Nžu¼‰ģ]ĆU‰å‹^ƒt‹^’wčė’^ød;Pčż^‹^‹ƒĆSč…’^‰ģ]ĆU‰å‹4iƒu øf;Pčąü^ė’64ič³’^’vė&‹4i‹’7øh;PčĮü^^ė‹4i‹’7øv;Pč®ü^^ė¾Š:[é .ƒ~tø‚;Pč–ü^‰ģ]ĆU‰åƒģĒFžĒFśĒpuĒručxöøP’6LuøP’vśčröƒÄ‰Fü¹»‹Füčķ-©’t ’vž’NžX Ąu̹»‹FüčŃ-©’taĒpu ĒruĒFžčöøP’6LuøP’vśčöƒÄ‰Fü¹»‹Füč”-©’t ’vž’NžX Ąu̹»‹Füčx-©’tø„;Pčhü^‰ģ]ĆU‰åƒģ1Ą¾1’‹^čL.‰Fų‰Vśƒ~u ‹8i9^u‰ģ]Ƌ^‰8i¹ ‹Fų‹^śćŃūŃŲāś‰FōĒFņ¹»‹Fōč-i1Ū‰Fü‰^ž‹Fü‹^ž-’’ƒŪu!ĄtC Ū~ø¢;PčCū^øPč#õ^¹»‹FōŗR’6LučÅ,iP’vč-õƒÄ‰Fö¹»‹FöčØ,©’u‰ģ]Ćčõ1ĄP’vƒ~uøč;Pėøš;P’vöøČ;P诜ƒÄ ¹»‹FōŗR’6Luče,iP’včĶōƒÄ‰Fö¹»‹FöčH,©’u‰ģ]Ć’Nņuž1Ą’vöP’vƒ~uøiuø,it1ĄPčņ^‰ģ]ĆU‰åƒģĒFüĒFž‹^uƒĆ ƒė¹ ‰Ų1Ņ÷ń‹dubuĆS¹»Xč€)‰Fś‹`uƒėøPSčü^^ĘLiøPøLiP’vž’vü葿ƒÄĘLi‹Fü‹^žƒÓ‰Fü‰^ž’NśuŠ‹fu‰Ā:‹buƒĆdu1Ą¾1’¹ Q¹“:Qč *RPčHżƒÄ¹»”huŗRŗLiR’6fučņ(¹»čé(‰ĮXÓą1ŪS¾1’‰ĆXčĪ)RPč żƒÄ¹»”huŗ Rŗ”:R’6fuč¶(¹»č­(‰ĮXÓą1ŪS¾1’‰ĆXč’)RPčŠüƒÄ‰ģ]ĆU‰åƒģPøōitčžėøPø^uP1ĄPøPčsśƒÄƒ>itčAū¹»”nuča&=tøx=PčQõ^¹»”^učH& Ąø˜=Pč9õ^ƒ>`uwø¢=Pč*õ^¹»”buč!& Ąø¬=Pčõ^¹»”duč & Ąø“=Pčśō^¹»”fučń%=ø¼=Pčįō^ƒ>hu}øÖ=PčŅō^‹ju‹luƒėƒŁu!ŪtA Éøī=Pč±ō^‰ģ]ĆU‰åƒģ‹^uĆ ¹ ÓėS¹»Xč’%‰Fž¹»”nučƒ%=tø>Pčsō^¹»”bučj%9Fž~ø">PčZō^¹»‹Fž’6bučM%[9Ćt"øZ>PøX>P’vžø6>Pč鳃Ä’6buø\>Pč‰ó^^‹`uĆ ƒė¹ ÓėS¹»Xč %‰Fž¹»”dučü$9Fž~øl>Pčģó^¹»‹Fž’6dučß$[9Ćt"ø¤>Pø¢>P’vžø€>Pč{łƒÄ’6duø¦>Pčó^^¹»”fuč¬$¹»č£$9`uwø¶>Pč’ó^¹»”huč‰$=røŠ>Pčyó^ƒ>hu~ ’6huøč>PčĖņ^^¹»”huŗRčX$¹»čO$‰ĮXÓą¹»čA$¹»č8$‹^uƒĆ ƒėP¹ ‰Ų1Ņ÷ń‹buƒĆduĆXŲ-P¹»”huč$¹»čū#‰ĮXÓč¹»čķ#‰Fž¹»”fučŽ#9Fž~ø ?PčĪņ^¹»‹Fž’6fučĮ#[9Ćt’vžø&?Pčņ^^’6fuøR?Pčņ^^ĒFś’’ĒFü’‹Fś‹^ü-ƒŪSP”hu™‰ĮX[ćŃūŃŲāśSP1ĄPøPč”#-ƒŁu!ĄtA É|”hu™‰Įø»ćŃąŃÓāś‰Fś‰^ü‹ju‹lu+^śNüu Ł Ét"’vü’vśøb?Pč‚ńƒÄ’6lu’6juøˆ?PčpńƒÄ‰ģ]ĆU‰åPPøP’vč”ó^^‰Fž‹Fž‰Fü‹^ü‹ ‰‹Fž‰ģ]ĆU‰åƒģ‹F‰FüĒFž‹F9Fž}/1Ą¾1’‹^¹Q’vüčØ#RPč¤öƒÄ’Fž‹F‰FFüėɋF‰Fų‹^ų‹ ‰‰ģ]ĆU‰åƒģ‹F‰FüĒFž‹F9Fž}/1Ą¾1’‹^¹Q’vüčL#RPčŠöƒÄ’Fž‹F‰FFüėɉģ]ĆU‰åƒģöFtB¹‹FÓč¹Óą‰Ć^‰^ś‹F%’7¹»ŗRč’!‰ĮXÓą[ Ų‹^ś‰‹F‰Fėø¹‹FÓč¹Óą‰Ć^‰^žø÷fŃą‰Ć^‰^ü‹Fü9Fžs ‹^žĒ’’ƒFžėė‰ģ]ĆU‰å’6bu藾^£Vu’6du茾^£Ru’6bu聞^£Tu’6dučvž^£Pu’6bučkž^£Nu‰ģ]ĆU‰åPP‹F F Ąu鷋F3FØtK‹F ‰Fž‹^ ‹@‹^ž‰‹^ž¹‹™÷ł Ņu+‹^ƒ?t#ƒ>itƒ>iu ø˜?PčTš^ Ąt ‹^ĒėF‹^ƒ?t>÷Ft÷Fu’v’v øŖ?PčBļƒÄė÷Fu÷Ft’v’v ø¼?Pč"ļƒÄ‹FŃč‰F‹FŃč‰F‹F‰Fé<’‰ģ]ĆU‰åƒģ ‹F‰Fž‹F‰FüĒFśĒFųƒ>it’v ’v ’včīżƒÄ‰ģ]Ć’vøŠ?Pčæī^^’v ’v ’včsżƒÄ‹^ž‹vü‹9t‹^ü‹vžFśPFųP’v’v’7’4軞ƒÄ ƒFžƒFü‹F‰F‹F9Fr½ƒ>itƒ>itƒ~śuøā?PčPī^ƒ~ųƒ~ų ~ ’vųøč?Pč9ī^^ƒ~ųtøś?Pč ļ^ Ąt’v ’v ’vč7żƒÄƒ~ų~ø @Pč ī^‰ģ]ĆU‰åPPĒFžƒ>it‰ģ]Ćø@Pččķ^‹Fž%¹»ŗRčs‰ĮXÓą¹‹^žÓė¹ÓćVu…t霋buƒĆdu1Ą¾1’¹QNüQč1 ‹^žƒė1ÉRP¾ 1’‰Čč [YĆŃQSčóƒÄƒ~ütW’vžø$@Pčhķ^^ø>@Pč@ī^ Ąt?‹buƒĆdu1Ą¾1’¹ Q¹LiQčŌ‹^žƒė1ÉRP¾ 1’‰ČčĄ[YĆŃQSčųņƒÄ‹Fž‰Fž‹^u9^žwé’øF@Pč’ģ^‰ģ]ĆU‰å‹^uƒĆøPSč"ļ^^£Ji‰ģ]ĆU‰åƒģ"ƒ>XutøH@PčĖģ^ĒXu‹buƒĆdu1Ą¾1’¹ QNąQč>‹^ƒė1ÉRP¾ 1’‰Čč*[YĆŃQSč ņƒÄ‹^Ji‰^Ž‹^ފ0ä˜PŠFķ0ä˜[Ƌvވ‹^JiŠ0ä˜P¹»ŠFķ0äččP’vø\@Pč>ģƒÄøh@Pčķ^ ĄtZ‹^JiŠ0äˆFķ˜ Ąuøp@Pč°ģ^‹buƒĆdu1Ą¾1’¹ QNąQ莋^ƒė1ÉRP¾ 1’‰Ččz[YĆŃQSč²ńƒÄ‰ģ]ĆU‰åPĒFž‹^u9^žw‹^žJi€?t’vžčĪž^‹Fž‰Fžėك>XuuøŒ@Pč“ė^‰ģ]ĆU‰å¹»‹F’vč¹»č‰ĮXÓčØtøŽ@P븐@Pč]ė^¹»‹F’včģ¹»čć‰ĮXÓčØtø’@Pėø”@Pč.ė^¹»‹F襅Ft’v ø–@Pčė^^ė/¹»‹F’včž¹»č•‰ĮXÓčØtøš@Pėøœ@Pčąź^‰ģ]ĆU‰åƒ>itĒiøž@PčÄź^’vøĀ@Pč¹ź^^‹^‹%šPė2øČ@P脟^ė/øŹ@P蛼^ė%øĢ@P葼^ėøĪ@P臼^ėøŠ@Pč}ź^ė¾Ō:Zéū‹^øsPøPøP’7čŃžƒÄ‹^øsPøPøP’7čŗžƒÄ‹^øtPøP1ĄP’7褞ƒÄ‹^ŠG 0ä˜PøŅ@Pčź^^‹^‹%šPė<‹^1ɋGÓč%’¹‹_Óėć’PSøŲ@PčļéƒÄė‹^’w’wøä@PčŚéƒÄė¾č:ZéVøP1ĄPčŠģ^^‰ģ]ĆU‰åƒģ‹^¹‹Óč¹Óą‰ĆTu‰^ų‹v‹%’7¹»ŗRč(‰ĮXÓą[ Ų‹^ų‰øź@PčVź^ ĄtM‹^‹Ji‰^ų‹^ųŠ0ä˜HˆĒFü:i‹F‰FśĒFž’vž’NžX Ąt’vüƒFü[‹vśŠˆƒFśėąøPė1ĄPX‰ģ]ĆU‰åP‹^ ‹F 9ué3‹^ ƒĆSøś@Pčüč^^1ĄPøPčüė^^‹^ ‹v ’7ƒĘVøAPčŪčƒÄ’v øAPčĪč^^¹‹FÓč¹Óą‰ĆTu‰^ž‹F%’7¹»ŗRč@‰ĮXÓą[ Ų‹^ž‰‹^ ¹‹Óč¹Óą‰ĆTu‰^ž‹v ‹%’7¹»ŗRč‰ĮXÓą[ Ų‹^ž‰¹‹F Óč¹Óą‰ĆTu‰^ž‹F %’7¹»ŗRč̉ĮXÓą[ Ų‹^ž‰ø*APčśč^ ĄuéJ‹^ ‹Ji‰^ž‹^žŠ0ä˜Hˆ‹F ‹^ ‰‹^ Ji‰^ž‹^žŠ0ä˜@ˆ1ĄPé‹^ ’v’v€tøPė1ĄPX™[Y)ĆŃu Ł Éuéå‹^ ’v’vƒĆSø4APč˜ēƒÄ1ĄPøP藼^^‹^ ‹v ’7ƒĘVøRAPčvēƒÄ¹‹FÓč¹Óą‰ĆTu‰^ž‹F%’7¹»ŗRčē‰ĮXÓą[ Ų‹^ž‰‹^ ¹‹Óč¹Óą‰ĆTu‰^ž‹v ‹%’7¹»ŗR諉ĮXÓą[ Ų‹^ž‰¹‹F Óč¹Óą‰ĆTu‰^ž‹F %’7¹»ŗRčs‰ĮXÓą[ Ų‹^ž‰øPX‰ģ]ĆU‰åƒģĒFž‹^ƒĆ‰^ü‹^ü€?uZøhAPč›ę^1ĄPPčŸé^^¹‹FÓč¹Óą‰ĆTu‰^ś‹F%’7¹»cefghijklmnoŗRč‰ĮXÓą[ Ų‹^ś‰’vč•ü^ Ąt1ĄPé›’Nžu鏋^ü€?ué„’vüƒFü[€?/uąø|APč!ę^1ĄPøPč"é^^¹‹FÓč¹Óą‰ĆTu‰^ś‹F%’7¹»ŗRčˆ‰ĮXÓą[ Ų‹^ś‰ø APčÕå^‹^ƒĆSčVč^øŖAPčĀå^’včżū^ Ąt1ĄPėøPX‰ģ]ĆU‰åƒģ‹^ ƒ?r‹^ ‹^u9w醸®APč…å^1ĄPøPč†č^^‹^ ’7øĢAPčlå^^øŽAPčcå^‹^ ƒĆSčäē^øčAPčPå^øģAPč)ę^ Ąt6ĒFž:i‹F ‰FüĒFś’vś’NśX Ąt’vžƒFž[‹vüŠˆƒFüėą1ĄPéµøP鮋^ ‹Ji1ĄŠP¹»Xč=uF‹^ ’7øüAPčŻä^^øBPčŌä^‹^ ƒĆSčUē^ø,BPčĮä^øP1ĄPčĀē^^’v čšś^ Ąt1ĄPéK‹^ ‹Ji‰^ų‹^ųŠ0ä˜@ˆ‹^ øBPƒĆSč•^^ ĄuC‹4iƒĆ‰^ų‹^ųŠ0ä˜ ˆƒ~u’vė ‹4i‹_‹’7’v ’v’v’v诜ƒÄ Pé™’v ’vč*ż^^ Ąu1ĄP鄋^ ‹%¹»ŗRčf‰ĮXÓą‹^ ¹‹Óė¹ÓćNu…tKøBBPč¤ć^1ĄPøPč„ę^^ødBPčć^‹^ ƒĆSčę^‹^ ’7ønBPčxć^^’v č²ł^ Ąt1ĄPėøPė’v čŲ ^PX‰ģ]ĆU‰åģ ¹»”huŗRčŪ¹»č҉ĮXÓą¹»čÄ¹Óą‰†üž»”hu’v 诹»č¦‰ĮXÓą1ŪS¾1’‰ĆX苉†öž‰–ųžøP†’P’¶ųž’¶öžčpčƒÄdžśžž’‰žžž^9žžžréó‹^‹G‹O+FN -ƒŁu!ĄtA É}wø€BPč”ā^1ĄPøPč•å^^øšBPčać^ ĄtQ¹‹FÓč¹Óą‰ĆTu‰žōž‹F%’7¹»ŗRčī‰ĮXÓą[ Ų‹žōž‰‹^‹F‹N ‰G‰Odžśžė1ĄP鷋žžžƒ?t’¶žž’v ’v’včcüƒÄ Ąudžśž‹F‹^ ƒÓ‰F‰^ ‹^‹F‹N +GOu!ĄtA É|ėƒ†žžé’ƒ¾śžtøP†’P’¶ųž’¶öžč‡ēƒÄ‹†öž‹žųžƒÓ‰†öž‰žųž’Žüžt‹^‹F‹N +GOu!ĄtA É}酾øPX‰ģ]ĆU‰å’vø¦BPč[į^^1ĄPøPč[ä^^’vø²BPčCį^^’vė(øÄBPč5į^ė%øŹBPč+į^ėøŚBPč!į^ėøźBPčį^ė¾ō:[éw’v ’v øųBPčįƒÄ‰ģ]ĆU‰åPP‹F+fu‰Fž‹FŃą‰ĆĆi‰^ü‹@‰‹fu9^r ‹`u9^r’v ’v ’v’vøCPčG’ƒÄ 1ĄPé ‹Fž%¹»ŗRč2‰ĮXÓą¹‹^žÓė¹ÓćRu…tT¹‹FžÓč¹Óą‰ĆPu‰^ü‹Fž%’7¹»ŗRčķ‰ĮXÓą[ Ų‹^ü‰’v ’v ’v’vøCPčĘžƒÄ 1ĄP鉒$i‹Fž%¹»ŗRč­‰ĮXÓą¹‹^žÓė¹ÓćPu…t’vž’v ’v ’v’v’vøCPčsžƒÄ¹‹FžÓč¹Óą‰ĆRu‰^ü‹Fž%’7¹»ŗRčL‰ĮXÓą[ Ų‹^ü‰øPX‰ģ]ĆU‰åģdžžž¹»”hu’v č¹»č‰ĮXÓą1ŪS¾1’‰ĆXčö‰†śž‰–üžøP†’P’¶üž’¶śžčŪäƒÄ‹F HPø€P†’P’v’v’včIƒÄ Ąu1ĄPė<‹†śž‹žüžƒÓ‰†śž‰žüž’Žžžt‹^‹v‹‹O+DLu!ĄtA É|‹øPX‰ģ]ĆU‰åƒģ¹»”huŗRčb¹»čY‰ĮXÓą¹»čK™‰Fü‰Vžƒ~t¾1’‹^ü‹Fžč(‰Fü‰Vž’Nuē‹Fü‹Vž‰ģ]ĆU‰åPƒ~ téw‹^‹%š=@u ‹^’v ’w’7’v’včūśƒÄ Ąu1ĄPė`‹F‰Fž‹^ž’w’7¹»”huŗRčù»čŗ‰ĮXÓą¹»č¬™[YĆыvž‰‰LøPė’v ’v ’v’v’včOžƒÄ PX‰ģ]ĆU‰åƒģĒFžĒFü‹F 9Fü|éĪ‹^‹v‹‹O+DLu!ĄtA É|鯋FüŃą‰Ć^ ƒ?u%‹F‰Fś‹^ś’w’7’vč§ž^[YĆыvś‰‰Lėu‹^‹FüŃą‰Ęv ’w’7’v’4’včYüƒÄ Ąu*‹F‰Fś‹^ś’w’7’vč^ž^[YĆыvś‰‰LĒFžė'‹FüŃą‰Ć^ ’v’7’v’v’v芾ƒÄ ĄuĒFž’Füé'’‹Fž‰ģ]ĆU‰åƒģ ĒFöĒFų‹^1ĄPøPƒĆSFöP’v’včåžƒÄ ‰FžĒFüĒFśƒ~ü }6‹^‹FüѹƒvśøPƒĆSFöP’v’vč­žƒÄ ĄuĒFž’Fü’FśėċFž‰ģ]ĆU‰åPP¹‹FÓč¹Óą‰ĆNu‰^ü‹F%’7¹»ŗRčŽ ‰ĮXÓą[ Ų‹^ü‰‹^‹G‹O-ˆƒŁu!ĄtA É~ø$CPčÜ^øPøPčß^^’v’vč ’^^‰Fž‹4iŠG0䘨uø>CPčąŪ^øPøP蹎^^ĒFž‹4iŠG0䘨uøLCPčøŪ^øPøPčøŽ^^ĒFž‹Fž‰ģ]ĆU‰å‹^‹%šPėc’.i’v’v薾^^PėX’,i’v’vč’^^PėF’*iøPė<’(iøPė2’&iø\CPčMŪ^1ĄPøPčNŽ^^‹^’7øjCPč4Ū^^1ĄPė¾;Zé® X‰ģ]ĆU‰åPƒ~u/‹^‹%š=@t"øvCPčŪ^‹^’7’vø–CPčóڃÄø®CPč„Ū^‹^€ uø°CPčŲŚ^1ĄPøP裯^^1ĄPé>’0i¹‹FÓč¹Óą‰ĆVu‰^ž‹F%’7¹»ŗRč5 ‰ĮXÓą[ Ų‹^ž‰‹^1ĄŠG P¹»Xč =w阸ÄCPčgŚ^1ĄPøPčhŻ^^‹^1ĄŠG P¹»Xčę PøÜCPč?Ś^^‹^Ji‰^ž‹^ž1ĄŠP¹»XčĄ -¹»č“ ‹^žˆ¹‹FÓč¹Óą‰ĆTu‰^ž‹F%’7¹»ŗRč„ ‰ĮXÓą[ Ų‹^ž‰ėC‹^Ji‰^ž‹^ž1ĄŠP¹»XčY ‹^P1ĄŠG P¹»XčE [)ĆS¹»Xč7 ‹^žˆ’v’včģż^^PX‰ģ]ĆU‰åƒģ2‹^‹‰FŽ‹F‰F֋4i‰^Ų^։4i‹FŽ%¹»ŗRčģ ‰ĮXÓą¹‹^ŽÓė¹ÓćTu…t’vŽøčCPč)Ł^^øP1ĄPč)Ü^^‹FŽ%¹»ŗRč§ ‰ĮXÓą¹‹^ŽÓė¹ÓćVu#¹»č† ‰F܃~Üt ƒ>iu鐋buƒĆdu1Ą¾1’¹ QNąQčN ‹^ރė1ÉRP¾ 1’‰Čč: [YĆŃQSč0ރă>it FąP’vŽč©ķ^^ƒ~Üté5FąP’vŽčNż^^ Ąté"¹‹FŽÓč¹Óą‰ĆTu‰^Ī‹FŽ%’7¹»ŗRčŚ ‰ĮXÓą[ Ų‹^ΉøśCPčŁ^ ĄuéŪ‹^ŽJi‰^Ī‹^Ί0ä˜PŠFķ0ä˜H[ƋvΈ¹‹FŽÓč¹Óą‰ĆVu‰^Ī‹FŽ%’7¹»ŗRčq ‰ĮXÓą÷Š[!ƋvΉ‹buƒĆdu1Ą¾1’¹ Q¹LiQč= ‹^ރė1ÉRP¾ 1’‰Čč) [YĆŃQSča݃ÄĒFŌ:i‹F‰FŅĒFŠ’vŠ’NŠX Ąt’vԃFŌ[‹vҊˆƒFŅėą‹4i‹_‰4i1ĄPė‹4i‹_‰4iøPX‰ģ]ĆU‰åƒģƒ>iu¹»”^uč¶£0i‹`u+fuƒĆS¹»Xč£$iĒFšĘFņFšPčiż^ ĄuøDPčz×^øDPč×Ö^‰ģ]ĆU‰åøPøDPčÄÖ^^¹»”huŗRčQ¹»čH‰ĮXÓą¹»č:Pø,DPč“Ö^^ø>DPčŠÖ^øZDPøXDP’6.iø@DPčČ܃ÄørDPøpDP’6,iø\DPč²ÜƒÄø–DPø”DP’6*iøvDPčœÜƒÄø¼DPøŗDP’6(iø˜DPč†ÜƒÄƒ>&itøŌDPøŅDP’6&iø¾DPči܃ÄøīDPøģDP’60iøÖDPčS܃ÄøEPøEP’6$iøšDPč=܃ĉģ]ĆU‰åƒ>iuƒ>itĒi‹^‰ZučÖÕčÄąč¬įč°å‹^uƒĆ’6buS’6VučåƒÄ‹`u+fuƒĆ’6duS’6Ruč÷äƒÄčččTž‹buƒĆ‹fuƒéøEP’6`u’6duSQ’6Pu’6Ruč^ęƒÄč†é‹^uƒĆøEPS’6buøP1ĄP’6Tu’6Vuč6ęƒÄč+ēčZžƒ>6itøEPčÕ^‰ģ]ĆU‰åƒģ ĒFžĒFüĒFśƒ>ę9t‹pu‰č9Ēę9ƒ>pu |ƒ>ru}ø@EPčŚŌ^ĒLuLqĒ\u\EøbEPčĘŌ^øhEPč¾Ō^ø€EPč¶Ō^ø²EPč®Ō^øųEPč¦Ō^øDFPčžŌ^ø’FPč–Ō^ø¶FPčŽŌ^č‹Ī‰Fų¹»‹Fųč%’¹»č‰Fö’vöøŗFPčbŌ^^ĒiĒtuĒvu’vöéÖčƒ>tu}ø€P븁P¹»XčÉ£vuĒrudĒpuøī9Pø¾FPčŌ^^čQ Ą}é?’Ēi鐸ī9PøŲFPčšÓ^^čZ×Ēiėxøī9PøšFPčŲÓ^^Ēi‹i‰ič4×ėXøGPč¼Ó^č'×Ēiƒ>puu@Ēź9°Ēģ9’ė2¹‹FųÓų¹»č+%’¹»čPėFø"GPčvÓ^é­ž¾;Zéó’vś’vü’vžø4GPčwżƒÄĒi‹i’6i‰ii‹i‰iéržX‰ģ]ĆU‰åPø@GPč'Ó^č$͈F’ŠF’0ä˜PøGPčÓ^^€~’ uø”GPčÓ^ƒ>tu~9‰ģ]ƃ>tu~ė,ŠF’0ä˜=1|!ŠF’0ä˜=9€~’5uėŠF’0ä˜-0£tuėœĒtuėŒU‰åƒģ&ĒFś’Fśƒ~ś~ø–GPčŸŅ^ø’’PéøøP’6Lu1ĄPPčšĢƒÄ‰Fž¹»‹Fžč©’uĀĒFüƒ~ü|é-¹‹FüÓą¹»’6LučķĘ[Ć1ĄŠ0’‰^ę‰F蹋FüÓą¹»’6LučĆĘ[Ć1ĄŠ0’‰^ā‰F之FüÓą¹»’6Luč™Ę[Ć1ĄŠ0’‰^މF๋FüÓą¹»’6LučoĘ[Ć1ĄŠ0’‰^ډFܹ‹FŽ‹^ąćŃąŃÓāś¹‹VŚ‹vÜćŃāŃÖāś Ā Ž¹‹Fā‹^äćŃąŃÓāś Š ó Fę ^蹋VüÓā‰Ö‰Bź‰Zģ‹FüÓą‰Ę‹Bź‹Zģ-’’ƒŪu!ĄtC Ū~øĄGPčEŃ^øPč%Ė^’Fü鏞ƒ>tu| ‹tuƒėSė’6tuFüFźPč=^¹‹FüÓą-‰Ę‹Zź‰i”i1Ņ÷ń Ņt»”i1Ņ÷ó¹Óą£i1ĄPX‰ģ]ĆU‰åPPĒFžƒ~ž|ééĒFüƒ~ü|éÕ¹‹FüÓą‰Ć^‹‹O-ƒŁu Į ÉuB‹Fü@¹Óą‰Ć^‹‹O-ƒŁu Į Ét!‹Fü@¹Óą‰Ć^‹FüÓą‰ĘvSVč^^ėm¹‹FüÓą‰Ć^‹Fü@Óą‰Ęv‹‹O+Lu!ĄtA É~@‹Fü@¹Óą‰Ć^‹‹O-ƒŁu Į Ét‹Fü@¹Óą‰Ć^‹FüÓą‰ĘvSVč^^’Füé"’’Fžé’‰ģ]ĆU‰åPP‹^‹’w‰FüFž‹^‹v‹‹_‰‰\‹^‹Fü‹Nž‰‰O‰ģ]ĆU‰å‹^Š0ä˜P’vƒF[Š0ä˜[9Ću’vƒF[Š0ä˜ ĄuŌ1ĄPė‹^Š0䘃F’‹^PŠ0ä˜[)ĆSX‰ģ]ĆU‰åƒģĒFüĒFžĒFų‹^Š0䘉Ɗ‡óG0䘹»čĆØtƒFė܋^Š0ä˜=-u ƒFĒFų’vƒF[Š0ä˜-0¹»芉Fśƒ~ś s)¾ 1’‹^ü‹Fžčk‰Fü‰Vž1Ą‹^ü‹Nž^śĮ‰^ü‰Nžėµƒ~ųt‹^ü‹Fž÷Ų÷ŪPSė’vž’vüXZ‰ģ]Ƌ+\;\w Ńć‹X…Ūu ‰Ó…Ūuč«’歓­‘I|­9Š­u÷“…Ūuč”’ć_9Ėtƒūt ƒūuƒłu Z’ēƒłu1ŅR’ēPčhU‰åW)’‹V ‹F‹^‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×č…’t÷Ś÷؃Ś_]‰ŃĀ…Ūu‰Ć‰Š)Ņ÷ń“÷ń‰Ń‰Ś)ŪĆUWV)’„’u&GWˆßˆėˆĶ(É‰ĶˆÅ(ɈąˆŌˆņ(öRPQ‰é9Śr ø’’ė WWRP‰Š)Ņ÷ó‰Å÷į_)ĒƒŅ‰Ö‰Ų÷嚃Ņ^)ʃŅX)Šy MĻŽėō‰ł‰ó_…’tˆéˆŻˆūˆĒ‰č)Ņ^_]Ć÷ę‰Į‰ų÷ćĮ‰š÷ćŹĆ‰ę‹\‹D™9Āu1!Ņ}÷Ūt)1Ņ‹L‹D!Ą}÷Ų÷ŁŠ÷ó‘÷ó1ۃ|}÷Ū÷ڃŪ‰Ē1Ū!’}÷ß÷\ߋD‹T!Ņ}÷Ś÷ŲڹŃąŃŅŃÓ9ßwr»9Tvāķė¹+Tū@āć미tHėø‹Hėø¢Hėø¹HėøŠHė øęHėøżHė»SPøPččĘU‰åĒzu‹^‰|u‹^‰~u‹^‰‚uøxuPøPø»xu¹Ķ ‰ģ]Ć h_Answer questions with y or n. Then hit RETURN넯 Ķ ¹ × Ć\į(BtC.DOÄSÜUfXµbLc.dģoœsÜu>xŽT L%d« ~ ‘ ...ķA Ź ¶@¬`Ą€¢d =`=0%%%&%ö* ģ*@Š*`ā*€¾*Ń2=±2fS2h2lk2m‹20123456789ABCDEF%s fatal %s? yes --> %c// (ino = %u, (ino = %u) can't determine diskette-typeFsck cannot read beyond sector 65535 error 0x%x %s block %D, retry readingwriting%s: can't %s block %D (error = 0x%x) readwriteinternal error (devwrite)ninodes = %unzones = %uimap_blocks = %uzmap_blocks = %ufirstdatazone = %ulog_zone_size = %umaxsize = %Uok nowDo you want to try againHit RETURN key to select default values # zones (default: %d) log zonesize (default: %d) #inodes (default: %u) is this okbad magic number in super blockno inodesno zonesno imapno zmapfirst data zone too smallzone size < block sizemax. file size <= 0bad magic number in super blocktoo few imap blockswarning: expected %d imap_block%ss instead of %d too few zmap blockswarning: expected %d zmap_block%ss instead of %d first data zone too largelog_zone_size too largewarning: large log_zone_size (%d) first data zone too smallwarning: expected first data zone to be %d instead of %u warning: expected max size to be %D instead of %D stop this listing%s %u is missing %s %u is not free Checking %s map etc. %d errors found. install a new map Checking inode list mode inode %u not cleared. clear INODE NLINK COUNT %5u %5u %5u adjustinternal error (counterror) r-w-%cx- inode permission link size name %6u -dcb? %3u %2x,%2x %7D . remove entrybad %s in %s is linked to %u instead of %u). repairwarning: %s has offset %D in %s is linked to %u) null name found in found a '/' in entry of directory entry = '')bad inode found in directory ino found = %u, name = ''). remove entrytoo many links to ino %u discovered at entry '' in directory ...link to directory discovered in name = '', dir ino = %u)bad format in directory . truncate%s zone in zno = %u, type = DATASINGLE INDIRECTDOUBLE INDIRECTVERY INDIRECT, pos = %D) out-of-rangeduplicatefoundwarning: huge directory: . missing in .. missing in bad mode of mode = %o)root inode is not a directory (ino = %u, mode = %o) link count zero of link count too big in cnt = %u) found inode %u: removebad root inode blocksize = %5d zonesize = %5d %6u Regular file%s s%6u Director%s yies%6u Block special file%s s%6u Character special file%s s%6u Bad inode%s s%6u Free inode%s s%6u Free zone%s szoneinode----- FILE SYSTEM HAS BEEN MODIFIED ----- Bootblok gave bad tracksiz fsck Hit key as follows: = start MINIX (root file system in drive 0) f check the file system (first insert any file system diskette) l check and list file system (first insert any file system diskette) m make an (empty) file system (first insert blank, formatted diskette) h check hard disk file system # %c Checking hard disk. %s Checking diskette. %s Checking diskette. %s Making empty file system Illegal command disk(ette) Please enter partition number. Drive 0: 1-4, drive 1: 6-9, then hit RETURN: %c Disk errors. Can't read partition table Fsck can't handle partitions above sector 65535  AAAAAABBBBBB Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow /* fsck - file system checker Author: Robbert van Renesse */ #include "/usr/include/const.h" #include "/usr/include/type.h" #include "../fs/const.h" #include "../fs/type.h" /* #define DOS /* compile to run under MS-DOS */ #define STANDALONE /* compile for the boot-diskette */ #define HERE /* fixes for Adaptec ACB-2070a */ /* Fsck may be compiled to run in any of two situations. For each * a different symbol must be defined: * * STANDALONE will compile fsck to be part of the boot-diskette and * all necessary routines are contained in the program * DOS will compile fsck to run under MS-DOS, using * the standard DOS library for your compiler. * * The assembler file fsck1.asm must be assembled correspondingly. It has * only one symbol defined, namely STANDALONE. * The assembler file fsck.s is only used under PC/IX to produce * a version for the boot diskette. * When you have a problem look at the preprocessor output to see * which lines will actually be compiled. * To produce an executable/binary version issue one of the following * commands, depending on your development environment: * * Development system: MS-DOS * * fsck to run under: MS-DOS * defined symbols: fsck.c: DOS * fsck1.asm: - * command: link fsck+fsck1,,,DOS-lib * * fsck to run under: BOOT * defined symbols: fsck.c: STANDALONE * fsck1.asm: STANDALONE * command: link fsck1+fsck,fsck,, {Minix-lib || DOS-lib} * dos2out -d fsck * * fsck to run under: MINIX -not yet implemented- * command: link crtso+fsck,fsck,,Minix-lib * dos2out -d fsck * * * Development system: PC/IX * * fsck to run under: PC/IX * command: ld fsck -lc * * fsck to run under: BOOT * defined symbols: fsck.c: STANDALONE * fsck1.s: - * command: ld fsck1.o fsck.0 -l../lib/lib.a * * fsck to run under: MINIX * command: ld fsck.o -l../lib/lib.a * */ #ifndef STANDALONE # ifndef DOS -error: no system defined. # endif #endif #define BITSHIFT 4 /* = 2log(#bits(int)) */ #define BITMAPSHIFT 13 /* = 2log(#bits(block)); 13 means 1K blocks */ #define MAXPRINT 8 /* max. number of error lines in chkmap */ #define MAXWIDTH 32 /* max. width of an ``integer string'' */ #define MAXDIRSIZE 5000 /* max. size of a reasonable directory */ #define CINDIR 128 /* number of indirect zno's read at a time */ #define CDIRECT 16 /* number of dir entries read at a time */ #define SECT_SHIFT 9 /* sectors are 512 bytes */ #define SECTOR_SIZE (1<> BITSHIFT] |= 1 << ((b) & BITMASK)) #define clrbit(w, b) (w[(b) >> BITSHIFT] &= ~(1 << ((b) & BITMASK))) #define bitset(w, b) (w[(b) >> BITSHIFT] & (1 << ((b) & BITMASK))) int drive, partition, cylsiz, tracksiz; int virgin = 1; /* MUST be initialized to put it in data seg */ int floptrk = 9; /* MUST be initialized to put it in data seg */ int zone_ct = 360; int inode_ct = 95; struct dsb { inode_nr s_ninodes; /* # inodes on the minor device */ zone_nr s_nzones; /* total dev size, incl. bit maps etc */ unsigned short s_imap_blocks; /* # of blocks used by inode bit map */ unsigned short s_zmap_blocks; /* # of blocks used by zone bit map */ zone_nr s_firstdatazone; /* number of first data zone */ short s_log_zone_size; /* log2 of blocks/zone */ file_pos s_maxsize; /* maximum file size on this device */ int s_magic; /* magic number for super blocks */ } sb; #define STICKY_BIT 01000 /* not defined anywhere else */ /* ztob gives the block address of a zone * btoa gives the byte address of a block */ #define ztob(z) ((block_nr) (z) << sb.s_log_zone_size) #define btoa(b) ((long) (b) * BLOCK_SIZE) #define SCALE ((int) ztob(1)) /* # blocks in a zone */ #define FIRST sb.s_firstdatazone /* as the name says */ /* # blocks of each type */ #define N_SUPER 1 #define N_IMAP (sb.s_imap_blocks) #define N_ZMAP (sb.s_zmap_blocks) #define N_ILIST ((sb.s_ninodes+INODES_PER_BLOCK-1) / INODES_PER_BLOCK) #define N_DATA (sb.s_nzones - FIRST + 1) /* block address of each type */ #define BLK_SUPER (SUPER_BLOCK) #define BLK_IMAP (BLK_SUPER + N_SUPER) #define BLK_ZMAP (BLK_IMAP + N_IMAP) #define BLK_ILIST (BLK_ZMAP + N_ZMAP) #define BLK_FIRST ztob(FIRST) #define ZONE_SIZE ((int) ztob(BLOCK_SIZE)) #define NLEVEL (NR_ZONE_NUMS - NR_DZONE_NUM + 1) /* byte address of a zone/of an inode */ #define zaddr(z) btoa(ztob(z)) #define inoaddr(i) ((long) (i - 1) * INODE_SIZE + btoa(BLK_ILIST)) #define INDCHUNK (CINDIR * ZONE_NUM_SIZE) #define DIRCHUNK (CDIRECT * DIR_ENTRY_SIZE) char *prog, *device; /* program name (fsck), device name */ int firstcnterr; /* is this the first inode ref cnt error? */ unsigned *imap, *spec_imap; /* inode bit maps */ unsigned *zmap, *spec_zmap; /* zone bit maps */ unsigned *dirmap; /* directory (inode) bit map */ char *rwbuf; /* one block buffer cache */ char rwbuf1[BLOCK_SIZE]; /* in case of a DMA-overrun under DOS .. */ char rwbuf2[BLOCK_SIZE]; /* .. an other buffer can be used */ char nullbuf[BLOCK_SIZE]; /* null buffer */ links *count; /* inode count */ dir_struct nulldir; /* empty directory entry */ block_nr thisblk; /* block that is now in the buffer */ int changed; /* has the diskette been written to? */ struct stack { dir_struct *st_dir; struct stack *st_next; char st_presence; } *top; extern long lseek(); #ifdef DOS #define atol(s) atoi(s) /* kludge for C86 (no atol(s) in library) */ #else long atol(); #endif #ifdef STANDALONE extern end; /* last variable */ int *brk; /* the ``break'' (end of data space) */ #else int dev; /* file descriptor of the device */ #endif #define DOT 1 #define DOTDOT 2 /* counters for each type of inode/zone */ int nfreeinode, nregular, ndirectory, nblkspec, ncharspec, nbadinode; int nfreezone, ztype[NLEVEL]; int repair, automatic, listing, listsuper, makefs; /* flags */ int firstlist; /* has the listing header been printed? */ unsigned part_offset; /* sector offset for this partition */ char answer[] = {"Answer questions with y or n. Then hit RETURN"}; union types { int *u_char; /* %c */ int *u_int; /* %d */ unsigned *u_unsigned; /* %u */ long *u_long; /* %D */ char **u_charp; /* %s */ }; #ifndef STANDALONE # ifdef DOS # include "/lib/c86/stdio.h" # endif #else /*STANDALONE*/ /* Print the given character. */ putchar(c){ if (c == '\n') putc('\r'); putc(c); } /* Get a character from the user and echo it. */ getchar(){ register c; if ((c = getc() & 0xFF) == '\r') c = '\n'; putchar(c); return(c); } #endif /*STANDALONE*/ /* Print the number n. */ printnum(n, base, sign, width, pad) long n; int base, sign; int width, pad; { register short i, mod; char a[MAXWIDTH]; register char *p = a; if (sign) if (n < 0) { n = -n; width--; } else sign = 0; do { /* mod = n % base; n /= base */ mod = 0; for (i = 0; i < 32; i++) { mod <<= 1; if (n < 0) mod++; n <<= 1; if (mod >= base) { mod -= base; n++; } } *p++ = "0123456789ABCDEF"[mod]; width--; } while (n); while (width-- > 0) putchar(pad); if (sign) *p++ = '-'; while (p > a) putchar(*--p); } /* Print the character c. */ printchar(c, mode){ if (mode == 0 || (isprint(c) && c != '\\')) { putchar(c); return(1); } else { putchar('\\'); switch (c) { case '\0': putchar('0'); break; case '\b': putchar('b'); break; case '\n': putchar('n'); break; case '\r': putchar('r'); break; case '\t': putchar('t'); break; case '\f': putchar('f'); break; case '\\': putchar('\\'); break; default: printnum((long) (c & 0xFF), 8, 0, 3, '0'); return(4); } return(2); } } /* Print the awyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžrguments pointer to by `arg' according to format. */ doprnt(format, argp) char *format; union types argp; { register char *fmt, *s; register short width, pad, mode; for (fmt = format; *fmt != 0; fmt++) switch(*fmt) { case '\n': putchar('\r'); default: putchar(*fmt); break; case '%': if (*++fmt == '-') fmt++; pad = *fmt == '0' ? '0' : ' '; width = 0; while (isdigit(*fmt)) { width *= 10; width += *fmt++ - '0'; } if (*fmt == 'l' && islower(*++fmt)) *fmt = toupper(*fmt); mode = isupper(*fmt); switch (*fmt) { case 'c': case 'C': prc(nextarg(char)); break; case 'b': prn(unsigned, 2, 0); break; case 'B': prn(long, 2, 0); break; case 'o': prn(unsigned, 8, 0); break; case 'O': prn(long, 8, 0); break; case 'd': prn(int, 10, 1); break; case 'D': prn(long, 10, 1); break; case 'u': prn(unsigned, 10, 0); break; case 'U': prn(long, 10, 0); break; case 'x': prn(unsigned, 16, 0); break; case 'X': prn(long, 16, 0); break; case 's': case 'S': s = nextarg(charp); while (*s) prc(*s++); break; case '\0': break; default: putchar(*fmt); } while (width-- > 0) putchar(pad); } } /* Print the arguments according to fmt. */ printf(fmt, args) char *fmt; { doprnt(fmt, &args); } /* Initialize the variables used by this program. */ initvars(){ register level; #ifdef STANDALONE brk = &end; #endif nregular = ndirectory = nblkspec = ncharspec = nbadinode = 0; for (level = 0; level < NLEVEL; level++) ztype[level] = 0; changed = 0; firstlist = 1; firstcnterr = 1; thisblk = NO_BLOCK; } /* Copy n bytes. */ copy(p, q, n) register char *p, *q; register int n; { do *q++ = *p++; while (--n); } /* Print the string `s' and exit. */ fatal(s) char *s; { printf("%s\n", s); printf("fatal\n"); exit(-1); } /* Test for end of line. */ eoln(c) { return(c < 0 || c == '\n' || c == '\r'); } /* Ask a question and get the answer unless automatic is set. */ yes(question) char *question; { register c, answer; if (!repair) { printf("\n"); return(0); } printf("%s? ", question); if (automatic) { printf("yes\n"); return(1); } if ((c = answer = getchar()) == 'q' || c == 'Q') exit(1); while (!eoln(c)) c = getchar(); return !(answer == 'n' || answer == 'N'); } /* Convert string to integer. Representation is octal. */ atoo(s) char *s; { register n = 0; while ('0' <= *s && *s < '8') { n *= 8; n += *s++ - '0'; } return(n); } /* If repairing the file system, print a prompt and get a string from the user. */ input(buf, size) char *buf; { register char *p = buf; printf("\n"); if (repair) { printf("--> "); while (--size) { *p = getchar(); if (eoln(*p)) { *p = 0; return(p > buf); } p++; } *p = 0; while (!eoln(getchar())) ; return(1); } return(0); } /* Allocate some memory and zero it. */ char *alloc(nelem, elsize) unsigned nelem, elsize; { char *p; #ifdef STANDALONE register *r; p = (char *) brk; brk += nelem * ((elsize + sizeof(int) - 1) / sizeof(int)); for (r = (int *) p; r < brk; r++) *r = 0; return(p); #else extern char *calloc(); if ((p = calloc(nelem, elsize)) == 0) fatal("out of memory"); return(p); #endif } #ifndef STANDALONE /* Deallocate previously allocated memory. */ dealloc(p) char *p; { free(p); } #endif /* Print the name in a directory entry. */ printname(s) char *s; { register n = NAME_SIZE; do { if (*s == 0) break; printf("%c", isprint(*s) ? *s : '?'); s++; } while (--n); } /* Print the pathname given by a linked list pointed to by `sp'. The * names are in reverse order. */ printrec(sp) struct stack *sp; { if (sp->st_next != 0) { printrec(sp->st_next); printf("/"); printname(sp->st_dir->d_name); } } /* Print the current pathname. */ printpath(mode, nlcr){ if (top->st_next == 0) printf("/"); else printrec(top); switch (mode) { case 1: printf(" (ino = %u, ", top->st_dir->d_inum); break; case 2: printf(" (ino = %u)", top->st_dir->d_inum); break; } if (nlcr) printf("\n"); } #ifndef STANDALONE # ifndef DOS /* don't need to open devices under DOS */ /* Open the device. */ devopen(){ if ((dev = open(device, repair ? 2 : 0)) < 0) { perror(device); fatal(""); } } /* Close the device. */ devclose(){ if (close(dev) != 0) { perror("close"); fatal(""); } } # else /*DOS*/ devopen(){} /* dummies */ devclose(){} sync(){} # endif #endif #ifdef DOS # ifndef STANDALONE # define STANDALONE /* DOS will need the diskio routine */ # define TMP /* remember standalone wasn't defined */ # endif #endif #ifdef STANDALONE disktype() { register retry = 3, error, dir=READING; /* test whether at or pc diskette. Note logical sectors * count from 0 and bios counts from 1. */ tracksiz=15; cylsiz=30; reset_diskette(); do error = diskio(dir, 14, rwbuf, 1); while ( ((error & 0xFF00) != 0) && (retry--)); if ((error & 0xFF00)!=0) { /* not an AT-diskette */ tracksiz=9; cylsiz=18; retry=3; reset_diskette(); do error = diskio(dir, 8, rwbuf, 1); while ( ((error & 0xFF00) != 0) && (retry--)); if ((error & 0xFF00)!=0) fatal ("can't determine diskette-type"); } } # ifdef TMP # undef TMP # undef STANDALONE # endif #endif /* Read or write a block. * Note that under STANDALONE or DOS only the * A-drive (drive 0) can be used */ devio(bno, dir) block_nr bno; { long lastone; long offset = btoa(bno); register error; if (dir == READING && bno == thisblk) return; thisblk = bno; #ifdef DOS # ifndef STANDALONE # define STANDALONE /* DOS will need the diskio routine */ # define TMP /* remember standalone wasn't defined */ # endif #endif #ifdef STANDALONE { register sector = offset >> SECT_SHIFT, retry = 3; lastone = sector + part_offset + (BLOCK_SIZE>>SECT_SHIFT); if (lastone > 65535) { printf("Fsck cannot read beyond sector 65535\n"); exit(1); } error = diskio(dir, sector+part_offset, rwbuf, BLOCK_SIZE>>SECT_SHIFT); if ((error & 0xFF00) == 0) return; reset_diskette(); do { printf("error 0x%x %s block %D, retry\n", error, dir == READING ? "reading" : "writing", (long) bno); error = diskio(dir, sector+part_offset, rwbuf, BLOCK_SIZE >> SECT_SHIFT); if ((error & 0xFF00) == 0) return; } while (--retry != 0); } # ifdef TMP # undef TMP # undef STANDALONE # endif #else /*STANDALONE*/ { extern read(), write(), errno; lseek(dev, offset, 0); if (dir == READING) if (read(dev,rwbuf,BLOCK_SIZE) == BLOCK_SIZE) return; else error = errno; else if (write(dev,rwbuf,BLOCK_SIZE) == BLOCK_SIZE) return; else error = errno; } #endif /*STANDALONE*/ printf("%s: can't %s block %D (error = 0x%x)\n", prog, dir == READING ? "read" : "write", (long) bno, error); fatal(""); } /* Read `size' bytes from the disk starting at byte `offset'. */ devread(offset, buf, size) long offset; char *buf; { devio((block_nr) (offset / BLOCK_SIZE), READING); copy(&rwbuf[offset % BLOCK_SIZE], buf, size); } /* Write `size' bytes to the disk starting at byte `offset'. */ devwrite(offset, buf, size) long offset; char *buf; { if (!repair) fatal("internal error (devwrite)"); if (size != BLOCK_SIZE) devio((block_nr) (offset / BLOCK_SIZE), READING); copy(buf, &rwbuf[offset % BLOCK_SIZE], size); devio((block_nr) (offset / BLOCK_SIZE), WRITING); changed = 1; } /* Print a string with either a singular or a plural pronoun. */ pr(fmt, cnt, s, p) char *fmt, *s, *p; { printf(fmt, cnt, cnt == 1 ? s : p); } #ifndef STANDALONE /* Convert string to number. */ bit_nr getnumber(s) char *s; { register bit_nr n = 0; if (s == 0) return(NO_BIT); while (*s != 0) { if (!isdigit(*s)) return(NO_BIT); n *= 10; n += *s++ - '0'; } return(n); } /* See if the list pointed to by `argv' contains numbers. */ char **getlist(argv, type) char ***argv, *type; { register char **list = *argv; register empty = 1; while (getnumber(**argv) != NO_BIT) { (*argv)++; empty = 0; } if (empty) { printf("warning: no %s numbers given\n", type); return(0); } return(list); } #endif /*STANDALONE*/ /* Make a listing of the super block. If `repair' is set, ask the user * for changes. */ lsuper(){ char buf[80]; long atol(); do { printf("ninodes = %u", sb.s_ninodes); if (input(buf, 80)) sb.s_ninodes = atol(buf); printf("nzones = %u", sb.s_nzones); if (input(buf, 80)) sb.s_nzones = atol(buf); printf("imap_blocks = %u", sb.s_imap_blocks); if (input(buf, 80)) sb.s_imap_blocks = atol(buf); printf("zmap_blocks = %u", sb.s_zmap_blocks); if (input(buf, 80)) sb.s_zmap_blocks = atol(buf); printf("firstdatazone = %u", sb.s_firstdatazone); if (input(buf, 80)) sb.s_firstdatazone = atol(buf); printf("log_zone_size = %u", sb.s_log_zone_size); if (input(buf, 80)) sb.s_log_zone_size = atol(buf); printf("maxsize = %U", sb.s_maxsize); if (input(buf, 80)) sb.s_maxsize = atol(buf); if (yes("ok now")) { devwrite(btoa(BLK_SUPER), (char *) &sb, sizeof(sb)); return; } } while (yes("Do you want to try again")); if (repair) exit(0); } /* Add an empty root directory to the file system. */ makedev(){ register long position = BLK_IMAP * BLOCK_SIZE; register int n = N_IMAP + N_ZMAP + N_ILIST; static dir_struct rootdir[] = { { 1, "." }, { 1, ".." } }; static d_inode inode = { I_DIRECTORY | 0755, 0, sizeof(rootdir), 0, 0, 2 }; devio((block_nr) sb.s_nzones - 1, WRITING); nullbuf[0] = 1 << (ROOT_INODE - 1); /* corrupt nullbuf */ do { devwrite(position, nullbuf, BLOCK_SIZE); nullbuf[0] = 0; /* nullbuf restored */ position += BLOCK_SIZE; } while (--n); #ifndef STANDALONE time(&inode.i_modtime); #endif inode.i_zone[0] = FIRST; devwrite(inoaddr(ROOT_INODE), (char *) &inode, INODE_SIZE); devwrite(zaddr(FIRST), nullbuf, BLOCK_SIZE); devwrite(zaddr(FIRST), (char *) rootdir, sizeof(rootdir)); } /* Get the contents for the super block from the user. Make him some * suggestions. */ mkfs(){ char buf[80]; long atol(); printf("Hit RETURN key to select default values\n\n"); sb.s_nzones = zone_ct; printf("# zones (default: %d) ", zone_ct); if (input(buf, 80)) sb.s_nzones = atol(buf); sb.s_log_zone_size = 0; printf("log zonesize (default: %d) ", sb.s_log_zone_size); if (input(buf, 80)) sb.s_log_zone_size = atol(buf); sb.s_ninodes = inode_ct; printf("#inodes (default: %u) ", sb.s_ninodes); if (input(buf, 80)) sb.s_ninodes = atol(buf); sb.s_imap_blocks = (sb.s_ninodes + (1<> BITMAPSHIFT; sb.s_zmap_blocks = (sb.s_nzones + (1<> BITMAPSHIFT; sb.s_firstdatazone = (BLK_ILIST+N_ILIST+SCALE-1) >> sb.s_log_zone_size; sb.s_maxsize = MAX_FILE_POS; if (((sb.s_maxsize-1) >> sb.s_log_zone_size) / BLOCK_SIZE >= MAX_ZONES) sb.s_maxsize =((long)MAX_ZONES*BLOCK_SIZE)<> BITMAPSHIFT; if (sb.s_magic != SUPER_MAGIC) fatal("bad magic number in super block"); if ((short) sb.s_imap_blocks < n) fatal("too few imap blocks"); if (sb.s_imap_blocks != n) { pr("warning: expected %d imap_block%s", n, "", "s"); printf(" instead of %d\n", sb.s_imap_blocks); } n = (sb.s_nzones + (1 << BITMAPSHIFT) - 1) >> BITMAPSHIFT; if ((short) sb.s_zmap_blocks < n) fatal("too few zmap blocks"); if (sb.s_zmap_blocks != n) { pr("warning: expected %d zmap_block%s", n, "", "s"); printf(" instead of %d\n", sb.s_zmap_blocks); } if ((short) sb.s_firstdatazone >= sb.s_nzones) fatal("first data zone too large"); if ((unsigned short) sb.s_log_zone_size >= 8 * sizeof(block_nr)) fatal("log_zone_size too large"); if (sb.s_log_zone_size > 8) printf("warning: large log_zone_size (%d)\n", sb.s_log_zone_size); n = (BLK_ILIST + N_ILIST + SCALE - 1) >> sb.s_log_zone_size; if ((short) sb.s_firstdatazone < n) fatal("first data zone too small"); if (sb.s_firstdatazone != n) { printf("warning: expected first data zone to be %d ", n); printf("instead of %u\n", sb.s_firstdatazone); } maxsize = MAX_FILE_POS; if (((maxsize - 1) >> sb.s_log_zone_size) / BLOCK_SIZE >= MAX_ZONES) maxsize = ((long) MAX_ZONES*BLOCK_SIZE) << sb.s_log_zone_size; if (sb.s_maxsize != maxsize) { printf("warning: expected max size to be %D ", maxsize); printf("instead of %D\n", sb.s_maxsize); } } #ifndef STANDALONE /* Make a listing of the inodes given by `clist'. If `repair' is set, ask * the user for changes. */ lsi(clist) char **clist; { register bit_nr bit; register inode_nr ino; d_inode inode, *ip = &inode; char buf[80]; long atol(); if (clist == 0) return; while ((bit = getnumber(*clist++)) != NO_BIT) { setbit(spec_imap, bit); ino = bit; do { devread(inoaddr(ino), (char *) ip, INODE_SIZE); printf("inode %u:\n", ino); printf(" mode = %06o", ip->i_mode); if (input(buf, 80)) ip->i_mode = atoo(buf); printf(" nlinks = %6u", ip->i_nlinks); if (input(buf, 80)) ip->i_nlinks = atol(buf); printf(" size = %6D", ip->i_size); if (input(buf, 80)) ip->i_size = atol(buf); if (yes("Write this back")) { devwrite(inoaddr(ino), (char*) ip, INODE_SIZE); break; } } while (yes("Do you want to change it again")); } } #endif /*STANDALONE*/ /* Allocate `nblk' blocks worth of bitmap. */ unsigned *allocbitmap(nblk){ register unsigned *bitmap; bitmap = (unsigned *) alloc(nblk, BLOCK_SIZE); *bitmap |= 1; return(bitmap); } /* Load the bitmap starting at block `bno' from disk. */ loadbitmap(bitmap, bno, nblk) unsigned *bitmap; block_nr bno; { register i; register unsigned *p; p = bitmap; for (i = 0; i < nblk; i++, bno++, p += INTS_PER_BLOCK) devread(btoa(bno), (char *) p, BLOCK_SIZE); *bitmap |= 1; } /* Write the bitmap starting at block `bno' to disk. */ dumpbitmap(bitmap, bno, nblk) unsigned *bitmap; block_nr bno; { register i; register unsigned *p = bitmap; for (i = 0; i < nblk; i++, bno++, p += INTS_PER_BLOCK) devwrite(btoa(bno), (char *) p, BLOCK_SIZE); } /* Initialize the given bitmap by setting all the bits starting at `bit'. */ initbitmap(bitmap, bit, nblk) unsigned *bitmap; bit_nr bit; { register unsigned *first, *last; while (bit & BITMASK) { setbit(bitmap, bit); bit++; } first = &bitmap[bit >> BITSHIFT]; last = &bitmap[nblk * INTS_PER_BLOCK]; while (first < last) *first++ = ~0; } #ifndef STANDALONE /* Set the bits given by `list' in the bitmap. */ fillbitmap(bitmap, lwb, upb, list) unsigned *bitmap; bit_nr lwb, upb; char **list; { register bit_nr bit; if (list == 0) return; while ((bit = getnumber(*list++)) != NO_BIT) if (bit < lwb || bit >= upb) { if (bitmap == spec_imap) printf("inode number %u ", bit); else printf("zone number %u ", bit); printf("out of range (ignored)\n"); } else setbit(bitmap, bit - lwb + 1); } /* Deallocate the bitmap `p'. */ freebitmap(p) unsigned *p; { dealloc((char *) p); } #endif /*STANDALONE*/ /* Get all the bitmaps used by this program. */ getbitmaps(){ imap = allocbitmap(N_IMAP); zmap = allocbitmap(N_ZMAP); spec_imap = allocbitmap(N_IMAP); spec_zmap = allocbitmap(N_ZMAP); dirmap = allocbitmap(N_IMAP); } #ifndef STANDALONE /* Release all the space taken by the bitmaps. */ putbitmaps(){ freebitmap(imap); freebitmap(zmap); freebitmap(spec_imap); freebitmap(spec_zmap); freebitmap(dirmap); } #endif /* `w1' and `w2' are differing words from two bitmaps that should be * identical. Print what's the matter with them. */ chkword(w1, w2, bit, type, n, report) unsigned w1, w2; char *type; bit_nr bit; int *n, *report; { for (; w1 | w2; w1 >>= 1, w2 >>= 1, bit++) if ((w1 ^ w2) & 1 && ++(*n) % MAXPRINT == 0 && *report && (!repair || automatic || yes("stop this listing"))) *report = 0; else if (*report) if ((w1 & 1) && !(w2 & 1)) printf("%s %u is missing\n", type, bit); else if (!(w1 & 1) && (w2 & 1)) printf("%s %u is not free\n", type, bit); } /* Check if the given (correct) bitmap is identical with the one that is * on the disk. If not, ask if the disk should be repaired. */ chkmap(cmap, dmap, bit, blkno, nblk, nbit, type) unsigned *cmap, *dmap; bit_nr bit, nbit; block_nr blkno; char *type; { register unsigned *p = dmap, *q = cmap; int report = 1, nerr = 0; if (makefs) { dumpbitmap(cmap, blkno, nblk); return; } printf("Checking %s map\n", type); loadbitmap(dmap, blkno, nblk); do { if (*p != *q) chkword(*p, *q, bit, type, &nerr, &report); p++; q++; } while ((bit += 8 * sizeof(unsigned)) < nbit); if ((!repair || automatic) && !report) printf("etc. "); if (nerr > MAXPRINT || nerr > 10) printf("%d errors found. ", nerr); if (nerr != 0 && yes("install a new map")) dumpbitmap(cmap, blkno, nblk); if (nerr > 0) printf("\n"); } /* See if the inodes that aren't allocated are cleared. */ chkilist(){ register inode_nr ino = 1; mask_bits mode; if (makefs) return; printf("Checking inode list\n"); do if (!bitset(imap, (bit_nr) ino)) { devread(inoaddr(ino), (char *) &mode, sizeof(mode)); if (mode != I_NOT_ALLOC) { printf("mode inode %u not cleared", ino); if (yes(". clear")) devwrite(inoaddr(ino), nullbuf, INODE_SIZE); } } while (++ino <= sb.s_ninodes); printf("\n"); } /* Allocate an array to maintain the inode reference counts in. */ getcount(){ count = (links *) alloc(sb.s_ninodes + 1, sizeof(links)); } /* The reference count for inode `ino' is wrong. Ask if it should be adjusted. */ counterror(ino) inode_nr ino; { d_inode inode; if (firstcnterr) { printf("INODE NLINK COUNT\n"); firstcnterr = 0; } devread(inoaddr(ino), (char *) &inode, INODE_SIZE); count[ino] += inode.i_nlinks; printf("%5u %5u %5u", ino, (unsigned) inode.i_nlinks, count[ino]); if (yes(" adjust")) { if ((inode.i_nlinks = count[ino]) == 0) { fatal("internal error (counterror)"); /* This would be a patch inode.i_mode = I_NOT_ALLOC; clrbit(imap, (bit_nr) ino); */ } devwrite(inoaddr(ino), (char *) &inode, INODE_SIZE); } } /* Check if the reference count of the inodes are correct. The array `count' * is maintained as follows: an entry indexed by the inode number is * incremented each time a link is found; when the inode is read the link * count in there is substracted from the corresponding entry in `count'. * Thus, when the whole file system has been traversed, all the entries * should be zero. */ chkcount(){ register inode_nr ino; for (ino = 1; ino <= sb.s_ninodes; ino++) if (count[ino] != 0) counterror(ino); if (!firstcnterr) printf("\n"); } #ifndef STANDALONE /* Deallocate the `count' array. */ freecount(){ dealloc((char *) count); } #endif /* Print the inode permission bits given by mode and shift. */ printperm(mode, shift, special, overlay) mask_bits mode; { printf(mode >> shift & R_BIT ? "r" : "-"); printf(mode >> shift & W_BIT ? "w" : "-"); if (mode & special) printf("%c", overlay); else printf(mode >> shift & X_BIT ? "x" : "-"); } /* List the given inode. */ list(ino, ip) inode_nr ino; d_inode *ip; { if (firstlist) { firstlist = 0; printf(" inode permission link size name\n"); } printf("%6u ", ino); switch (ip->i_mode & I_TYPE) { case I_REGULAR: printf("-"); break; case I_DIRECTORY: printf("d"); break; case I_CHAR_SPECIAL: printf("c"); break; case I_BLOCK_SPECIAL: printf("b"); break; default: printf("?"); } printperm(ip->i_mode, 6, I_SET_UID_BIT, 's'); printperm(ip->i_mode, 3, I_SET_GID_BIT, 's'); printperm(ip->i_mode, 0, STICKY_BIT, 't'); printf(" %3u ", ip->i_nlinks); switch (ip->i_mode & I_TYPE) { case I_CHAR_SPECIAL: case I_BLOCK_SPECIAL: printf(" %2x,%2x ", (dev_nr) ip->i_zone[0] >> MAJOR & 0xFF, (dev_nr) ip->i_zone[0] >> MINOR & 0xFF); break; default: printf("%7D ", ip->i_size); } printpath(0, 1); } /* Remove an entry from a directory if ok with the user. */ remove(dp) dir_struct *dp; { int i; char *cp1, *cp2; setbit(spec_imap, (bit_nr) dp->d_inum); if (yes(". remove entry")) { count[dp->d_inum]--; cp1 = (char *) &nulldir; cp2 = (char *) dp; i = sizeof(dir_struct); while (i--) *cp2++ = *cp1++; return(1); } return(0); } /* See if the `.' or `..' entry is as expected. */ chkdots(ino, pos, dp, exp) inode_nr ino, exp; file_pos pos; dir_struct *dp; { if (dp->d_inum != exp) { printf("bad %s in ", dp->d_name); printpath(1, 0); printf("%s is linked to %u ", dp->d_name, dp->d_inum); printf("instead of %u)", exp); setbit(spec_imap, (bit_nr) ino); setbit(spec_imap, (bit_nr) dp->d_inum); setbit(spec_imap, (bit_nr) exp); if (yes(". repair")) { count[dp->d_inum]--; dp->d_inum = exp; count[exp]++; return(0); } } else if (pos != (dp->d_name[1] ? DIR_ENTRY_SIZE : 0)) { printf("warning: %s has offset %D in ", dp->d_name, pos); printpath(1, 0); printf("%s is linked to %u)\n", dp->d_name, dp->d_inum); setbit(spec_imap, (bit_nr) ino); setbit(spec_imap, (bit_nr) dp->d_inum); setbit(spec_imap, (bit_nr) exp); } return(1); } /* Check the name in a directory entry. */ chkname(ino, dp) inode_nr ino; dir_struct *dp; { register n = NAME_SIZE + 1; register char *p = dp->d_name; if (*p == 0) { printf("null name found in "); printpath(0, 0); setbit(spec_imap, (bit_nr) ino); if (remove(dp)) return(0); } while (--n != 0 && *p != 0) if (*p++ == '/') { printf("found a '/' in entry of directory "); printpath(1, 0); setbit(spec_imap, (bit_nr) ino); printf("entry = '"); printname(dp->d_name); printf("')"); if (remove(dp)) return(0); break; } return(1); } /* Check a directory entry. Here the routine `descendtree' is called * recursively to check the file or directory pointed to by the entry. */ chkentry(ino, pos, dp) inode_nr ino; file_pos pos; dir_struct *dp; { char *cp1, *cp2; int i; if (dp->d_inum < ROOT_INODE || dp->d_inum > sb.s_ninodes) { printf("bad inode found in directory "); printpath(1, 0); printf("ino found = %u, ", dp->d_inum); printf("name = '"); printname(dp->d_name); printf("')"); if (yes(". remove entry")) { cp1 = (char *) &nulldir; cp2 = (char *) dp; i = sizeof(dir_struct); while (i--) *cp2++ = *cp1++; return(0); } return(1); } if ((unsigned) count[dp->d_inum] == MAX_LINKS) { printf("too many links to ino %u\n", dp->d_inum); printf("discovered at entry '"); printname(dp->d_name); printf("' in directory "); printpath(0, 1); if (remove(dp)) return(0); } count[dp->d_inum]++; if (strcmp(dp->d_name, ".") == 0) { top->st_presence |= DOT; return(chkdots(ino, pos, dp, ino)); } if (strcmp(dp->d_name, "..") == 0) { top->st_presence |= DOTDOT; return(chkdots(ino, pos, dp, ino == ROOT_INODE ? ino : top->st_next->st_dir->d_inum)); } if (!chkname(ino, dp)) return(0); if (bitset(dirmap, (bit_nr) dp->d_inum)) { printf("link to directory discovered in "); printpath(1, 0); printf("name = '"); printname(dp->d_name); printf("', dir ino = %u)", dp->d_inum); return !remove(dp); } return(descendtree(dp)); } /* Check a zone of a directory by checking all the entries in the zone. * The zone is split up into chunks to not allocate too much stack. */ chkdirzone(ino, ip, pos, zno) inode_nr ino; d_inode *ip; file_pos pos; zone_nr zno; { dir_struct dirblk[CDIRECT]; register dir_struct *dp; register n = SCALE * (NR_DIR_ENTRIES / CDIRECT), dirty; register long offset = zaddr(zno); do { devread(offset, (char *) dirblk, DIRCHUNK); dirty = 0; for (dp = dirblk; dp < &dirblk[CDIRECT]; dp++) { if (ip->i_size - pos < DIR_ENTRY_SIZE) { printf("bad format in directory "); printpath(2, 0); if (yes(". truncate")) { setbit(spec_imap, (bit_nr) ino); ip->i_size = pos; dirty = 1; } else return(0); } if (dp->d_inum != NO_ENTRY && !chkentry(ino, pos, dp)) dirty = 1; if ((pos += DIR_ENTRY_SIZE) >= ip->i_size) break; } if (dirty) devwrite(offset, (char *) dirblk, DIRCHUNK); offset += DIRCHUNK; } while (--n && pos < ip->i_size); return(1); } /* There is something wrong with the given zone. Print some details. */ errzone(mess, zno, level, pos) char *mess; zone_nr zno; file_pos pos; { printf("%s zone in ", mess); printpath(1, 0); printf("zno = %u, type = ", zno); switch (level) { case 0: printf("DATA"); break; case 1: printf("SINGLE INDIRECT"); break; case 2: printf("DOUBLE INDIRECT"); break; default: printf("VERY INDIRECT"); } printf(", pos = %D)\n", pos); } /* Found the given zone in the given inode. Check it, and if ok, mark it * in the zone bitmap. */ markzone(ino, zno, level, pos) inode_nr ino; zone_nr zno; file_pos pos; { register bit_nr bit = (bit_nr) zno - FIRST + 1; ztype[level]++; if (zno < FIRST || zno >= sb.s_nzones) { errzone("out-of-range", zno, level, pos); return(0); } if (bitset(zmap, bit)) { setbit(spec_zmap, bit); errzone("duplicate", zno, level, pos); return(0); } nfreezone--; if (bitset(spec_zmap, bit)) errzone("found", ino, zno, level, pos, bit); setbit(zmap, bit); return(1); } /* Check an indirect zone by checking all of its entries. * The zone is split up into chunks to not allocate too much stack. */ chkindzone(ino, ip, pos, zno, level) inode_nr ino; d_inode *ip; file_pos *pos; zone_nr zno; { zone_nr indirect[CINDIR]; register n = NR_INDIRECTS / CINDIR; register long offset = zaddr(zno); do { devread(offset, (char *) indirect, INDCHUNK); if (!chkzones(ino, ip, pos, indirect, CINDIR, level - 1)) return(0); offset += INDCHUNK; } while (--n && *pos < ip->i_size); return(1); } /* Return the size of a gap in the file, represented by a null zone number * at some level of indirection. */ file_pos jump(level){ file_pos power = ZONE_SIZE; if (level != 0) do power *= NR_INDIRECTS; while (--level); return(power); } /* Check a zone, which may be either a normal data zone, a directory zone, * or an indirect zone. */ zonechk(ino, ip, pos, zno, level) inode_nr ino; d_inode *ip; file_pos *pos; zone_nr zno; { if (level == 0) { if ((ip->i_mode & I_TYPE) == I_DIRECTORY && !chkdirzone(ino, ip, *pos, zno)) return(0); *pos += ZONE_SIZE; return(1); } else return chkindzone(ino, ip, pos, zno, level); } /* Check a list of zones given by `zlist'. */ chkzones(ino, ip, pos, zlist, len, level) inode_nr ino; d_inode *ip; file_pos *pos; zone_nr *zlist; { register ok = 1, i; for (i = 0; i < len && *pos < ip->i_size; i++) if (zlist[i] == NO_ZONE) *pos += jump(level); else if (!markzone(ino, zlist[i], level, *pos)) { *pos += jump(level); ok = 0; } else if (!zonechk(ino, ip, pos, zlist[i], level)) ok = 0; return(ok); } /* Check a file or a directory. */ chkfile(ino, ip) inode_nr ino; d_inode *ip; { register ok, i, level; file_pos pos = 0; ok = chkzones(ino, ip, &pos, &ip->i_zone[0], NR_DZONE_NUM, 0); for (i = NR_DZONE_NUM, level = 1; i < NR_ZONE_NUMS; i++, level++) if (!chkzones(ino, ip, &pos, &ip->i_zone[i], 1, level)) ok = 0; return(ok); } /* Check a directory by checking the contents. Check if . and .. are present. */ chkdirectory(ino, ip) inode_nr ino; d_inode *ip; { register ok; setbit(dirmap, (bit_nr) ino); if (ip->i_size > MAXDIRSIZE) { printf("warning: huge directory: "); printpath(2, 1); } ok = chkfile(ino, ip); if (!(top->st_presence & DOT)) { printf(". missing in "); printpath(2, 1); ok = 0; } if (!(top->st_presence & DOTDOT)) { printf(".. missing in "); printpath(2, 1); ok = 0; } return(ok); } /* Check the mode of an inode, and if it is a file or a directory, check * the contents. */ chkmode(ino, ip) inode_nr ino; d_inode *ip; { switch (ip->i_mode & I_TYPE) { case I_REGULAR: nregular++; return chkfile(ino, ip); break; case I_DIRECTORY: ndirectory++; return chkdirectory(ino, ip); case I_BLOCK_SPECIAL: nblkspec++; return(1); case I_CHAR_SPECIAL: ncharspec++; return(1); default: nbadinode++; printf("bad mode of "); printpath(1, 0); printf("mode = %o)", ip->i_mode); return(0); } } /* Check an inode. */ chkinode(ino, ip) inode_nr ino; d_inode *ip; { if (ino == ROOT_INODE && (ip->i_mode & I_TYPE) != I_DIRECTORY) { printf("root inode is not a directory "); printf("(ino = %u, mode = %o)\n", ino, ip->i_mode); fatal(""); } if (ip->i_nlinks == 0) { printf("link count zero of "); printpath(2, 0); return(0); } nfreeinode--; setbit(imap, (bit_nr) ino); if ((unsigned) ip->i_nlinks > MAX_LINKS) { printf("link count too big in "); printpath(1, 0); printf("cnt = %u)\n", (unsigned) ip->i_nlinks); count[ino] -= MAX_LINKS; setbit(spec_imap, (bit_nr) ino); } else count[ino] -= (unsigned) ip->i_nlinks; return chkmode(ino, ip); } /* Check the directory entry pointed to by dp, by checking the inode. */ descendtree(dp) dir_struct *dp; { d_inode inode; register inode_nr ino = dp->d_inum; register visited; struct stack stk; char *cp1, *cp2; int i; stk.st_dir = dp; stk.st_next = top; top = &stk; if (bitset(spec_imap, (bit_nr) ino)) { printf("found inode %u: ", ino); printpath(0, 1); } visited = bitset(imap, (bit_nr) ino); if (!visited || listing) { devread(inoaddr(ino), (char *) &inode, INODE_SIZE); if (listing) list(ino, &inode); if (!visited && !chkinode(ino, &inode)) { setbit(spec_imap, (bit_nr) ino); if (yes("remove")) { count[ino] += inode.i_nlinks - 1; clrbit(imap, (bit_nr) ino); devwrite(inoaddr(ino), nullbuf, INODE_SIZE); cp1 = (char *) &nulldir; cp2 = (char *) dp; i = sizeof(dir_struct); while (i--) *cp2++ = *cp1++; top = top->st_next; return(0); } } } top = top->st_next; return(1); } /* Check the file system tree. */ chktree(){ dir_struct dir; if (!makefs) nfreeinode = sb.s_ninodes; nfreezone = N_DATA; dir.d_inum = ROOT_INODE; dir.d_name[0] = 0; if (!descendtree(&dir)) fatal("bad root inode"); printf("\n"); } /* Print the totals of all the objects found. */ printtotal(){ printf("blocksize = %5d ", BLOCK_SIZE); printf("zonesize = %5d\n", ZONE_SIZE); printf("\n"); pr("%6u Regular file%s\n", nregular, "", "s"); pr("%6u Director%s\n", ndirectory, "y", "ies"); pr("%6u Block special file%s\n", nblkspec, "", "s"); pr("%6u Character special file%s\n", ncharspec, "", "s"); if (nbadinode != 0) pr("%6u Bad inode%s\n", nbadinode, "", "s"); pr("%6u Free inode%s\n", nfreeinode, "", "s"); /* Don't print some fields. printf("\n"); pr("%6u Data zone%s\n", ztype[0], "", "s"); pr("%6u Single indirect zone%s\n", ztype[1], "", "s"); pr("%6u Double indirect zone%s\n", ztype[2], "", "s"); */ pr("%6u Free zone%s\n", nfreezone, "", "s"); } /* Check the device which name is given by `f'. The inodes listed by `clist' * should be listed separately, and the inodes listed by `ilist' and the zones * listed by `zlist' should be watched for while checking the file system. */ chkdev(f, clist, ilist, zlist) char *f, **clist, **ilist, **zlist; { if (automatic || makefs) repair = 1; device = f; initvars(); #ifndef STANDALONE devopen(); #endif getsuper(); chksuper(); #ifndef STANDALONE lsi(clist); #endif getbitmaps(); initbitmap(imap, (bit_nr) sb.s_ninodes + 1, N_IMAP); initbitmap(zmap, (bit_nr) sb.s_nzones - FIRST + 1, N_ZMAP); #ifndef STANDALONE fillbitmap(spec_imap, (bit_nr) 1, (bit_nr) sb.s_ninodes + 1, ilist); fillbitmap(spec_zmap, (bit_nr) FIRST, (bit_nr) sb.s_nzones, zlist); #endif getcount(); chktree(); chkmap(zmap, spec_zmap, (bit_nr) FIRST - 1, BLK_ZMAP, N_ZMAP, (bit_nr) sb.s_nzones, "zone"); chkcount(); chkmap(imap, spec_imap, (bit_nr) 0, BLK_IMAP, N_IMAP, (bit_nr) sb.s_ninodes + 1, "inode"); chkilist(); printtotal(); #ifndef STANDALONE putbitmaps(); freecount(); devclose(); #endif if (changed) printf("----- FILE SYSTEM HAS BEEN MODIFIED -----\n\n"); } main(argc, argv) char **argv; { register char **clist = 0, **ilist = 0, **zlist = 0; #ifdef STANDALONE register c, command; if (virgin) floptrk = tracksiz; /* save 9 or 15 in floptrk */ virgin = 0; /* only on first pass thru */ if (tracksiz < 9 || cylsiz < 18) printf("Bootblok gave bad tracksiz\n"); rwbuf = rwbuf1; prog = "fsck"; printf("\n\n\n\n"); for (;;) { printf("\nHit key as follows:\n\n"); printf(" = start MINIX (root file system in drive 0)\n"); printf(" f check the file system (first insert any file system diskette)\n"); printf(" l check and list file system (first insert any file system diskette)\n"); printf(" m make an (empty) file system (first insert blank, formatted diskette)\n"); printf(" h check hard disk file system\n"); printf("\n# "); c = getc(); command = c & 0xFF; printf("%c\n", command); part_offset = 0; partition = 0; drive = 0; switch (command) { case 'h': get_partition(); drive = (partition < PARB ? 0x80 : 0x81); #ifdef HERE cylsiz = 100; /* 4 heads -- ST-238-specific */ tracksiz = 25; #else cylsiz = 68; tracksiz = 17; #endif printf("Checking hard disk. %s\n", answer); if (read_partition() < 0) continue; repair = 1; break; case 'f': printf("Checking diskette. %s\n", answer); disktype(); /* init tracksiz & cylsiz */ repair = 1; break; case 'l': printf("Checking diskette. %s\n", answer); listing = listsuper = 1; disktype(); /* init tracksiz & cylsiz */ break; case 'm': printf("Making empty file system\n"); disktype(); /* init tracksiz & cylsiz */ makefs = 1; if (tracksiz == 15) { /* 1.2M diskette. */ zone_ct = 1200; inode_ct = 255; } break; case '=': return((c >> 8) & 0xFF); default: printf("Illegal command\n"); continue; } chkdev("disk(ette)", clist, ilist, zlist); repair = listing = listsuper = makefs = 0; } #else /* STANDALONE */ register devgiven = 0; register char *arg; rwbuf = rwbuf1; #ifdef DOS if (DMAoverrun(rwbuf1)) rwbuf = rwbuf2; disktype() /* init tracksiz & cylsize for disk in A: */ #endif sync(); prog = *argv++; while ((arg = *argv++) != 0) if (arg[0] == '-' && arg[1] != 0 && arg[2] == 0) switch (arg[1]) { case 'a': automatic ^= 1; break; case 'c': clist = getlist(&argv, "inode"); break; case 'i': ilist = getlist(&argv, "inode"); break; case 'z': zlist = getlist(&argv, "zone" ); break; case 'r': repair ^= 1; break; case 'l': listing ^= 1; break; case 's': listsuper ^= 1; break; case 'm': makefs ^= 1; break; default: printf("%s: unknown flag '%s'\n", prog, arg); } else { chkdev(arg, clist, ilist, zlist); clist = 0; ilist = 0; zlist = 0; devgiven = 1; } if (!devgiven) chkdev("/dev/disk", clist, ilist, zlist); return(0); #endif /*STANDALONE*/ } get_partition() { /* Ask for a partition number and wait for it. */ char chr; while (1) { printf("\n\nPlease enter partition number. Drive 0: 1-4, drive 1: 6-9, then hit RETURN: "); while (1) { chr = getc(); printf("%c", chr); if (chr == '\r') { printf("\n"); if (partition > 0) return; else break; } else { if (partition > 0) break; } if (chr < '1' || chr > '9' || chr == '5') break; partition = chr - '0'; } partition = 0; } } /* This define tells where to find things in partition table. */ #define P1 0x1C6 int read_partition() { /* Read the partition table to find out where the requested partition * begins. Put the sector offset in 'part_offset'. */ int error, p, retries = 0; long val[4]; long b0, b1, b2, b3; while (1) { retries++; if (retries > 5) { printf("Disk errors. Can't read partition table\n"); return(-1); } error = diskio(READING, 0, rwbuf, 1); if ( (error&0xFF00) == 0) break; } /* Find start of the requested partition and set 'part_offset'. */ for (p=0; p<4; p++) { b0 = rwbuf[P1+16*p+0] & 0xFF; b1 = rwbuf[P1+16*p+1] & 0xFF; b2 = rwbuf[P1+16*p+2] & 0xFF; b3 = rwbuf[P1+16*p+3] & 0xFF; val[p] = (b3<<24) | (b2<<16) | (b1<<8) | b0; if (val[p] > 65535) { printf("Fsck can't handle partitions above sector 65535\n"); exit(1); } } p = (partition >= PARB ? partition - PARB + 1 : partition); sort(val); part_offset = (unsigned) val[p-1]; if ((part_offset % (BLOCK_SIZE/SECTOR_SIZE)) != 0) part_offset = (part_offset/(BLOCK_SIZE/SECTOR_SIZE)+1)*(BLOCK_SIZE/SECTOR_SIZE); return(0); } sort(val) register long *val; { register int i,j; for (i=0; i<4; i++) for (j=0; j<3; j++) if ((val[j] == 0) && (val[j+1] != 0)) swap(&val[j], &val[j+1]); else if (val[j] > val[j+1] && val[j+1] != 0) swap(&val[j], &val[j+1]); } swap(first, second) register long *first, *second; { register long tmp; tmp = *first; *first = *second; *second = tmp; } É_virgin ® _virgin: É_floptrk Ā1 _floptrk: É_zone_ct Ā9 _zone_ct: É_inode_ct Ā360 _inode_ct: É_answer Ā95 _answer: Ā28225 Ā30579 Ā29285 Ā28960 Ā25973 Ā29811 Ā28521 Ā29550 Ā30496 Ā29801 Ā8296 Ā8313 Ā29295 Ā28192 Ā8238 Ā21536 Ā25960 Ā8302 Ā26984 Ā8308 Ā17746 Ā21844 Ā20050 É_putchar ø † _putchar: ƒ ‚ ĶÅ,#10 ŁI0013 3 € Ó_putc Š • ˆ Ó_putc Š … „  É_getchar _getchar: ƒ ‚ € Ó_getc  ž – „  ž – ” ĶĘ,#13 ŁI0023 ĄĘ,#10 I0023: ” Ó_putchar Š — … „  É_printnum _printnum: ƒ ‚ ×ņ,#44 Ūå-3Ī Ą-3Ō,ģ Ķ10(ń)ö je I003A ¢ Æ ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jge I0036 ’ ĄäĪ ōė ōģ sbb į0 ĄÅ,ģ ĄĪ,ė ó12(ń) ĢI003A I0036: Ą10(ń)ö I003A: ĄĻö ¼ I003E: ĶĘ,#32 jge I003B £ sal į1 ¬ ¢ Æ ×į0 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jge I00310 ÜĻ I00310: Ąć1 ¢ Æ © 2: sal į1 rcl ā1 Ø 1: ĄÅ,ė ĄĪ,ģ ĄäŌ ĶĻ,ė jl I003C £ ×äŌ ¬ ¢ Æ Äį1 adc ā0 ĄÅ,ė ĄĪ,ģ I003C: ÜĘ ĢI003E I003B: ĄåĻ Ąč-3Ō Źal,_1Ē Ź(ļ),al Ä-3Ō,#1 ó12(ń) ¢ Æ ×į0 sbb ā0 Ł1f or åė 1: or åģ ŁI003A I00316: Į12(ń) ó12(ń)  ™ jle I00315 Į1Å Ó_putchar Š ĢI00316 I00315: Ķ10(ń)ö je I0031C Ąå-3Ō movb Ē,#45 Ä-3Ō,#1 I0031C: Ūå-3Ī Ķ-3Ō,ģ jbe I0031B Ä-3Ō,#-1 Ąå-3Ō Œ Ž ‹ € Ó_putchar Š ĢI0031C I0031B: … „  É_printchar _printchar: ƒ ‚ ® _2: ĀI00410 Ā7 ø ĀI0049 Ā8 ĀI004A Ā9 ĀI004D Ā10 ĀI004B Ā12 ĀI004E Ā13 ĀI004C Ā92 ĀI004F † ĶĪö je I0042 ¢ ×į32  ž – Ķį94 ja I0043 ĶÅ,#92 je I0043 I0042: ˆ Ó_putchar Š  € ĢI0041 I0043: Ąį92 € Ó_putchar Š ˆ ĢI0047 I0049: Ąį48 € Ó_putchar Š ĢI0048 I004A: Ąį98 € Ó_putchar Š ĢI0048 I004B: 10 € Ó_putchar Š ĢI0048 I004C: 14 € Ó_putchar Š ĢI0048 I004D: 16 € Ó_putchar Š ĢI0048 I004E: 02 € Ó_putchar Š jmp I0048 I004F: Ąį92 € Ó_putchar Š ĢI0048 I00410:  ž ¢ Ąē#48 œ Ąē#3 œ Ėēī œ Ąē#8 œ – „ Ėåģ ¦ € Ó_printnum Äņ,#12 Ąį4 € ĢI0041 I0047: Ąč#_2 Ćī Ģ.csb2 I0048: “ € I0041:  … „  É_doprnt _doprnt: ƒ ‚ ×ņ,#14 ® _3: ĀI0052E Ā15 ø ĀI00530 Ā66 ĀI0051F Ā67 ĀI0051D Ā68 ĀI00523 Ā79 ĀI00521 Ā83 ĀI00529 Ā85 ĀI00525 Ā88 ĀI00527 Ā98 ĀI0051E Ā99 ĀI0051D Ā100 ĀI00522 Ā111 ĀI00520 Ā115 ĀI00529 Ā117 ĀI00524 Ā120 ĀI00526 _4: ĀI0059 Ā2 Ā10 ĀI0058 Ā37 ĀI005A † ¢ ” I0055: § cmpb Ēö je I0052 § Œ Ž ‹ € ĢI0056 I0058: 3 Įė Ó_putchar Š I0059: § Œ Ž ‹ € Ó_putchar Š ĢI0053 I005A: ÄĘ,#1 § cmpb Ē,#45 ŁI005C ÄĘ,#1 I005C: § cmpb Ē,#48 ŁI005F Ąį48 € ĢI00510 I005F: Ąį32 € I00510: ĆŲ ĄŠö I00512: § Œ Ž ‹ ×į48  ž – Ķį9 ja I00511 0 mul Š ĄŠ,ė ĮŠ ” ÄĘ,#1 ‰ Œ Ž ‹ ×į48 ‰ Äåė ĄŠ,ģ ĢI00512 I00511: § cmpb Ē,#108 ŁI00515 ÄĘ,#1 § Œ Ž ‹ ×į97  ž – Ķį25 ja I00515 § Œ Ž ‹ Äį-32 ŗ I00515: § Œ Ž ‹ ×į65  ž – Ķį25 jbe I00518 ‡ € ĢI00519 I00518:  € I00519: Ć-10(ń) Ąå-2(bp) Œ Ž ‹ € ĢI0051A I0051D: ĮŠ Į-10(ń) “ ÄĪ,#2 ‰ ĮĒ Ó_printchar Š Š ‰ ×åė ĄŠ,ģ ĢI00530 I0051E: ĮŲ ĮŠ ‡ € “ € “ ÄĪ,#2 ‰ ‡ € ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I0051F: ĮŲ ĮŠ ‡ € “ € “ ÄĪ,#4 ‰ Į2Ē ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00520: ĮŲ ĮŠ ‡ € Ąį8 € “ ÄĪ,#2 ‰ ‡ € ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00521: ĮŲ ĮŠ ‡ € Ąį8 € “ ÄĪ,#4 ‰ Į2Ē ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00522: ĮŲ ĮŠ  € 0 € “ ÄĪ,#2 ‰ « cwd œ Įax Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00523: ĮŲ ĮŠ  € 0 € “ ÄĪ,#4 ‰ Į2Ē ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00524: ĮŲ ĮŠ ‡ € 0 € “ ÄĪ,#2 ‰ ‡ € ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00525: ĮŲ ĮŠ ‡ € 0 € “ ÄĪ,#4 ‰ Į2Ē ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00526: ĮŲ ĮŠ ‡ € 6 € “ ÄĪ,#2 ‰ ‡ € ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00527: ĮŲ ĮŠ ‡ € 6 € “ ÄĪ,#4 ‰ Į2Ē ĮĒ Ó_printnum Äņ,#12 ĄŠö ĢI00530 I00529: “ ÄĪ,#2 ‰ « ¬ I0052B: ĄåĻ cmpb Ē,#0 je I00530 ĮŠ Į-10(ń) ¹ ÄĻ,#1 ‰ Œ Ž ‹ € Ó_printchar Š Š ‰ ×åė ĄŠ,ģ ĢI0052B I0052E: § Œ Ž ‹ € Ó_putchar Š ĢI00530 I0051A: Ąč#_3 Ćī Ģ.csb2 I00530: ĮŠ óŠ  ™ jle I0053 ĮŲ Ó_putchar Š ĢI00530 I0056: Ąč#_4 Ćī Ģ.csb2 I0053: ÄĘ,#1 ĢI0055 I0052: … „  É_printk _printk: ƒ ‚ ŪäĪ € ˆ Ó_doprnt Š Š … „  É_initvars _initvars: ƒ ‚ € Ą_brk,#_end Ą_nbašnodeö Ąå_nbašnode Į_nbašnode Ą_ncharņec,ģ Ć_nblkņec Ąå_nblkņec Į_nblkņec Ą_nšrectory,ģ Ć_nregular ¼ I0075: ĶĘ,#3 jge I0072 — sal į1 » Ą_ztypeĒö ÜĘ ĢI0075 I0072: Ą_changedö Ą_firstlist,#1 Ą_firstcnterr,#1 Ą_thisblkö … „  É_copy _copy: ƒ ‚ I0084: ˆ ˜ ‰ ĄčĪ Œ Ź(ļ),al ÄĪ,#1 óŌ ŁI0084 … „  É_fatal _fatal: ƒ ‚ ˆ Ąį_5 € Ó_printk Š Š Ąį_6 € Ó_printk Š Ąį-1 € Ó_exit Š … „  É_eoln _eoln: ƒ ‚ ĶÅö jl I00A2 ĶÅ,#10 je I00A2 ĶÅ,#13 je I00A2 ‡ € ĢI00A1 I00A2:  € I00A1:  … „  É_yes _yes: ƒ ‚ € € Ķ_repairö ŁI00B3 Ąį_7 € Ó_printk Š ‡ € ĢI00B1 I00B3: ˆ Ąį_8 € Ó_printk Š Š Ķ_automaticö je I00B6 Ąį_9 € Ó_printk Š  € ĢI00B1 I00B6: Ó_getchar ¬ £ ” ĶĻ,#113 je I00B8 ĶĘ,#81 ŁI00BD I00B8:  € Ó_exit Š I00BD: ” Ó_eoln Š ™ ŁI00BC Ó_getchar ” ĢI00BD I00BC: ĶĻ,#110 je I00B10 ĶĻ,#78 ŁI00BF I00B10: ‡ € ĢI00B1 I00BF:  € I00B1:  … „  É_atoo _atoo: ƒ ‚ ×ņ,#6 ¼ I00C3: ’ Œ Ž ‹ Ķį48 jl I00C2 ’ Œ Ž ‹ Ķį56 jge I00C2 Ąć3 — sal äcl ” ” ˆ ˜ ‰ Œ Ž ‹ ×į48 ‰ Äåė ĄĘ,ģ ĢI00C3 I00C2: — … „  É_input _input: ƒ ‚ € ¢ ” Ąį_10 € Ó_printk Š Ķ_repairö je I00D3 Ąį_11 € Ó_printk Š I00D6: óĪ je I00D5 Ó_getchar § ŗ § Œ Ž ‹ € Ó_eoln Š ™ je I00D9 § ŹĒö ¢ ĶĘ,ė ja I00DB ‡ € ĢI00D1 I00DB:  € ĢI00D1 I00D9: ÄĘ,#1 ĢI00D6 I00D5: § ŹĒö I00DE: Ó_getchar € Ó_eoln Š ™ ŁI00DD ĢI00DE I00DD:  € ĢI00D1 I00D3: ‡ € I00D1:  … „  É_alloc _alloc: ƒ ‚ ×ņ,#6 Ąå_brk ĄĘ,ģ ĄäĪ Äį2 ×į1 ž Ėēī šv ģ mul Å Ąć1 sal äcl » Äå_brk Ą_brk,ģ — ¬ I00E5: Ąå_brk ĶĻ,ģ jae I00E2 ĄåĻ ĄĒö ÄĻ,#2 ĢI00E5 I00E2: — … „  É_printname _printname: ƒ ‚ € ĄĘ,#14 I00F4: ’ cmpb Ēö ŁI00F6 ĢI00F2 I00F6: ’ Œ Ž ‹ ×į32  ž – Ķį94 ja I00F9 ’ Œ Ž ‹ € ĢI00FA I00F9: Ąį63 € I00FA: Ąį_12 € Ó_printk Š Š ˜ óĘ ŁI00F4 I00F2: … „  É_printrec _printrec: ƒ ‚ ’ Ķ2Ēö je I0103 ’ Į2Ē Ó_printrec Š Ąį_13 € Ó_printk Š ’ ĄåĒ Äā2 ¦ Ó_printname Š I0103: … „  É_printpath _printpath: ƒ ‚ ® _17: ĀI0116 Ā1 Ā1 ĀI0117 ĀI0118 † Ąå_top Ķ2Ēö ŁI0113 Ąį_14 € Ó_printk Š ĢI0114 I0113: Į_top Ó_printrec Š I0114: ˆ ĢI0115 I0117: Ąå_top ĄåĒ ĮĒ Ąį_15 € Ó_printk Š Š ĢI0116 I0118: Ąå_top ĄåĒ ĮĒ Ąį_16 € Ó_printk Š Š ĢI0116 I0115: Ąč#_17 ‰ Ģ.csa2 I0116: ĶĪö je I011A Ąį_18 € Ó_printk Š I011A: … „  É_šsktype _šsktype: ƒ ‚ ×ņ,#6 ĄĘ,#3 ĄŠö Ą_trackļz,#15 Ą_cylļz,#30 Ó_reset_šskette I0124:  € Į_rwbuf 4 € ĮŠ Ó_šskio Äņ,#8 ¬  ž £ – test į65280 je I0122 ” óĘ  ™ ŁI0124 I0122:  ž £ – test į65280 je I0127 Ą_trackļz,#9 Ą_cylļz,#18 ĄĘ,#3 Ó_reset_šskette I012B:  € Į_rwbuf Ąį8 € ĮŠ Ó_šskio Äņ,#8 ¬  ž £ – test į65280 je I0129 ” óĘ  ™ ŁI012B I0129:  ž £ – test į65280 je I0127 Ąį_19 € Ó_fatal Š I0127: … „  É_devio _devio: ƒ ‚ ×ņ,#14 ‡ Ąč#1024 Ėéš ’ Ó.mli4 ĄŲ,ė ĄŠ,ī ĶĪö ŁI0133 Ąå_thisblk ĶÅ,ģ ŁI0133 … „  I0133: ’ Ą_thisblk,ģ Ąć9 ĄäŲ ĄåŠ © 2: sar ā1 rcr į1 Ø 1: Ą-12(ń),ė Ą-1Å,#3  ž Ąä-12(ń) – Ää_part_offset Äį2 Ėåģ ¬ ĄĘ,ģ £ § ×į65535 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jle I0137 Ąį_20 € Ó_printk Š  € Ó_exit Š I0137:  ž Ąä-12(ń) Ąē#2 œ Į_rwbuf – Ää_part_offset € “ Ó_šskio Äņ,#8 Ą-10(ń),ė  ž Ąä-10(ń) – test į65280 ŁI013A … „  I013A: Ó_reset_šskette I013E: ‡ € ˆ ĶĪö ŁI01310 Ąį_22 € ĢI01311 I01310: Ąį_23 € I01311: Į-10(ń) Ąį_21 € Ó_printk Äņ,#10  ž Ąä-12(ń) Ąē#2 œ Į_rwbuf call Ś Ää_part_offset € “ Ó_šskio Äņ,#8 Ą-10(ń),ė  ž Ąä-10(ń) – test į65280 ŁI013D … „  I013D: ó-1Å ŁI013E ‡ Į-10(ń) € ˆ ĶĪö ŁI01316 Ąį_25 € ĢI01317 I01316: Ąį_26 € I01317: Į_prog Ąį_24 € Ó_printk Äņ,#12 Ąį_27 € Ó_fatal Š … „  É_devread _devread: ƒ ‚ ‡ € “ ˆ € 024 € Ó.dvi4 € Ó_devio Š Š Į10(ń) ĮŌ Į_rwbuf “ ˆ ‡ € 024 € Ó.rmi4 ‰ Äåī ¦ Ó_copy ¤ … „  É_devwrite _devwrite: ƒ ‚ Ķ_repairö ŁI0153 Ąį_28 € Ó_fatal Š I0153: Ķ10(ń),#1024 je I0156 ‡ € “ ˆ € 024 € Ó.dvi4 € Ó_devio Š Š I0156: Į10(ń) Į_rwbuf “ ˆ ‡ € 024 € Ó.rmi4 ‰ Äåī ¦ ĮŌ Ó_copy ¤  € “ ˆ ‡ € 024 € Ó.dvi4 € Ó_devio Š Š Ą_changed,#1 … „  É_pr _pr: ƒ ‚ ĶĪ,#1 ŁI0163 ĮŌ ĢI0164 I0163: Į10(ń) I0164: “ ˆ Ó_printk ¤ … „  É_lsuper _lsuper: ƒ ‚ ×ņ,#80 I0174: Į_sb Ąį_29 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I0176 Ūä-80(ń) € Ó_atol Š Ą_sb,ė I0176: Į_sb+2 Ąį_30 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I0179 Ūä-80(ń) € Ó_atol Š Ą_sb+2,ė I0179: Į_sb+4 Ąį_31 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I017C Ūä-80(ń) € Ó_atol Š Ą_sb+4,ė I017C: Į_sb+6 Ąį_32 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I017F Ūä-80(ń) € Ó_atol Š Ą_sb+6,ė I017F: Į_sb+8 Ąį_33 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I01712 Ūä-80(ń) € Ó_atol Š Ą_sb+8,ė I01712: Į_sb+10 Ąį_34 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I01715 Ūä-80(ń) € Ó_atol Š Ą_sb+10,ė I01715: Į_sb+12+2 Į_sb+12 Ąį_35 € Ó_printk ¤ Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I01718 Ūä-80(ń) € Ó_atol Š Ą¦Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖ_sb+12,ė Ą_sb+12+2,ī I01718: Ąax,#_36 € Ó_yes Š ™ je I0173 8 € Ąį_sb € ‡ € 024 € Ó_devwrite Äņ,#8 … „  I0173: Ąį_37 € Ó_yes Š ™ ŁI0174 Ķ_repairö je I0171E ‡ € Ó_exit Š I0171E: … „  É_makedev _makedev: ƒ ‚ ×ņ,#8 ® _38: Ā1 Ā46 ø ø ø ø ø ø Ā1 Ā11822 ø ø ø ø ø ø _39: Ā16877 ø Ā32,0 ø,0 Ā512 ø ø ø ø ø ø ø ø ø † ĄĻ,#2048 ¼ Ąå_sb Äā32 ×ā1 Ąć32 Ąäģ Ėēī šv ķ Ąå_sb+6 Äå_sb+4 Äåė ¦  ž  – ĄŠ,ė Ąå_sb+2 ×ā1  € ¦ Ó_devio Š Š Ź_nullbuf,#1 I0184: 024 € Ąį_nullbuf € ” Į-4(ń) Ó_devwrite Äņ,#8 Ź_nullbufö £ § Äį1024 adc ā0 ¬ ĄĘ,ģ óŠ ŁI0184 Ąå_sb+8 Ą_39+14,ģ Ąå_sb+4 Äā2 Äå_sb+6 ‡ Ąč#1024 Ėéš Ąć32 Įķ Ąć_39 Įķ Ó.mli4 œ € Ó_devwrite Äņ,#8  ž Ąä_sb+10 Ąē#1024 œ Ąē#_nullbuf œ Į_sb+8 –  ž – Ąęė  sal äcl Ėåģ ¦ Ąč#1024 Ėéš »  Ó.mli4 œ € Ó_devwrite Äņ,#8  ž Ąä_sb+10 Ąē#32 œ Ąē#_38 œ Į_sb+8 –  ž – Ąęė  sal äcl Ėåģ ¦ Ąč#1024 Ėéš »  Ó.mli4 œ € Ó_devwrite Äņ,#8 … „  É_mkfs _mkfs: ƒ ‚ ×ņ,#80 Ąį_40 € Ó_printk Š  ž Ąä_zone_ct – mov _sb+2,ė Į_zone_ct Ąį_41 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I0193 Ūä-80(ń) € Ó_atol Š Ą_sb+2,ė I0193: Ą_sb+10ö Į_sb+10 Ąį_42 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I0196 Ūä-80(ń) € Ó_atol Š Ą_sb+10,ė I0196:  ž Ąä_inode_ct – Ą_sb,ė Į_sb Ąį_43 € Ó_printk Š Š Ąį80 € Ūä-80(ń) € Ó_input Š Š ™ je I0199 Ūä-80(ń) € Ó_atol Š Ą_sb,ė I0199: Ąå_sb Äā8192 ×ā1 Ąć13 shr åcl Ą_sb+4,ģ Ąå_sb+2 Äā8192 ×ā1 shr åcl Ą_sb+6,ģ  ž Ąä_sb+10 Ąē#1 œ –  ž – Ąęė  sal äcl  ž –  ž – Ąå_sb Äā32 ×ā1 € Ąć32 Ąäģ Ėēī šv ķ Ąå_sb+4 Äā2 Äå_sb+6 Äåė  Ääģ ×į1 €  ž Ąä_sb+10 –  ž – Ąęė  shr äcl Ą_sb+8,ė Ą_sb+12,#65535 Ą_sb+12+2,#32767 Ąå_sb+12 Ąę_sb+12+2 ×ā1 sbb ć0 Ąä_sb+10 cwd Įķ Ąęė  © 2: sar į1 rcr ā1 Ø 1: € ¦ ‡ € 024 € Ó.dvi4 ×į519 sbb ć4 Ł1f Öäė je 1f Üķ 1: or ęķ jl I019C Ąä_sb+10 cwd Ąęė Ąį7168 Ąā4104 © 2: sal į1 rcl ā1 Ø 1: Ą_sb+12,ė Ą_sb+12+2,ģ I019C: Ą_sb+16,#4991 Ąį_44 € Ó_printk Š Ą_repairö Ó_lsuper Ą_repair,#1 Ąį_45 € Ó_yes Š ™ ŁI019F Ó_lsuper ĢI01910 I019F: 8 € Ąį_sb € ‡ € 024 € Ó_devwrite Äņ,#8 I01910: Ó_makedev … pop ń  É_getsuper _getsuper: ƒ ‚ Ķ_makefsö je I01A3 Ó_mkfs ĢI01A4 I01A3: 8 € Ąį_sb € ‡ € 024 € Ó_devread Äņ,#8 Ķ_listsuperö je I01A4 Ó_lsuper I01A4:  ž Ąä_sb+16 – Ķį4991 je I01A9 Ąį_46 € Ó_fatal Š I01A9:  ž Ąä_sb – ™ jg I01AC Ąį_47 € Ó_fatal Š I01AC: Ķ_sb+2,#2 ja I01AF Ąį_48 € Ó_fatal Š I01AF:  ž Ąä_sb+4 – ™ jg I01A12 Ąį_49 € Ó_fatal Š I01A12:  ž Ąä_sb+6 – ™ jg I01A15 Ąį_50 € Ó_fatal Š I01A15:  ž Ąä_sb+8 – Ķį1 jg I01A18 Ąį_51 € Ó_fatal Š I01A18: Ķ_sb+10ö jge I01A1B Ąį_52 € Ó_fatal Š I01A1B: Ąå_sb+12 Ąę_sb+12+2 ×ā0 sbb ć0 Ł1f Öåģ je 1f Üķ 1: or ęķ jg I01A1E Ąį_53 € Ó_fatal Š I01A1E: … „  É_chksuper _chksuper: ƒ ‚ ×ņ,#6 Ąå_sb Äā8192 Ąć13 shr åcl ¦  ž  – ”  ž Ąä_sb+16 – Ķį4991 je I01B3 Ąį_54 € Ó_fatal Š I01B3:  ž Ąä_sb+4 – ĶĘ,ė jle I01B6 Ąį_55 € Ó_fatal Š I01B6:  ž — Į_sb+4 – ‰ Ķåė je I01B9 Ąį_58 € Ąį_57 € ” Ąį_56 € Ó_pr Äņ,#8 Į_sb+4 Ąį_59 € Ó_printk Š Š I01B9: Ąå_sb+2 Äā8192 ×ā1 Ąć13 shr åcl ¦  ž  – ”  ž Ąä_sb+6 – ĶĘ,ė jle I01BC Ąį_60 € Ó_fatal Š I01BC:  ž — Į_sb+6 – ‰ Ķåė je I01BF Ąį_63 € Ąį_62 € ” Ąį_61 € Ó_pr Äņ,#8 Į_sb+6 Ąį_64 € Ó_printk Š Š I01BF:  ž Ąä_sb+8 –  ž – Ķ_sb+2,ė ja I01B12 Ąį_65 € Ó_fatal Š I01B12:  ž Ąä_sb+10 – Ķį16 jb I01B15 Ąį_66 € Ó_fatal Š I01B15: Ķ_sb+10,#8 jle I01B18 Į_sb+10 Ąį_67 € Ó_printk Š Š I01B18:  ž Ąä_sb+10 Ąē#1 œ –  ž – Ąęė  sal äcl  ž –  ž – Ąå_sb Äā32 ×ā1 € Ąć32 Ąäģ Ėēī šv ķ Ąå_sb+4 Äā2 Äå_sb+6 Äåė  Ääģ ×į1 €  ž Ąä_sb+10 –  ž – Ąęė  shr äcl  ž – ”  ž Ąä_sb+8 call Ś ĶĘ,ė jle I01B1B Ąį_68 € Ó_fatal Š I01B1B:  ž — Į_sb+8 – ‰ Ķåė je I01B1E ” Ąį_69 € Ó_printk Š Š Į_sb+8 Ąį_70 € Ó_printk Š Š I01B1E: ĄŠ,#65535 ĄĻ,#32767 ĄäŠ ĄåĻ ×į1 sbb ā0 ¦ € Ąä_sb+10 cwd Ąęė  ‰ © 2: sar ā1 rcr į1 Ø 1: ¦ € ‡ € 024 € Ó.dvi4 ×į519 sbb ć4 Ł1f Öäė je 1f Üķ 1: or ęķ jl I01B21 Ąä_sb+10 cwd Ąęė Ąį7168 Ąā4104 © 2: sal į1 rcl ā1 Ø 1: ĄŠ,ė ĄĻ,ģ I01B21: Ąå_sb+12 Ąę_sb+12+2 ×åŠ sbb ęĻ Ł1f or ęģ 1: or ęķ je I01B24 ¹ ĮŠ Ąį_71 € Ó_printk ¤ Į_sb+12+2 Į_sb+12 Ąį_72 € Ó_printk ¤ I01B24: … „  É_allocbitmap _allocbitmap: ƒ ‚ € € 024 € ˆ Ó_alloc Š Š ” — ¬ ĄåĻ « or į1 ° — … „  É_loadbitmap _loadbitmap: ƒ ‚ ×ņ,#8 ¢ ¬ ¼ I01D5: ĄäŌ ĶĘ,ė jge I01D2 ‡ Ąč#1024 Ėéš Æ Ąć1024 Įķ ¹ Ó.mli4 œ € Ó_devread Äņ,#8 ÜĘ ĄäĪ Äį1 ĄĪ,ė ÄĻ,#1024 ĢI01D5 I01D2: ¢ ĄŲ,ė ĄåŲ « or į1 ° … „  É_dumpbitmap _dumpbitmap: ƒ ‚ ×ņ,#6 ¢ ¬ ¼ I01E5: ĄäŌ ĶĘ,ė jge I01E2 ‡ Ąč#1024 Ėéš Æ Ąć1024 Įķ ¹ Ó.mli4 œ € Ó_devwrite Äņ,#8 ÜĘ ĄäĪ Äį1 ĄĪ,ė ÄĻ,#1024 ĢI01E5 I01E2: … „  É_initbitmap _initbitmap: ƒ ‚ ×ņ,#6 I01F3: testb Ī,#15 je I01F2 Ąć4 ĄäĪ shr äcl Ąć1 sal äcl » ÄåÅ ĄŠ,ģ ĄäĪ Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ ĄåŠ ° ĄäĪ Äį1 ĄĪ,ė ĢI01F3 I01F2: Ąć4 ĄäĪ shr äcl Ąć1 sal äcl » ÄåÅ ĄĘ,ģ Ąį512 mul Ō sal į1 » ÄåÅ ĄĻ,ģ I01F6: £ ĶĘ,ė jae I01F5 § ĄĒ,#65535 ÄĘ,#2 ĢI01F6 I01F5: … „  É_getbitmaps _getbitmaps: ƒ ‚ Į_sb+4 Ó_allocbitmap Š Ą_imap,ė Į_sb+6 Ó_allocbitmap Š Ą_zmap,ė Į_sb+4 Ó_allocbitmap Š Ą_ņec_imap,ė Į_sb+6 Ó_allocbitmap Š Ą_ņec_zmap,ė Į_sb+4 Ó_allocbitmap Š Ą_šrmap,ė … „  É_chkword _chkword: ƒ ‚ € € I0215: ¢ or äĪ ™ je I0212 ĄäĪ ĖäÅ testb al,#1 je I0217 Ąä12(ń) ” Ąå12(ń) « Üė § ° § Ąć8 « cwd išv ķ or ēī ŁI0217 Ąå1Å ĶĒö je I0217 Ķ_repairö je I0216 Ķ_automaticö ŁI0216 Ąį_73 € Ó_yes Š ™ je I0217 I0216: Ąå1Å ĄĒö ĢI0213 I0217: Ąå1Å ĶĒö je I0213 test Å,#1 je I02112 test Ī,#1 ŁI02112 ĮŌ Į10(ń) Ąį_74 € Ó_printk ¤ ĢI0213 I02112: test Å,#1 ŁI0213 test Ī,#1 je I0213 ĮŌ Į10(ń) Ąį_75 € Ó_printk ¤ I0213: ¢ shr į1 ĄÅ,ė ĄäĪ shr į1 ĄĪ,ė ĄäŌ Äį1 ĄŌ,ė ĢI0215 I0212: … „  É_chkmap _chkmap: ƒ ‚ ×ņ,#10 mov äĪ ” ¢ ¬ ĄŠ,#1 ĄŲö Ķ_makefsö je I0223 Į12(ń) Į10(ń) ˆ Ó_dumpbitmap ¤ … „  I0223: Į1Ī Ąį_76 € Ó_printk Š Š Į12(ń) Į10(ń) “ Ó_loadbitmap ¤ I0227: § ĄčĻ Ąä(ļ) ĶĒ,ė je I0229 ĄåĻ ĄčĘ ŪäŠ € ŪäŲ € Į1Ī ĮŌ ĮĒ Į(ļ) Ó_chkword Äņ,#12 I0229: ÄĘ,#2 ÄĻ,#2 ĄäŌ Äį16 ĄŌ,ė Ąä1Å ĶŌ,ė jb I0227 Ķ_repairö je I022E Ķ_automaticö je I022C I022E: ĶŠö ŁI022C Ąį_77 € Ó_printk Š I022C: ĶŲ,#8 jg I02210 ĶŲ,#10 jle I02211 I02210: ĮŲ Ąį_78 € Ó_printk Š Š I02211: ĶŲö je I02215 Ąį_79 € Ó_yes Š ™ je I02215 Į12(ń) Į10(ń) ˆ Ó_dumpbitmap Äņ,#6 I02215: ĶŲö jle I02219 Ąį_80 € Ó_printk Š I02219: … „  É_chkilist _chkilist: ƒ ‚ € € ĄĘ,#1 Ķ_makefsö je I0233 … „  I0233: Ąį_81 € Ó_printk Š I0237: — Öį15  ž Ąē#1 œ – Ąęė  sal äcl Ąć4 § shr åcl Ąć1 sal åcl Äå_imap test Ē,ė ŁI0236 Ąå_sb+4 Äā2 Äå_sb+6 ‡ Ąč#1024 Ėéš  Įķ ŪęĻ Įķ Ó.mli4 § ×ā1 Ėęķ œ € Ąč#32 Ėéš Ąäķ Ó.mli4 ‰ Ćķ Äåė adc ęī Įķ ¦ Ó_devread Äņ,#8 ĶĻö je I0236 ” Ąį_82 € Ó_printk Š Š Ąį_83 € Ó_yes Š ™ je I0236 Ąå_sb+4 Äā2 Äå_sb+6 ‡ Ąč#1024 Ėéš Ąć32 Įķ Ąć_nullbuf Įķ Ó.mli4 mov åĘ ×ā1 Ėęķ œ € Ąč#32 Ėéš Ąäķ Ó.mli4 ‰ Ćķ Äåė adc ęī Įķ ¦ Ó_devwrite Äņ,#8 I0236: — Äį1 ” Ąå_sb ĶĘ,ģ jbe I0237 Ąį_84 € Ó_printk Š … „  É_getcount _getcount: ƒ ‚ Ąå_sb Äā1  € ¦ Ó_alloc Š Š Ą_count,ė … „  É_counterror _counterror: ƒ ‚ ×ņ,#34 Ķ_firstcnterrö je I0253 Ąį_85 € Ó_printk Š Ą_firstcnterrö I0253: Ąå_sb+4 Äā2 Äå_sb+6 ‡ Ąč#1024 Ėéš Ąć32 Įķ Ūę-32(ń) Įķ Ó.mli4 ’ ×ā1 Ėęķ œ € Ąč#32 Ėéš Ąäķ Ó.mli4 ‰ Ćķ Äåė adc ęī Įķ ¦ Ó_devread Äņ,#8 ’ Äå_count Ą-3Å,ģ Ąå-3Å Œ Ž ‹ € Źal,-19(ń) Õah,ah ‹ ‰ Äåė Ąč-3Å Ź(ļ),bl ’ Äå_count Œ Ž ‹ €  ž Źal,-19(ń) Ž – € ˆ Ąį_86 € Ó_printk Äņ,#8 Ąį_87 € Ó_yes Š ™ je I0256 ’ Äå_count Œ Ž Ź-19(ń),al ‹ ™ ŁI0259 Ąį_88 € Ó_fatal Š I0259: Ąå_sb+4 Äā2 Äå_sb+6 ‡ Ąč#1024 Ėéš Ąć32 Įķ Ūę-32(ń) Įķ Ó.mli4 ’ ×ā1 Ėęķ œ € Ąč#32 Ėéš Ąäķ Ó.mli4 ‰ Ćķ Äåė adc ęī Įķ ¦ Ó_devwrite Äņ,#8 I0256: … „  É_chkcount _chkcount: ƒ ‚ € ĄĘ,#1 I0265: Ąå_sb ĶĘ,ģ ja I0262 § Äå_count cmpb Ēö je I0263 ” Ó_counterror Š I0263: — Äį1 ” ĢI0265 I0262: Ķ_firstcnterrö jne I026A Ąį_89 € Ó_printk Š I026A: … „  É_printperm _printperm: ƒ ‚  ž ĄäĪ ˆ –  ž – Ąęė  shr äcl testb al,#4 je I0273 Ąį_90 € ĢI0274 I0273: Ąį_91 € I0274: Ó_printk Š  ž ĄäĪ ˆ –  ž – Ąęė  shr äcl testb al,#2 je I0276 Ąį_92 € ĢI0277 I0276: Ąį_93 € I0277: Ó_printk Š  ž ĄäŌ – test Å,ė je I0279 Į10(ń) Ąį_94 € Ó_printk Š Š ĢI027A I0279:  ž ĄäĪ ˆ –  ž – Ąęė  shr äcl testb al,#1 je I027C Ąį_95 € ĢI027D I027C: Ąį_96 € I027D: Ó_printk Š I027A: … „  É_list _list: ƒ ‚ ® _104: ĀI028B Ā4 Ā8192 ĀI0289 Ā16384 ĀI0288 Ā24576 ĀI028A Ā-32768 ĀI0287 _108: ĀI02810 Ā2 Ā8192 ĀI028F Ā24576 ĀI028F † Ķ_firstlistö je I0283 Ą_firstlistö Ąį_97 € Ó_printk Š I0283: ˆ Ąį_98 € Ó_printk Š Š Æ « Öį61440 € ĢI0285 I0287: Ąį_99 € Ó_printk Š ĢI0286 I0288: Ąį_100 € Ó_printk Š ĢI0286 I0289: Ąį_101 € Ó_printk Š ĢI0286 I028A: Ąį_102 € Ó_printk Š ĢI0286 I028B: Ąį_103 € Ó_printk Š ĢI0286 I0285: Ąč#_104 Ćī Ģ.csb2 I0286: Æ 15 € “048 € Ąį6 € ĮĒ Ó_printperm Äņ,#8 Æ 15 € 024 € Ąį3 € ĮĒ Ó_printperm Äņ,#8 Æ 16 € Ąį512 € ‡ € ĮĒ Ó_printperm add ņ,#8 Æ Źal,13Ē Ž ‹ € Ąį_105 € Ó_printk Š Š Æ « Öį61440 € ĢI028C I028F: Æ Ėęķ Ąä14Ē shr äcl „ Ąć8 Ąå14Ē shr åcl Öā255 € ¦ Ąį_106 € Ó_printk ¤ ĢI028D I02810: Æ Į6Ē Į4Ē Ąį_107 € Ó_printk ¤ ĢI028D I028C: Ąč#_108 Ćī Ģ.csb2 I028D:  € ‡ € Ó_printpath Š Š … „  É_remove _remove: ƒ ‚ ×ņ,#8 ’ Ąć4 « shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄŲ,ģ ĄčÅ Ąä(ļ) Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ ĄåŲ ° Ąį_109 € Ó_yes Š ™ je I0293 ’ ĄåĒ Äå_count ĄŲ,ģ ĄåŲ movb al,Ē Ž ‹ óė ŗ ĄĻ,#_nullšr ¢ ĄŠ,ė ĄĘ,Ń I0296: ” óĘ  ™ je I0295 ¹ ÄĻ,#1 ‰ ĄčŠ Œ Ź(ļ),al ÄŠ,#1 ĢI0296 I0295:  € ĢI0291 I0293: ‡ € I0291:  … „  É_chkdots _chkdots: ƒ ‚ € Ąå10(ń) Ąä12(ń) ĶĒ,ė je I02A3 Ąå10(ń) Äā2 ¦ Ąį_110 € Ó_printk Š Š ‡ €  € Ó_printpath Š Š Ąå10(ń) Ąč10(ń) ĮĒ Äč#2 Įļ Ąį_111 € Ó_printk ¤ Į12(ń) Ąį_112 € Ó_printk Š Š Ąć4 ¢ shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄĘ,ģ ¢ Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ § ° Ąå10(ń) Ąć4 « shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄĘ,ģ Ąč10(ń) Ąä(ļ) Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ § ° Ąć4 Ąä12(ń) shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄĘ,ģ Ąä12(ń) Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ § ° Ąį_113 € Ó_yes Š ™ je I02A4 Ąå10(ń) ĄåĒ Äå_count ĄĘ,ģ § Œ Ž ‹ óė ŗ Ąä12(ń) Ąå10(ń) ° Ąå12(ń) Äå_count ĄĘ,ģ § Œ Ž ‹ Üė ŗ ‡ € ĢI02A1 I02A3: Ąå10(ń) ĮŌ “ cmpb 3Ēö je I02AC 6 € ĢI02AD I02AC: ‡ € I02AD:  cwd ‰ Ćķ ×åė sbb ęī Ł1f or ęģ 1: or ęķ je I02A4 Ąå10(ń) ĮŌ “ Äā2 ¦ Ąį_114 € Ó_printk Äņ,#8 ‡ €  € Ó_printpath Š Š Ąå10(ń) Ąč10(ń) ĮĒ Äč#2 Įļ Ąį_115 € Ó_printk ¤ Ąć4 ¢ shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄĘ,ģ ¢ Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ § ° Ąå10(ń) Ąć4 « shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄĘ,ģ Ąč10(ń) Ąä(ļ) Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ § ° Ąć4 Ąä12(ń) shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄĘ,ģ Ąä12(ń) Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ § ° I02A4:  € I02A1:  … „  É_chkname _chkname: ƒ ‚ ×ņ,#6 ĄĘ,#15 Æ Äā2 ĄĻ,ģ ĄåĻ cmpb Ēö ŁI02B9 Ąį_116 € Ó_printk Š ‡ € € Ó_printpath Š Š Ąć4 ¢ shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄŠ,ģ ¢ Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ ĄåŠ ° “ Ó_remove Š ™ je I02B9 ‡ € ĢI02B1 I02B9: óĘ je I02B8 ĄåĻ cmpb Ēö je I02B8 ¹ ÄĻ,#1 ‰ cmpb Ē,#47 ŁI02B9 Ąį_117 € Ó_printk Š ‡ €  € Ó_printpath Š Š Ąć4 ¢ shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄŠ,ģ ¢ Öį15 Į(ģ)  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ ĄåŠ ° Ąį_118 € Ó_printk Š Æ Äā2 ¦ Ó_printname Š Ąį_119 € Ó_printk Š “ Ó_remove Š ™ je I02B8 ‡ € ĢI02B1 I02B8:  € I02B1:  … „  É_chkentry _chkentry: ƒ ‚ ×ņ,#8 Ąå10(ń) ĶĒ,#1 jb I02C2 Ąå10(ń) Ąę_sb ĶĒ,ķ jbe I02C3 I02C2: Ąį_120 € Ó_printk Š ‡ €  € Ó_printpath Š Š Ąå10(ń) ĮĒ Ąį_121 € Ó_printk Š Š Ąį_122 € Ó_printk Š Ąå10(ń) Äā2 ¦ Ó_printname Š Ąį_123 € Ó_printk Š Ąį_124 € Ó_yes Š ™ je I02C7 ĄĘ,#_nullšr Ąä10(ń) ¬ ĄŠ,Ń I02CA: ĮŠ óŠ  ™ je I02C9 ” ÄĘ,#1 ‰ ĄčĻ Œ Ź(ļ),al ÄĻ,#1 ĢI02CA I02C9: ‡ € ĢI02C1 I02C7:  € ĢI02C1 I02C3: Ąå10(ń) ĄåĒ Äå_count ‡ Œ €  ž  – Ķį127 ŁI02CD Ąå10(ń) ĮĒ Ąį_125 € Ó_printk Š Š Ąį_126 € Ó_printk Š Ąå10(ń) Äā2 ¦ Ó_printname Š Ąį_127 € Ó_printk Š  € ‡ € Ó_printpath Š Š Į10(ń) Ó_remove Š ™ je I02CD ‡ € ĢI02C1 I02CD: Ąå10(ń) ĄåĒ Äå_count ĄŲ,ģ ĄåŲ Œ Ž ‹ Üė ŗ Ąå10(ń) Ąį_128 € Äā2 ¦ Ó_strcmp Š Š ™ ŁI02C13 Ąå_top Äā4 ĄŲ,ģ ĄåŲ Œ Ž ‹ or į1 ŗ ˆ Į10(ń) ĮŌ push Ī ˆ Ó_chkdots Äņ,#10 € ĢI02C1 I02C13: Ąå10(ń) Ąį_129 € Äā2 ¦ Ó_strcmp Š Š ™ ŁI02C16 Ąå_top Äā4 ĄŲ,ģ ĄåŲ Œ Ž ‹ or į2 ŗ ĶÅ,#1 ŁI02C19 ˆ ĢI02C1A I02C19: Ąå_top Ąå2Ē ĄåĒ ĮĒ I02C1A: Į10(ń) ĮŌ “ ˆ Ó_chkdots Äņ,#10 € ĢI02C1 I02C16: Į10(ń) ˆ Ó_chkname Š Š ™ ŁI02C1C ‡ € ĢI02C1 I02C1C: Ąå10(ń) « Öį15  ž Ąē#1 œ – Ąęė  sal äcl Ąå10(ń) Ąć4 ĄåĒ shr åcl Ąć1 sal åcl Äå_šrmap test Ē,ė je I02C1F Ąį_130 € Ó_printk Š ‡ €  € Ó_printpath Š Š Ąį_131 € Ó_printk Š Ąå10(ń) Äā2 ¦ Ó_printname Š Ąå10(ń) ĮĒ Ąį_132 € Ó_printk Š Š Į10(ń) Ó_remove Š ™ je I02C21 ‡ € ĢI02C1 I02C21:  € ĢI02C1 I02C1F: Į10(ń) Ó_descendtree Š € I02C1:  … „  É_chkšrzone _chkšrzone: ƒ ‚ ×ņ,#268  ž Ąä_sb+10 Ąē#1 œ –  ž – Ąęė  sal äcl  ž –  sal äcl Ą-260(ń),ė ž Ąä_sb+10 Į12(ń) –  ž – Ąęė  sal äcl Ėåģ ¦ Ąč#1024 Ėéš »  Ó.mli4 Ą-26Ī,ė Ą-26Å,ī I02D4: “56 € Ūä-25Ī € Į-26Å Į-26Ī Ó_devread Äņ,#8 Ą-262(ń)ö Ūå-25Ī Ą-25Ō,ģ I02D8: Ūå0(ń) Ķ-25Ō,ģ jae I02D5 Æ Ąä4Ē Ąę6Ē ×äŌ sbb ę10(ń) ×į16 sbb ć0 Ł1f Öäė je 1f Üķ 1: or ęķ jge I02DA Ąį_133 € Ó_printk Š ‡ € “ € Ó_printpath Š Š Ąį_134 € Ó_yes Š ™ je I02DD Ąć4 ¢ shr äcl Ąć1 sal äcl » Äå_ņec_imap Ą-26Ō,ģ ¢ Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ Ąå-26Ō ° Æ ĄäŌ Ąę10(ń) Ą4Ē,ė Ą6Ē,ķ Ą-262(ń),#1 ĢI02DA I02DD: ‡ € ĢI02D1 I02DA: Ąå-25Ō ĶĒö je I02D10 Į-25Ō Į10(ń) ĮŌ ˆ Ó_chkentry Äņ,#8 ™ ŁI02D10 Ą-262(ń),#1 I02D10: ĄäŌ Ąå10(ń) Äį16 adc ā0 ĄŌ,ė Ą10(ń),ģ Æ ĄäŌ Ąę10(ń) ×ä4Ē sbb ę6Ē Ł1f Öäė je 1f Üķ 1: or ęķ jl I02D6 ĢI02D5 I02D6: Ä-25Ō,Ń ĢI02D8 I02D5: Ķ-262(ń)ö je I02D17 “56 € Ūä-256(bp) € Į-26Å Į-26Ī Ó_devwrite Äņ,#8 I02D17: Ąä-26Ī Ąå-26Å Äį256 adc ā0 Ą-26Ī,ė Ą-26Å,ģ ó-260(ń) je I02D2 Æ ĄäŌ Ąę10(ń) ×ä4Ē sbb ę6Ē Ł1f Öäė je 1f Üķ 1: or ęķ jl I02D4 I02D2:  € I02D1:  … „  É_errzone _errzone: ƒ ‚ ® _141: ĀI02E7 ø Ā2 ĀI02E4 ĀI02E5 ĀI02E6 † ˆ Ąį_135 € Ó_printk Š Š ‡ €  € Ó_printpath Š Š “ Ąį_136 € Ó_printk Š Š ĮŌ ĢI02E2 I02E4: Ąį_137 € Ó_printk Š ĢI02E3 I02E5: Ąį_138 € Ó_printk Š ĢI02E3 I02E6: Ąį_139 € Ó_printk Š ĢI02E3 I02E7: Ąį_140 € Ó_printk Š ĢI02E3 I02E2: Ąč#_141 ‰ Ģ.csa2 I02E3: Į12(ń) Į10(ń) Ąį_142 € Ó_printk ¤ … „  É_markzone _markzone: ƒ ‚ € € ĄäĪ ×ä_sb+8 Äį1 ” ĄäŌ sal į1 » Äā_ztype ĄĻ,ģ « Üė ° Ąå_sb+8 ĶĪ,ģ jb I02F2 Ąå_sb+2 ĶĪ,ģ jb I02F3 I02F2: Į12(ń) Į10(ń) ĮŌ “ Ąį_143 € Ó_errzone Äņ,#10 ‡ € ĢI02F1 I02F3: — Öį15  ž Ąē#1 œ – Ąęė  sal äcl Ąć4 § shr åcl Ąć1 sal åcl Äå_zmap test Ē,ė je I02F7 Ąć4 — shr äcl Ąć1 sal äcl » Äå_ņec_zmap ĄĻ,ģ — Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ ĄåĻ ° Į12(ń) Į10(ń) ĮŌ “ Ąį_144 € Ó_errzone Äņ,#10 ‡ € ĢI02F1 I02F7: ó_nfreezone — Öį15  ž Ąē#1 œ – Ąęė  sal äcl Ąć4 § shr åcl Ąć1 sal åcl Äå_ņec_zmap test Ē,ė je I02FA ” Į12(ń) Į10(ń) ĮŌ “ ˆ Ąį_145 € Ó_errzone Äņ,#14 I02FA: Ąć4 — shr äcl Ąć1 sal äcl » Äå_zmap ĄĻ,ģ — Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ ĄåĻ °  € I02F1:  … „  É_chkindzone _chkindzone: ƒ ‚ ×ņ,#264 Ą-25Ō,#4  ž Ąä_sb+10 Į10(ń) –  ž – Ąęė  sal äcl Ėåģ ¦ Ąč#1024 Ėéš »  Ó.mli4 Ą-262(ń),ė Ą-260(ń),ī I0304: “56 € Ūä-25Ī € Į-260(ń) Į-262(ń) Ó_devread Äņ,#8 Ąä12(ń) óė € 28 € Ūä-25Ī € ĮŌ “ ˆ Ó_chkzones Äņ,#12 ™ ŁI0306 ‡ € ĢI0301 I0306: Ąä-262(ń) Ąå-260(ń) Äį256 adc ā0 Ą-262(ń),ė Ą-260(ń),ģ ó-25Ō je I0302 › ĄčĪ « Ąę2Ē ×ä4(ļ) sbb ę6(ļ) Ł1f Öäė je 1f Üķ 1: or ęķ jl I0304 I0302:  € I0301:  … „  É_jump _jump: ƒ ‚ ×ņ,#6  ž Ąä_sb+10 Ąē#1024 œ –  ž – Ąęė  sal äcl  ž – cwd ¬ ĄĘ,ī ĶÅö je I0313 I0317: Ąč#512 Ėéš ĄåĻ — Ó.mli4 ¬ ĄĘ,ī óÅ ŁI0317 I0313: £ ĄēĘ … „  É_zonechk _zonechk: ƒ ‚ € Ķ12(ń)ö ŁI0323 Æ « Öį61440 Ķį16384 ŁI0326 › Į10(ń) Į2Ē ĮĒ “ ˆ Ó_chkšrzone Äņ,#10 ™ ŁI0326 ‡ € ĢI0321 I0326: ĄäŌ ” § Į2Ē ĮĒ  ž Ąä_sb+10 Ąē#1024 œ –  ž – Ąęė  sal äcl  ž – cwd ‰ Ćķ Äåė adc ęī ĄčĘ Ą(ļ),ģ Ą2(ļ),ķ  € ĢI0321 I0323: Į12(ń) Į10(ń) ĮŌ “ ˆ Ó_chkindzone Äņ,#10 € I0321:  … „  É_chkzones _chkzones: ƒ ‚ ×ņ,#6 ĄĘ,#1 ĄĻö I0335: Ąä12(ń) ĶĻ,ė jge I0332 › ĄčĪ « Ąę2Ē ×ä4(ļ) sbb ę6(ļ) Ł1f Öäė je 1f Üķ 1: or ęķ jge I0332 £ sal į1 » Äå10(ń) ĶĒö ŁI0338 ĄäŌ ĄŠ,ė ĄåŠ Į2Ē ĮĒ Į14(ń) Ó_jump Š ‰ Ćķ Äåė adc ęī ĄčŠ Ą(ļ),ģ Ą2(ļ),ķ ĢI0333 I0338: › £ sal į1 Ąčė Äč10(ń) Į2Ē ĮĒ Į1Å Į(ļ) ˆ Ó_markzone Äņ,#10 ™ ŁI033B ĄäŌ ĄŠ,ė ĄåŠ Į2Ē ĮĒ Į1Å Ó_jump Š ‰ Ćķ Äåė adc ęī ĄčŠ Ą(ļ),ģ Ą2(ļ),ķ ¼ ĢI0333 I033B: £ sal į1 » Äå10(ń) Į1Å ĮĒ ĮŌ “ ˆ Ó_zonechk Äņ,#10 ™ ŁI0333 ¼ I0333: ÜĻ ĢI0335 I0332: — … „  É_chkfile _chkfile: ƒ ‚ ×ņ,#10 Ą-10(ń)ö ĄŲö Æ ‡ € Ąį7 € Äā14 ¦ Ūä-10(ń) € “ ˆ Ó_chkzones Äņ,#12 ” ĄĻ,#7 ĄŠ,#1 I0345: ĶĻ,#9 jge I0342 Æ £ sal į1 Äåė ĮŠ  € Äā14 ¦ Ūä-10(ń) € “ ˆ Ó_chkzones Äņ,#12 ™ ŁI0343 ¼ I0343: ÜĻ ÜŠ ĢI0345 I0342: — … „  É_chkšrectory _chkšrectory: ƒ ‚ € € Ąć4 ¢ shr äcl Ąć1 sal äcl » Äå_šrmap ĄĻ,ģ ¢ Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ ĄåĻ ° Æ Ąä4Ē Ąę6Ē ×į5000 sbb ć0 Ł1f Öäė je 1f Üķ 1: or ęķ jle I0353 Ąį_146 € Ó_printk Š  € “ € Ó_printpath Š Š I0353: “ ˆ Ó_chkfile Š Š ” Ąå_top Źal,4Ē Ž ‹ testb al,#1 ŁI0356 Ąį_147 € Ó_printk Š  € “ € Ó_printpath Ćsi Š ¼ I0356: Ąå_top Źal,4Ē Ž ‹ testb al,#2 ŁI0359 Ąį_148 € Ó_printk Š  € “ € Ó_printpath Š Š ¼ I0359: — … „  É_chkmode _chkmode: ƒ ‚ ® _151: ĀI0368 Ā4 Ā8192 ĀI0367 Ā16384 ĀI0365 Ā24576 ĀI0366 Ā-32768 ĀI0364 † Æ « Öį61440 € ĢI0362 I0364: Ü_nregular “ ˆ Ó_chkfile Š Š € ĢI0361 I0365: Ü_nšrectory “ ˆ Ó_chkšrectory Š Š € ĢI0361 I0366: Ü_nblkņec  € ĢI0361 I0367: Ü_ncharņec  € ĢI0361 I0368: Ü_nbašnode Ąį_149 € Ó_printk Š ‡ €  € Ó_printpath Š Š Æ ĮĒ Ąį_150 € Ó_printk Š Š ‡ € ĢI0361 I0362: Ąč#_151 Ćī Ģ.csb2 I0361:  … „  É_chkinode _chkinode: ƒ ‚ € ĶÅ,#1 ŁI0373 Æ « Öį61440 Ķį16384 je I0373 Ąį_152 € Ó_printk Š Æ ĮĒ ˆ Ąį_153 € Ó_printk ¤ Ąį_154 € Ó_fatal Š I0373: Æ cmpb 13Ēö ŁI0377 Ąį_155 € Ó_printk Š ‡ € “ € Ó_printpath Š Š ‡ € ĢI0371 I0377: ó_nfreeinode Ąć4 ¢ shr äcl Ąć1 sal äcl » Äå_imap ĄĘ,ģ ¢ Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ § ° Æ ‡ Źal,13Ē €  ž  – Ķį127 jbe I037A Ąį_156 € Ó_printk Š ‡ €  € Ó_printpath Š Š Æ x™ Źal,13Ē €  ž  – € Ąį_157 € Ó_printk Š Š ’ Äå_count ĄĘ,ģ § ‡ Œ €  ž  – ×į127  ž – § ŗ Ąć4 ¢ shr äcl Ąć1 sal äcl » Äå_ņec_imap ĄĘ,ģ ¢ Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ § ° ĢI037B I037A: ’ Äå_count ĄĘ,ģ § ‡ Œ €  ž  – Æ € ‡ Źal,13Ē €  ž  – ‰ ×åė ¦  ž  – § ŗ I037B: “ ˆ Ó_chkmode Š Š € I0371:  … „  É_descendtree _descendtree: Įbp ‚ ×ņ,#50 ’ « Ą-3Å,ė ¢ Ą-42(ń),ė Ąå_top Ą-40(ń),ģ Ūå-42(ń) Ą_top,ģ Ąä-3Å Öį15  ž Ąē#1 œ – Ąęė  sal äcl Ąć4 Ąå-3Å shr åcl Ąć1 sal åcl Äå_ņec_imap test Ē,ė je I0383 Į-3Å Ąį_158 € Ó_printk Š Š  € ‡ € Ó_printpath Š Š I0383: Ąä-3Å Öį15  ž Ąē#1 œ – Ąęė  sal äcl Ąć4 Ąå-3Å shr åcl Ąć1 sal åcl Äå_imap ÖäĒ  ž – Ą-3Ī,ė Ķ-3Īö je I0385 Ķ_listingö je I0386 I0385: Ąå_sb+4 Äā2 Äå_sb+6 ‡ Ąč#1024 Ėéš Ąć32 Įķ Ūę-32(ń) Įķ Ó.mli4 Ąå-3Å ×ā1 Ėęķ œ € Ąč#32 Ėéš Ąäķ Ó.mli4 ‰ Ćķ Äåė adc ęī Įķ ¦ Ó_devread Äņ,#8 Ķ_listingö je I038A Ūä-32(ń) € Į-3Å Ó_list Š Š I038A: Ķ-3Īö ŁI0386 Ūä-32(ń) € Į-3Å Ó_chkinode Š Š ™ ŁI0386 Ąć4 Ąä-3Å shr äcl Ąć1 sal äcl » Äå_ņec_imap Ą-50(ń),ģ Ąä-3Å Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl ‰ or äģ Ąå-50(ń) ° Ąį_159 € Ó_yes Š ™ je I0386 Ąå-3Å Äå_count Ą-50(ń),ģ Ąå-50(ń) Œ Ž ‹ € Źal,-19(ń) Ž ‹ óė ‰ Äåė Ąč-50(ń) Ź(ļ),bl Ąć4 Ąä-3Å shr äcl Ąć1 sal äcl » Äå_imap Ą-50(ń),ģ Ąä-3Å Öį15 ĮĒ  ž Ąē#1 œ – Ąęė  sal äcl not ė ‰ Öåė Ąč-50(ń) Ą(ļ),ģ Ąå_sb+4 Äā2 Äå_sb+6 ‡ Ąč#1024 Ėéš Ąć32 Įķ Ąć_nullbuf Įķ Ó.mli4 Ąå-3Å ×ā1 Ėęķ œ € Ąč#32 Ėéš Ąäķ Ó.mli4 ‰ Ćķ Äåė adc ęī Įķ ¦ Ó_devwrite Äņ,#8 Ą-4Å,#_nullšr ¢ Ą-4Ī,ė Ą-4Ō,Ń I03814: Į-4Ō ó-4Ō  ™ je I03813 Į-4Å Ä-4Å,#1 ‰ Ąč-4Ī Œ Ź(ļ),al Ä-4Ī,#1 ĢI03814 I03813: Ąå_top Ąå2Ē Ą_top,ģ ‡ € ĢI0381 I0386: Ąå_top Ąå2Ē Ą_top,ģ  € I0381:  … „  É_chktree _chktree: ƒ ‚ ×ņ,Ń Ķ_makefsö ŁI0393  ž Ąä_sb – Ą_nfreeinode,ė I0393: Ąå_sb+2 ×å_sb+8 Äā1 ¦  ž  – Ą_nfreezone,ė Ą-1Ī,#1 Ź-1Åö Ūä-1Ī € Ó_descendtree Š ™ ŁI0396 Ąį_160 € Ó_fatal Š I0396: Ąį_161 € Ó_printk Š … „  É_printtotal _printtotal: ƒ ‚ 024 € Ąį_162 € Ó_printk Š Š  ž Ąä_sb+10 Ąē#1024 œ –  ž – Ąęė  sal äcl  ž – € Ąį_163 € Ó_printk Š Š Ąį_164 € Ó_printk Š Ąį_167 € Ąį_166 € Į_nregular Ąį_165 € Ó_pr Äņ,#8 Ąį_170 € Ąį_169 € Į_nšrectory Ąį_168 € Ó_pr Äņ,#8 Ąį_173 € Ąį_172 € Į_nblkņec Ąį_171 € Ó_pr Äņ,#8 Ąį_176 € Ąį_175 € Į_ncharņec Ąį_174 € Ó_pr Äņ,#8 Ķ_nbašnodeö je I03A3 Ąį_179 € Ąį_178 € Į_nbašnode Ąį_177 € Ó_pr Äņ,#8 I03A3: Ąį_182 € Ąį_181 € Į_nfreeinode Ąį_180 € Ó_pr Äņ,#8 Ąį_185 € Ąį_184 € Į_nfreezone Ąį_183 € Ó_pr Äņ,#8 … „  É_chkdev _chkdev: ƒ ‚ Ķ_automaticö ŁI03B2 Ķ_makefsö je I03B3 I03B2: Ą_repair,#1 I03B3: ’ Ą_device,ģ Ó_initvars Ó_getsuper Ó_chksuper Ó_getbitmaps Ąå_sb Äā1 Į_sb+4 ¦ Į_imap Ó_initbitmap ¤ Ąå_sb+2 ×å_sb+8 Äā1 Į_sb+6 ¦ Į_zmap Ó_initbitmap ¤ Ó_getcount Ó_chktree Ąå_sb+4 Äā2 Ąę_sb+8 ×ć1 Ąį_186 € Į_sb+2 Į_sb+6 ¦ Įķ Į_ņec_zmap Į_zmap Ó_chkmap Äņ,#14 Ó_chkcount Ąå_sb Äā1 Ąį_187 € ¦ Į_sb+4 “ € ‡ € Į_ņec_imap Į_imap Ó_chkmap Äņ,#14 Ó_chkilist Ó_printtotal Ķ_changedö je I03B7 Ąį_188 € Ó_printk Š I03B7: … „  É_main _main: ƒ ‚ ×ņ,#10 ® _205: ĀI03C1D Ā5 Ā61 ĀI03C1C Ā102 ĀI03C16 Ā104 ĀI03CF Ā108 ĀI03C17 Ā109 ĀI03C18 † ¼ ĄĻö ĄŠö Ķ_virginö je I03C3 Ąå_trackļz Ą_floptrk,ģ I03C3: Ą_virginö Ķ_trackļz,#9 jl I03C5 Ķ_cylļz,#18 jge I03C6 I03C5: Ąį_189 € Ó_printk Š I03C6: Ą_rwbuf,#_rwbuf1 Ą_prog,#_190 Ąį_191 € Ó_printk Š I03CC: Ąį_192 € Ó_printk Š Ąį_193 € Ó_printk Š Ąį_194 € Ó_printk Š Ąį_195 € Ó_printk Š Ąį_196 € Ó_printk Š Ąį_197 € Ó_printk Š Ąį_198 € Ó_printk Š Ó_getc ĄŲ,ė  ž ĄäŲ – „  ž – Ą-10(ń),ė Į-10(ń) Ąį_199 € Ó_printk Š Š Ą_part_offsetö Ą_partitionö Ą_driveö Į-10(ń) ĢI03CD I03CF: Ó_get_partition Ķ_partition,#6 jge I03C11 28 € ĢI03C12 I03C11: 29 € I03C12:  ž  – Ą_drive,ė Ą_cylļz,#100 Ą_trackļz,#25 Ąį_answer € Ąį_200 € Ó_printk Š Š Ó_read_partition ™ jge I03C14 ĢI03CC I03C14: Ą_repair,#1 ĢI03CE I03C16: Ąį_answer € Ąį_201 € Ó_printk Š Š Ó_šsktype Ą_repair,#1 ĢI03CE I03C17: Ąį_answer € Ąį_202 € Ó_printk Š Š Ą_listsuper,#1 Ąå_listsuper Ą_listing,ģ Ó_šsktype ĢI03CE I03C18: Ąį_203 € Ó_printk Š Ó_šsktype Ą_makefs,#1 Ķ_trackļz,#15 ŁI03CE Ą_zone_ct,#1200 Ą_inode_ct,Ž ĢI03CE I03C1C: Ąć8 ĄäŲ sar äcl  ž – „  ž – € ĢI03C1 I03C1D: Ąį_204 € Ó_printk Š ĢI03CC I03CD: mov č#_205 Ćī Ģ.csb2 I03CE: ĮŠ ¹ ” Ąį_206 € Ó_chkdev Äņ,#8 Ą_makefsö Ąå_makefs Į_makefs Ą_listsuper,ģ Ć_listing Ąå_listing Ą_repair,ģ ĢI03CC I03C1:  … „  É_get_partition _get_partition: ƒ ‚ € I03D3: Ąį_207 € Ó_printk Š I03D6: Ó_getc Ź-1(ń),al Źal,-1(ń) Ž ‹ € Ąį_208 € Ó_printk Š Š cmpb -1(ń),#13 ŁI03D9 Ąį_209 € Ó_printk Š Ķ_partitionö jle I03D5 … „  I03D9: Ķ_partitionö jle I03DA ĢI03D5 I03DA: Źal,-1(ń) Ž ‹ Ķį49 jl I03D5 Źal,-1(ń) Ž ‹ Ķį57 jg I03D5 cmpb -1(ń),#53 ŁI03D12 ĢI03D5 I03D12: Źal,-1(ń) Ž ‹ ×į48 Ą_partition,ė ĢI03D6 I03D5: Ą_partitionö ĢI03D3 É_read_partition _read_partition: ƒ ‚ ×ņ,#38 ĄŠö I03E3: ÜŠ cmp Š,#5 jle I03E6 Ąį_210 € Ó_printk Š Ąį-1 € ĢI03E1 I03E6:  € Į_rwbuf ‡ € € Ó_šskio Äņ,#8 ”  ž — – test į65280 ŁI03E3 ĄĻö I03EE: ĶĻ,#4 jge I03EB Ąć4 £ sal äcl  ž Į_rwbuf – Äį454 Äį0 ‰ Äåė ‡ Źbl,Ē Õbh,bh Ą-2Ī,ģ Ą-2Å,ė Ąć4 £ sal äcl  ž Į_rwbuf – Äį454 Äį1 ‰ Äåė ‡ Źbl,Ē Õbh,bh Ą-30(ń),ģ Ą-2Ō,ė Ąć4 £ sal äcl  ž Į_rwbuf – Äį454 Äį2 ‰ Äåė ‡ Źbl,Ē Õbh,bh Ą-3Å,ģ Ą-32(ń),ė Ąć4 £ sal äcl  ž Į_rwbuf – Äį454 Äį3 ‰ Äåė ‡ Źbl,Ē Õbh,bh Ą-3Ō,ģ Ą-3Ī,ė mov ć16 Ąä-3Å Ąå-32(ń) © 2: sal į1 rcl ā1 Ø 1: 4 Ąē-3Ō Ąč-3Ī © 2: sal ē#1 rcl č#1 Ø 1: or ēė or čģ Ąć8 Ąä-30(ń) Ąå-2Ō © 2: sal į1 rcl ā1 Ø 1: or äī or åļ or ä-2Ī or å-2Å  ĄēĻ sal ēcl Ąčī Ą-22(ń_ļ),ė Ą-20(ń_ļ),ģ £ sal äcl Ąčė Ąä-22(ń_ļ) Ąå-20(ń_ļ) ×į65535 sbb ā0 Ł1f Öäė je 1f Üģ 1: or åģ jle I03EC Ąį_211 € Ó_printk Š  € Ó_exit Š I03EC: ÜĻ ĢI03EE I03EB: Ķ_partition,#6 jl I03E13 Ąå_partition ×ā5 ¦ ĢI03E14 I03E13: Į_partition I03E14: ĆĻ Ūä-22(ń) € Ó_sort Š  £ sal äcl ×į4 Ąčė Ąå-22(ń_ļ) Ą_part_offset,ģ Ąä_part_offset Ėēī šv ķ or ēī je I03E16 ž Ąä_part_offset Ėēī šv ģ Äį1 Ąć1 sal äcl Ą_part_offset,ė I03E16: ‡ € I03E1:  … „  É_sort _sort: ƒ ‚ € € ¼ I03F5: ĶĘ,#4 jge I03F2 ĄĻö I03F9: ĶĻ,#3 jge I03F3  £ sal äcl » ÄåÅ « Ąę2Ē ×į0 sbb ć0 Ł1f or ęė 1: or ęķ ŁI03FB £ Üė  sal äcl » ÄåÅ « Ąę2Ē ×į0 sbb ć0 Ł1f or ęė 1: or ęķ je I03FB £ Üė  sal äcl » ÄåÅ £ sal äcl Ąčė ÄčÅ ¦ Įļ Ó_swap Š Š ĢI03F7 I03FB:  £ sal äcl » ÄåÅ £ Üė sal äcl Ąčė ÄčÅ « Ąę2Ē ×ä(ļ) sbb ę2(ļ) Ł1f Öäė je 1f Üķ 1: or ęķ jle I03F7 £ Üė  sal äcl » ÄåÅ « Ąę2Ē ×į0 sbb ć0 Ł1f or ęė 1: or ęķ je I03F7 £ Üė  sal äcl » ÄåÅ £ sal äcl Ąčė ÄčÅ ¦ Įļ Ó_swap Š Š I03F7: ÜĻ ĢI03F9 I03F3: ÜĘ ĢI03F5 I03F2: … „  É_swap _swap: ƒ ‚ € € ’ « Į2Ē ¬ ĆĘ Æ ĄčÅ « Ąå2Ē Ą(ļ),ė Ą2(ļ),ģ Æ £ ĄęĘ ° Ą2Ē,ķ … „  É_part_offset ³ _part_offset: .zerow 2/2 É_firstlist _firstlist: .zerow 2/2 É_makefs _makefs: .zerow 2/2 É_listsuper _listsuper: .zerow 2/2 É_listing _listing: .zerow 2/2 É_automatic _automatic: .zerow 2/2 É_repair _repair: .zerow 2/2 É_ztype _ztype: .zerow 6/2 É_nfreezone _nfreezone: .zerow 2/2 É_nbašnode _nbašnode: .zerow 2/2 É_ncharņec _ncharņec: .zerow 2/2 É_nblkņec _nblkņec: .zerow 2/2 É_nšrectory _nšrectory: .zerow 2/2 É_nregular _nregular: .zerow 2/2 É_nfreeinode _nfreeinode: .zerow 2/2 É_brk _brk: .zerow 2/2 É_top _top: .zerow 2/2 É_changed _changed: .zerow 2/2 É_thisblk _thisblk: .zerow 2/2 É_nullšr _nullšr: .zerow 16/2 É_count _count: .zerow 2/2 É_nullbuf _nullbuf: .zerow 1024/2 É_rwbuf2 _rwbuf2: .zerow 1024/2 É_rwbuf1 _rwbuf1: .zerow 1024/2 É_rwbuf _rwbuf: .zerow 2/2 É_šrmap _šrmap: .zerow 2/2 É_ņec_zmap _ņec_zmap: .zerow 2/2 É_zmap _zmap: .zerow 2/2 É_ņec_imap _ņec_imap: .zerow 2/2 É_imap _imap: .zerow 2/2 É_firstcnterr _firstcnterr: .zerow 2/2 É_device _device: .zerow 2/2 É_prog _prog: .zerow 2/2 É_sb _sb: .zerow 18/2 É_trackļz _trackļz: .zerow 2/2 É_cylļz _cylļz: .zerow 2/2 É_partition _partition: .zerow 2/2 É_drive _drive: .zerow 2/2 ® _1: Ā12592 Ā13106 Ā13620 Ā14134 Ā14648 Ā16961 Ā17475 Ā17989 ø _5: Ā29477 Ā10 _6: Ā24934 Ā24948 Ā2668 ø _7: Ā10 _8: Ā29477 Ā8255 ø _9: Ā25977 Ā2675 ø _10: Ā10 _11: Ā11565 Ā8254 ø _12: Ā25381 ø _13: Ā47 _14: Ā47 _15: Ā10272 Ā28265 Ā8303 Ā8253 Ā29989 Ā8236 ø _16: Ā10272 Ā28265 Ā8303 Ā8253 Ā29989 Ā41 _18: Ā10 _19: Ā24931 Ā10094 Ā8308 Ā25956 Ā25972 Ā28018 Ā28265 Ā8293 Ā26980 Ā27507 Ā29797 Ā25972 Ā29741 Ā28793 Ā101 _20: Ā29510 Ā27491 Ā25376 Ā28257 Ā28526 Ā8308 Ā25970 Ā25697 Ā25120 Ā31077 Ā28271 Ā8292 Ā25971 Ā29795 Ā29295 Ā13856 Ā13621 Ā13619 Ā10 _21: Ā29285 Ā28530 Ā8306 Ā30768 Ā30757 Ā9504 Ā8307 Ā27746 Ā25455 Ā8299 Ā17445 Ā8236 Ā25970 Ā29300 Ā2681 ø _22: Ā25970 Ā25697 Ā28265 Ā103 _23: Ā29303 Ā29801 Ā28265 Ā103 _24: Ā29477 Ā8250 Ā24931 Ā10094 Ā8308 Ā29477 Ā25120 Ā28524 Ā27491 Ā9504 Ā8260 Ā25896 Ā29298 Ā29295 Ā15648 Ā12320 Ā9592 Ā10616 Ā10 _25: Ā25970 Ā25697 ø _26: Ā29303 Ā29801 Ā101 _27: ø _28: Ā28265 Ā25972 Ā28274 Ā27745 Ā25888 Ā29298 Ā29295 Ā10272 Ā25956 Ā30582 Ā26994 Ā25972 Ā41 _29: Ā26990 Ā28526 Ā25956 Ā8307 ² ² ² Ā8253 Ā29989 ø _30: Ā31342 Ā28271 Ā29541 ² ² ² ² Ā8253 Ā29989 ø _31: Ā28009 Ā28769 Ā25183 Ā28524 Ā27491 Ā8307 ² Ā8253 Ā29989 ø _32: Ā28026 Ā28769 Ā25183 Ā28524 Ā27491 .word 8307 ² Ā8253 Ā29989 ø _33: Ā26982 Ā29554 æ16 Ā29793 Ā31329 Ā28271 Ā8293 Ā8253 Ā29989 ø _34: Ā28524 Ā24423 Ā28538 Ā25966 Ā29535 Ā31337 Ā8293 Ā8253 Ā29989 ø _35: Ā24941 Ā29560 Ā31337 Ā8293 ² ² ² Ā8253 Ā21797 ø _36: Ā27503 Ā28192 Ā30575 ø _37: Ā28484 Ā31008 Ā30063 Ā30496 Ā28257 Ā8308 Ā28532 Ā29728 Ā31090 Ā24864 Ā24935 Ā28265 ø _40: Ā26952 Ā8308 Ā17746 Ā21844 Ā20050 Ā27424 Ā31077 Ā29728 Ā8303 Ā25971 Ā25964 Ā29795 Ā25632 Ā26213 Ā30049 Ā29804 Ā30240 Ā27745 Ā25973 Ā2675 Ā10 _41: Ā8227 Ā28538 Ā25966 Ā8307 Ā25640 Ā26213 Ā30049 Ā29804 Ā8250 Ā25637 Ā8233 ø _42: Ā28524 Ā8295 Ā28538 Ā25966 Ā26995 Ā25978 Ā10272 Ā25956 Ā24934 Ā27765 Ā14964 Ā9504 Ā10596 Ā32 _43: Ā26915 Ā28526 Ā25956 Ā8307 Ā25640 Ā26213 Ā30049 Ā29804 Ā8250 Ā29989 Ā8233 ø _44: Ā10 _45: Ā29545 Ā29728 Ā26984 Ā8307 Ā27503 ø _46: Ā24930 Ā8292 Ā24941 Ā26983 Ā8291 Ā30062 Ā25197 Ā29285 Ā26912 Ā8302 Ā30067 Ā25968 Ā8306 Ā27746 Ā25455 Ā107 _47: Ā28526 Ā26912 Ā28526 Ā25956 Ā115 _48: Ā28526 Ā31264 Ā28271 Ā29541 ø _49: Ā28526 Ā26912 Ā24941 Ā112 _50: Ā28526 Ā31264 Ā24941 Ā112 _51: Ā26982 Ā29554 Ā8308 Ā24932 Ā24948 Ā31264 Ā28271 Ā8293 Ā28532 Ā8303 Ā28019 Ā27745 Ā108 _52: Ā28538 Ā25966 Ā29472 Ā31337 Ā8293 Ā8252 .word 27746 Ā25455 Ā8299 Ā26995 Ā25978 ø _53: Ā24941 Ā11896 Ā26144 Ā27753 Ā8293 Ā26995 Ā25978 Ā15392 Ā8253 Ā48 _54: Ā24930 Ā8292 Ā24941 Ā26983 Ā8291 Ā30062 Ā25197 Ā29285 Ā26912 Ā8302 Ā30067 Ā25968 Ā8306 Ā27746 Ā25455 Ā107 _55: Ā28532 Ā8303 Ā25958 Ā8311 Ā28009 Ā28769 Ā25120 Ā28524 Ā27491 Ā115 _56: Ā24951 Ā28274 Ā28265 Ā14951 Ā25888 Ā28792 Ā25445 Ā25972 Ā8292 Ā25637 Ā26912 Ā24941 Ā24432 Ā27746 Ā25455 Ā9579 Ā115 _57: ø _58: Ā115 _59: Ā26912 Ā29550 Ā25972 Ā25697 Ā28448 Ā8294 Ā25637 Ā10 _60: Ā28532 Ā8303 Ā25958 Ā8311 Ā28026 Ā28769 Ā25120 Ā28524 Ā27491 Ā115 _61: Ā24951 Ā28274 Ā28265 Ā14951 Ā25888 Ā28792 .word 25445 Ā25972 Ā8292 Ā25637 Ā31264 Ā24941 Ā24432 Ā27746 Ā25455 Ā9579 Ā115 _62: ø _63: Ā115 _64: Ā26912 Ā29550 Ā25972 Ā25697 Ā28448 Ā8294 Ā25637 Ā10 _65: Ā26982 Ā29554 Ā8308 Ā24932 Ā24948 Ā31264 Ā28271 Ā8293 Ā28532 Ā8303 Ā24940 Ā26482 Ā101 _66: Ā28524 Ā24423 Ā28538 Ā25966 Ā29535 Ā31337 Ā8293 Ā28532 Ā8303 Ā24940 Ā26482 Ā101 _67: Ā24951 Ā28274 Ā28265 Ā14951 Ā27680 Ā29281 Ā25959 Ā27680 Ā26479 Ā31327 Ā28271 Ā24421 Ā26995 Ā25978 Ā10272 Ā25637 Ā2601 ø _68: Ā26982 Ā29554 Ā8308 Ā24932 Ā24948 Ā31264 Ā28271 Ā8293 Ā28532 Ā8303 Ā28019 Ā27745 Ā108 _69: Ā24951 Ā28274 Ā28265 Ā14951 Ā25888 Ā28792 Ā25445 Ā25972 Ā8292 Ā26982 Ā29554 Ā8308 Ā24932 Ā24948 Ā31264 Ā28271 Ā8293 Ā28532 Ā25120 Ā8293 Ā25637 Ā32 _70: Ā28265 Ā29811 Ā24933 Ā8292 Ā26223 Ā9504 Ā2677 ø _71: Ā24951 Ā28274 Ā28265 Ā14951 Ā25888 Ā28792 Ā25445 Ā25972 Ā8292 Ā24941 Ā8312 Ā26995 Ā25978 Ā29728 Ā8303 Ā25954 Ā9504 Ā8260 ø _72: Ā28265 Ā29811 Ā24933 Ā8292 Ā26223 Ā9504 Ā2628 ø _73: Ā29811 Ā28783 Ā29728 Ā26984 Ā8307 Ā26988 Ā29811 Ā28265 Ā103 _74: Ā29477 Ā9504 Ā8309 Ā29545 Ā27936 Ā29545 Ā26995 Ā26478 Ā10 _75: Ā29477 Ā9504 Ā8309 Ā29545 Ā28192 Ā29807 Ā26144 Ā25970 Ā2661 ø _76: Ā26691 Ā25445 Ā26987 Ā26478 Ā9504 Ā8307 Ā24941 Ā2672 ø _77: .word 29797 Ā11875 Ā32 _78: Ā25637 Ā25888 Ā29298 Ā29295 Ā8307 Ā28518 Ā28277 Ā11876 Ā32 _79: Ā28265 Ā29811 Ā27745 Ā8300 Ā8289 Ā25966 Ā8311 Ā24941 Ā112 _80: Ā10 _81: Ā26691 Ā25445 Ā26987 Ā26478 Ā26912 Ā28526 Ā25956 Ā27680 Ā29545 Ā2676 ø _82: Ā28525 Ā25956 Ā26912 Ā28526 Ā25956 Ā9504 Ā8309 Ā28526 Ā8308 Ā27747 Ā24933 Ā25970 Ā100 _83: Ā8238 Ā27747 Ā24933 Ā114 _84: Ā10 _85: Ā20041 Ā17487 Ā8261 Ā19534 Ā20041 Ā8267 Ā20291 Ā20053 Ā2644 ø _86: Ā13605 Ā8309 Ā13605 Ā8309 Ā13605 Ā117 _87: Ā24864 Ā27236 Ā29557 Ā116 _88: Ā28265 Ā25972 Ā28274 Ā27745 Ā25888 Ā29298 Ā29295 Ā10272 Ā28515 Ā28277 Ā25972 Ā29298 Ā29295 Ā41 _89: Ā10 _90: Ā114 _91: Ā45 _92: Ā119 _93: Ā45 _94: Ā25381 ø _95: Ā120 _96: Ā45 _97: Ā26912 Ā28526 Ā25956 Ā28704 Ā29285 Ā26989 Ā29555 Ā28521 Ā8302 Ā26988 Ā27502 ² Ā29472 Ā31337 Ā8293 Ā24942 Ā25965 Ā10 _98: Ā13861 Ā8309 ø _99: Ā45 _100: Ā100 _101: Ā99 _102: Ā98 _103: Ā63 _105: Ā9504 Ā30003 Ā32 _106: ² Ā12837 Ā11384 Ā12837 Ā8312 ø _107: Ā14117 Ā8260 ø _109: Ā8238 Ā25970 Ā28525 Ā25974 Ā25888 Ā29806 Ā31090 ø _110: Ā24930 Ā8292 Ā29477 Ā26912 Ā8302 ø _111: Ā29477 Ā26912 Ā8307 Ā26988 Ā27502 æ01 Ā29728 Ā8303 Ā29989 Ā32 _112: Ā28265 Ā29811 Ā24933 Ā8292 Ā26223 Ā9504 Ā10613 ø _113: Ā8238 Ā25970 Ā24944 Ā29289 ø _114: Ā24951 Ā28274 Ā28265 Ā14951 Ā9504 Ā8307 Ā24936 Ā8307 Ā26223 Ā29542 Ā29797 Ā9504 Ā8260 Ā28265 Ā32 _115: Ā29477 Ā26912 Ā8307 Ā26988 Ā27502 æ01 Ā29728 Ā8303 Ā29989 Ā2601 ø _116: Ā30062 Ā27756 Ā28192 Ā28001 Ā8293 Ā28518 Ā28277 Ā8292 Ā28265 Ā32 _117: Ā28518 Ā28277 Ā8292 Ā8289 Ā12071 Ā8231 Ā28265 Ā25888 Ā29806 Ā31090 Ā28448 Ā8294 Ā26980 Ā25970 Ā29795 Ā29295 Ā8313 ø _118: Ā28261 Ā29300 Ā8313 Ā8253 Ā39 _119: Ā10535 ø _120: Ā24930 Ā8292 Ā28265 æ11 Ā8293 Ā28518 Ā28277 Ā8292 Ā28265 Ā25632 Ā29289 Ā25445 Ā28532 Ā31090 Ā32 _121: Ā28265 Ā8303 Ā28518 Ā28277 Ā8292 Ā8253 Ā29989 .word 8236 ø _122: Ā24942 Ā25965 Ā15648 Ā10016 ø _123: Ā10535 ø _124: Ā8238 Ā25970 Ā28525 Ā25974 Ā25888 Ā29806 Ā31090 ø _125: Ā28532 Ā8303 Ā24941 Ā31086 Ā27680 Ā28265 Ā29547 Ā29728 Ā8303 Ā28265 Ā8303 Ā29989 Ā10 _126: Ā26980 Ā25459 Ā30319 Ā29285 æ01 Ā24864 Ā8308 Ā28261 Ā29300 Ā8313 Ā39 _127: Ā8231 Ā28265 Ā25632 Ā29289 Ā25445 Ā28532 Ā31090 Ā32 _128: Ā46 _129: Ā11822 ø _130: Ā26988 Ā27502 Ā29728 Ā8303 Ā26980 Ā25970 Ā29795 Ā29295 Ā8313 Ā26980 Ā25459 Ā30319 Ā29285 æ01 Ā26912 Ā8302 ø _131: Ā24942 Ā25965 Ā15648 Ā10016 ø _132: Ā11303 Ā25632 Ā29289 Ā26912 Ā28526 Ā15648 Ā9504 Ā10613 ø _133: Ā24930 .word 8292 Ā28518 Ā28018 Ā29793 Ā26912 Ā8302 Ā26980 Ā25970 Ā29795 Ā29295 Ā8313 ø _134: Ā8238 Ā29300 Ā28277 Ā24931 Ā25972 ø _135: Ā29477 Ā31264 Ā28271 Ā8293 Ā28265 Ā32 _136: Ā28282 Ā8303 Ā8253 Ā29989 Ā8236 Ā31092 Ā25968 Ā15648 Ā32 _137: Ā16708 Ā16724 ø _138: Ā18771 Ā18254 Ā17740 Ā18720 Ā17486 Ā21065 Ā17221 Ā84 _139: Ā20292 Ā16981 Ā17740 Ā18720 Ā17486 Ā21065 Ā17221 Ā84 _140: Ā17750 Ā22866 Ā18720 Ā17486 Ā21065 Ā17221 Ā84 _142: Ā8236 Ā28528 Ā8307 Ā8253 Ā17445 Ā2601 ø _143: Ā30063 Ā11636 Ā26223 Ā29229 Ā28257 Ā25959 ø _144: Ā30052 Ā27760 Ā25449 Ā29793 Ā101 _145: Ā28518 Ā28277 Ā100 _146: Ā24951 Ā28274 Ā28265 Ā14951 Ā26656 Ā26485 Ā8293 Ā26980 Ā25970 Ā29795 Ā29295 Ā14969 Ā32 _147: Ā8238 Ā26989 Ā29555 Ā28265 Ā8295 Ā28265 Ā32 _148: Ā11822 Ā27936 Ā29545 Ā26995 Ā26478 Ā26912 Ā8302 ø _149: Ā24930 Ā8292 Ā28525 Ā25956 Ā28448 Ā8294 ø _150: Ā28525 Ā25956 Ā15648 Ā9504 Ā10607 ø _152: Ā28530 Ā29807 Ā26912 Ā28526 Ā25956 Ā26912 Ā8307 Ā28526 Ā8308 Ā8289 Ā26980 Ā25970 Ā29795 Ā29295 Ā8313 ø _153: Ā26920 Ā28526 Ā15648 Ā9504 Ā11381 Ā27936 æ11 Ā8293 Ā8253 Ā28453 Ā2601 ø _154: ø _155: Ā26988 Ā27502 Ā25376 Ā30063 Ā29806 Ā31264 Ā29285 Ā8303 Ā26223 Ā32 _156: Ā26988 Ā27502 Ā25376 Ā30063 Ā29806 Ā29728 Ā28527 Ā25120 Ā26473 Ā26912 Ā8302 ø _157: Ā28259 Ā8308 Ā8253 Ā29989 Ā2601 ø _158: Ā28518 Ā28277 Ā8292 Ā28265 æ11 Ā8293 Ā29989 Ā8250 ø _159: Ā25970 Ā28525 Ā25974 ø _160: Ā24930 Ā8292 Ā28530 Ā29807 Ā26912 Ā28526 Ā25956 ø _161: Ā10 _162: Ā27746 Ā25455 Ā29547 Ā31337 Ā8293 Ā8253 Ā13605 Ā8292 ² ² ² Ā32 _163: Ā28538 Ā25966 Ā26995 Ā25978 ² Ā8253 Ā13605 Ā2660 ø _164: Ā10 _165: Ā13861 Ā8309 ² Ā21024 Ā26469 Ā27765 Ā29281 Ā26144 Ā27753 Ā9573 Ā2675 ø _166: ø _167: Ā115 _168: Ā13861 Ā8309 ² Ā17440 Ā29289 Ā25445 Ā28532 Ā9586 Ā2675 ø _169: Ā121 _170: Ā25961 Ā115 _171: Ā13861 Ā8309 ² .word 16928 Ā28524 Ā27491 Ā29472 Ā25968 Ā26979 Ā27745 Ā26144 Ā27753 Ā9573 Ā2675 ø _172: ø _173: Ā115 _174: Ā13861 Ā8309 ² Ā17184 Ā24936 Ā24946 Ā29795 Ā29285 Ā29472 Ā25968 Ā26979 Ā27745 Ā26144 Ā27753 Ā9573 Ā2675 ø _175: ø _176: Ā115 _177: Ā13861 Ā8309 ² Ā16928 Ā25697 Ā26912 Ā28526 Ā25956 Ā29477 Ā10 _178: ø _179: Ā115 _180: Ā13861 Ā8309 ² Ā17952 Ā25970 Ā8293 Ā28265 æ11 Ā9573 Ā2675 ø _181: ø _182: Ā115 _183: Ā13861 Ā8309 ² Ā17952 Ā25970 Ā8293 Ā28538 Ā25966 Ā29477 Ā10 _184: ø _185: Ā115 _186: Ā28538 Ā25966 ø _187: Ā28265 æ11 Ā101 _188: Ā11565 Ā11565 Ā8237 Ā18758 Ā17740 Ā21280 Ā21337 Ā17748 Ā8269 Ā16712 Ā8275 Ā17730 Ā20037 Ā19744 Ā17487 Ā17993 Ā17737 Ā8260 Ā11565 Ā11565 Ā2605 Ā10 _189: Ā28482 Ā29807 Ā27746 Ā27503 Ā26400 Ā30305 Ā8293 Ā24930 Ā8292 Ā29300 Ā25441 Ā29547 Ā31337 Ā10 _190: Ā29542 Ā27491 ø _191: æ0 æ0 ø _192: Ā18442 Ā29801 Ā27424 Ā31077 Ā24864 Ā8307 Ā28518 Ā27756 Ā30575 Ā14963 æ0 ø _193: ² ² Ā8253 Ā29472 Ā24948 Ā29810 Ā19744 Ā20041 Ā22601 Ā10272 Ā28530 Ā29807 Ā26144 Ā27753 Ā8293 Ā31091 Ā29811 Ā28005 Ā26912 Ā8302 Ā29284 Ā30313 Ā8293 Ā10544 Ā10 _194: ² ² Ā8294 Ā25376 Ā25960 Ā27491 Ā29728 Ā25960 Ā26144 Ā27753 Ā8293 Ā31091 Ā29811 Ā28005 Ā10272 Ā26982 Ā29554 Ā8308 Ā28265 Ā25971 Ā29810 Ā24864 Ā31086 Ā26144 Ā27753 Ā8293 Ā31091 Ā29811 Ā28005 Ā25632 Ā29545 Ā25963 Ā29812 Ā10597 Ā10 _195: ² ² Ā8300 Ā25376 Ā25960 Ā27491 Ā24864 æ10 Ā27680 Ā29545 Ā8308 Ā26982 Ā25964 Ā29472 Ā29561 Ā25972 Ā8301 Ā26152 Ā29289 Ā29811 Ā26912 Ā29550 Ā29285 Ā8308 Ā28257 Ā8313 Ā26982 Ā25964 Ā29472 Ā29561 Ā25972 Ā8301 Ā26980 Ā27507 Ā29797 Ā25972 Ā2601 ø _196: ² ² Ā8301 Ā27936 Ā27489 Ā8293 Ā28257 Ā10272 Ā28005 Ā29808 Ā10617 Ā26144 Ā27753 Ā8293 Ā31091 Ā29811 Ā28005 Ā10272 Ā26982 Ā29554 Ā8308 Ā28265 Ā25971 Ā29810 Ā25120 Ā24940 Ā27502 Ā8236 Ā28518 Ā28018 Ā29793 Ā25972 Ā8292 Ā26980 Ā27507 Ā29797 Ā25972 Ā2601 ø _197: ² ² Ā8296 Ā25376 Ā25960 Ā27491 Ā26656 Ā29281 Ā8292 Ā26980 Ā27507 Ā26144 Ā27753 Ā8293 Ā31091 Ā29811 Ā28005 Ā10 _198: Ā8970 Ā32 _199: Ā25381 Ā10 _200: Ā26691 Ā25445 Ā26987 Ā26478 Ā26656 Ā29281 Ā8292 Ā26980 Ā27507 Ā8238 Ā9504 Ā2675 ø _201: Ā26691 Ā25445 Ā26987 Ā26478 Ā25632 Ā29545 Ā25963 Ā29812 Ā11877 ² Ā29477 Ā10 _202: Ā26691 Ā25445 Ā26987 Ā26478 Ā25632 Ā29545 Ā25963 Ā29812 Ā11877 ² Ā29477 Ā10 _203: Ā24909 Ā26987 Ā26478 Ā25888 Ā28781 Ā31092 Ā26144 Ā27753 Ā8293 Ā31091 Ā29811 Ā28005 Ā10 _204: Ā27721 Ā25964 Ā24935 Ā8300 Ā28515 Ā28013 Ā28257 Ā2660 ø _206: Ā26980 Ā27507 Ā25896 Ā29812 Ā10597 ø _207: æ0 Ā27728 Ā24933 Ā25971 Ā25888 Ā29806 Ā29285 Ā28704 Ā29281 Ā26996 Ā26996 Ā28271 Ā28192 Ā28021 Ā25954 Ā11890 Ā17440 Ā26994 Ā25974 Ā12320 Ā8250 Ā11569 Ā11316 Ā25632 Ā26994 Ā25974 Ā12576 Ā8250 Ā11574 Ā11321 Ā29728 Ā25960 Ā8302 Ā26984 Ā8308 Ā17746 Ā21844 Ā20050 Ā8250 ø _208: Ā25381 ø _209: Ā10 _210: Ā26948 Ā27507 Ā25888 Ā29298 Ā29295 Ā11891 ² Ā24899 Ā10094 Ā8308 Ā25970 Ā25697 Ā28704 Ā29281 Ā26996 Ā26996 Ā28271 Ā29728 Ā25185 Ā25964 Ā10 _211: Ā29510 Ā27491 Ā25376 Ā28257 Ā29735 Ā26656 Ā28257 Ā27748 Ā8293 Ā24944 Ā29810 Ā29801 Ā28521 Ā29550 Ā24864 Ā28514 Ā25974 Ā29472 Ā25445 Ā28532 Ā8306 Ā13622 Ā13109 Ā2613 ø † STACKSIZE = 8192 .globl _main, _exit, _edata, _end, _putc, _getc, _reset_diskette, _diskio .globl csv, cret, begtext, begdata, begbss .globl _cylsiz, _tracksiz, _drive .text begtext: start: mov dx,bx | bootblok puts # sectors/track in bx xor ax,ax mov bx,#_edata | prepare to clear bss mov cx,#_end sub cx,bx sar cx,*1 st.1: mov (bx),ax | clear bss add bx,#2 loop st.1 mov _tracksiz,dx | dx (was bx) is # sectors/track add dx,dx mov _cylsiz,dx | # sectors/cylinder mov sp,#kerstack+STACKSIZE call _main mov bx,ax | put scan code for '=' in bx cli mov dx,#0x60 mov ds,dx mov es,dx mov ss,dx jmpi 0,0x60 | jmp to kernel _exit: mov bx,_tracksiz jmp start _putc: xor ax,ax call csv movb al,4(bp) | al contains char to be printed movb ah,#14 | 14 = print char movb bl,*1 | foreground color push bp | not preserved int 0x10 | call BIOS VIDEO_IO pop bp jmp cret _getc: xorb ah,ah int 0x16 ret _reset_diskette: xor ax,ax call csv push es | not preserved int 0x13 | call BIOS DISKETTE_IO pop es jmp cret | handle diskio(RW, sector_number, buffer, sector_count) call | Do not issue a BIOS call that crosses a track boundary _diskio: xor ax,ax call csv mov tmp1,#0 | tmp1 = # sectors actually transferred mov di,10(bp) | di = # sectors to transfer mov tmp2,di | di = # sectors to transfer d0: mov ax,6(bp) | ax = sector number to start at xor dx,dx | dx:ax is dividend div _cylsiz | ax = cylinder, dx = sector within cylinder movb cl,ah | cl = hi-order bits of cylinder rorb cl,#1 | BIOS expects hi bits in a funny place rorb cl,#1 | ditto movb ch,al | cx = sector # in BIOS format mov ax,dx | ax = sector offset within cylinder xor dx,dx | dx:ax is dividend div _tracksiz | ax = head, dx = sector movb dh,al | dh = head orb cl,dl | cl = 2 high-order cyl bits || sector incb cl | BIOS counts sectors starting at 1 movb dl,_drive | dl = drive code (0-3 or 0x80 - 0x81) mov bx,8(bp) | bx = address of buffer movb al,cl | al = sector # addb al,10(bp) | compute last sector decb al | al = last sector to transfer cmpb al,_tracksiz | see if last sector is on next track jle d1 | jump if last sector is on this track mov 10(bp),#1 | transfer 1 sector at a time d1: movb ah,4(bp) | ah = READING or WRITING addb ah,*2 | BIOS codes are 2 and 3, not 0 and 1 movb al,10(bp) | al = # sectors to transfer mov tmp,ax | al is # sectors to read/write push es | BIOS ruins es int 0x13 | issue BIOS call pop es | restore es cmpb ah,*0 | ah != 0 means BIOS detected error jne d2 | exit with error mov ax,tmp | fetch count of sectors transferred xorb ah,ah | count is in ax add tmp1,ax | tmp1 accumulates sectors transferred mov si,tmp1 | are we done yet? cmp si,tmp2 | ditto je d2 | jump if done inc 6(bp) | next time around, start 1 sector higher add 8(bp),#0x200 | move up in buffer by 512 bytes jmp d0 d2: jmp cret csv: pop bx push bp mov bp,sp push di push si sub sp,ax jmp (bx) cret: lea sp,*-4(bp) pop si pop di pop bp ret .data begdata: tmp: .word 0 tmp1: .word 0 tmp2: .word 0 .bss begbss: kerstack: .zerow STACKSIZE/2 | kernel stack  b.j h,‹Ó3Ą»Ģ;¹4h+ĖŃł‰Ćāų‰Ī;҉Ģ;¼4hč„'‹Ųśŗ`ŽŚŽĀŽŅź`‹Ī;éĀ’3Ąč©Š†“³UĶ]é¤2äĶĆ3ĄčĶé“3Ąč„Ēd.‹¾ ‰>f.‹†3Ņ÷6Ģ;ŠĢŠÉŠÉŠč‹Ā3Ņ÷6Ī;Šš ŹžĮŠŠ;‹žŠĮ† žČ:Ī;~dž Ц€ÄІ £b.Ķ€üu ”b.2äd.‹6d.;6f.t ’††鍒é [U‹ģWV+ą’ćfü^_]Ć+Ąč钃~ u ø Pč.’ƒÄ’vč%’ƒÄé×’+ĄčČ’č+’*ä‹ų= uæ WčĒ’ƒÄ‹Ēé·’ø"č§’F܉Fڃ~ t#ƒ~}‹V‹F÷Ś÷ŲƒŚ‰F‰V’N ėĒF +ö+’Ńęƒ~}FŃfŃV;v| +vƒFƒVGƒ’ |Ū‹^ڊ„ą.ˆ’FŚ’N ƒ~uƒ~t ėŗ’vč>’ƒÄ‹F ’N …Ąķƒ~ t‹^ŚĘ-’FŚė’NŚ‹^ڊ˜Pč’ƒÄFÜ9FŚwčéżž+Ąčīžƒ~t‹F- =^wAƒ~\t;’vč枃Äøė*=tP= tZø0PøP+ĄPøP‹F*ä™RPčųžƒÄ ø馞ø\Pč§žƒÄ‹F= t2=uŗø0P莾ƒÄøėÕøbėļønėźørėåøtėąøfėŪø\ėÖ= tń= tā=\tģ놸č?ž‹~ėø PčEžƒÄŠ˜Pč;žƒÄG€=u銘= tŪ=%uąG€=-uG€=0uø0ėø ‰FųĒFśė‹Fśŗ ÷ź‰Fś‹ßGŠ˜-0FśŠ˜-0= vŽ€=luGŠ˜-a=wŠ˜- ˆŠ˜-A=wøė+Ą‰FöŠ˜=Xuéē~éN=Dué¼~é =t"=Bt\=Cté(’vö‹^ƒF’7čqžƒÄ)Fś‹Fś’Nś…Ąé+’’vųč]żƒÄėč’vų’vś+ĄPøP‹^ƒF‹+ŅRPč|żƒÄ ĒFśėĮ’vų’vś+ĄPøP‹^ƒF’w’7ėŲ’vų’vś+ĄPøė¼’vų’vś+ĄPøėÕ’vų’vśøPø P‹^ƒF‹™ė ’vų’vśøPø 묒vų’vś+ĄPø év’’vų’vś+ĄPøė‹^‹7ƒF€<ué3’’vö‹ŽFŠ˜P葿ƒÄ)Fśėć=Ot=StŠ=Uu"’vų’vś+Ąėž=bué’=cuéąž=duéc’Š˜Péöž=oué8’~×=st“=uuén’=xuŻ’vų’vś+ĄPøéßžé ü+ĄčüFP’včĀżƒÄé ü+ĄčüūĒH4hĒHĒHĒHĒHĒH+’‹ßŃćLJ HGƒ’|šĒ HĒ0HĒź;Ē Héµū+Ąč¦ū‹¾‹¶‹ßGŠ˜‹ŽFˆƒnuļé”ū+Ąč…ū’vøń.Pče’ƒÄøõ.Pč[’ƒÄø’’Pč²śƒÄékū+Ąč\ūƒ~| ƒ~ tƒ~ uøéNū+Ąėł+Ąč;ūƒ>&Huøü.Pč’ƒÄ+Ąė ø/Pč ’ƒÄøé ū’vøž.PčöžƒÄƒ>(HuÜč2ū‹š‹ų=qtƒ’QuøPč5śƒÄėčū‹ųWč{’ƒÄ…Ątšƒžnt¦ƒžNuÆėŸ+ĄčÄś+’ė‹^€?8}‹Ēŗ÷ź‹ųŠ˜-0ų’F‹^€?0}܋Ē锜+Ąč’ś‹~ø/PčržƒÄƒ>&Ht-ø /PčažƒÄė&č¢śˆŠ˜Pč’ƒÄ…ĄtĘ;~vøé[ś+ĄėłGƒnuŌĘčsśPčŪžƒÄ…ĄtņėÜøč-ś”H‰Fś‹F+ҹ÷ń÷fŃąH‹~śėĒƒĒ;>Hró‹Fśéś+Ąčōłæ‹^€?t&Š˜- =^wŠ˜ėø?Pø/PčøżƒÄ’FƒļuŅ鏳+Ąč»ł‹^ƒt"’wč쒃Äø/P茿ƒÄ‹^‹P蚒ƒÄ闳+Ąčˆł‹Hƒu ø/Pčażė’6Hč®’ƒÄ‹F=t=t'ƒ~t ø//Pč;żƒÄéUł‹H‹’7ø/Pč&żƒÄėŁ‹H‹’7ø#/ėźøč$łæĒFśĒĪ;ĒĢ;čxųøP’6ö;øP’vśčrųƒÄ‹š÷Ę’t‹ĒO…ĄuÜ÷Ę’tFĒĪ; ĒĢ;æč<ųøP’6ö;øP’vśč6ųƒÄ‹š÷Ę’t‹ĒO…ĄuÜ÷Ę’t ø1/PčżƒÄé¤ųø č”ų‹F+ҹ ŃąŃŅāś‰Fō‰Vöƒ~u ‹F; Huéć‹F£ H‹Vö‹Fō¹ ŃśŃŲāś‹šĒFņ‹Ę2H+҉Fų‰Vś…Ņ|=’’vøO/PčüƒÄøPčp÷ƒÄøP’6ö;‹Ę2HP’vč„÷ƒÄ‹ų÷Ē’twčj÷‹F+ŅRP9Vuø”/ėøœ/PWøu/PčĢūƒÄ øP’6ö;‹Ę2HP’včA÷ƒÄ‹ų÷Ē’t4ƒnņuŗW‹F+ŅRP9VuøŹ/ėøĻ/P’6ę;ø¤/Pč‚ūƒÄ øÕ/PčüƒÄé’÷+Ąčƒ÷+ĄP+ŅøRP’v’včŖ#PčŅžƒÄ’v ’v+ŅøRP’v’včĶ#ö;Pč ūƒÄéO÷+Ąč@÷ƒ>&Hu øÖ/PčØūƒÄ~ t+ĄP+ŅøRP’v’včO#PčwžƒÄ’v +ŅøRP’v’vču#ö;P’včEūƒÄøP+ŅøRP’v’vč#Pč;žƒÄĒ HéÓö+ĄčÄöƒ~u‹Fė‹F P’v’v薶ƒÄé°öøPč ö’6Ō;øš/PčśƒÄøPPF¬PčšūƒÄ…Ąt F¬Pčå!ƒÄ£Ō;’6Ö;ø0PčRśƒÄøPPF¬PčĆūƒÄ…Ąt F¬Pčø!ƒÄ£Ö;’6Ų;ø0Pč%śƒÄøPPF¬Pč–ūƒÄ…Ąt F¬Pč‹!ƒÄ£Ų;’6Ś;ø)0PčųłƒÄøPPF¬PčiūƒÄ…Ąt F¬Pč^!ƒÄ£Ś;’6Ü;ø<0PčĖłƒÄøPPF¬Pč<ūƒÄ…Ąt F¬Pč1!ƒÄ£Ü;’6Ž;øO0P螳ƒÄøPPF¬PčūƒÄ…Ąt F¬Pč!ƒÄ£Ž;’6ā;’6ą;øb0PčmłƒÄøPPF¬P莜ƒÄ…ĄtF¬PčÓ ƒÄ£ą;‰ā;øu0PčśƒÄ…ĄtøPøŌ;P+ŅøRPčųżƒÄė!ø|0PčńłƒÄ…Ąt釾ƒ>&Ht +ĄPčeōƒÄéõøčõĒFųĒFś”Ō;+ҹ ÷ń‹Ų;Ś;Ā‹ųøP”Ö;HPčEüƒÄĘųCøPøųCP’vś’vų聿ƒÄĘųCFųƒVśƒļuŁ”Ü;£Ī.ø PøĄ.P”Ų;Ś;+ҹ ŃąŃŅāśƒŅRPč@żƒÄøPøųCP”Ü;‹Ž;Óą+ҹ ŃąŃŅāśRPčżƒÄø Pø .P”Ü;‹Ž;Óą+ҹ ŃąŃŅāśRPčųüƒÄéAōøPč1ōø•0PčųƒÄ”l.£Ö;’6l.øæ0PčųƒÄøPPF¬PčqłƒÄ…Ąt F¬PčfƒÄ£Ö;ĒŽ;’6Ž;øÖ0PčĶ÷ƒÄøPPF¬Pč>łƒÄ…Ąt F¬Pč3ƒÄ£Ž;”n.£Ō;Pøņ0Pč÷ƒÄøPPF¬PčłƒÄ…Ąt F¬PčƒÄ£Ō;”Ō;’¹ Óč£Ų;”Ö;’¹ Óč£Ś;”Ō;+ҹ ÷ń‹Ų;ƒĀŚ;Āŗ‹Ž;ÓāĀH‹Ž;Óč£Ü;Ēą;’’Ēā;’+ŅøRP‹ā;”ą;-ƒŚ‹Ž;+ö…Ū}÷Ö‹Ė…ÉtŃśŃŲāśRPčCƒś|%=r”Ž;™¾»‹Č…ÉtŃćŃÖāś‰ą;‰6ā;Ēä;ø 1Pč¼öƒÄĒ&Hč üĒ&Hø 1Pčy÷ƒÄ…Ąuč üėøPøŌ;P+ŅøRPčVūƒÄ聿éœņ+Ąčņƒ>.HtčLžėøPøŌ;P+ŅøRPčēśƒÄƒ>,Htč¼ū>ä;t ø1PčÉöƒÄƒ>Ō; ø61PčøöƒÄƒ>Ö;w ø@1Pč§öƒÄƒ>Ų; øI1Pč–öƒÄƒ>Ś; øQ1Pč…öƒÄƒ>Ü; øY1PčtöƒÄƒ>Ž;} øs1PčcöƒÄƒ>ā;|ƒ>ą;u øŠ1PčIöƒÄé×ńøčĒń”Ō; ¹ Óč‹ų>ä;t øž1Pč!öƒÄ9>Ų;} ø¾1PčöƒÄ9>Ų;t!øõ1Pøō1PWøŅ1Pč¹śƒÄ’6Ų;ø÷1Pč^õƒÄ”Ö;’¹ Óč‹ų9>Ś;} ø2PčĶõƒÄ9>Ś;t!ø>2Pø=2PWø2PčuśƒÄ’6Ś;ø@2PčõƒÄ”Ü;;Ö;r øP2Pč“õƒÄƒ>Ž;r øj2Pč‚õƒÄƒ>Ž;~’6Ž;ø‚2PčįōƒÄ”Ō;+ҹ ÷ń‹Ų;ƒĀŚ;Āŗ‹Ž;ÓāĀH‹Ž;Óč‹ų9>Ü;} ø„2Pč/õƒÄ9>Ü;tWøæ2Pč’ōƒÄ’6Ü;øė2Pč„ōƒÄĒFų’’ĒFś’+ŅøRP‹Vś‹Fų-ƒŚ‹Ž;+ö…Ū}÷Ö‹Ė…ÉtŃśŃŲāśRPč—ƒś|#=r”Ž;™¾»‹Č…ÉtŃćŃÖāś‰^ų‰vś‹ā;”ą;;Vśu;Fųt"’vś’vųøś2PčōƒÄ’6ā;’6ą;ø3PčļóƒÄé š+ĄčśļøP’vč½õƒÄ‹ų ‹Ēéģļ+ĄčŻļ‹v+’ė#øPV‹F+ҹ ŃąŃŅāśRPč6ųƒÄG’FĘ;~|Ų‹^é®ļ+ĄčŸļ‹v+’ė#øPV‹F+ҹ ŃąŃŅāśRPč;ųƒÄG’FĘ;~|Ųéwļ+Ąčhļė!‹F%ŗ‹ČÓā‹F¹ÓčŃąF‹Ų ’F÷FuŲ‹F¹ÓčŃąF‹ų‹F¹ ӹѹF‹šė ‹ßƒĒĒ’’;žróéļ+Ąč ļ’6Ų;č’ƒÄ£ģ;’6Ś;čöžƒÄ£š;’6Ų;č鞃Ä£ī;’6Ś;čÜžƒÄ£ņ;’6Ų;čĻžƒÄ£ō;éĻī+ĄčĄī鑋F3F©t>‹^ ’‹™¹÷ł…Ņu-‹^ƒ?t%ƒ>&Htƒ>(Huø.3PčDóƒÄ…Ąt ‹^Ēė?‹^ƒ?t7÷Ft÷Fu ’v’v ø@3ė÷Fu÷Ft’v’v øR3Pč"ņƒÄŃnŃn’F‹F Ftéd’é(īøčī‹~‹vĒFśĒFųƒ>.Ht’v ’v ’včQžƒÄé¶’vøe3PčĻńƒÄ’v ’v ’včōżƒÄ‹;tFśPFųP’v’v’4’5čóžƒÄ ƒĒƒĘƒF‹F;FrЃ>&Htƒ>(Htƒ~śu øv3PčrńƒÄƒ~ųƒ~ų ~ ’vųø|3PčYńƒÄƒ~ųtøŽ3PčņƒÄ…Ąt’v ’v ’včØżƒÄƒ~ų~ ø 3Pč&ńƒÄé@ķøč0ķæƒ>.HtéŃø¢3PčńƒÄ‹Ē%ŗ‹ČÓā‹Ē¹ÓčŃąģ;‹Ų‹#ŠtéøPFśPE’+ҹŃąŃŅāś‹Ų;_Ś;+ö¹ ŃćŃÖāśĆÖRPč8õƒÄƒ~śtQWø·3P虹ƒÄøŃ3PčeńƒÄ…Ąt8ø PøųCPE’+ҹŃąŃŅāś‹Ų;_Ś;+ö¹ ŃćŃÖāśĆÖRPč$õƒÄG;>Ō;wéC’øŁ3Pč?šƒÄéYģ+ĄčJģøP”Ō;@Pč ņƒÄ£ųGé?ģø č/ģƒ>ź;tøŪ3Pč šƒÄĒź;ø PFÜP‹F-+ҹŃąŃŅāś‹Ų;_Ś;+ö¹ ŃćŃÖāśĆÖRPčXōƒÄŠF阋ųGV‹Ś”ųGF‹ŲŠ˜PŠFé˜P’vøī3PčļƒÄøś3PčišƒÄ…ĄtW”ųGF‹ŲŠ˜ˆF酡u ø4Pč’ļƒÄø PFÜP‹F-+ҹŃąŃŅāś‹Ų;_Ś;+ö¹ ŃćŃÖāśĆÖRPč ōƒÄéRė+ĄčCėæė”ųGNj؀?tWčłžƒÄG;>Ō;vęƒ>ź;u ø4PčļƒÄéė+Ąč ė‹F‹NÓč©tø 4ėø"4PčÜīƒÄ‹F‹NÓč©tø$4ėø&4PčĄīƒÄ‹F…Ft’v ø(4Pč«īƒÄė‹F‹NÓč©tø+4ėø-4PčīƒÄé§ź+Ąč˜źƒ>0HtĒ0Hø/4PčnīƒÄ’vøS4PčaīƒÄ‹^‹%š=€uéŖ= ué®=@ué =`u餸`4Pč/īƒÄøsPøPøP‹^’7č’ƒÄøsPøPøP‹^’7č’ƒÄøtPøP+ĄP‹^’7čńžƒÄ‹^ŠG ˜Pøb4PčŁķƒÄ‹^‹%š= t==`t8’w’wøs4Pč·ķƒÄøP+ĄPč3šƒÄéÄéøX4ék’øZ4ée’ø\4é_’ø^4éY’‹^‹G+ÉÓč*äP‹G¹Óč*äPøh4듸čé‹^‹%ŗ‹ČÓ⋹ÓčŃąī;‹Ų øx4PčīƒÄ…Ąt@‹^‹ųG‹ŲžĒFųśG‹F‰FöĒFśė‹^ųŠ˜‹^öˆ’Fų’Fö‹Fś’Nś…Ąuåøéé+Ąėł+Ąčé‹^ ‹;F uéŅ‹ĆPø‡4PčŲģƒÄ+ĄPøPčTļƒÄ‹^ ’7‹ĆPø’4Pč¶ģƒÄ’v ø¦4Pč©ģƒÄ‹F%ŗ‹ČÓā‹F¹ÓčŃąī;‹Ų ‹^ ‹%ŗ‹ČÓ⋹ÓčŃąī;‹Ų ‹F %ŗ‹ČÓā‹F ¹ÓčŃąī;‹Ų øµ4PčķƒÄ…Ąu馋^ ‹ųG‹Ųž‹^ ‹F ‰”ųGF ‹Ųž+Ąé3č‹^ €tøė+Ą+Ņ9Vu9Fué—’v’v‹F Pø¾4PčąėƒÄ+ĄPøPč\īƒÄ‹^ ’7‹ĆPøÜ4Pč¾ėƒÄ‹F%ŗ‹ČÓā‹F¹ÓčŃąī;‹Ų ‹^ ‹%ŗ‹ČÓ⋹ÓčŃąī;‹Ų ‹F %ŗ‹ČÓā‹F ¹ÓčŃąī;‹Ų øéA’+Ąčhēæ‹F‹š€<té·øń4Pč8ėƒÄ+ĄPPč·ķƒÄ‹F%ŗ‹ČÓā‹F¹ÓčŃąī;‹Ų ’v藿ƒÄ…Ąufėuø5PčöźƒÄ+ĄPøPčrķƒÄ‹F%ŗ‹ČÓā‹F¹ÓčŃąī;‹Ų ø(5P襟ƒÄ‹FPčŠģƒÄø25P詟ƒÄ’vč1żƒÄ…Ąt+Ąė€<t ‹ŽF€?/t‹ƒļuīøéęøčę‹^ ƒ?r ‹;Ō;wéÖø55Pč]źƒÄ+ĄPøPčŁģƒÄ‹^ ’7øS5PčAźƒÄød5Pč7źƒÄ‹F PčGģƒÄøm5Pč źƒÄøp5PčģźƒÄ…ĄuéiĒFśśG‹F ‰FųĒFöė‹^śŠ˜‹^ųˆ’Fś’Fų‹Fö’Nö…Ąuå+Ąéi‹^ ’7ø5PčĪéƒÄø™5PčÄéƒÄ‹F PčŌėƒÄøÆ5Pč­éƒÄøP+ĄPč)ģƒÄ’v č(üƒÄ…Ąt믋^ ‹ųG‹ŲŠ˜=t”‹^ ‹ųG‹Ųžøæ5P‹F PčrƒÄ…ĄuA‹H€O’v’v ’v’v’včHüƒÄ éȋH€Oƒ~u‹Fė ‹H‹_‹‹PėŹøĮ5P‹F PčƒÄ…ĄtŹ’v ’vč£żƒÄ…ĄuUé’øÄ5PčéčƒÄ+ĄPøPčeėƒÄøå5PčŅčƒÄ‹F PčāźƒÄ‹^ ’7øī5Pč¶čƒÄ’v č>ūƒÄ…ĄtéÄžøė-‹^ ‹%ŗ‹ČÓ⋹ÓčŃąō;‹Ų‹#ŠuŠ’v č’ƒÄéŽäø č~äø‹Ž;Óą¹Óą‹š‹F ‹Ž;Óą+ҹ ŃąŃŅāś‰†öž‰–ųžøP†üžP’¶ųž’¶öžč¶ģƒÄdžśž†üž‹ųFü;ųréĀ‹^‹W‹G+FV …Ņc|=s\ø’5PčīēƒÄ+ĄPøPčjźƒÄø6Pč­čƒÄ…ĄuéĻ‹F%ŗ‹ČÓā‹F¹ÓčŃąī;‹Ų ‹^‹V ‹F‰G‰Wdžśžƒ=tW’v ’v’vč żƒÄ…Ąudžśž‹^‹W‹G‰†ņž‰–ōžƒFƒV ‹V ‹F;–ōž|[;†ņžrSƒ¾śžtøP†üžP’¶ųž’¶öžčģƒÄ†öžƒ–ųžƒīt‹^‹V ‹F;W}éŅž;GséČžøéć+ĄėłƒĒéŪž+Ąčć’vø#6PčåęƒÄ+ĄPøPčaéƒÄ’vø/6PčĖęƒÄ‹F=t'=t'=t'øf6PčÆęƒÄ’v ’v øt6PčŸęƒÄé¹āøA6ėįøF6ėÜøV6ė×+Ąč›ā‹F+Ü;@‹ų‹^Ńć’‡ H‹F;Ü;r;Ö;rI’v ’v ’v’vø6Pč\’ƒÄ +Ąé®‹Ē%ŗ‹ČÓā‹Ē¹ÓčŃąņ;‹Ų ’v ’v ’v’vøŽ6ėʋĒ%ŗ‹ČÓā‹Ē¹ÓčŃąš;‹Ų‹#Šu±’H‹Ē%ŗ‹ČÓā‹Ē¹ÓčŃąņ;‹Ų‹#ŠtW’v ’v ’v’v’vø˜6PčÉžƒÄ‹Ē%ŗ‹ČÓā‹Ē¹ÓčŃąš;‹Ų øé·įøč§įæ‹F ‹Ž;Óą+ҹ ŃąŃŅāś‰†ųž‰–śžøP†üžP’¶śž’¶ųžčģéƒÄ‹F HPø€P†üžP’v’v’vč×ƒÄ …Ąu+ĄéU၆ųžƒ–śžƒļt‹^‹W‹‹^;W|£;GrœøėŃøčįø‹Ž;Óą™‰FųףŚŪÜŻŽß‰Vśƒ~t+ŅøRPFųPč± ƒnuģ‹Vś‹Fųéšą+Ąčįąƒ~ uD‹^‹%š=@u ’v ‹^’w’7’v’vč6üƒÄ …Ąu+Ąéøąø‹Ž;Óą™‹^Wøėę’v ’v ’v’v’včŲžƒÄ ėĻøčząæ+öéʋ^‹W‹G‰Fų‰Vś‹^‹W‹;Vś~éÆ|;Fųré„‹ĘŃąF ‹Ųƒ?u$’vč’ƒÄ‰Fų‰Vś‹^‹W‹FųVś‰‰Wėj‹^’w’7’v‹ĘŃąF ‹Ų’7’vč[żƒÄ …Ąu$’včĻžƒÄ‰Fų‰Vś‹^‹W‹FųVś‰‰Wė!’v‹ĘŃąF ‹Ų’7’v’v’v芞ƒÄ …Ąu+’F;v }é2’‹Ēé©ßøč™ßĒFöĒFų+ĄPøP‹FPFöP’v’včōžƒÄ ‹ų¾ĒFś’vśøP‹F‹ÖŃāĀPFöP’v’včĘžƒÄ …Ąu+’F’Fśƒž |Ķ‹Ēé9ß+Ąč*ߋF%ŗ‹ČÓā‹F¹ÓčŃąō;‹Ų ‹^ƒ|!ˆvøž6PčÜāƒÄøPøPčWåƒÄ’v’vč9’ƒÄ‹ų‹HŠG˜©uøø6Pč©āƒÄøPøPč$åƒÄ+’‹HŠG˜©uøĘ6Pč‚āƒÄøPøPčżäƒÄ+’‹Ē銮+Ąč{Ž‹^‹%š=€t>= tc=@tF=`tP’HøÕ6Pč>āƒÄ+ĄPøPčŗäƒÄ‹^’7øā6Pč"āƒÄ+Ąé:Ž’H’v’v脾ƒÄėė’H’v’včāžėģ’HøėÓ’Hėõ+Ąčū݃~u3‹^‹%š=@t&øķ6PčĖįƒÄ‹^’7’vø 7Pč¹įƒÄø#7Pč;āƒÄ‹^€ uø$7PčœįƒÄ+ĄPøPčäƒÄ+Ąé§Ż’H‹F%ŗ‹ČÓā‹F¹ÓčŃąģ;‹Ų ‹^ŠG ˜=vUø87PčQįƒÄ+ĄPøPčĶćƒÄ‹^ŠG ˜PøO7Pč2įƒÄ”ųGF‹Ų€/‹F%ŗ‹ČÓā‹F¹ÓčŃąī;‹Ų ė‹^ŠG ˜‹ųGV‹Ś(’v’vč~žƒÄéX’ø0čņ܋^‹?‹F‰FÖ”H‰FŲFÖ£H‹Ē%ŗ‹ČÓā‹Ē¹ÓčŃąī;‹Ų‹#ŠtWøZ7P蜱ƒÄøP+ĄPčćƒÄ‹Ē%ŗ‹ČÓā‹Ē¹ÓčŃąģ;‹Ų‹#Š‹ņ…öt ƒ>*HuéA”Ų;Ś;+ҹ ŃąŃŅāś‰F̉VĪø PFÜPE’+ҹŃąŃŅāśFĢVĪRPčÆäƒÄƒ>*Ht FÜPWčˆńƒÄ…ötééFÜPWčžƒÄ…Ąté׋Ē%ŗ‹ČÓā‹Ē¹ÓčŃąī;‹Ų øk7P脹ƒÄ…Ąu驊Fé˜H‹ųG׋Ś‹Ē%ŗ‹ČÓā÷ҋǹÓčŃąģ;‹Ų!”Ų;Ś;+ҹ ŃąŃŅāś‰F̉VĪø PøųCPE’+ҹŃąŃŅāśFĢVĪRPč,äƒÄĒFŌśG‹F‰FŅĒFŠė‹^Ԋ˜‹^҈’FŌ’FŅ‹FŠ’NŠ…Ąuå‹H‹G£H+Ąé<Ū‹H‹G£Høėīøčۃ>.Hu”Ō;£H”Ö;+Ü;@£HĒFģĘFīFģPčżżƒÄ…Ąu ør7Pč]߃Äø7PčĒŽƒÄéįŚ+ĄčŅŚøPøƒ7P豎ƒÄø‹Ž;ÓąPø›7P蝮ƒÄø¬7P蓮ƒÄøĘ7PøÅ7P’6Hø®7PčŹćƒÄøŻ7PøŪ7P’6HøČ7Pč“ćƒÄø’7Pøž7P’6Høį7PčžćƒÄø#8Pø"8P’6Hø8PčˆćƒÄƒ>Htø:8Pø98P’6Hø%8PčkćƒÄøR8PøQ8P’6Hø<8PčUćƒÄøi8Pøh8P’6HøT8Pč?ćƒÄé Ś+ĄčżŁƒ>(Huƒ>.HtĒ&H‹F£č;č߯čKēč ččÉź’6Ų;”Ō;@P’6ģ;čZźƒÄ’6Ś;”Ö;+Ü;@P’6š;čCźƒÄč[ķ脾øk8P’6Ö;’6Ś;”Ų;P”Ü;HP’6ņ;’6š;čfėƒÄč6īøp8P”Ō;@P’6Ų;øP+ĄP’6ī;’6ģ;čAėƒÄč#ģčžƒ> Ht øv8Pč2݃ÄéLŁøč<Ł+’+öĒFśƒ>h.t”Ī;£j.Ēh.ƒ>Ī; |ƒ>Ģ;} ø¢8Pčõ܃ÄĒö;ų;Ēę;¾8øĆ8Pčß܃ÄøČ8PčÕ܃Äøß8PčĖ܃Äø9PčĮ܃ÄøW9Pč·ÜƒÄø¢9Pč­ÜƒÄøļ9Pč£ÜƒÄø:Pč™ÜƒÄčŲ‰Fų*ä‰FöPø:PčƒÜƒÄĒ2HĒŅ;ĒŠ;‹Fö==uéē=fué„=ht=luéŠ=mu锸~:é]’č΃>Ņ;}ø€ėø£Š;ĒĢ;DĒĪ;øp.Pø:Pč܃Äč …Ą}é+’Ē&H’vśVWø:Pč žƒÄĒ.HĒ,HĒ*HĒ&Héūžøp.Pø4:PčĢۃÄč²Žė½øp.PøL:Pč¹ŪƒÄĒ,HĒ*Hč“Žė¤ød:PčžŪƒÄ脮Ē.Hƒ>Ī;uŠĒl.°Ēn.’é{’‹Fų¹Óų*äé×øč×øš:PčbۃÄė&éz׃>Ņ;H€~ū1|B€~ū9<€~ū5t6ŠFū˜-0£Ņ;č°ÖˆFūŠFū˜Pøé:Pč%ۃÄ€~ū uĀøģ:Pčۃă>Ņ;®ĒŅ;뚸&č×ĒFö’Föƒ~ö~øī:Pč范Äø’’é’ÖøP’6ö;+ĄPPč]փĉFś©’uĶĒFųéė‹Fų¹Óąö;‹ŲЇĘ˜*䙉Fā‰Vä‹Fų¹Óąö;‹ŲЇĒ˜*䙉FމVą‹Fų¹Óąö;‹ŲЇČ˜*䙉FډV܋Fų¹Óąö;‹ŲЇÉ˜*䙉F։VŲ¹ŃąŃŅāś‹v܋^ڹŃćŃÖāś Ć Ö‹vą‹^޹ŃćŃÖāś Ć Ö Fā Vä^ę‹vų¹Óęމ‰WFę‹Vų¹ÓāĀ‹Ųƒ|?’’vø;PčāŁƒÄøPč9ՃÄ’Fųƒ~ų}é ’ƒ>Ņ;|”Ņ;-ė”Ņ;‰FųFęPč8ƒÄFę‹VųJ¹Óā‹؋W‹£2H+ҹ÷ń…Ņt ”2H+Ņ÷ń@Ńą£2H+Ąé“žøč…Õ‹¾+öĒFśéœ‹Fś¹ÓąĒ‹Ųƒuƒ?u‹Fś@¹ÓąĒ‹ŲƒuRƒ?uM‹Fś@¹ÓąNj؋W‹‰Fö‰Vų‹Fś¹ÓąNj؋W‹;Vų|<;Föv5‹Fś@¹ÓąĒ‹Ųƒuƒ?t‹Fś@¹ÓąĒP‹Fś¹ÓąĒPčƒÄ’Fśƒ~ś}é[’Fƒž}éJ’éŠŌøčĄŌ‹¾‹¶‹U‹‰Fų‰Vś‹T‹‰‰U‹Vś‹Fų‰‰TéŸŌø čŽŌ‹¾ĒFųĒFśĒFöėGŠ˜‹ŲЇK;˜©uš€=-u2GĒFöė*+Ņø RPFųPč ‹Ę+҉Fņ‰Vō‹Vś‹FųFņVō‰Fų‰Vś‹ßGŠ˜-0‹š= rʃ~öt‹Vś‹Fų÷Ś÷؃ŚéŌ‹Vś‹Fųėõ+Ąč’Ӌ¾‹¶Š˜‹ŽFйÓāÓś;Āu ‹ßG€?uå+Ąéįӊ˜NйÓāÓś+ĀėģU‹ģW+’‹V‹F‹^ ‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×č{…’t÷Ś÷؃Ś_]ĀU‹ģW+’‹V‹F‹^ ‹N…Ņy ÷Ś÷؃Ś÷ׅŪy÷Ū÷كŪč=‹Ó‹Į…’t÷Ś÷؃Ś_]ĀU‹ģ‹^‹F÷g‹Č‹G÷fȋF÷gщG‰W]Ā…Ūu‹Ų‹Ā+Ņ÷ń“÷ń‹Ź‹Ó+ŪĆUWV+’„’u&GWŠūŠŻŠé*ɋéŠč*ɊĊāŠÖ*öRPQ‹Ķ;Ór ø’’ė WWRP‹Ā+Ņ÷ó‹č÷į_+ųƒŅ‹ņ‹Ć÷åʃŅ^+šƒŅX+Āy Młóėō‹Ļ‹Ž_…’tŠĶŠėŠßŠų‹Å+Ņ^_]Ć h_Answer questions with y or n. Then hit RETURN...ķA 0123456789ABCDEF%s fatal %s? yes --> %c// (ino = %u, (ino = %u) can't determine diskette-typeFsck cannot read beyond sector 65535 error 0x%x %s block %D, retry readingwriting%s: can't %s block %D (error = 0x%x) readwriteinternal error (devwrite)ninodes = %unzones = %uimap_blocks = %uzmap_blocks = %ufirstdatazone = %ulog_zone_size = %umaxsize = %Uok nowDo you want to try againHit RETURN key to select default values # zones (default: %d) log zonesize (default: %d) #inodes (default: %u) is this okbad magic number in super blockno inodesno zonesno imapno zmapfirst data zone too smallzone size < block sizemax. file size <= 0bad magic number in super blocktoo few imap blockswarning: expected %d imap_block%ss instead of %d too few zmap blockswarning: expected %d zmap_block%ss instead of %d first data zone too largelog_zone_size too largewarning: large log_zone_size (%d) first data zone too smallwarning: expected first data zone to be %d instead of %u warning: expected max size to be %D instead of %D stop this listing%s %u is missing %s %u is not free Checking %s map etc. %d errors found. install a new map Checking inode list mode inode %u not cleared. clear INODE NLINK COUNT %5u %5u %5u adjustinternal error (counterror) r-w-%cx- inode permission link size name %6u -dcb? %3u %2x,%2x %7D . remove entrybad %s in %s is linked to %u instead of %u). repairwarning: %s has offset %D in %s is linked to %u) null name found in found a '/' in entry of directory entry = '')bad inode found in directory ino found = %u, name = ''). remove entrytoo many links to ino %u discovered at entry '' in directory ...link to directory discovered in name = '', dir ino = %u)bad format in directory . truncate%s zone in zno = %u, type = DATASINGLE INDIRECTDOUBLE INDIRECTVERY INDIRECT, pos = %D) out-of-rangeduplicatefoundwarning: huge directory: . missing in .. missing in bad mode of mode = %o)root inode is not a directory (ino = %u, mode = %o) link count zero of link count too big in cnt = %u) found inode %u: removebad root inode blocksize = %5d zonesize = %5d %6u Regular file%s s%6u Director%s yies%6u Block special file%s s%6u Character special file%s s%6u Bad inode%s s%6u Free inode%s s%6u Free zone%s szoneinode----- FILE SYSTEM HAS BEEN MODIFIED ----- Bootblok gave bad tracksiz fsck Hit key as follows: = start MINIX (root file system in drive 0) f check the file system (first insert any file system diskette) l check and list file system (first insert any file system diskette) m make an (empty) file system (first insert blank, formatted diskette) h check hard disk file system # %c Checking hard disk. %s Checking diskette. %s Checking diskette. %s Making empty file system Illegal command disk(ette) Please enter partition number. Drive 0: 1-4, drive 1: 6-9, then hit RETURN: %c Disk errors. Can't read partition table Fsck can't handle partitions above sector 65535  AAAAAABBBBBB /* fsck - file system checker Author: Robbert van Renesse */ #include "../h/const.h" #include "../h/type.h" #include "../fs/const.h" #include "../fs/type.h" /* #define DOS /* compile to run under MS-DOS */ #define STANDALONE /* compile for the boot-diskette */ /* Fsck may be compiled to run in any of two situations. For each * a different symbol must be defined: * * STANDALONE will compile fsck to be part of the boot-diskette and * all necessary routines are contained in the program * DOS will compile fsck to run under MS-DOS, using * the standard DOS library for your compiler. * * The assembler file fsck1.asm must be assembled correspondingly. It has * only one symbol defined, namely STANDALONE. * The assembler file fsck.s is only used under PC/IX to produce * a version for the boot diskette. * When you have a problem look at the preprocessor output to see * which lines will actually be compiled. * To produce an executable/binary version issue one of the following * commands, depending on your development environment: * * Development system: MS-DOS * * fsck to run under: MS-DOS * defined symbols: fsck.c: DOS * fsck1.asm: - * command: link fsck+fsck1,,,DOS-lib * * fsck to run under: BOOT * defined symbols: fsck.c: STANDALONE * fsck1.asm: STANDALONE * command: link fsck1+fsck,fsck,, {Minix-lib || DOS-lib} * dos2out -d fsck * * fsck to run under: MINIX -not yet implemented- * command: link crtso+fsck,fsck,,Minix-lib * dos2out -d fsck * * * Development system: PC/IX * * fsck to run under: PC/IX * command: ld fsck -lc * * fsck to run under: BOOT * defined symbols: fsck.c: STANDALONE * fsck1.s: - * command: ld fsck1.o fsck.0 -l../lib/lib.a * * fsck to run under: MINIX * command: ld fsck.o -l../lib/lib.a * */ #ifndef STANDALONE # ifndef DOS -error: no system defined. # endif #endif #define BITSHIFT 4 /* = 2log(#bits(int)) */ #define BITMAPSHIFT 13 /* = 2log(#bits(block)); 13 means 1K blocks */ #define MAXPRINT 8 /* max. number of error lines in chkmap */ #define MAXWIDTH 32 /* max. width of an ``integer string'' */ #define MAXDIRSIZE 5000 /* max. size of a reasonable directory */ #define CINDIR 128 /* number of indirect zno's read at a time */ #define CDIRECT 16 /* number of dir entries read at a time */ #define SECT_SHIFT 9 /* sectors are 512 bytes */ #define SECTOR_SIZE (1<> BITSHIFT] |= 1 << ((b) & BITMASK)) #define clrbit(w, b) (w[(b) >> BITSHIFT] &= ~(1 << ((b) & BITMASK))) #define bitset(w, b) (w[(b) >> BITSHIFT] & (1 << ((b) & BITMASK))) int drive, partition, cylsiz, tracksiz; int virgin = 1; /* MUST be initialized to put it in data seg */ int floptrk = 9; /* MUST be initialized to put it in data seg */ int zone_ct = 360; int inode_ct = 95; struct dsb { inode_nr s_ninodes; /* # inodes on the minor device */ zone_nr s_nzones; /* total dev size, incl. bit maps etc */ unsigned short s_imap_blocks; /* # of blocks used by inode bit map */ unsigned short s_zmap_blocks; /* # of blocks used by zone bit map */ zone_nr s_firstdatazone; /* number of first data zone */ short s_log_zone_size; /* log2 of blocks/zone */ file_pos s_maxsize; /* maximum file size on this device */ int s_magic; /* magic number for super blocks */ } sb; #define STICKY_BIT 01000 /* not defined anywhere else */ /* ztob gives the block address of a zone * btoa gives the byte address of a block */ #define ztob(z) ((block_nr) (z) << sb.s_log_zone_size) #define btoa(b) ((long) (b) * BLOCK_SIZE) #define SCALE ((int) ztob(1)) /* # blocks in a zone */ #define FIRST sb.s_firstdatazone /* as the name says */ /* # blocks of each type */ #define N_SUPER 1 #define N_IMAP (sb.s_imap_blocks) #define N_ZMAP (sb.s_zmap_blocks) #define N_ILIST ((sb.s_ninodes+INODES_PER_BLOCK-1) / INODES_PER_BLOCK) #define N_DATA (sb.s_nzones - FIRST + 1) /* block address of each type */ #define BLK_SUPER (SUPER_BLOCK) #define BLK_IMAP (BLK_SUPER + N_SUPER) #define BLK_ZMAP (BLK_IMAP + N_IMAP) #define BLK_ILIST (BLK_ZMAP + N_ZMAP) #define BLK_FIRST ztob(FIRST) #define ZONE_SIZE ((int) ztob(BLOCK_SIZE)) #define NLEVEL (NR_ZONE_NUMS - NR_DZONE_NUM + 1) /* byte address of a zone/of an inode */ #define zaddr(z) btoa(ztob(z)) #define inoaddr(i) ((long) (i - 1) * INODE_SIZE + btoa(BLK_ILIST)) #define INDCHUNK (CINDIR * ZONE_NUM_SIZE) #define DIRCHUNK (CDIRECT * DIR_ENTRY_SIZE) char *prog, *device; /* program name (fsck), device name */ int firstcnterr; /* is this the first inode ref cnt error? */ unsigned *imap, *spec_imap; /* inode bit maps */ unsigned *zmap, *spec_zmap; /* zone bit maps */ unsigned *dirmap; /* directory (inode) bit map */ char *rwbuf; /* one block buffer cache */ char rwbuf1[BLOCK_SIZE]; /* in case of a DMA-overrun under DOS .. */ char rwbuf2[BLOCK_SIZE]; /* .. an other buffer can be used */ char nullbuf[BLOCK_SIZE]; /* null buffer */ links *count; /* inode count */ dir_struct nulldir; /* empty directory entry */ block_nr thisblk; /* block that is now in the buffer */ int changed; /* has the diskette been written to? */ struct stack { dir_struct *st_dir; struct stack *st_next; char st_presence; } *top; extern long lseek(); #ifdef DOS #define atol(s) atoi(s) /* kludge for C86 (no atol(s) in library) */ #else long atol(); #endif #ifdef STANDALONE extern end; /* last variable */ int *brk; /* the ``break'' (end of data space) */ #else int dev; /* file descriptor of the device */ #endif #define DOT 1 #define DOTDOT 2 /* counters for each type of inode/zone */ int nfreeinode, nregular, ndirectory, nblkspec, ncharspec, nbadinode; int nfreezone, ztype[NLEVEL]; int repair, automatic, listing, listsuper, makefs; /* flags */ int firstlist; /* has the listing header been printed? */ unsigned part_offset; /* sector offset for this partition */ char answer[] = {"Answer questions with y or n. Then hit RETURN"}; union types { int *u_char; /* %c */ int *u_int; /* %d */ unsigned *u_unsigned; /* %u */ long *u_long; /* %D */ char **u_charp; /* %s */ }; #ifndef STANDALONE # ifdef DOS # include "/lib/c86/stdio.h" # endif #else /*STANDALONE*/ /* Print the given character. */ putchar(c){ if (c == '\n') putc('\r'); putc(c); } /* Get a character from the user and echo it. */ getchar(){ register c; if ((c = getc() & 0xFF) == '\r') c = '\n'; putchar(c); return(c); } #endif /*STANDALONE*/ /* Print the number n. */ printnum(n, base, sign, width, pad) long n; int base, sign; int width, pad; { register short i, mod; char a[MAXWIDTH]; register char *p = a; if (sign) if (n < 0) { n = -n; width--; } else sign = 0; do { /* mod = n % base; n /= base */ mod = 0; for (i = 0; i < 32; i++) { mod <<= 1; if (n < 0) mod++; n <<= 1; if (mod >= base) { mod -= base; n++; } } *p++ = "0123456789ABCDEF"[mod]; width--; } while (n); while (width-- > 0) putchar(pad); if (sign) *p++ = '-'; while (p > a) putchar(*--p); } /* Print the character c. */ printchar(c, mode){ if (mode == 0 || (isprint(c) && c != '\\')) { putchar(c); return(1); } else { putchar('\\'); switch (c) { case '\0': putchar('0'); break; case '\b': putchar('b'); break; case '\n': putchar('n'); break; case '\r': putchar('r'); break; case '\t': putchar('t'); break; case '\f': putchar('f'); break; case '\\': putchar('\\'); break; default: printnum((long) (c & 0xFF), 8, 0, 3, '0'); return(4); } return(2); } } /* Print the arguments pointer to by `arg' according to format. */ doprnt(forēéźėģķīļšńņóōõö÷ųłśūüżž’     mat, argp) char *format; union types argp; { register char *fmt, *s; register short width, pad, mode; for (fmt = format; *fmt != 0; fmt++) switch(*fmt) { case '\n': putchar('\r'); default: putchar(*fmt); break; case '%': if (*++fmt == '-') fmt++; pad = *fmt == '0' ? '0' : ' '; width = 0; while (isdigit(*fmt)) { width *= 10; width += *fmt++ - '0'; } if (*fmt == 'l' && islower(*++fmt)) *fmt = toupper(*fmt); mode = isupper(*fmt); switch (*fmt) { case 'c': case 'C': prc(nextarg(char)); break; case 'b': prn(unsigned, 2, 0); break; case 'B': prn(long, 2, 0); break; case 'o': prn(unsigned, 8, 0); break; case 'O': prn(long, 8, 0); break; case 'd': prn(int, 10, 1); break; case 'D': prn(long, 10, 1); break; case 'u': prn(unsigned, 10, 0); break; case 'U': prn(long, 10, 0); break; case 'x': prn(unsigned, 16, 0); break; case 'X': prn(long, 16, 0); break; case 's': case 'S': s = nextarg(charp); while (*s) prc(*s++); break; case '\0': break; default: putchar(*fmt); } while (width-- > 0) putchar(pad); } } /* Print the arguments according to fmt. */ printf(fmt, args) char *fmt; { doprnt(fmt, &args); } /* Initialize the variables used by this program. */ initvars(){ register level; #ifdef STANDALONE brk = &end; #endif nregular = ndirectory = nblkspec = ncharspec = nbadinode = 0; for (level = 0; level < NLEVEL; level++) ztype[level] = 0; changed = 0; firstlist = 1; firstcnterr = 1; thisblk = NO_BLOCK; } /* Copy n bytes. */ copy(p, q, n) register char *p, *q; register int n; { do *q++ = *p++; while (--n); } /* Print the string `s' and exit. */ fatal(s) char *s; { printf("%s\n", s); printf("fatal\n"); exit(-1); } /* Test for end of line. */ eoln(c) { return(c < 0 || c == '\n' || c == '\r'); } /* Ask a question and get the answer unless automatic is set. */ yes(question) char *question; { register c, answer; if (!repair) { printf("\n"); return(0); } printf("%s? ", question); if (automatic) { printf("yes\n"); return(1); } if ((c = answer = getchar()) == 'q' || c == 'Q') exit(1); while (!eoln(c)) c = getchar(); return !(answer == 'n' || answer == 'N'); } /* Convert string to integer. Representation is octal. */ atoo(s) char *s; { register n = 0; while ('0' <= *s && *s < '8') { n *= 8; n += *s++ - '0'; } return(n); } /* If repairing the file system, print a prompt and get a string from the user. */ input(buf, size) char *buf; { register char *p = buf; printf("\n"); if (repair) { printf("--> "); while (--size) { *p = getchar(); if (eoln(*p)) { *p = 0; return(p > buf); } p++; } *p = 0; while (!eoln(getchar())) ; return(1); } return(0); } /* Allocate some memory and zero it. */ char *alloc(nelem, elsize) unsigned nelem, elsize; { char *p; #ifdef STANDALONE register *r; p = (char *) brk; brk += nelem * ((elsize + sizeof(int) - 1) / sizeof(int)); for (r = (int *) p; r < brk; r++) *r = 0; return(p); #else extern char *calloc(); if ((p = calloc(nelem, elsize)) == 0) fatal("out of memory"); return(p); #endif } #ifndef STANDALONE /* Deallocate previously allocated memory. */ dealloc(p) char *p; { free(p); } #endif /* Print the name in a directory entry. */ printname(s) char *s; { register n = NAME_SIZE; do { if (*s == 0) break; printf("%c", isprint(*s) ? *s : '?'); s++; } while (--n); } /* Print the pathname given by a linked list pointed to by `sp'. The * names are in reverse order. */ printrec(sp) struct stack *sp; { if (sp->st_next != 0) { printrec(sp->st_next); printf("/"); printname(sp->st_dir->d_name); } } /* Print the current pathname. */ printpath(mode, nlcr){ if (top->st_next == 0) printf("/"); else printrec(top); switch (mode) { case 1: printf(" (ino = %u, ", top->st_dir->d_inum); break; case 2: printf(" (ino = %u)", top->st_dir->d_inum); break; } if (nlcr) printf("\n"); } #ifndef STANDALONE # ifndef DOS /* don't need to open devices under DOS */ /* Open the device. */ devopen(){ if ((dev = open(device, repair ? 2 : 0)) < 0) { perror(device); fatal(""); } } /* Close the device. */ devclose(){ if (close(dev) != 0) { perror("close"); fatal(""); } } # else /*DOS*/ devopen(){} /* dummies */ devclose(){} sync(){} # endif #endif #ifdef DOS # ifndef STANDALONE # define STANDALONE /* DOS will need the diskio routine */ # define TMP /* remember standalone wasn't defined */ # endif #endif #ifdef STANDALONE disktype() { register retry = 3, error, dir=READING; /* test whether at or pc diskette. Note logical sectors * count from 0 and bios counts from 1. */ tracksiz=15; cylsiz=30; reset_diskette(); do error = diskio(dir, 14, rwbuf, 1); while ( ((error & 0xFF00) != 0) && (retry--)); if ((error & 0xFF00)!=0) { /* not an AT-diskette */ tracksiz=9; cylsiz=18; retry=3; reset_diskette(); do error = diskio(dir, 8, rwbuf, 1); while ( ((error & 0xFF00) != 0) && (retry--)); if ((error & 0xFF00)!=0) fatal ("can't determine diskette-type"); } } # ifdef TMP # undef TMP # undef STANDALONE # endif #endif /* Read or write a block. * Note that under STANDALONE or DOS only the * A-drive (drive 0) can be used */ devio(bno, dir) block_nr bno; { long lastone; long offset = btoa(bno); register error; if (dir == READING && bno == thisblk) return; thisblk = bno; #ifdef DOS # ifndef STANDALONE # define STANDALONE /* DOS will need the diskio routine */ # define TMP /* remember standalone wasn't defined */ # endif #endif #ifdef STANDALONE { register sector = offset >> SECT_SHIFT, retry = 3; lastone = sector + part_offset + (BLOCK_SIZE>>SECT_SHIFT); if (lastone > 65535) { printf("Fsck cannot read beyond sector 65535\n"); exit(1); } error = diskio(dir, sector+part_offset, rwbuf, BLOCK_SIZE>>SECT_SHIFT); if ((error & 0xFF00) == 0) return; reset_diskette(); do { printf("error 0x%x %s block %D, retry\n", error, dir == READING ? "reading" : "writing", (long) bno); error = diskio(dir, sector+part_offset, rwbuf, BLOCK_SIZE >> SECT_SHIFT); if ((error & 0xFF00) == 0) return; } while (--retry != 0); } # ifdef TMP # undef TMP # undef STANDALONE # endif #else /*STANDALONE*/ { extern read(), write(), errno; lseek(dev, offset, 0); if (dir == READING) if (read(dev,rwbuf,BLOCK_SIZE) == BLOCK_SIZE) return; else error = errno; else if (write(dev,rwbuf,BLOCK_SIZE) == BLOCK_SIZE) return; else error = errno; } #endif /*STANDALONE*/ printf("%s: can't %s block %D (error = 0x%x)\n", prog, dir == READING ? "read" : "write", (long) bno, error); fatal(""); } /* Read `size' bytes from the disk starting at byte `offset'. */ devread(offset, buf, size) long offset; char *buf; { devio((block_nr) (offset / BLOCK_SIZE), READING); copy(&rwbuf[offset % BLOCK_SIZE], buf, size); } /* Write `size' bytes to the disk starting at byte `offset'. */ devwrite(offset, buf, size) long offset; char *buf; { if (!repair) fatal("internal error (devwrite)"); if (size != BLOCK_SIZE) devio((block_nr) (offset / BLOCK_SIZE), READING); copy(buf, &rwbuf[offset % BLOCK_SIZE], size); devio((block_nr) (offset / BLOCK_SIZE), WRITING); changed = 1; } /* Print a string with either a singular or a plural pronoun. */ pr(fmt, cnt, s, p) char *fmt, *s, *p; { printf(fmt, cnt, cnt == 1 ? s : p); } #ifndef STANDALONE /* Convert string to number. */ bit_nr getnumber(s) char *s; { register bit_nr n = 0; if (s == 0) return(NO_BIT); while (*s != 0) { if (!isdigit(*s)) return(NO_BIT); n *= 10; n += *s++ - '0'; } return(n); } /* See if the list pointed to by `argv' contains numbers. */ char **getlist(argv, type) char ***argv, *type; { register char **list = *argv; register empty = 1; while (getnumber(**argv) != NO_BIT) { (*argv)++; empty = 0; } if (empty) { printf("warning: no %s numbers given\n", type); return(0); } return(list); } #endif /*STANDALONE*/ /* Make a listing of the super block. If `repair' is set, ask the user * for changes. */ lsuper(){ char buf[80]; long atol(); do { printf("ninodes = %u", sb.s_ninodes); if (input(buf, 80)) sb.s_ninodes = atol(buf); printf("nzones = %u", sb.s_nzones); if (input(buf, 80)) sb.s_nzones = atol(buf); printf("imap_blocks = %u", sb.s_imap_blocks); if (input(buf, 80)) sb.s_imap_blocks = atol(buf); printf("zmap_blocks = %u", sb.s_zmap_blocks); if (input(buf, 80)) sb.s_zmap_blocks = atol(buf); printf("firstdatazone = %u", sb.s_firstdatazone); if (input(buf, 80)) sb.s_firstdatazone = atol(buf); printf("log_zone_size = %u", sb.s_log_zone_size); if (input(buf, 80)) sb.s_log_zone_size = atol(buf); printf("maxsize = %U", sb.s_maxsize); if (input(buf, 80)) sb.s_maxsize = atol(buf); if (yes("ok now")) { devwrite(btoa(BLK_SUPER), (char *) &sb, sizeof(sb)); return; } } while (yes("Do you want to try again")); if (repair) exit(0); } /* Add an empty root directory to the file system. */ makedev(){ register long position = BLK_IMAP * BLOCK_SIZE; register int n = N_IMAP + N_ZMAP + N_ILIST; static dir_struct rootdir[] = { { 1, "." }, { 1, ".." } }; static d_inode inode = { I_DIRECTORY | 0755, 0, sizeof(rootdir), 0, 0, 2 }; devio((block_nr) sb.s_nzones - 1, WRITING); nullbuf[0] = 1 << (ROOT_INODE - 1); /* corrupt nullbuf */ do { devwrite(position, nullbuf, BLOCK_SIZE); nullbuf[0] = 0; /* nullbuf restored */ position += BLOCK_SIZE; } while (--n); #ifndef STANDALONE time(&inode.i_modtime); #endif inode.i_zone[0] = FIRST; devwrite(inoaddr(ROOT_INODE), (char *) &inode, INODE_SIZE); devwrite(zaddr(FIRST), nullbuf, BLOCK_SIZE); devwrite(zaddr(FIRST), (char *) rootdir, sizeof(rootdir)); } /* Get the contents for the super block from the user. Make him some * suggestions. */ mkfs(){ char buf[80]; long atol(); printf("Hit RETURN key to select default values\n\n"); sb.s_nzones = zone_ct; printf("# zones (default: %d) ", zone_ct); if (input(buf, 80)) sb.s_nzones = atol(buf); sb.s_log_zone_size = 0; printf("log zonesize (default: %d) ", sb.s_log_zone_size); if (input(buf, 80)) sb.s_log_zone_size = atol(buf); sb.s_ninodes = inode_ct; printf("#inodes (default: %u) ", sb.s_ninodes); if (input(buf, 80)) sb.s_ninodes = atol(buf); sb.s_imap_blocks = (sb.s_ninodes + (1<> BITMAPSHIFT; sb.s_zmap_blocks = (sb.s_nzones + (1<> BITMAPSHIFT; sb.s_firstdatazone = (BLK_ILIST+N_ILIST+SCALE-1) >> sb.s_log_zone_size; sb.s_maxsize = MAX_FILE_POS; if (((sb.s_maxsize-1) >> sb.s_log_zone_size) / BLOCK_SIZE >= MAX_ZONES) sb.s_maxsize =((long)MAX_ZONES*BLOCK_SIZE)<> BITMAPSHIFT; if (sb.s_magic != SUPER_MAGIC) fatal("bad magic number in super block"); if ((short) sb.s_imap_blocks < n) fatal("too few imap blocks"); if (sb.s_imap_blocks != n) { pr("warning: expected %d imap_block%s", n, "", "s"); printf(" instead of %d\n", sb.s_imap_blocks); } n = (sb.s_nzones + (1 << BITMAPSHIFT) - 1) >> BITMAPSHIFT; if ((short) sb.s_zmap_blocks < n) fatal("too few zmap blocks"); if (sb.s_zmap_blocks != n) { pr("warning: expected %d zmap_block%s", n, "", "s"); printf(" instead of %d\n", sb.s_zmap_blocks); } if ((short) sb.s_firstdatazone >= sb.s_nzones) fatal("first data zone too large"); if ((unsigned short) sb.s_log_zone_size >= 8 * sizeof(block_nr)) fatal("log_zone_size too large"); if (sb.s_log_zone_size > 8) printf("warning: large log_zone_size (%d)\n", sb.s_log_zone_size); n = (BLK_ILIST + N_ILIST + SCALE - 1) >> sb.s_log_zone_size; if ((short) sb.s_firstdatazone < n) fatal("first data zone too small"); if (sb.s_firstdatazone != n) { printf("warning: expected first data zone to be %d ", n); printf("instead of %u\n", sb.s_firstdatazone); } maxsize = MAX_FILE_POS; if (((maxsize - 1) >> sb.s_log_zone_size) / BLOCK_SIZE >= MAX_ZONES) maxsize = ((long) MAX_ZONES*BLOCK_SIZE) << sb.s_log_zone_size; if (sb.s_maxsize != maxsize) { printf("warning: expected max size to be %D ", maxsize); printf("instead of %D\n", sb.s_maxsize); } } #ifndef STANDALONE /* Make a listing of the inodes given by `clist'. If `repair' is set, ask * the user for changes. */ lsi(clist) char **clist; { register bit_nr bit; register inode_nr ino; d_inode inode, *ip = &inode; char buf[80]; long atol(); if (clist == 0) return; while ((bit = getnumber(*clist++)) != NO_BIT) { setbit(spec_imap, bit); ino = bit; do { devread(inoaddr(ino), (char *) ip, INODE_SIZE); printf("inode %u:\n", ino); printf(" mode = %06o", ip->i_mode); if (input(buf, 80)) ip->i_mode = atoo(buf); printf(" nlinks = %6u", ip->i_nlinks); if (input(buf, 80)) ip->i_nlinks = atol(buf); printf(" size = %6D", ip->i_size); if (input(buf, 80)) ip->i_size = atol(buf); if (yes("Write this back")) { devwrite(inoaddr(ino), (char*) ip, INODE_SIZE); break; } } while (yes("Do you want to change it again")); } } #endif /*STANDALONE*/ /* Allocate `nblk' blocks worth of bitmap. */ unsigned *allocbitmap(nblk){ register unsigned *bitmap; bitmap = (unsigned *) alloc(nblk, BLOCK_SIZE); *bitmap |= 1; return(bitmap); } /* Load the bitmap starting at block `bno' from disk. */ loadbitmap(bitmap, bno, nblk) unsigned *bitmap; block_nr bno; { register i; register unsigned *p; p = bitmap; for (i = 0; i < nblk; i++, bno++, p += INTS_PER_BLOCK) devread(btoa(bno), (char *) p, BLOCK_SIZE); *bitmap |= 1; } /* Write the bitmap starting at block `bno' to disk. */ dumpbitmap(bitmap, bno, nblk) unsigned *bitmap; block_nr bno; { register i; register unsigned *p = bitmap; for (i = 0; i < nblk; i++, bno++, p += INTS_PER_BLOCK) devwrite(btoa(bno), (char *) p, BLOCK_SIZE); } /* Initialize the given bitmap by setting all the bits starting at `bit'. */ initbitmap(bitmap, bit, nblk) unsigned *bitmap; bit_nr bit; { register unsigned *first, *last; while (bit & BITMASK) { setbit(bitmap, bit); bit++; } first = &bitmap[bit >> BITSHIFT]; last = &bitmap[nblk * INTS_PER_BLOCK]; while (first < last) *first++ = ~0; } #ifndef STANDALONE /* Set the bits given by `list' in the bitmap. */ fillbitmap(bitmap, lwb, upb, list) unsigned *bitmap; bit_nr lwb, upb; char **list; { register bit_nr bit; if (list == 0) return; while ((bit = getnumber(*list++)) != NO_BIT) if (bit < lwb || bit >= upb) { if (bitmap == spec_imap) printf("inode number %u ", bit); else printf("zone number %u ", bit); printf("out of range (ignored)\n"); } else setbit(bitmap, bit - lwb + 1); } /* Deallocate the bitmap `p'. */ freebitmap(p) unsigned *p; { dealloc((char *) p); } #endif /*STANDALONE*/ /* Get all the bitmaps used by this program. */ getbitmaps(){ imap = allocbitmap(N_IMAP); zmap = allocbitmap(N_ZMAP); spec_imap = allocbitmap(N_IMAP); spec_zmap = allocbitmap(N_ZMAP); dirmap = allocbitmap(N_IMAP); } #ifndef STANDALONE /* Release all the space taken by the bitmaps. */ putbitmaps(){ freebitmap(imap); freebitmap(zmap); freebitmap(spec_imap); freebitmap(spec_zmap); freebitmap(dirmap); } #endif /* `w1' and `w2' are differing words from two bitmaps that should be * identical. Print what's the matter with them. */ chkword(w1, w2, bit, type, n, report) unsigned w1, w2; char *type; bit_nr bit; int *n, *report; { for (; w1 | w2; w1 >>= 1, w2 >>= 1, bit++) if ((w1 ^ w2) & 1 && ++(*n) % MAXPRINT == 0 && *report && (!repair || automatic || yes("stop this listing"))) *report = 0; else if (*report) if ((w1 & 1) && !(w2 & 1)) printf("%s %u is missing\n", type, bit); else if (!(w1 & 1) && (w2 & 1)) printf("%s %u is not free\n", type, bit); } /* Check if the given (correct) bitmap is identical with the one that is * on the disk. If not, ask if the disk should be repaired. */ chkmap(cmap, dmap, bit, blkno, nblk, nbit, type) unsigned *cmap, *dmap; bit_nr bit, nbit; block_nr blkno; char *type; { register unsigned *p = dmap, *q = cmap; int report = 1, nerr = 0; if (makefs) { dumpbitmap(cmap, blkno, nblk); return; } printf("Checking %s map\n", type); loadbitmap(dmap, blkno, nblk); do { if (*p != *q) chkword(*p, *q, bit, type, &nerr, &report); p++; q++; } while ((bit += 8 * sizeof(unsigned)) < nbit); if ((!repair || automatic) && !report) printf("etc. "); if (nerr > MAXPRINT || nerr > 10) printf("%d errors found. ", nerr); if (nerr != 0 && yes("install a new map")) dumpbitmap(cmap, blkno, nblk); if (nerr > 0) printf("\n"); } /* See if the inodes that aren't allocated are cleared. */ chkilist(){ register inode_nr ino = 1; mask_bits mode; if (makefs) return; printf("Checking inode list\n"); do if (!bitset(imap, (bit_nr) ino)) { devread(inoaddr(ino), (char *) &mode, sizeof(mode)); if (mode != I_NOT_ALLOC) { printf("mode inode %u not cleared", ino); if (yes(". clear")) devwrite(inoaddr(ino), nullbuf, INODE_SIZE); } } while (++ino <= sb.s_ninodes); printf("\n"); } /* Allocate an array to maintain the inode reference counts in. */ getcount(){ count = (links *) alloc(sb.s_ninodes + 1, sizeof(links)); } /* The reference count for inode `ino' is wrong. Ask if it should be adjusted. */ counterror(ino) inode_nr ino; { d_inode inode; if (firstcnterr) { printf("INODE NLINK COUNT\n"); firstcnterr = 0; } devread(inoaddr(ino), (char *) &inode, INODE_SIZE); count[ino] += inode.i_nlinks; printf("%5u %5u %5u", ino, (unsigned) inode.i_nlinks, count[ino]); if (yes(" adjust")) { if ((inode.i_nlinks = count[ino]) == 0) { fatal("internal error (counterror)"); /* This would be a patch inode.i_mode = I_NOT_ALLOC; clrbit(imap, (bit_nr) ino); */ } devwrite(inoaddr(ino), (char *) &inode, INODE_SIZE); } } /* Check if the reference count of the inodes are correct. The array `count' * is maintained as follows: an entry indexed by the inode number is * incremented each time a link is found; when the inode is read the link * count in there is substracted from the corresponding entry in `count'. * Thus, when the whole file system has been traversed, all the entries * should be zero. */ chkcount(){ register inode_nr ino; for (ino = 1; ino <= sb.s_ninodes; ino++) if (count[ino] != 0) counterror(ino); if (!firstcnterr) printf("\n"); } #ifndef STANDALONE /* Deallocate the `count' array. */ freecount(){ dealloc((char *) count); } #endif /* Print the inode permission bits given by mode and shift. */ printperm(mode, shift, special, overlay) mask_bits mode; { printf(mode >> shift & R_BIT ? "r" : "-"); printf(mode >> shift & W_BIT ? "w" : "-"); if (mode & special) printf("%c", overlay); else printf(mode >> shift & X_BIT ? "x" : "-"); } /* List the given inode. */ list(ino, ip) inode_nr ino; d_inode *ip; { if (firstlist) { firstlist = 0; printf(" inode permission link size name\n"); } printf("%6u ", ino); switch (ip->i_mode & I_TYPE) { case I_REGULAR: printf("-"); break; case I_DIRECTORY: printf("d"); break; case I_CHAR_SPECIAL: printf("c"); break; case I_BLOCK_SPECIAL: printf("b"); break; default: printf("?"); } printperm(ip->i_mode, 6, I_SET_UID_BIT, 's'); printperm(ip->i_mode, 3, I_SET_GID_BIT, 's'); printperm(ip->i_mode, 0, STICKY_BIT, 't'); printf(" %3u ", ip->i_nlinks); switch (ip->i_mode & I_TYPE) { case I_CHAR_SPECIAL: case I_BLOCK_SPECIAL: printf(" %2x,%2x ", (dev_nr) ip->i_zone[0] >> MAJOR & 0xFF, (dev_nr) ip->i_zone[0] >> MINOR & 0xFF); break; default: printf("%7D ", ip->i_size); } printpath(0, 1); } /* Remove an entry from a directory if ok with the user. */ remove(dp) dir_struct *dp; { int i; char *cp1, *cp2; setbit(spec_imap, (bit_nr) dp->d_inum); if (yes(". remove entry")) { count[dp->d_inum]--; cp1 = (char *) &nulldir; cp2 = (char *) dp; i = sizeof(dir_struct); while (i--) *cp2++ = *cp1++; return(1); } return(0); } /* See if the `.' or `..' entry is as expected. */ chkdots(ino, pos, dp, exp) inode_nr ino, exp; file_pos pos; dir_struct *dp; { if (dp->d_inum != exp) { printf("bad %s in ", dp->d_name); printpath(1, 0); printf("%s is linked to %u ", dp->d_name, dp->d_inum); printf("instead of %u)", exp); setbit(spec_imap, (bit_nr) ino); setbit(spec_imap, (bit_nr) dp->d_inum); setbit(spec_imap, (bit_nr) exp); if (yes(". repair")) { count[dp->d_inum]--; dp->d_inum = exp; count[exp]++; return(0); } } else if (pos != (dp->d_name[1] ? DIR_ENTRY_SIZE : 0)) { printf("warning: %s has offset %D in ", dp->d_name, pos); printpath(1, 0); printf("%s is linked to %u)\n", dp->d_name, dp->d_inum); setbit(spec_imap, (bit_nr) ino); setbit(spec_imap, (bit_nr) dp->d_inum); setbit(spec_imap, (bit_nr) exp); } return(1); } /* Check the name in a directory entry. */ chkname(ino, dp) inode_nr ino; dir_struct *dp; { register n = NAME_SIZE + 1; register char *p = dp->d_name; if (*p == 0) { printf("null name found in "); printpath(0, 0); setbit(spec_imap, (bit_nr) ino); if (remove(dp)) return(0); } while (--n != 0 && *p != 0) if (*p++ == '/') { printf("found a '/' in entry of directory "); printpath(1, 0); setbit(spec_imap, (bit_nr) ino); printf("entry = '"); printname(dp->d_name); printf("')"); if (remove(dp)) return(0); break; } return(1); } /* Check a directory entry. Here the routine `descendtree' is called * recursively to check the file or directory pointed to by the entry. */ chkentry(ino, pos, dp) inode_nr ino; file_pos pos; dir_struct *dp; { char *cp1, *cp2; int i; if (dp->d_inum < ROOT_INODE || dp->d_inum > sb.s_ninodes) { printf("bad inode found in directory "); printpath(1, 0); printf("ino found = %u, ", dp->d_inum); printf("name = '"); printname(dp->d_name); printf("')"); if (yes(". remove entry")) { cp1 = (char *) &nulldir; cp2 = (char *) dp; i = sizeof(dir_struct); while (i--) *cp2++ = *cp1++; return(0); } return(1); } if ((unsigned) count[dp->d_inum] == MAX_LINKS) { printf("too many links to ino %u\n", dp->d_inum); printf("discovered at entry '"); printname(dp->d_name); printf("' in directory "); printpath(0, 1); if (remove(dp)) return(0); } count[dp->d_inum]++; if (strcmp(dp->d_name, ".") == 0) { top->st_presence |= DOT; return(chkdots(ino, pos, dp, ino)); } if (strcmp(dp->d_name, "..") == 0) { top->st_presence |= DOTDOT; return(chkdots(ino, pos, dp, ino == ROOT_INODE ? ino : top->st_next->st_dir->d_inum)); } if (!chkname(ino, dp)) return(0); if (bitset(dirmap, (bit_nr) dp->d_inum)) { printf("link to directory discovered in "); printpath(1, 0); printf("name = '"); printname(dp->d_name); printf("', dir ino = %u)", dp->d_inum); return !remove(dp); } return(descendtree(dp)); } /* Check a zone of a directory by checking all the entries in the zone. * The zone is split up into chunks to not allocate too much stack. */ chkdirzone(ino, ip, pos, zno) inode_nr ino; d_inode *ip; file_pos pos; zone_nr zno; { dir_struct dirblk[CDIRECT]; register dir_struct *dp; register n = SCALE * (NR_DIR_ENTRIES / CDIRECT), dirty; register long offset = zaddr(zno); do { devread(offset, (char *) dirblk, DIRCHUNK); dirty = 0; for (dp = dirblk; dp < &dirblk[CDIRECT]; dp++) { if (ip->i_size - pos < DIR_ENTRY_SIZE) { printf("bad format in directory "); printpath(2, 0); if (yes(". truncate")) { setbit(spec_imap, (bit_nr) ino); ip->i_size = pos; dirty = 1; } else return(0); } if (dp->d_inum != NO_ENTRY && !chkentry(ino, pos, dp)) dirty = 1; if ((pos += DIR_ENTRY_SIZE) >= ip->i_size) break; } if (dirty) devwrite(offset, (char *) dirblk, DIRCHUNK); offset += DIRCHUNK; } while (--n && pos < ip->i_size); return(1); } /* There is something wrong with the given zone. Print some details. */ errzone(mess, zno, level, pos) char *mess; zone_nr zno; file_pos pos; { printf("%s zone in ", mess); printpath(1, 0); printf("zno = %u, type = ", zno); switch (level) { case 0: printf("DATA"); break; case 1: printf("SINGLE INDIRECT"); break; case 2: printf("DOUBLE INDIRECT"); break; default: printf("VERY INDIRECT"); } printf(", pos = %D)\n", pos); } /* Found the given zone in the given inode. Check it, and if ok, mark it * in the zone bitmap. */ markzone(ino, zno, level, pos) inode_nr ino; zone_nr zno; file_pos pos; { register bit_nr bit = (bit_nr) zno - FIRST + 1; ztype[level]++; if (zno < FIRST || zno >= sb.s_nzones) { errzone("out-of-range", zno, level, pos); return(0); } if (bitset(zmap, bit)) { setbit(spec_zmap, bit); errzone("duplicate", zno, level, pos); return(0); } nfreezone--; if (bitset(spec_zmap, bit)) errzone("found", ino, zno, level, pos, bit); setbit(zmap, bit); return(1); } /* Check an indirect zone by checking all of its entries. * The zone is split up into chunks to not allocate too much stack. */ chkindzone(ino, ip, pos, zno, level) inode_nr ino; d_inode *ip; file_pos *pos; zone_nr zno; { zone_nr indirect[CINDIR]; register n = NR_INDIRECTS / CINDIR; register long offset = zaddr(zno); do { devread(offset, (char *) indirect, INDCHUNK); if (!chkzones(ino, ip, pos, indirect, CINDIR, level - 1)) return(0); offset += INDCHUNK; } while (--n && *pos < ip->i_size); return(1); } /* Return the size of a gap in the file, represented by a null zone number * at some level of indirection. */ file_pos jump(level){ file_pos power = ZONE_SIZE; if (level != 0) do power *= NR_INDIRECTS; while (--level); return(power); } /* Check a zone, which may be either a normal data zone, a directory zone, * or an indirect zone. */ zonechk(ino, ip, pos, zno, level) inode_nr ino; d_inode *ip; file_pos *pos; zone_nr zno; { if (level == 0) { if ((ip->i_mode & I_TYPE) == I_DIRECTORY && !chkdirzone(ino, ip, *pos, zno)) return(0); *pos += ZONE_SIZE; return(1); } else return chkindzone(ino, ip, pos, zno, level); } /* Check a list of zones given by `zlist'. */ chkzones(ino, ip, pos, zlist, len, level) inode_nr ino; d_inode *ip; file_pos *pos; zone_nr *zlist; { register ok = 1, i; for (i = 0; i < len && *pos < ip->i_size; i++) if (zlist[i] == NO_ZONE) *pos += jump(level); else if (!markzone(ino, zlist[i], level, *pos)) { *pos += jump(level); ok = 0; } else if (!zonechk(ino, ip, pos, zlist[i], level)) ok = 0; return(ok); } /* Check a file or a directory. */ chkfile(ino, ip) inode_nr ino; d_inode *ip; { register ok, i, level; file_pos pos = 0; ok = chkzones(ino, ip, &pos, &ip->i_zone[0], NR_DZONE_NUM, 0); for (i = NR_DZONE_NUM, level = 1; i < NR_ZONE_NUMS; i++, level++) if (!chkzones(ino, ip, &pos, &ip->i_zone[i], 1, level)) ok = 0; return(ok); } /* Check a directory by checking the contents. Check if . and .. are present. */ chkdirectory(ino, ip) inode_nr ino; d_inode *ip; { register ok; setbit(dirmap, (bit_nr) ino); if (ip->i_size > MAXDIRSIZE) { printf("warning: huge directory: "); printpath(2, 1); } ok = chkfile(ino, ip); if (!(top->st_presence & DOT)) { printf(". missing in "); printpath(2, 1); ok = 0; } if (!(top->st_presence & DOTDOT)) { printf(".. missing in "); printpath(2, 1); ok = 0; } return(ok); } /* Check the mode of an inode, and if it is a file or a directory, check * the contents. */ chkmode(ino, ip) inode_nr ino; d_inode *ip; { switch (ip->i_mode & I_TYPE) { case I_REGULAR: nregular++; return chkfile(ino, ip); break; case I_DIRECTORY: ndirectory++; return chkdirectory(ino, ip); case I_BLOCK_SPECIAL: nblkspec++; return(1); case I_CHAR_SPECIAL: ncharspec++; return(1); default: nbadinode++; printf("bad mode of "); printpath(1, 0); printf("mode = %o)", ip->i_mode); return(0); } } /* Check an inode. */ chkinode(ino, ip) inode_nr ino; d_inode *ip; { if (ino == ROOT_INODE && (ip->i_mode & I_TYPE) != I_DIRECTORY) { printf("root inode is not a directory "); printf("(ino = %u, mode = %o)\n", ino, ip->i_mode); fatal(""); } if (ip->i_nlinks == 0) { printf("link count zero of "); printpath(2, 0); return(0); } nfreeinode--; setbit(imap, (bit_nr) ino); if ((unsigned) ip->i_nlinks > MAX_LINKS) { printf("link count too big in "); printpath(1, 0); printf("cnt = %u)\n", (unsigned) ip->i_nlinks); count[ino] -= MAX_LINKS; setbit(spec_imap, (bit_nr) ino); } else count[ino] -= (unsigned) ip->i_nlinks; return chkmode(ino, ip); } /* Check the directory entry pointed to by dp, by checking the inode. */ descendtree(dp) dir_struct *dp; { d_inode inode; register inode_nr ino = dp->d_inum; register visited; struct stack stk; char *cp1, *cp2; int i; stk.st_dir = dp; stk.st_next = top; top = &stk; if (bitset(spec_imap, (bit_nr) ino)) { printf("found inode %u: ", ino); printpath(0, 1); } visited = bitset(imap, (bit_nr) ino); if (!visited || listing) { devread(inoaddr(ino), (char *) &inode, INODE_SIZE); if (listing) list(ino, &inode); if (!visited && !chkinode(ino, &inode)) { setbit(spec_imap, (bit_nr) ino); if (yes("remove")) { count[ino] += inode.i_nlinks - 1; clrbit(imap, (bit_nr) ino); devwrite(inoaddr(ino), nullbuf, INODE_SIZE); cp1 = (char *) &nulldir; cp2 = (char *) dp; i = sizeof(dir_struct); while (i--) *cp2++ = *cp1++; top = top->st_next; return(0); } } } top = top->st_next; return(1); } /* Check the file system tree. */ chktree(){ dir_struct dir; if (!makefs) nfreeinode = sb.s_ninodes; nfreezone = N_DATA; dir.d_inum = ROOT_INODE; dir.d_name[0] = 0; if (!descendtree(&dir)) fatal("bad root inode"); printf("\n"); } /* Print the totals of all the objects found. */ printtotal(){ printf("blocksize = %5d ", BLOCK_SIZE); printf("zonesize = %5d\n", ZONE_SIZE); printf("\n"); pr("%6u Regular file%s\n", nregular, "", "s"); pr("%6u Director%s\n", ndirectory, "y", "ies"); pr("%6u Block special file%s\n", nblkspec, "", "s"); pr("%6u Character special file%s\n", ncharspec, "", "s"); if (nbadinode != 0) pr("%6u Bad inode%s\n", nbadinode, "", "s"); pr("%6u Free inode%s\n", nfreeinode, "", "s"); /* Don't print some fields. printf("\n"); pr("%6u Data zone%s\n", ztype[0], "", "s"); pr("%6u Single indirect zone%s\n", ztype[1], "", "s"); pr("%6u Double indirect zone%s\n", ztype[2], "", "s"); */ pr("%6u Free zone%s\n", nfreezone, "", "s"); } /* Check the device which name is given by `f'. The inodes listed by `clist' * should be listed separately, and the inodes listed by `ilist' and the zones * listed by `zlist' should be watched for while checking the file system. */ chkdev(f, clist, ilist, zlist) char *f, **clist, **ilist, **zlist; { if (automatic || makefs) repair = 1; device = f; initvars(); #ifndef STANDALONE devopen(); #endif getsuper(); chksuper(); #ifndef STANDALONE lsi(clist); #endif getbitmaps(); initbitmap(imap, (bit_nr) sb.s_ninodes + 1, N_IMAP); initbitmap(zmap, (bit_nr) sb.s_nzones - FIRST + 1, N_ZMAP); #ifndef STANDALONE fillbitmap(spec_imap, (bit_nr) 1, (bit_nr) sb.s_ninodes + 1, ilist); fillbitmap(spec_zmap, (bit_nr) FIRST, (bit_nr) sb.s_nzones, zlist); #endif getcount(); chktree(); chkmap(zmap, spec_zmap, (bit_nr) FIRST - 1, BLK_ZMAP, N_ZMAP, (bit_nr) sb.s_nzones, "zone"); chkcount(); chkmap(imap, spec_imap, (bit_nr) 0, BLK_IMAP, N_IMAP, (bit_nr) sb.s_ninodes + 1, "inode"); chkilist(); printtotal(); #ifndef STANDALONE putbitmaps(); freecount(); devclose(); #endif if (changed) printf("----- FILE SYSTEM HAS BEEN MODIFIED -----\n\n"); } main(argc, argv) char **argv; { register char **clist = 0, **ilist = 0, **zlist = 0; #ifdef STANDALONE register c, command; if (virgin) floptrk = tracksiz; /* save 9 or 15 in floptrk */ virgin = 0; /* only on first pass thru */ if (tracksiz < 9 || cylsiz < 18) printf("Bootblok gave bad tracksiz\n"); rwbuf = rwbuf1; prog = "fsck"; printf("\n\n\n\n"); for (;;) { printf("\nHit key as follows:\n\n"); printf(" = start MINIX (root file system in drive 0)\n"); printf(" f check the file system (first insert any file system diskette)\n"); printf(" l check and list file system (first insert any file system diskette)\n"); printf(" m make an (empty) file system (first insert blank, formatted diskette)\n"); printf(" h check hard disk file system\n"); printf("\n# "); c = getc(); command = c & 0xFF; printf("%c\n", command); part_offset = 0; partition = 0; drive = 0; switch (command) { case 'h': get_partition(); drive = (partition < PARB ? 0x80 : 0x81); cylsiz = 68; tracksiz = 17; printf("Checking hard disk. %s\n", answer); if (read_partition() < 0) continue; repair = 1; break; case 'f': printf("Checking diskette. %s\n", answer); disktype(); /* init tracksiz & cylsiz */ repair = 1; break; case 'l': printf("Checking diskette. %s\n", answer); listing = listsuper = 1; disktype(); /* init tracksiz & cylsiz */ break; case 'm': printf("Making empty file system\n"); disktype(); /* init tracksiz & cylsiz */ makefs = 1; if (tracksiz == 15) { /* 1.2M diskette. */ zone_ct = 1200; inode_ct = 255; } break; case '=': return((c >> 8) & 0xFF); default: printf("Illegal command\n"); continue; } chkdev("disk(ette)", clist, ilist, zlist); repair = listing = listsuper = makefs = 0; } #else /* STANDALONE */ register devgiven = 0; register char *arg; rwbuf = rwbuf1; #ifdef DOS if (DMAoverrun(rwbuf1)) rwbuf = rwbuf2; disktype() /* init tracksiz & cylsize for disk in A: */ #endif sync(); prog = *argv++; while ((arg = *argv++) != 0) if (arg[0] == '-' && arg[1] != 0 && arg[2] == 0) switch (arg[1]) { case 'a': automatic ^= 1; break; case 'c': clist = getlist(&argv, "inode"); break; case 'i': ilist = getlist(&argv, "inode"); break; case 'z': zlist = getlist(&argv, "zone" ); break; case 'r': repair ^= 1; break; case 'l': listing ^= 1; break; case 's': listsuper ^= 1; break; case 'm': makefs ^= 1; break; default: printf("%s: unknown flag '%s'\n", prog, arg); } else { chkdev(arg, clist, ilist, zlist); clist = 0; ilist = 0; zlist = 0; devgiven = 1; } if (!devgiven) chkdev("/dev/disk", clist, ilist, zlist); return(0); #endif /*STANDALONE*/ } get_partition() { /* Ask for a partition number and wait for it. */ char chr; while (1) { printf("\n\nPlease enter partition number. Drive 0: 1-4, drive 1: 6-9, then hit RETURN: "); while (1) { chr = getc(); printf("%c", chr); if (chr == '\r') { printf("\n"); if (partition > 0) return; else break; } else { if (partition > 0) break; } if (chr < '1' || chr > '9' || chr == '5') break; partition = chr - '0'; } partition = 0; } } /* This define tells where to find things in partition table. */ #define P1 0x1C6 int read_partition() { /* Read the partition table to find out where the requested partition * begins. Put the sector offset in 'part_offset'. */ int error, p, retries = 0; long val[4]; long b0, b1, b2, b3; while (1) { retries++; if (retries > 5) { printf("Disk errors. Can't read partition table\n"); return(-1); } error = diskio(READING, 0, rwbuf, 1); if ( (error&0xFF00) == 0) break; } /* Find start of the requested partition and set 'part_offset'. */ for (p=0; p<4; p++) { b0 = rwbuf[P1+16*p+0] & 0xFF; b1 = rwbuf[P1+16*p+1] & 0xFF; b2 = rwbuf[P1+16*p+2] & 0xFF; b3 = rwbuf[P1+16*p+3] & 0xFF; val[p] = (b3<<24) | (b2<<16) | (b1<<8) | b0; if (val[p] > 65535) { printf("Fsck can't handle partitions above sector 65535\n"); exit(1); } } p = (partition >= PARB ? partition - PARB + 1 : partition); sort(val); part_offset = (unsigned) val[p-1]; if ((part_offset % (BLOCK_SIZE/SECTOR_SIZE)) != 0) part_offset = (part_offset/(BLOCK_SIZE/SECTOR_SIZE)+1)*(BLOCK_SIZE/SECTOR_SIZE); return(0); } sort(val) register long *val; { register int i,j; for (i=0; i<4; i++) for (j=0; j<3; j++) if ((val[j] == 0) && (val[j+1] != 0)) swap(&val[j], &val[j+1]); else if (val[j] > val[j+1] && val[j+1] != 0) swap(&val[j], &val[j+1]); } swap(first, second) register long *first, *second; { register long tmp; tmp = *first; *first = *second; *second = tmp; }  €¢`ė‹&ščėžėžU‰åƒģčČčÆ Ąt FšPč×^ėB1ĄPøœPčŅ^^ Ą}ø’’PčĶ’^øPø¤Pč¹^^øPø®Pč¬^^øøPč)^øž’P裒^1ĄPøĄPč^^‰Fņƒ~ņuDFöPčb^‰Fźƒ~ź~Vƒ~źtėē€~ö1tėߊFų0ä˜-0‰Fģƒ~ģ|̓~ģ |ėÅ’vģč^ė¼øPøŹPč6^^‰FņøPøŌP’vņčGƒÄėž’vņčł^ĒFčƒ~čøP’vččG^^’FčėéFīPčģ^‰Fš’0 ĒFčƒ~č }ę‹FčŃą‰Ć‹Fš9‡2 u’včč^’FčėŽU‰åPčƒ‰Fžƒ~žt‹FŃą‰Ć‹Fž‰‡2 ’0 é€1ĄPč{^‹F0¢˜1ĄPøPč†^^ Ątøż’P聞^øPøPčm^^=tøż’Pčgž^øPøPčS^^=tøż’PčMž^øšPčĆ^øPč»^ø Pč³^øPč«^‰ģ]Ɖģ]ĆU‰åP‹F‰FžøP’vž1ĄPč ƒÄ Ą1ĄPė!‹^ž€? uƒFž‹^žĘ‹Fž+FPėƒFžėĘX‰ģ]ĆU‰åøF PFP’včMƒÄ‰ģ]ĆU‰åP^‰^ž’vžƒFž[ƒ?tėń‹^ž’7FP’včƒÄ‰ģ]ĆU‰åøF P’v’včƒÄ‰ģ]ĆU‰åģdžņūdžšū‹F‰†žū‹F‰†üū’¶žūƒ†žū[ƒ?t’†ņūėė’¶üūƒ†üū[ƒ?t’†šūėėdžģū‹†šū†ņū÷¦ģū‰Ęšü‰žśū‹žņūžśūžšūv9órøł’Péržü‰žųū‹†ņū‰ƒ†ųūdžōū‹†ņū9†ōū}qžü‹†śū)Ų‰†źū‹†źū‹žųū‰ƒ†ųū’vƒF[‹‰†öū‹žöūŠ0ä˜ Ąt'’¶öūƒ†öū[‹¶śūŠˆƒ†śū^9žśūrÓøł’P鹋žśūĘƒ†śū’†ōūė…‹žųūĒƒ†ųūdžōū‹†šū9†ōū}pžü‹†śū)Ų‰†źū‹†źū‹žųū‰ƒ†ųū’vƒF[‹‰†öū‹žöūŠ0ä˜ Ąt&’¶öūƒ†öū[‹¶śūŠˆƒ†śū^9žśūrÓøł’Pėc‹žśūĘƒ†śū’†ōū놋žųūĒƒ†ųūžü‹†śū)Ų†ģūH™÷¾ģū÷¦ģū‰†īū1ĄP†üP’v1ĄP’¶īū’včµ^Pø;P1ĄPčŹƒÄPX‰ģ]ĆU‰åPPĘFüĘFżĘFžĘF’1ĄPFüP’v1ĄPøP’včt^Pø;P1ĄPč‰ƒÄ‰ģ]ĆU‰å1ĄPPPPPPøP1ĄPčmƒÄ‰ģ]ĆU‰å1ĄPPPPP’vøPøPčNƒÄ‰ģ]ĆU‰å’v’vøPøPčoƒÄ‰ģ]ĆU‰åP1ĄPP’vP’v’vøPøPčƒÄ‰Fž‹Fž‰ģ]ĆU‰åPP‹FŃą-‰Ć‹‡H ‰Fü‹FŃą-‰Ć‹F‰‡H ‹^‰n ƒ~tƒ~u’vėøæPx ø0P1ĄPčK^^‰Fžƒ~ž}’vžė’vüX‰ģ]ĆPSQRVWU‰ć‹_KŪ‹ŸH ’6l ’ӏl ]_^ZY[X ĻU‰å1ĄPPPPPPø$PøPčVƒÄ‰ģ]ĆU‰åP1ĄPPPPPPøP1ĄPč9ƒÄ‰Fž‹n ‹v‰‹Fž‰ģ]ĆU‰å1ĄPP’vP’v’vøPøPčƒÄ‰ģ]ĆU‰å‹^‰n ‹^ ‰p ‹^ ‰r ‹^‰t ‹^‰v ‹^‰x ’v’včd^^‰ģ]ĆU‰åPP’v č˜^‰Fž‹^ž‰n ‹^‰p ‹^ ‰r ĒFüt ƒ~ž ’vž’NžX Ąt’v ƒF [‹vüŠˆƒFüėą’v’vč^^‰ģ]ĆU‰åP‹^‰l øj P’vča^^‰Fžƒ~žt’vžėƒ>l }‹l ÷Ū‰h ø’’Pė’6l X‰ģ]ĆU‰åPĒFž’vƒF[Š0ä˜ Ąt’Fžėź‹Fž@‰ģ]ùė ¹ė¹ėU‰å‹F‹^Ķ ]ĆŚŚ/dev/tty?0 /etc/rc/dev/tty0/dev/tty0/bin/sh/etc/ttys/dev/tty0Init can't open /etc/ttys /usr/bin/login/bin/login/bin/sh/usr/bin/sh/* This process is the father (mother) of all MINIX user processes. When * MINIX comes up, this is process 2. It executes the /etc/rc shell file and * then reads the /ect/ttys file to find out which terminals need a login * process. */ #include "../h/signal.h" #define PIDSLOTS 10 #define STACKSIZE 256 #define DIGIT 8 char name[] = {"/dev/tty?"}; /* terminal names */ int pid[PIDSLOTS]; /* pids of init's own children */ int pidct; extern int errno; char stack[STACKSIZE]; char *stackpt = &stack[STACKSIZE]; main() { char line[10]; /* /etc/ttys lines are supposed to be 3 chars */ int rc, tty, k, status, ttynr, ct, i; /* Carry out /etc/rc. */ sync(); /* force buffers out onto RAM disk */ if (fork()) { /* Parent just waits. */ wait(&k); } else { /* Child exec's the shell to do the work. */ if (open("/etc/rc", 0) < 0) exit(-1); open("/dev/tty0", 1); /* std output */ open("/dev/tty0", 1); /* std error */ execn("/bin/sh"); exit(-2); /* impossible */ } /* Read the /etc/ttys file and fork off login processes. */ if ( (tty = open("/etc/ttys", 0)) == 0) { /* Process /etc/ttys file. */ while ( (ct = getline(line)) > 1) { if (ct != 4) continue; if (line[0] != '1') continue; ttynr = line[2] - '0'; if (ttynr < 0 || ttynr >= PIDSLOTS) continue; startup(ttynr); } } else { tty = open("/dev/tty0", 1); write(tty, "Init can't open /etc/ttys\n", 26); while (1) ; /* just hang -- system cannot be started */ } close(tty); /* All the children have been forked off. Wait for someone to terminate. * Note that it might be a child, in which case a new login process must be * spawned off, or it might be somebody's orphan, in which case ignore it. * First ignore all signals. */ for (i = 1; i <= NR_SIGS; i++) signal(i, SIG_IGN); while (1) { k = wait(&status); pidct--; /* Search to see which line terminated. */ for (i = 0; i < PIDSLOTS; i++) if (pid[i] == k) startup(i); } } startup(linenr) int linenr; { /* Fork off a process for the indicated line. */ int k; if ( (k = fork()) != 0) { /* Parent */ pid[linenr] = k; pidct++; } else { /* Child */ close(0); /* /etc/ttys may be open */ name[DIGIT] = '0' + linenr; if (open(name, 0) != 0) exit(-3); /* standard input */ if (open(name, 1) != 1) exit(-3); /* standard output */ if (open(name, 1) != 2) exit(-3); /* standard error */ execn("/usr/bin/login"); execn("/bin/login"); execn("/bin/sh"); /* last resort, if mount of /usr failed */ execn("/usr/bin/sh"); /* last resort, if mount of /usr failed */ return; /* impossible */ } } int getline(buf) char *buf; { /* Read a line from standard input. */ char *p; p = buf; while (1) { if (read(0, p, 1) <= 0) return(0); if (*p == '\n') { p++; *p = 0; return(p - buf); /* count of chars read */ } else { p++; } } } É_name ® _name: Ā25647 Ā30309 Ā29743 Ā31092 É_stackpt Ā63 _stackpt: Ā_stack+256 É_main † _main: ƒ ‚ ×ņ,#24 Ó_sync Ó_fork ™ je I0013 Ūä-1Ī € Ó_wait Š ĢI0014 • ‡ € Ąį_1 € Ó_open Š Š ™ jge I0016 Ąį-1 € Ó_exit Š ½  € Ąį_2 € Ó_open Š Š  € Ąį_3 € Ó_open Š Š Ąį_4 € Ó_execn Š Ąį-2 € Ó_exit Š I0014: ‡ € Ąį_5 € Ó_open Š Š Ą-1Å,ė Ķ-1Åö ŁI0019 I001C: Ūä-10(ń) € Ó_getline Š Ą-22(ń),ė Ķ-22(ń),#1 jle I001A Ķ-22(ń),#4 je I001F ĢI001C I001F: cmpb -10(ń),#49 je I00112 ĢI001C I00112: Źal,Ų Ž ‹ ×į48 Ą-20(ń),ė Ķ-20(ń)ö jl I001C Ķ-20(ń),#10 jl I00115 ĢI001C I00115: Į-20(ń) Ó_startup Š ĢI001C I0019:  € Ąį_6 € Ó_open Š Š Ą-1Å,ė “6 € Ąį_7 € Į-1Å Ó_write ¤ I00119: š9 I001A: Į-1Å Ó_close Š Ą-2Å,#1 I0011E: Ķ-2Å,Ń jg I00120  € Į-2Å Ó_ļgnal Š Š Ü-2Å šE I00120: Ūä-1Ō € Ó_wait Š Ą-1Ī,ė ó_pidct Ą-2Åö I00125: Ķ-2Å,#10 jge I00120 Ąä-2Å sal į1 » Ąä-1Ī Ķ_pidĒ,ė ŁI00123 Į-2Å Ó_startup Š I00123: Ü-2Å ĢI00125 É_startup _startup: ƒ ‚ € Ó_fork ” ĶĘö je I0023 ¢ sal į1 » — Ą_pidĒ,ė Ü_pidct ĢI0024 I0023: ‡ € Ó_close Š ¢ Äį48 Ź_name+8,al ‡ € Ąį_name € Ó_open Š Š ™ je I0026 Ąį-3 € call _exit Š I0026:  € Ąį_name € Ó_open Š Š Ķį1 je I0029 Ąį-3 € Ó_exit Š I0029:  € Ąį_name € Ó_open Š Š Ķį2 je I002C Ąį-3 € Ó_exit Š I002C: Ąį_8 € Ó_execn Š Ąį_9 € Ó_execn Š Ąį_10 € Ó_execn Š Ąį_11 € Ó_execn Š … „  I0024: … „  É_getline _getline: ƒ ‚ € ¢ ” I0033:  € ” ‡ € Ó_read ¤ ™ jg I0036 ‡ € ĢI0031 I0036: § cmpb Ē,#10 ŁI0039 ÄĘ,#1 § ŹĒö — ×äÅ € ĢI0031 I0039: ÄĘ,#1 ĢI0033 I0031:  … „  É_stack ³ _stack: .zerow 256/2 É_pidct _pidct: .zerow 2/2 É_pid _pid: .zerow 20/2 ® _1: Ā25903 Ā25460 .word 29231 Ā99 _2: Ā25647 Ā30309 Ā29743 Ā31092 Ā48 _3: Ā25647 Ā30309 Ā29743 Ā31092 Ā48 _4: Ā25135 Ā28265 Ā29487 Ā104 _5: Ā25903 Ā25460 Ā29743 Ā31092 Ā115 _6: Ā25647 Ā30309 Ā29743 Ā31092 Ā48 _7: Ā28233 Ā29801 Ā25376 Ā28257 Ā29735 Ā28448 Ā25968 Ā8302 Ā25903 Ā25460 Ā29743 Ā31092 Ā2675 ø _8: Ā29999 Ā29299 Ā25135 Ā28265 Ā27695 Ā26479 Ā28265 ø _9: Ā25135 Ā28265 Ā27695 Ā26479 Ā28265 ø _10: Ā25135 Ā28265 Ā29487 Ā104 _11: Ā29999 Ā29299 Ā25135 Ā28265 Ā29487 Ā104 †  Pfķ %ėśŒČŽŲ”ŽŲŽŠ‰`p¼ŹƒÄč!ėžč…‹.ø{’v’v’6ź‹’včDGéÄčkčŸé»čbčÉVé²čYĒŠ‹øĪ‹Pøū’PčāEé›čBĒŠ‹øĪ‹Pøś’PčĖEé„č+ĒŠ‹øĪ‹Pøż’Pč“Eėnččėfč č±ė^ččāėVŽbfdf‰`f‹ø{ƒĆGG ŒW‰g‰ÜŒŪŽÓ’6bfŽĆUWVRQ’6`fP¼ŹƒÄĒÄlʃƒÄl”df’ą>ź‹üt5ś‹&ø{X[YZ^_‰ff‰ć‹o&‰.Äl‹o‰.hf]‹g ŽW’w’w’w ÅffĻū›ėżU‰åƒģč·WĒFų`‹RfPf‰^ś‹FśFų‰FöĒFžŗ{~žvéĒFüƒ~ü })¹»‹Füč)b¹Óą¹»čb‹^üŃć^ž‰’FüėыFž-ŗ{»V™÷ū-‰Fü~žj~s¹‹FüÓą ‰ĆĆŹ„SėøP‹^žX‰G‹^ž‹vž‹G‰D2‹^žƒ2t‹^žƒĆ2‰^ī‹^‹FüŃą‰Ć‹vž‹‡Ŗl‰D‹^žƒuƒ~ü|’vžčrI^‹^žĒG‹^žĒGƒ~ü}P‹^žĒG$ ™‹^ž‹Fų‰G"‹^žĒG* ™‹Pf^ų‹vž‰\(‹^žĒG0 ™‹Pf^ųRf‹vž‰\.‹RfPf‹vž‰\,雸V÷füZ‰Ć‹‡č{‰Fō‹Füѹѹ‰Ć‹vž‹‡Pf‰D$ƒ~üu’vöė’vō‹^žX‰G"‹Füѹѹ‰Ć‹vž‹‡Pf‰D*‹Füѹѹ‰Ć‹vž‹‡PfD"‰D(‹Füѹѹ‰Ć‹vž‹‡Pf‰D,‹Füѹѹ‰Ć‹vž‹‡PfD(‰D.‹^ž’w"¹»Xčt`‹^ž‰G‹^ž’w(¹»Xč^`‹^ž‰G‹^ž’w(¹»XčH`‹^ž‰G‹^ž’w(¹»Xč2`‹^ž‰GƒFžVéŪżĒ*~ʃ*~ĒF~ʃƒF~ĒFžl~žŹƒs‹^žĒGƒFžVėėčØU£bpøPø’’PčaV^^‰Fü¹»‹FüčŅ_=üuĒŹ‹øPøęlPøPø~PčDAƒÄ‰Fš‰Vņ1ĄPøP’vņ’vš1ĄPPčūSƒÄ ĒFüƒ~ü}’vųø’P’vüčČƒÄ’FüėåĒFü~ü}’vųøšP’vüč§ƒÄ’Füėä’vųø¢P1ĄPč’ƒÄ’vųø"Pø PčƒÄ’vųø|PøPčpƒÄ’vųø<Pø Pč_ƒÄ’vųøNPøPčNƒÄ’vųøEPøPč=ƒÄƒ>Ź‹t’vųøePøvPč%ƒÄė’vųøePø PčƒÄ1ĄPøŗ{PøPčƒÄǶ{~čF1ĄPø!PčŹS^^1ĄPø”Pč¾S^^čÜū‰ģ]ĆU‰åøzfPč§Y^‹ø{¹‹G*ÓąP’wø˜fPčYƒÄ‰ģ]ĆU‰åø¼fPč~Y^øÜfPčvY^øgPčnY^‹ø{¹‹G*ÓąP’wøLgPčVYƒÄ‰ģ]ĆU‰åøpgPčEY^‹ø{¹‹G*ÓąP’wø–gPč-YƒÄ‰ģ]ĆU‰å‹^€?t1’vøŗgPčY^^¹»‹FčÜ]=€t ’vøĢgPčōX^^øŠgPčėX^øŅgPčćX^čjT‰ģ]ĆU‰åƒģ ‹F‰Fü‹F‰Fž^ü‰^ś1Ą1Ū‹PfNŲPQøPYX[ćŃąŃÓāś‰Fö‰^ų¹»‹Fö’vųči]1ŪYFśŁQ¹»čW]‰FöFų‹F™¾1’‰Ć‰Š1ÉQ¹Qč^RP’vų’vöč“QƒÄ ‰ģ]ĆU‰åƒģ辍FčPøtPč$X^^ø‚÷fģ‰ĆĆ²q‰^ę’vźė^FčPč^^ėՍFčP’vęčv^^ėĒFčP’vęčš ^^ė¹FčP’vęčf ^^ė«FčP’vęčŁ^^ė1ĄPPPPøź’P’vī’včøDPčDƒÄ끾fi[éd\U‰åƒģčßQ‹^‹G‰FōĒFņpq‹^ōŠ0䘉Fü‹Fü‰Fś‹FüFüƒFō’vü’NüX Ą~’vōƒFō[‹vņŠˆƒFņėą‹^‹G‰Fō‹^ōĘč‹QĒFņpq’vś’NśX ĄéĀ’vņƒFņ[ŠˆFń’vņƒFņ[Š0䘉FüŠFń0ä˜P’vüčœ^^ø‚÷fü‰ĆĆ²q‰^ī‹^r~­‹^ī’·\¹»XčĢ[%"¹»čĄ[‰Fž‹^Īƒ~žuéz’‹^Ģém’’vīč¾^‰Fž‹^īŠ‡n0䘉FųЇo0䘉Fö1ĄPPPP’vž’vö’vųøCPčƒÄé0’‰ģ]ĆU‰åƒģ ø‚÷f‰ĆĆ²q‰^žŠF0ä˜=;|ŠF0ä˜=DŠF0ä˜Pč/^‰ģ]Ƌ^žæĢČ|‰ģ]Ƌ^ž’·\¹»Xč[%"¹»čöZ‰Fü‹^ž€æetŠF0ä˜Pč"^ˆFė.¹»‹FüčĶZ= t¹»ŠF0äčŗZ%¹»č®ZˆF€~u‰ģ]ƃ~üt¹»‹FüčZ=téWƒ~üté|ŠF0䘋^žPЇg0ä˜[9Ću>‹^ž€æcu4’vžčv^=’’t$øP’vžč*^^ø P’vžč^^øP’vžč^^‰ģ]ÊF0䘋^žPЇh0ä˜[9Ću:‹^ž€æcu0’vžč"^ Ąuėó‹^žŠ‡h0ä˜P’vžčĪ^^ø P’vžčĀ^^‰ģ]Ƌ^ž€æcuA€~\u‹^žĘ‡cŠF0ä˜P’vžč—^^‰ģ]ÊF0䘋^žPЇm0ä˜[9Ćté”ĘF鍋^žĘ‡cŠF0䘋^žPЇg0ä˜[9ĆtoŠF0䘋^žPЇh0ä˜[9ĆtYŠF0䘋^žPЇm0ä˜[9ĆtC‹^žĆȉ^ö‹vöø\P’7ƒ[Xˆ‹^žĆ̉^ö‹@‰‹^ž‹vžĘČ9·Ču ‹^ž‹Fž‰‡Č€~ u‹^ž’·\¹»XčėXØtĘF ŠF0䘋^žPЇi0ä˜[9ĆtŠF0䘋^žPЇj0ä˜[9Ću6ŠF0䘋^žPЇi0ä˜[9ĆuøPėøPFś’vś’v’vžčg ƒÄ‰ģ]ÊF0䘋^žPЇl0ä˜[9Ću ‹^žĘ‡d‰ģ]ÊF0䘋^žPЇk0ä˜[9Ću‹^žĘ‡d‹^ž‹‡Z’vž’Š^‰ģ]ƀ~ t€~u‹^žĆΉ^ö‹@‰‹^žĆȉ^ö‹vö1ĄŠFP’7ƒ[Xˆ‹^ž‹vžĘČ9·Ču ‹^ž‹Fž‰‡Č‹^žĆ̉^ö‹@‰ŠF0ä˜P’vžč„^^‰ģ]ĆU‰åƒģŠF0䘹»čØW%¹»čœW‰FžŠF0䘹»čŠW؀t1ĄPėøPFüƒ>Ģ‹t邃>npuƒ>lpt ‹^žŠ‡Bh0ä˜Pė ‹^žŠ‡īg0ä˜PFśƒ>fptƒ~ž} ‹^žŠ‡Bh0䘉Fśƒ~žF鯃>hpu鄃>npuƒ>lpt ‹^žŠ‡īg0ä˜Pė ‹^žŠ‡Bh0ä˜PFśéyƒ>npuƒ>lpt ‹^žŠ‡žh0ä˜Pė ‹^žŠ‡–h0ä˜PFśƒ>fptƒ~ž} ‹^žŠ‡Bh0䘉Fśƒ~žF~0ƒ>hpt)ƒ>npuƒ>lpt ‹^žŠ‡–h0ä˜Pė ‹^žŠ‡žh0ä˜PFś¹»‹FśčiV%’¹»č]V‰Fś¹»‹FśčNV=€r¹»‹Fśč=V=†s鎃>jpt'ƒ~śA| ƒ~śZƒFś ėƒ~śa|ƒ~śz ‹Fś- ‰Fśƒ>dpt¹»‹FśčōU €¹»ččU‰Fśƒ>fpt¹»‹FśčŅU%¹»čĘU‰Fśƒ~śuĒFśƒ~üuĒFś’vśé„¹»‹Fśč›U-€Pėh‹^ü‰npėf‹^ü‰lpė]‹^ü‰fpėT‹^ü‰dpėKƒ~ütƒ>źgt ø+jp£jpø+Fü£źgė)ƒ~ütƒ>ģgt ø+hp£hpø+Fü£ģgė¾xi[éńT1ĄPX‰ģ]ĆU‰å‹^’·\¹»Xč UØu‰ģ]ƀ~tŠF0ä˜P’vč– ^^’vč ^‰ģ]ĆU‰åPP‹^ƒæĢuø’’PėT‹^‹F9‡Čt ‹^‹‡ČHPė‹^ĆĒSFž‹^ž€? t‹^ž€? uø’’Pė‹^‹Fž‰‡Č‹^Ć̉^ü‹H‰1ĄPX‰ģ]ĆU‰åPP‹^ƒær~#‹^‹v1ĄPPPPøż’P’w’4øDPččƒÄ‰ģ]Ƌ^‹v‹ˆ„n‹^‹v‹Gˆ„o‹^‹v‹G‰„p‹^‹v‹G‰„r’vč0^‰Fž‹^Їo0䘉Fü‹^1ĄPPPP’vž’vü’7øDPčƒÄ‰ģ]ĆU‰åƒģ&‹^’·\¹»XčĀSØ"t1ĄPėøPFž‹^ƒæĢtƒ~žt‹^ƒæĪuøüPéé‹^Їo0䘻V÷㰉Áú{‰^ą‹^‹‡p‰Fš’·r¹»Xč^S‰Fī’vī’všøP’vąčŪ4ƒÄ‰Fź‰Vģ‹Fź‹^ģ-ƒŪu Ć Ūuøö’PéøPøppPøPø|Pč¤4ƒÄ‰Fę‰VčĒFöĒFōĒFņ‹^ƒæré;‹^‹v‹„Ģ9‡r} ‹^’·rė‹^’·ĢFų~ų}’vųėøPFųĒFüĒFāpp’vų’NųX Ąéw‹^Ćʉ^Ž‹vŽ’7ƒ[ŠˆFå‹^‹vĘČ9·Źu ‹^‹F‰‡Ź‹^āŠF刃Fā’Fü€~å t€~åu„‹^ĆΉ^Ž‹H‰ƒ~žt €~åu’Fņ’Fōƒ~žué{’ƒ~ņt‹FüHPė’vüFś‹Fś™RP’vģ’vź’vč’vęčfFƒÄ ‹Fś™FźVģ‰Fź‰Vģ‹FśFö‹^Ćr‰^Ś‹+Fü‰‹^Ć̉^Ś‹+Fü‰‹^ƒæĢt ƒ~ōuéøž‹^LJr’vöX‰ģ]ĆU‰åPP‹^LJP‹^LJ|‹^€æfu‰ģ]Ƌ^Їt0䘉FžŠ‡u0䘉Fü1ĄPPPP’v’vü’vžøDPčšƒÄ‹^ʇf‰ģ]ĆU‰åƒģ‹^‹v‹ˆ„t‹^‹v‹Gˆ„u‹^‹v‹G‰„v‹^‹v‹G‰„|‹^ʇf‹^LJ~‹^Їu0䘻V÷㰉Áú{‰^ś‹^‹‡v‰Fž’·|¹»XčÅP‰Fü’vü’vžøP’vśčB2ƒÄ‹^‰‡x‰—z‹^‹‡x‹z-ƒŁu Į Éu‹^LJ~ö’‹^LJ|‹^‹‡Z’v’Š^‰ģ]ĆU‰åƒģ&ĒFŚĒFüĒFžĒFųĒFś‹^’wé*‹^¹‹G ‹W ćŃśŃŲāś¹»Rč"P[%’ć‹^ˆ‡g‹^1ɋG ‹W ćŃśŃŲāś¹»RčöO[%’ć‹^ˆ‡h‹^‹v‹G‰„\éČ‹^¹‹G ‹W ćŃśŃŲāś¹»Rč¹O[%’ć‹^ˆ‡i‹^¹‹G ‹W ćŃśŃŲāś¹»RčŒO[%’ć‹^ˆ‡j‹^¹‹G ‹W ćŃśŃŲāś¹»Rč_O[%’ć‹^ˆ‡k‹^1ɋG ‹W ćŃśŃŲāś¹»Rč3O[%’ć‹^ˆ‡l‹^¹‹G‹WćŃśŃŲāś¹»RčO[%’ć‹^ˆ‡méå‹^Їg0䘙¹»RčßN[%’ćS¹»čĶN‰FōFö‹^Їh0䘙¹»Rč²N[%’ćS¹»č N‰FšFņ¹‹Fō‹^öćŃąŃÓāś Fš ^ņ‰Fų‰^ś‹^‹‡\™‰Fü‰Vžé]‹^Їi0䘙¹»RčWN[%’ćS¹»čEN‰FģFī‹^Їj0䘙¹»Rč*N[%’ćS¹»čN‰FčFź‹^Їk0䘙¹»RčżM[%’ćS¹»čėM‰FäFę‹^Їl0䘙¹»RčŠM[%’ćS¹»č¾M‰FąFā‹^Їm0䘙¹»Rč£M[%’ćS¹»č‘M‰F܏F޹‹Fč‹^źćŃąŃÓāś¹‹Vģ‹vīćŃāŃÖāś Ā Ž¹‹Fä‹^ęćŃąŃÓāś Š ó1ɋVą‹vāćŃāŃÖāś Ā Ž‰Vų‰vś¹‹F܋^ŽćŃąŃÓāś‰Fü‰^žėĒFŚź’ė¾ŠiZéųL‹^‹v’vś’vų’vž’vü’vŚ’w’4øDP荃ĉģ]ĆU‰å‹^ƒæru‹^ƒæ|u‰ģ]Ƌ^‹F‰‡Č‹^‹F‰‡Ź‹^LJ̋^LJ΋^LJr‹^LJ|‹^ʇf‹^ʇd‹^‹v1ĄPPPPøü’P’w’4øDPčƒÄ‰ģ]ĆU‰åƒģ‹F‰Fź‹F‰Fģ‹F ‰Fī‹F ‰Fö‹F‰Fų‹F‰Fņ‹F‰FōFčP’vč2G^^‰ģ]ĆU‰å‹^ʇdøü’P’včiś^^‹^‹F‰‡Č‹^‹F‰‡Ź‹^LJ̋^LJ΋F’vPču,^^‰ģ]ĆU‰åƒģ FüPø`Pčū@^^FžPøaPčī@^^¹»‹Fžč„K €PøaPčÅ@^^’vžøaPč¹@^^¹»‹Füč€K-€¹»čtK‰Fśƒ~ś~;ƒ~śu逃~ś*uéwƒ~ś6uénƒ~ś8thƒ~ś:tbƒ~śEt\ø PPča@^^‰ģ]ù»”uč$K% ¹»čK‰FųŠuˆN÷ƒ~ųu&ƒ>fptƒ~üu€~÷uĘuø PPč@^^‰ģ]ƃ>fptƒ>dpt ƒ~üSuč[A q0䘉Fś ‘q0ä˜9Fś}G‹FśFś‹Fś‰Ć‹Füˆ‡q‹Fś‰Ćʇq q0ä˜@¢qĒJpĒZpqøHpPøł’Pč-^^ė ø PPč“?^^‰ģ]ĆU‰åƒģ ‹^¹‹‡x‹—zćŃśŃŲāś¹»RčD= s’Füėź’vžøaPčU9^^č{9‰ģ]ĆU‰åƒģøPøÄPč;9^^øPøÅPč.9^^ĒFž²q~ž4use‹^ž‹Fž‰‡Č‹^ž‹Fž‰‡Ź‹^žĒ‡\ ‹^žĒ‡Z !"#$%&'()*+,-./0123P‹^žĘ‡g‹^žĘ‡h@‹^žĘ‡i‹^žĘ‡j‹^žĘ‡k‹^žĘ‡l‹^žĘ‡mFž‚ė”Ęuƒ>bptĒDpøĒBp’?Ē@pŠĒFpėĒDp°ĒBp’Ē@p°ĒFppĒ uĘ‘qøPø Pčž^^1ĄPø Pčž^^1ĄPPø²qPč¾üƒÄƒ>`p uĒĢ‹‰ģ]ĆU‰åŠF0ä˜Pø²qP脳^^‰ģ]ĆU‰å€~;učÕ9€~4u} ’64uø8jPč¤ä^^‹4u‰^ü‹:u‰^ś’66uė!ø4uPčC^‰Fžėø4uPč6^‰FžėĒFžź’ė¾.j[é0BĒ6uD‹^ś‰8u‹^ž‰:uø4uP’vüčR=^^ėU‰åƒģ ‹^‹G‰Fśƒ~ś|ƒ~ś|øū’Pé?ø÷fś‰ĆĆXu‰^ž‹^ž‹Fś‰G‹^‹G‹^ž‰‹^’w ’w 1ĄPøPčQCƒźƒŪu Ó Ūtøź’Péō‹^’w ’w 1ĄPøPččA‰Fō‰Nö‹Fō‹^ö-` ƒŪu!ĄtC Ū|ø˜’P齋^žŠG0䘣Lu¹»‹Fō’vöč„A‹LuŃćP’·ži¹»XčoA¹Óą1ŪSPč[B‹^ž‰G‹LuŃ拇ži™»ÖiS’vö’vōRPč©B[ӊ0䘋^ž‰G ¹»‹Fō’vöč&A‹LuŃćP’·ži¹»XčA¹Óą1ŪSPčźB‹LuŃ扩™÷æži‹^ž‰G ‹^‹vž‹G‰D‹^‹vž‹G‰D‹^‹vž‹G‰D‹^žtøź’PéŪĒFųƒ~ų~é•’Fų»‹Fų™÷ū Ņu‹LuC¹‰Ų™÷ł‰Lu‹^žˆWĒPu‹LuŃ拇 j™‹^ō‹Nö)ĆŃu!ŪtA É|먃>Putčv’vžčs^’vžčŠ^’vžčt^‰Füƒ~üté}’’vžčS^‰Füƒ~üuė ƒ~üūtéb’ĒTu ø¤&Pø“PčŚ^^ƒ~üu‹^žƒ~ĒNuƒ~üuøPėøū’PX‰ģ]ĆU‰åƒģ‹^ƒ?uøFPėøJP¹»Xč»?‰Fž‹^‹G‰Fš’w¹»Xč¢?‰Fī‹^øV÷g°‰Ć’vī’všøPĆŗ{Sč!ƒÄ‰Fź‰Vģ1ɋFź‹^ģćŃūŃŲāś¹»č]?%’¹»čQ?‰Fü¹‹Fź‹^ģćŃūŃŲāś¹»č4?%’¹»č(?‰Fś¹‹Fź‹^ģćŃūŃŲāś¹»č ?%’¹»č’>‰Fų‹Fī-1ÉÓč¹»čé>¹»čą>%’¹»čŌ>‰Fö‹Fī-¹Óč¹»č½>¹»č“>%’¹»čØ>‰Fō‹Fź‹^ģ-ƒŪu Ć Ūu¹»‹Fšč…>PøTjPč~ą^^1ĄP¹»‹Fź’vī’vģčf>[YZĮڃéƒŚRQøPYX[ćŃėŃŲāś%’ć‰Fņ‹Fų9Fņt ’vųøxjPč-ą^^čv3’vžø PčH3^^’vžø Pč<3^^’vüøPč03^^’vśøPč$3^^’vųøPč3^^’vöøPč 3^^’vōøPč3^^č&3øPø Pčš2^^‰ģ]ĆU‰åƒģč3‹^‹G‰ĮøÓą‰Fž’w¹»Xč–=P¹»‹Fžč‰= [ Ų¹»čz=£Tu‹Vu…Rut‹Ru Tu‹Fž#Vu‰Fü’6TuøņPč{2^^‹Tu‰Vu‹^ž‰Ruč’2ƒ~üt‰ģ]ƋLuŃćøµ,P’·"jčņ^^ø4uPøż’Pč$8^^‰ģ]ĆU‰å¹»”Tuč’<%šP¹»”Vučļ<%š[9Ćt’6TuøņPč2^^‹Tu‰Vu‰ģ]ĆU‰åP‹^€u’vč?^ Ątø’’PéĪ‹^‹v‹D9Gu1ĄPéŗøPč¢^‹^¹‹G Óą GPč^‹LuŃć‹v‹D÷§jPčz^ƒ>Putø’’Pé|ø4uPø’’Pčb7^^øPčW^’vč‰^‰Fž‹^ŠG0䘹»č,<%ų= tĒFž’’‹^ŠG0䘋LuŃć‹vP‹D÷§j[9ĆtĒFž’’ƒ~žt’včs^ Ątø’’Pė’vžX‰ģ]ĆU‰åƒģ ‹^€uøž’Pé‹^‹G‰Į‹VuÓūöĆuøž’Péėƒ>Ź‹t‹LuŃć’·ņiø÷Pč¼0^^‹^ƒ?uøęPėøÅP¹»Xčs;‰Fś’vśčx^‹^¹‹G Óą GPče^‹^’wč[^‹^’w čQ^‹^’w čG^ Źi0ä˜Pč<^‹LuŃć’·žič.^‹LuŃć’·ęič ^ø’Pč^ƒ>Putøž’Pé=ø4uPø’’Pč6^^’vč/^‰Fžƒ~žt’vžé‹^ŠG0䘹»čĘ:Øu‹^ŠG0䘹»č°:Øt‹^ĘG‹^ŠG0䘹»č“:Øt‹^’wøšjPč©5^^øū’P黋^ŠG0䘹»čg:Øųtøž’P鞋^ŠG0ä˜PŠG0ä˜[ Ų Ątøž’P逋^ŠG0ä˜+G¹»č):¹Óą‹LuŃćP’·ži¹»Xč:[÷ć¹»č:‰Fü‹^ŠG0ä˜+G ‹LuŃć÷§žiFü‰Fü‹^ŠG0ä˜+G Fü‰Füø÷fü9Gtøž’Pė1ĄPX‰ģ]ĆU‰åƒģĒFžƒ~ž|é¤ĒFųĒFüƒ~üd})FśPøōPčÅ.^^¹»‹Fśč|9؀tĒFųė’Füėу~ųuøż’Pėi¹»‹FśčT9Øu1ĄPėT¹»‹Fśč?9Ø@uøż’Pė>FśPøõPče.^^¹»‹Fśč9%’¹»č9‹^^žˆG’FžéS’ĒPuøż’PX‰ģ]ĆU‰åƒģƒ>Put‰ģ]ĆĒFžd’vž’NžX Ą~KFüPøōPč.^^¹»‹Füčø8%Ą¹»č¬8‰Fü¹»‹Füč8=€tėŗ’vøõPč·-^^‰ģ]ĆĒPu‰ģ]ĆU‰åP’vč³ś^øPčx’^‹^’wčn’^ƒ>Putø’’Pėmø4uPø’’PčW3^^øPčL’^’vč~ž^‰Fž‹^ĒG’’ƒ~žu#‹^ŠG0䘹»č8%ų= u ‹^€tĒPu‹^ĘGøü’Pė ‹^ĘG1ĄPX‰ģ]ĆU‰åƒģĒPuč -ĒVuĒTu1ĄPøņPčę,^^ø PøņPčŁ,^^č’,ø4uPø’’Pč®2^^ĒFųXu‹^ųĘGøP藾^’vųčÉż^‰Fü‹^ų1ĄŠGP¹»Xčk7‰FśøPčož^øßPčgž^øPč_ž^ĒFžƒ~ž}ø÷fž‰Ćʇru’Fžėč‰ģ]ĆU‰åĒ6uĒ8uū’‹F™£>u‰@u‹^‰Buø4uPøż’Pč2^^‰ģ]ĆU‰åĒ6u’ø4uPøū’Pčō1^^‰ģ]ĆU‰åƒģč' ø°yPøtPčß1^^ƒ>°y}’6°yøŠjPčā1^^ėŻ‹°y‰^ü‹¶y‰^ś’6²yėø°yPč6^‰FžėĒFžź’ė¾Ęj[éS6DzyD‹^ś‰“y‹^ž‰¶yø°yP’vüču1^^ėŒU‰åƒģĒFų‹^‹G‰Fśƒ~ś|ƒ~ś |øū’PéÄ‹^tøź’Pé³ø÷fś‰ĆĆŹy‰^ž»‹Fś™÷ū‹^ž‰G‹^ž‹Čy9O|øū’Pé‚‹^‹G‹^ž‰‹^’w ’w 1ĄPøPčE7ƒźƒŪu Ó Ūtøź’PéO‹^’w ’w 1ĄPøPčÜ5‰Fō‰Nö‹Fō‹^öƒÓ‹vž+D\u!ĄtC Ū~ø˜’Pé‹^ž‹Fō‹NöGO‰Fō‰Nö¹»‹Fō’vöčf5‹^žP’w ¹»XčU5»÷ć1ŪSPčA6‹^ž‰G¹»‹Fō’vöč45P1ĄPøPč7‹^ž‰W¹»‹Fō’vöč5‹^žP’w ¹»Xč5»÷ć1ŪSPčÜ6SR1ĄPøPčć5‹^ž‰G ‹^‹vž‹G‰D‹^‹vž‹G‰D‹^‹vž‹G‰Dƒ~ų0’Fųƒ~ų|øū’Pė1ƒ>Äjtč’vžč&^’vžč^‰Füƒ~üuʃ~üuøPėøū’PX‰ģ]ĆU‰åƒģ‹^ƒ?uøGPėøKP¹»XčT4‰Fž‹^‹G‰Fš’w¹»Xč;4‰Fī‹^øV÷g°‰Ć’vī’všøPĆŗ{SčØƒÄ‰Fź‰Vģ¹»‹Fźč4%’¹»č÷3‰Fü¹‹Fź‹^ģćŃūŃŲāś¹»čŚ3%’¹»čĪ3‰Fś¹‹Fź‹^ģćŃūŃŲāś¹»č±3%’¹»č„3‰Fų‹Fī-¹»č“3¹»čŠ3%’¹»č~3‰Fö‹Fī-¹Óč¹»čg3¹»č^3%’¹»čR3‰Fō‹Fź‹^ģ-ƒŪu Ć Ūu¹»‹Fšč/3PøöjPč(Õ^^1ĄP¹»‹Fź’vī’vģč3[YZĮڃéƒŚRQøPYX[ćŃėŃŲāś%’ć‰Fņ‹Fų9Fņt ’vųøkPč×Ō^^č (’vžø Pčņ'^^’vžø Pčę'^^’vüøPčŚ'^^’vśøPčĪ'^^’vųø‚PčĀ'^^’vöøPč¶'^^’vōøPčŖ'^^čŠ'‰ģ]ĆU‰å‹^ƒ?uøPėø P¹»XčW2£¤y‹^¹‹GÓą G £¦y’w¹»Xč62%¹Óč‹^P’w»Xč 2[ Ų¹»č2£Øy‹^’w¹»Xč2%’¹»čõ1£ŖyǬyĒ®yøPčN^ Ątø’’PėJøPø Pčō&^^ø°yPø’’PčĢ,^^’vč/^ Ąu1ĄPė ‹^ŠG0ä˜%?=uč_ėĒÄjø’’PX‰ģ]ĆU‰åPPFüPø Pč°&^^1ĄPø#Pč”&^^÷Füu1ĄPé‹Ē¤y‹^¹‹GÓą£¦y1ĄPčÆ^ Ątø’’PėfĒFžƒ~ž}EøPčG^ Ątø’’PėIFüPø PčH&^^¹»‹Füč’0%’¹»čó0‹^^žˆG’Fžėµ‹^ŠG0䘨?tø’’Pė1ĄPX‰ģ]ĆU‰åƒ>Äjt‰ģ]ĆøPčŁ^ Ąu ’vø PčŃ%^^‰ģ]ĆU‰åPPĒFž’vžø!Pč·%^^ĒFü~ü'}$FžPø!Pč®%^^¹»‹Fžče0Øuė’FüėÕ÷Fžtø@kPčs+^ø’’Pė ĒÄjčPX‰ģ]ĆU‰åPǤy Ǧy1ĄPč^ Ątø’’Pé č`%¹‹šuÓūSč:’^¹»”šuč÷/%’Pč&’^’6œuč’^¹‹žuÓūSč’^¹»”žučĶ/%’Pčüž^¹‹ uÓūSčīž^¹»” uč«/%’P茞^’6¢učŅž^čī$č& Ąt ĒÄjø’’Péƒ>Čyé§Ē¦y 1ĄPčŻ^ Ątø’’Péīč®$¹‹uÓūS舞^¹»”učE/%’Pčtž^’6’učlž^¹‹”uÓūSč^ž^¹»””uč/%’PčJž^¹‹–uÓūSč<ž^¹»”–učł.%’Pč(ž^’6˜uč ž^č<$čt Ąt ĒÄjø’’Pė_ĒFž‹Čy9^ž}NǤy¹‹FžÓࣦyĒ®yøPč^ Ątø’’Pė(ø°yPø’’Pč”)^^čż Ąt ĒÄjø’’Pė’Fžė©1ĄPX‰ģ]ĆU‰åPøPčˆ^ ĄuFžPø Pč#^^÷Fžtø’’Pė 1ĄPė‰ģ]ĆX‰ģ]ĆU‰åPǤy 1ĄPč–^ Ąu?øPč?^ Ąu3FžPø PčF#^^øPč&^ ĄuFžPø Pč-#^^÷FžtĒÄjø’’‰ģ]ĆU‰åƒģĒFžFüPø!Pč#^^‹F!Fü’vž’FžX='}ƒ~ütہ~ž'| ĒÄjø’’Pė1ĄPX‰ģ]ĆU‰åPPĒFž’vø#PčØ"^^’vø"Pčœ"^^ĒFž~ž,}FüPø!Pč“"^^÷Fütė’Fžėށ~ž,u ĒÄjø’’Pé|č€"ĒFžƒ~ž}hFüPø!PčV"^^÷Fütė÷FüućĒÄjčV"ø’’PėB¹»‹Füčī,%= tĒÄjč3"ø’’Pė‹FžŃą‰Ć’·¤yø Pčš!^^’Fžė’č"1ĄPX‰ģ]ĆU‰åƒģFžPø"PčŻ!^^¹‹FžÓč%»č,‰Fų‹Fž%¹»č},‰Fö¹»”źmčn,‰Fś¹»”ģmč_,‰Fü1Ą¹‹^üćŃćŃŠāśPS¹»Xč@,1ŪYFśŁQ¹»č.,‰FņFō1ĄPø@PPø¤uPøPøf|Pč” ƒÄRP’vō’vņčg ƒÄ ¹‹FųÓą‰ĆøšuPĆ¤uSčž^^¹‹FöÓą‰ĆøuPĆ¤uSč†^^1ĄPøPPø¤uPøPøf|PčI ƒÄRP1ĄPøuPč ƒÄ ¹» ¤u0äč™+£ČyĒFžƒ~žsø÷fž‰Ć‹œu‰Öy‹Fž‰FžėßĒnzĒpz‹nz’6pz‰ŲyŚy”œu™RP”šu™‰Ę‰×[Xč–,¾1’‰Ć‰ŠčŠ,£Üy‰ŽyĒFžƒ~ž sø÷fž‰Ć‹’u‰Öy‹Fž‰Fžėß”’u™RP”u™‰Ę‰×[XčJ,¾1’‰Ć‰Šč>,£rz‰tzƒ>Čy~ č¢ś ĄtĒČyĒFž¹»”Čy’vžčŗ*[9Ćseø÷fž¹»č¦*£“yĒŗyǼyĒøyĒĀy¤uǶyś’Dzyø°yPčō^=t ’vžøXkPčiĢ^^ø÷fžPčk^‹Fž‰Fžė‡‰ģ]ĆU‰å‹^‹‹^‰‹^1ĄŠGP¹»Xč,*‹^‰G‹^‹v‹G‰D‹^‹v‹G‰D‹^1ĄŠGP¹»Xčū)‹^‰G‰ģ]ĆU‰åƒģ ĒFžƒ~ž|éźĒFöĒFų‹FFž»÷ć‰ĆĆŹy‰^ś¹»‹Fžč°)¹ÓąĘ¹»čŸ)‰Fü‹^ü‹vś‹‡¤u‹Ÿ¦u‰D‰\‹^ś’w’w1ĄPøPčŪ*ƒźƒŪu Ó ŪtO‹^ś‹G’w‰FöFų’w’w1ĄPøPčm)ƒŃ¾1’‰Ć‰Čč‹*‹^ś‰G‰W‹^ś‹G‹O+FöNų‰Fö‰Nų‹Fü‰Ć‹‡¤u‹¦u+FöNų‹^ś‰G‰O’Fžé ’‹F@»÷ć‰ĆĆŹySč^‰ģ]ĆU‰åPPĒFžƒ~ž|éšĒFüƒ~ü|éÜø÷fü‰Ć^‹G‹O-ƒŁu Į ÉuE‹Fü@»÷ć‰Ć^‹G‹O-ƒŁu Į Ét#‹Fü@»÷ć‰Ć^ø÷fü‰ĘvSVč‡^^érø÷fü‰Ć^‹Fü@¹÷į‰Ęv‹G‹O+DLu!ĄtA É~B‹Fü@»÷ć‰Ć^‹G‹O-ƒŁu Į Ét ‹Fü@»÷ć‰Ć^ø÷fü‰ĘvSVč^^’Füé’’Fžé’‰ģ]ĆU‰åƒģ‹v¹č)~⹉ęņ„‰ō‹v¹čš(‹~¹‰ęņ„‰ōvā¹čŪ(‹~¹‰ęņ„‰ō‰ģ]ĆU‰åPøžzPøtPčŒ"^^’6{é}øžzPč”^‰FžévøžzPč^‰FžėiøžzPč"^‰Fžė\øžzPčµ^‰FžėOøžzPč^‰FžėBøžzPč9^‰Fžė5øžzPč®^‰Fžė(øžzPčµ^‰FžėøžzPčš^‰FžėĒFž÷’뾂k[éŗ&‹^ž‰{øžzP’6žzčč!^^éQ’U‰åƒģ‹^‹G‰Fų‹G‰Fö‹G‰Fōƒ~ų|ƒ~ų} ƒ~ö|ƒ~ö|øõ’PéČøV÷fö°‰ĆĆŗ{‰^žøV÷fų°‰ĆĆŗ{‰^üøV÷fö°‰ĆĆŗ{‰^śĒFņV’vņ’NņX Ąt’vüƒFü[‹vśŠˆƒFśėą‹^žƒĆ‰^š’7¹»Xč.& ¹»č"&‹^š‰‹^ž‹Fō‰G4‹^žĒ‹^žĒG6ĒG8‹^žĒG:ĒG<‹^žĒG>ĒG@‹^žĒGBĒGD1ĄPX‰ģ]ĆU‰åƒģ ‹^‹‰Fč‹^‹G‰Fę‹G ‰Fāƒ~ęų|ƒ~ę|øõ’PémøV÷f氉Áú{‰^žøV÷f谉Áú{‰^üĒFź1Ą‹^ź‰^š‰Fņ‹Fā‰Fī‹^žƒĆ ‰^ģ’vź’vīøP’vüčŽƒÄ‰Fų‰Vś‹Fų‹^ś-ƒŪu Ć Ūu ø€PøškPč'Ē^^’vź’vģøPø¾}Pč£ƒÄ‰Fō‰Vö‹Fō‹^ö-ƒŪu Ć Ūu ø€PøøkPčģĘ^^’vņ’vš’vö’vō’vś’vųč8ƒÄ ‹^ž’w"¹»XčĮ$‹^ž‰G‹^ž’w(¹»Xč«$‹^ž‰G‹^ž’w(¹»Xč•$‹^ž‰G‹^ž’w(¹»Xč$‹^ž‰G‹^ž‹G‰FäƒĆ‰^ą’7¹»Xč^$%ż’¹»čR$‹^ą‰ƒ~ät‹^žƒu’vžč$ ^1ĄPX‰ģ]ĆU‰åƒģ‹^‹G‰Fü‹G ‰Fśƒ~ü|ƒ~ü|øõ’PėtøV÷fü°‰ĆĆŗ{‰^ž‹^ž‹Fś‰G‹^žĒG‹^žĒGFĒGH‹^žƒĆ‰^ų’7¹»XčĆ#%÷’¹»č·#‹^ų‰‹^žƒu’vžč ^’vś’vüčŠ^^1ĄPX‰ģ]ĆU‰åƒģ‹^‹G‰Fö‹G‰Fōƒ~ö|ƒ~ö} ƒ~ō|ƒ~ō|øõ’Pé!øV÷fö°‰ĆĆŗ{‰^žøV÷fō°‰ĆĆŗ{‰^ü‹^žƒĆ>‰^ņ‹^ņ‹vü‹~ü‹D>‹L@E6M8O‰‰O‹^žƒĆB‰^ņ‹^ņ‹vü‹~ü‹DB‹LDE:M<O‰‰O’vüčQ ^‹^üĒGFĒGH1ĄP’vōč^^‹^ü’w¹»Xčø"ØuélĒFžŗ{~žŹƒs`‹^žƒJuėO‹^ž‹Fü9GJu‹^ü‹vž‹GL‰DJė<‹^ž‹GJ‰Fś‹^ś‹GL‰Fųƒ~ųt‹Fü9Fųu‹^ų‹vś‹GL‰DLė‹Fų‰FśėӃFžV뙋^üĒG1ĄPX‰ģ]ĆU‰åPP‹^‹G‰Füƒ~ü|ƒ~ü|øõ’PėøV÷fü°‰ĆĆŗ{‰^ž‹^ž‹_‰{1ĄPX‰ģ]ĆU‰åPP‹^‹G‰Füƒ~ü|ƒ~ü|øõ’Pė]øV÷fü°‰ĆĆŗ{‰^ž‹^ž‹v‹G6‹_8‰D‰\‹^ž‹v‹G:‹_<‰D‰\ ‹^ž‹v‹G>‹_@‰D ‰\‹^ž‹v‹GB‹_D‰D‰\1ĄPX‰ģ]ĆU‰åø€PøÖkPčbĆ^^‰ģ]ĆU‰åƒģ‹^‹G‰Fī‹G‰Fģ‹G‰Fźƒ~ī|ƒ~ī|øõ’PéæøV÷fÁú{‰^žĒFōöz‹^ž‹G‰Fš’vģ’vžøözPč^ƒÄĒFņ‹Fš+Fņ‰Fš’vņ’vōøPø¾}PčnƒÄ‰Fś‰Vü’vņ’všøP’vžčUƒÄ‰Fö‰Vų‹Fö‹^ų-ƒŪu Ć Ūu ø€PøŲkPčžĀ^^1ĄP’vņ’vų’vö’vü’vśčźƒÄ ‹^ž‹Fš‰G‹^ž‹Fź‰G1ĄPX‰ģ]ĆU‰åƒģ‹^‹G‰Fž‹G‰FüŠG0䘉FśŠG0䘉Fų‹G ‰Fö‹G‰Fō‹G’w‰FčFź~žüu‹^‹G ’w ‰FšFņė%øV÷fž°‰Ć’vč’vö’vśĆŗ{Sč†ƒÄ‰Fš‰Vņ~üüu‹^‹G’w‰FģFīė%øV÷fü°‰Ć’vč’vō’vųĆŗ{SčIƒÄ‰Fģ‰Vī‹Fš‹^ņ-ƒŪu Ć Ūt‹Fģ‹^ī-ƒŪu Ć Ūuøņ’Pė’vź’vč’vī’vģ’vņ’vščŃƒÄ 1ĄPX‰ģ]ĆU‰åPPøV÷f°‰ĆĆŗ{‰^ž‹^žƒTu’ꋋ^žƒĆT‰^ü‹FH‰ĮøÓą ‰1ĄPč^‰ģ]ĆU‰åPPøV÷f°‰ĆĆŗ{‰^ü‹^ü’w¹»XčōØt ‹^üƒPtt‰ģ]ĆĒFžj~~žŹƒsc‹^žƒTtTĒ{@‹Fž-ŗ{»V™÷ū-£{‹^ž‹_T‰{’拸žzP’vø’’Pč ƒÄ Ąt ø€PøōkP艡^^‹^žĒGT‰ģ]ƃFžVė–‰ģ]ĆU‰åƒģ ƒ~ w1ĄPPéé‹F F-¹Óč‰Fžƒ~t‹^‹v‹G*D&9FžsøPėøPF¹‹FÓč‹^Pø÷fƋvø÷fʋG$D [9Ćr1ĄPP郋^ø÷fĆ1Ą‹_"‰^ś‰Fü¹‹Fś‹^üćŃąŃÓāś‰Fś‰^ü1Ą‹^‰^ö‰Fų¹»‹Fö’vųč°‹^Pø÷fù‹G Óą1ŪYZ)ĮŚRQ¹»Xčˆ‰FöFų‹Fö‹^ųFś^üSPXZ‰ģ]ĆU‰åƒģ ø PPč‹^^ƒ>Ź‹tƒ~śu ø Pø Pčq^^‹F÷Ų‰ĮøÓą‰Fų’v’vø’’PčšƒÄ ĄtC¹»”Ø{č‰Fśƒ~żu’ģ‹ėP¹»‹Fų’6Ø{čö[ Ų£Ø{‹F÷ŲŃą‰Ć‹F‰‡–{ė(‹Fų÷й»’6Ø{čĢ[!ƉØ{¹»”Ø{蹉Fśƒ~śt^ĒFžƒ~žS‹Nž‹FśÓųØtB‹FžŃą‰Ć‹Fž÷Ų’·–{Pø’’PčóƒÄ‰Füƒ~üu‹NžøÓą÷й»’6Ø{č^[!ƉØ{’Fžė§ƒ>°{tƒ>ź‹}>ź‹üuč˜‰ģ]ĆU‰åPPøV÷f°‰ĆĆŗ{‰^žƒ~ų| ƒ~|ƒ~tt ‹^žĒž’‰ģ]ƃ~tƒ~| ‹^žĒų’‰ģ]Ć÷Ft0’v ’v’včIƒÄ‰Füƒ~tƒ~üt‹Fü‹^ž‰ƒ~üt‰ģ]Ć÷Ft’v ’v’včĮƒÄ‰Fü‹Fü‹^ž‰‰ģ]ĆU‰åƒģƒ~|ƒ~t ƒ~tø’’P鋸V÷f°‰ĆĆŗ{‰^žøV÷f°‰ĆĆŗ{‰^ü‹^ü’w¹»Xč;Øtø’’PéL‹^ž‹G*‰Fņ‹F‰Fų¹‹FųÓč‰Fö‹Fų-Óč‰Fō‹Fö9Fōr‹^ž‹Fō+G&9Fņwøö’Pé‹^ü’w¹»XčŪØtn‹^üƒPtt ‹^ü‹F9GPuZ‹^ü‹vü‹~ž’wN’t(’v’u(’vč¤ƒÄ ‹^üƒĆ‰^š’7¹»Xč%÷’¹»č„‹^š‰‹^üƒt錒vüčY^邃~’uøü’Péx‹^ž‹F‰GN‹^žƒĆ‰^š’7¹»Xč> ¹»č2‹^š‰’vžč—^‹^ü‹GJ‰Fśƒ~śu ‹^ü‹Fž‰GJė‹^śƒLt ‹^ś‹GL‰Fśėģ‹^ś‹Fž‰GL‹^žĒGL1ĄPX‰ģ]ĆU‰åƒģ øV÷f°‰ĆĆŗ{‰^ž‹^ž‹GJ‰Füƒ~üu鳋Fü-ŗ{»V™÷ū-‰Fųƒ~tt ‹Fų9Fté~‹^ž‹vü‹~ü’v’w(’tN’u(’vųčsƒÄ ‹^üƒĆ‰^ö’7¹»Xč_%ū’¹»čS‹^ö‰‹^üƒu’vüč+^‹^ž‹GJ9Füu‹^ü‹vž‹GL‰DJė ‹^ü‹vś‹GL‰DL1ĄPėn‹Fü‰Fś‹^ü‹GL‰FüéD’‹^ž‹F‰GP‹^ž‹F‰GN‹^žƒĆ‰^ö’7¹»XčŪ ¹»čĻ‹^ö‰’vžč4^ƒ>ę‹~ƒ~u ƒ~tu1ĄP菳^1ĄPX‰ģ]ĆU‰åPƒ>°{tĒFžėƒ>²{tĒFžėĒFž‹ꋉ苋FžŃą‰Ćƒæ°{t:‹FžŃą‰Ć‹‡°{-ŗ{»V™÷ū-£ź‹‹FžŃą‰Ć‹Ÿ°{‰ø{ƒ>ź‹|‹ø{‰¶{ėĒź‹üĒø{~‹ø{‰¶{‰ģ]ĆU‰åPPč[ ‹F-ŗ{»V™÷ū-‰Füƒ~ü}1ĄPėƒ~ü}øPėøPFž‹FžŃą‰Ćƒæ°{u‹FžŃą‰Ć‹F‰‡°{ė‹FžŃą‰Ć‹ŸŖ{‹F‰GR‹FžŃą‰Ć‹F‰‡Ŗ{‹^ĒGRčģ ‰ģ]ĆU‰åƒģčÖ ‹F-ŗ{»V™÷ū-‰Füƒ~ü}1ĄPėƒ~ü}øPėøPFś‹FśŃą‰Ć‹‡°{‰Fžƒ~žu‰ģ]ƋF9Fžu‹^ž‹FśŃą‰Ę‹GR‰„°{肾ėO‹^ž‹F9GRt‹^ž‹GR‰Fžƒ~žuę‰ģ]Ƌ^ž‹_R‹vž‹GR‰DR‹^žƒRt ‹^ž‹GR‰Fžėģ‹FśŃą‰Ć‹Fž‰‡Ŗ{č' ‰ģ]ĆU‰åč ƒ>“{uč ‰ģ]Ƌ®{‹“{‰OR‹“{‰®{‹“{‹_R‰“{‹®{ĒGRčģżčā ‰ģ]ĆU‰åP謸({PøtPč„^^‹*{‰^ž’vžė-ø({PčH^ė*čjė%ø({Pč^ėč¹ė’6*{ølPč>ø^^ė¾l[éżĒ*{ƒ~žt§ø({P’6({č&^^ė˜U‰åƒģ ‹^‹G‰Fü‹G ’w ‰FųFś‹G‰FöøV÷fü°‰ĆĆŗ{‰^ž‹^ž‹GF‹OH-ƒŁu Į Éu1ĄPPė‹^ž‹GF‹OH+ī‹š‹QP1ĄPø<PčĻQP2{4{‹Fų‹^ś-ƒŪu Ć Ūu1ĄPPė‹Fų‹^śī‹š‹SP‹^žXY‰GF‰OHƒ~ü}‹Fü÷ŲŃą‰Ć‹Fö‰‡{ĒB{’’ĒD{’ĒFžŗ{~žŹƒsJ‹^ž‹GF‹OH-ƒŁu Į Ét-‹^ž‹GF‹OH+B{D{u!ĄtA É}‹^ž‹OF’wH‰B{D{ƒFžV믉ģ]ĆU‰åĒ*{’6š‹’6ī‹1ĄPø<PčłF{H{£2{‰4{‰ģ]ĆU‰å‹^’w ’w ’6š‹’6ī‹1ĄPø<PčČ[Z)ĆʉF{‰H{‰ģ]ĆU‰åƒģ ‹싉^ü‹Fü@™ī‹š‹£ī‹‰š‹‹ģ‹+^ü‰ģ‹‹B{‹D{+ī‹š‹u!ŪtA É~éŽĒB{’’ĒD{’ĒFžŗ{~žŹƒréƋ^ž‹GF‹OH-ƒŁu Į Éu颋^ž‹GF‹OH+ī‹š‹u!ĄtA ÉB‹Fž-ŗ{»V™÷ū-‰Fśƒ~ś|øP’vśčrō^^ė‹Fś÷ŲŃą‰Ć‹‡{’Š‹^žĒGFĒGH‹^ž‹GF‹OH-ƒŁu Į Ét-‹^ž‹GF‹OH+B{D{u!ĄtA É}‹^ž‹OF’wH‰B{D{ƒFžVé3’čH’lu>‹@{9¶{učˆüĒl‹¶{‰@{ƒ>†{tƒ>ˆ{~ ‹‚{9„{učŒ‹„{‰‚{‰ģ]ĆU‰åPƒ>č‹|‹¶{ƒĆ6‰^ž‹^ž‹‹OƒŃ‰‰Oė‹¶{ƒĆ:‰^ž‹^ž‹‹OƒŃ‰‰O‰ģ]ĆU‰åƒģĒFž®M‹Fž%’‰Fü¹‹FžÓč%’‰Fśø6PøCPčŃ^^’vüø@PčÅ^^’vśø@Pč¹^^‰ģ]ĆU‰åƒģč1Ū¹ćŃąŃÓāś£b{‰d{‹RfPf¹Óć1Ą‰R{£T{ĒN{ĒP{ øj{PøtPčN ^^ƒ>j{} ’6j{ø‹^ƒu‹Fü™RP’vö’vō’vś’vųč·ƒÄ ė‹Fü™RP’vś’vų’vö’vōčƒÄ ’vüX‰ģ]ĆU‰åP‹^‹G‰Fžƒ~ž|ƒ~ž|øś’PėJ‹^¹‹FžÓą‰Ę‹G ‹_ ‰„Z{‰œ\{‹^‹G™¾1’‰Ć‰Šč6‹^G W ¹‹^žÓ扇J{‰—L{1ĄPX‰ģ]ĆU‰åƒģč»FčPøtPč¼ ^^’vźėFčPč^ėäFčPčä^ėŚFčPč‰^ėŠ¾Xl[éKU‰åƒģĒFśƒ>†{tĒFśõ’‹^ƒĒFśź’‹^øV÷g°‰ĆĆŗ{‰^ö‹^‹v’w’tøP’vö襚ƒÄ‰Fņ‰Vō‹Fņ‹^ō-ƒŪu Ć ŪuĒFśö’ƒ~śtéĻčQ‹^‹‰’{‹^‹_‰{‹^‹_‰ˆ{‹^‹_‰Ž{¹‹Fņ‹^ōćŃūŃŲāś£Œ{¹»‹Fņ’vōčø[%ć£Š{ĒFž~žč}k‹”{CFųPSčĻ^^¹»‹Fųč†%°=udž{č×ĒFśüė8¹»‹Fųčb%°=uĒFü~üč}’Füėō’vųčų^ĒFśū’ė’Fžė޹»‹Fųč*%°=uĒFśõ’‹^‹v’vś’w’4øDP蕃ĉģ]ĆU‰åP‹^ƒu’6Ž{ėøū’PFž>{üt%’vž’6{’6’{øCPčZƒÄƒ~žūu ‹^’wčp^dž{‰ģ]ĆU‰åƒ>†{u‰ģ]Ćdž{Ēˆ{ǐ{ü‹^‹vøü’P’w’4øDPčƒÄ‰ģ]ĆU‰åƒģ‹F‰Fź‹F ‰Fī‹F‰FģFčP’vč\^^‰ģ]ĆU‰å¹»‹Fč< Ø tøhlPčX^¹»‹Fč$ Øuø‚lPč@^¹»‹Fč ØuøšlPč(^‰ģ]ĆU‰åPƒ>bptøxPėø¼P¹»XčŻ £”{dž{ø”{»SPčš^^ĒFžƒ~žd}’Fžėõø”{» SPčĻ^^‰ģ]ĆU‰åƒģ‹Ž{9ˆ{t ø PPč±^^ƒ>†{u‰ģ]ƃ>ˆ{驋”{CFžPSč^^¹»‹FžčT %°=un’6Š{’6Œ{čæ^^ˆFł¹»ŠFł0äč. ‰Fü’vü’6”{čL^^ø”{»SPč;^^ø”{»SPč*^^’Š{’ˆ{’„{ĒFśƒ~śd|éj’’Fśėņ¹»‹FžčŅ %°=u‰ģ]ĆĒŠ‹ƒ>ˆ{u1ĄPė’vžŌ‹øĪ‹Pøų’Pč4ī^^‰ģ]ÜśUPSQRVW‰å‹F‹~¹ŃŲŃßāśŽĒ‹F‹v¹ŃŲŃŽāśŽŽ‹~ē‹vę‹V ‹N÷Į€u÷Ā’’uė¹€‰Č÷Įtņ¤ėŃéņ„‹V ‹N1Ū)ĮŚ Éu Ņu _^ZY[X]Ć‰V ‰NF^F^éu’U‰åœśQVW‹F‹~ŽF‹v Ž^ &‰ƒĘƒĒ¹ ņ„_^Y]ĆS‰ćPR‹W‹GīZX[ĆS‰ćPR‹Wģ0ä‹_‰ZX[ÜśĄlĆūĆ’6ĄlĆU‰åSV‹^‹v‹F‰‹D‰G‹D‰G‹D‰G^[]Ć[U‰åWV)Ä;&Älv’ćĒÄl‹ø{ĒG2’6ꋸČlPčS¬ėäfü^_]ĆĶ$0<0tøĆ1ĄĆU‰åQRW¹ŗšüŽF‹~óm_ZZ‰ģ]ĆU‰åQRV¹ŗšüŽ^‹vóo^ZZ‰ģ]ĆU‰åVWSQR‹v‹~#>Bp‹N ŗŚ‰ūĖĖ+Bpƒė~Ńū)ىĘl÷bptģØtūœśŽFƒžt.š’Ālņ„ƒū~‰^ ĒFƒ~t§‹6ĘlövėœZY[_^]Ćøņ«ėŅU‰åŽF‹^&Š0ä]Ćśø ę č?ø@ŽŲø4£rø’’ŽŲ”P”PĖśø ę č1ĄĶø@ŽŲø4£rø’’ŽŲ”P”PĖü¹Ž¾ęl1’ŽĒņ„ĆūėżU‰åƒģønPč1^øPøō‹PøPø¾}P膼ƒÄ‰Fģ‰VīĒFžŗ{~žŹƒréÅ‹^ž’w¹»XčĪØté§‹^ž‹G"‰Fö‹vž‹G0D.‰Fō1Ą¹‹^öćŃćŃŠāśĆ‰^š‰Fņ’vņ’vš1ĄPøPčŖ‰Fś1Ą¹‹^ōćŃćŃŠāśĆ‰^š‰Fņ’vņ’vš1ĄPøPčz‰Fų‹Fž-ŗ{»V™÷ūPč0^‹^ž‹vž‹~ž’vų’vś’w<’w:’t8’t6’u’w’t’u4ø`nPč:ƒÄ‹^žƒu ø†nPč'^ė‹^ž‹GPPčŽ^‹Fž-ŗ{»V™÷ū-‰Fźƒ~ź鬹‹FźÓą‰Ć‹‡ Œ‹ Œ-ƒŁu Į Éu鉹‹FźÓą‰Ć1ĄPøP’vī’vģ’· Œ’· ŒčóūƒÄ ĒZŒĒ\ŒĒFüō‹~üŒs/‹^üŠ0ä˜= ~‹^üŠ0䘹»čV=r‹^üĘƒFüėŹƒ~źu øŽnPč_^ė øō‹Pø–nPčQ^^øšnPčH^ƒFžVé1žøœnPč9^‰ģ]ĆU‰åƒģøžnPč'^ĒFžj~~žŹƒr馋^ž’w¹»XčąØt鼋^ž‹G"‰Fų‹vž‹G0D.‰Fö1Ą¹‹^ųćŃćŃŠāśĆ‰^ņ‰Fō’vō’vņ1ĄPøP載Fü‹Fö+Fų1Ū¹ćŃąŃÓāśƒÓ‰Fņ‰^ō’vō’vņ1ĄPøP芉Fś‹Fž-ŗ{»V™÷ūPč@^‹^ž‹vž‹~ž’vś’vü’w0’t.’u,’w*’t(’u&’w$’t"’u øānPčGƒÄƒFžVé’‰ģ]ĆU‰åƒ~|u ønoPč)^ė2ƒ~|ƒ~ ‹FŃą‰Ć’·nøvoPč^^ė‹F-PøzoPčö^^‰ģ]ĆU‰åƒģ ƒ~u¹‹FÓą‰ĆLJ ŒĒ‡ Œ‰ģ]Ƌ^øV÷f°‰ĘøPƒĆSøPĘŗ{VčēƒÄ‰Fü‰Vž‹Fü‹^ž-ƒŪu Ć Ūu‰ģ]ĆøPøņ‹PøPø¾}PčŻęƒÄ‰Fų‰Vś1ĄPøP’vś’vų’vž’vü蒳ƒÄ øV÷f°‰ĆøP’6ņ‹øPĆŗ{SčœęƒÄ¹‹^Ó扇 Œ‰— Œ‰ģ]ùė ¹ė¹ėU‰å‹F‹^Ķ ]ĆU‰åƒģ$^‰^ų‹^€?uéc‹^€?%t’vƒF[Š0ä˜PčšĮ^ėŁĒFžƒF‹^Š0ä˜=0|+‹^Š0ä˜=9‹^Š0ä˜-0Pø ÷fž[Ɖ^žƒFėȋFų‰Fī‹Fų‰Fō‹^Š0ä˜P醒vųƒFų[‹‰Fü‹Fü™‰Fš‰VņĒFś én’vųƒFų[‹‰Fü¹»‹Füč‰Fö1Ą‹^ö‰^š‰FņĒFśé?’vųƒFų[‹‰Fü¹»‹Füčę‰Fö1Ą‹^ö‰^š‰FņĒFśé’vīƒFī[‹’w‰FšFņĒFś ‹Fī‰Fųéļ’vīƒFī[‹’w‰FšFņĒFś‹Fī‰FųéĪ’vīƒFī[‹’w‰FšFņĒFś‹Fī‰Fųé­’vųƒFų[‹‰Fü’vüčKĄ^ƒF酾’vōƒFō[‹‰Fą‹Fō‰Fų‹Fą‰FŽ’vąƒFą[Š0äˆFݘ Ąt ŠFŻ0ä˜Pč Ą^ė߃F‹Fą+FŽH+Fž÷Ų‰Füƒ~üé/ž’vü’NüX Ąué!žø PčŲæ^ėčø%PčĪæ^’vƒF[Š0ä˜P輿^éśż¾€oZ驍FāP’vś’vņ’vščUƒÄ‰Fü‹Fž+Fü‰Fśƒ~ś~’vś’NśX Ąt ø Pčzæ^ėė‹FüH‰Fśƒ~ś|‹vśŠBā0ä˜Pč]æ^’NśėēƒF钿‰ģ]ĆU‰åƒģ ĒFų‹F‹^-ƒŪu Ć Ūu ‹^ Ę0øPéČ‹F‹^-ƒŪu!ĄtC Ū}ƒ~ u‹^‹F÷Ų÷Ū‰^‰F’FųĒFüƒ~ü }‹^ü^ Ę’FüėģĒFüƒ~ u@’v’v1ĄPø Pč.‹^ü^ ˆ‹^ü^ Š0䘙‹^‹N)ĆŃQS1ĄPø PčƉF‰Nƒ~u=¹»‹F’včƒ[%ć‹^ü^ ˆ¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^ƒ~u=¹»‹F’vč@[%ć‹^ü^ ˆ¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^’Fü‹F‹^-ƒŪu Ć Ūté’ĒFś‹FüH‰Fžƒ~ž|b‹^ž^ €?uƒ~śu ‹^ž^ Ę ėA‹^ž^ Š0ä˜= }‹^ž^ ‰^ö‹^öŠ0ä˜0ˆė‹^ž^ ‰^ö‹^öŠ0ä˜7ˆ’Fś’Nžė˜ƒ~ųtø-P’v ’vü’Fü[XĆXˆ’vüX‰ģ]ÌŲĆøbŒĆśWø )’ŽĄ&Ǥ„1Ū&‹ū¤„u= uę_ūƋ+\;\w Ńć‹X…Ūu ‰Ó…ŪučR’歓­‘I|­9Š­u÷“…Ūuč;’ć_9Ėtƒūt ƒūuƒłu Z’ēƒłu1ŅR’ēPčU‰åW)’‹V ‹F‹^‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×č…’t÷Ś÷؃Ś_]‰ŃĀ…Ūu‰Ć‰Š)Ņ÷ń“÷ń‰Ń‰Ś)ŪĆUWV)’„’u&GWˆßˆėˆĶ(É‰ĶˆÅ(ɈąˆŌˆņ(öRPQ‰é9Śr ø’’ė WWRP‰Š)Ņ÷ó‰Å÷į_)ĒƒŅ‰Ö‰Ų÷嚃Ņ^)ʃŅX)Šy MĻŽėō‰ł‰ó_…’tˆéˆŻˆūˆĒ‰č)Ņ^_]Ɖę‹\‹D Ąu1Ņ‹L‹D÷ó‘÷ó‰Ē1Ū‹D‹T¹ŃąŃŅŃÓ9ßwr 9TvāķėŪ+Tū@āćėŃ[‰ŹŃłs0ä¬P’ć)Ō‰ēņ„’ć÷ę‰Į‰ų÷ćĮ‰š÷ćŹĆ‰ę‹\‹D™9Āu1!Ņ}÷Ūt)1Ņ‹L‹D!Ą}÷Ų÷ŁŠ÷ó‘÷ó1ۃ|}÷Ū÷ڃŪ‰Ē1Ū!’}÷ß÷\ߋD‹T!Ņ}÷Ś÷ŲڹŃąŃŅŃÓ9ßwr»9Tvāķė¹+Tū@āć믉ę‹\‹D Ąu1Ņ‹L‹D÷ó‘÷ó1Ū‰Ē1Ū‹D‹T¹ŃąŃŅŃÓ9ßwrŻ9TvŲāķėŪ+Tū@āćėŃø¤oėø»oėøŅoėøéoėøpė øpėø-pė»SPøPčč…ōU‰åĒLŒ‹^‰NŒ‹^‰PŒ‹^‰TŒøJŒPøPø»JŒ¹Ķ ‰ģ]ĆoRRS232 interruptUnexpected trap: vector < 16 pc = 0x%x text+data+bss = 0x%x Unexpected trap: vector >= 16 This may be due to accidentally including a non-MINIX library routine that is trying to make a system call. pc = 0x%x text+data+bss = 0x%x Trap to vector 0: divide overflow. pc = 0x%x text+data+bss = 0x%x Kernel panic: %s %d Type space to reboot 1234567890-= qwertyuiop[] ‚asdfghjkl;'`€\zxcvbnm,./*ƒ „”¢£¤„¦§Ø©Ŗ…ˆ·ø¹‰“µ¶Œ±²³0!@#$%^&*()_+ QWERTYUIOP{} ‚ASDFGHJKL:"~€|ZXCVBNM<>?*ƒ „‘’“”•–—˜™š„‹789‰456Œ1230.1234567890-^ qwertyuiop@[ ‚asdfghjkl;:]€\zxcvbnm,./*ƒ „”¢£¤„¦§Ø©Ŗˆ·ø¹‰“µ¶Œ±²³0. Š “²¶ø‹ /«¬­®ÆŽ!"#$%&'()_=~ QWERTYUIOP`{ ‚ASDFGHJKL+*}€|ZXCVBNM<>?*ƒ „‘’“”•–—˜™šø789‰456Œ123‡¹ ŗ  »¼/›œžŸ½¾æöč“ö¾ĢŚŒ&/8Ac•t¾ trtŪtF  ø µ < Ė å ž÷’’’’’’’’’’’ ***##  Š` Š Š ---?!%!2!disk task got message from FS gave floppy disk driver bad addrTrying to DMA across 64K boundaryDiskette in drive %d is write protected. ---winchester task got message from %d FS gave winchester disk driver bad addrTrying to DMA across 64K boundaryHard disk won't reset Can't read partition table of winchester µ<goFoNoVo^ofo proc -pid- -pc- -sp- flag user -sys- base limit recv command %4d %4x %4x %4x %6D %7D %3dK %3dK /bin/sh%s PROC -----TEXT----- -----DATA----- ----STACK----- BASE SIZE %4x %4x %4x %4x %4x %4x %4x %4x %4x %3dK %3dK PRINTRTTY WINCHEFLOPPYRAMDSKCLOCK SYS HARDWRMM FS INIT ANY %s%4d Ī`Dā_O`X$`cE`de_o„_s``x³_Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow l=/usr/lib CFLAGS = -F all: make init make bootblok make build make fsck init: $l/libc.a init.s $l/head.s asld -o init $l/head.s init.s $l/libc.a $l/end.s @echo init done. # bootblok.s is the source of the MINIX boot block. The bootblock is the # first 512 bytes on the image file and on the boot diskette. When bootblok.s # is assembled, it generates a short binary file (less than 400 bytes) that # must be stripped of its header and copied to the file bootblok. The dd # command below does this. If everything has been done right, the bootblok # file should begin with the following 8 words, in hex: # c0b8 8e07 33d8 b8f6 2fe0 c08e ff33 00b9 # The exact procedure for going from bootblok.s to the binary file stripped of # its header is somewhat operating system dependent. Some assemblers make # an object (.s) file; others make an a.sut file directly. If your boot # diskette does not start out by printing 'Booting MINIX 1.0' the problem is # probably that you have not made a good boot block. bootblok: bootblok.s @asld bootblok.s @dd if=a.out of=bootblok bs=16w skip=1 count=16 2>/dev/null @rm a.out @echo bootblok done. build: build.s cc -o build build.s @echo build done. mkfs: mkfs.s cc -o mkfs mkfs.s @echo mkfs done. fsck: fsck.s fsck1.s @echo "Start linking fsck. /lib/cem will be removed to make space on RAM disk" asld -o fsck -T. fsck1.s fsck.s $l/libc.a $l/end.s @echo fsck done. Please restore /lib/cem manually. fsck.s: fsck.c cc -c -Di8088 -w -F -T. fsck.c # 'make image' combines the bootblock, kernel, memory manager, file # system, init and fsck into a single file, called image. Each of these pieces # appears in the image file just as the original does on the disk, except that # the header at the front is removed, and each piece is padded out to an # integral multiple of 16 bytes. Build also prints a message telling how big # the various pieces (except fsck) are. image: build bootblok kernel mm fs init fsck /etc/umount /dev/fd0 @getlf "Insert blank diskette in drive 0 and hit return" build bootblok kernel mm fs init fsck /dev/fd0 # 'make usr' builds a file system on a file called 'usr', and then # copies this file to the diskette (9 sectors per track). It builds the file # system using the program mkfs, which is functionally the same as the standard # UNIX mkfs program, except that sizes (in blocks) for block special files # must be provided. usr: mkfs proto.usr /etc/umount /dev/fd0 @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/fd0 proto.usr >log.usr user: mkfs proto.user /etc/umount /dev/fd0 @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/fd0 proto.user >log.user # 'make ram' builds the root file system on a file called 'ram'. This file # will be copied to the boot diskette when 'image' is made. During system boot # it is copied from 128K on the boot diskette to the RAM disk. ram: mkfs proto.ram rc /etc/umount /dev/fd0 @getlf "Insert blank disk in drive 0 and hit return" mkfs -dL /dev/fd0 proto.ram >log.ram # Make the distribution disks. disk5: mkfs proto.disk5 /etc/umount /dev/fd0 @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/fd0 proto.disk5 >log.disk5 disk6: mkfs proto.disk6 /etc/umount /dev/fd0 @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/fd0 proto.disk6 >log.disk6 disk7: mkfs proto.disk7 @rm -rf proto.a misc.a >/dev/null ar r proto.a proto.* ar r misc.a passwd rc ttys profile /etc/umount /dev/fd0 @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/fd0 proto.disk7 >log.disk7 disk8: mkfs proto.disk8 /etc/umount /dev/fd0 @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/fd0 proto.disk8 >log.disk8 disk9: mkfs proto.disk9 /etc/umount /dev/fd0 @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/fd0 proto.disk9 >log.disk9 at.ram: mkfs proto.at.ram if /etc/umount /dev/at0; then : ; else : ; fi @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/at0 proto.at.ram >log.at.ram at.usr: mkfs proto.at.usr if /etc/umount /dev/at0; then : ; else : ; fi @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/at0 proto.at.usr >log.at.usr at.disk4: mkfs proto.at.disk4 if /etc/umount /dev/at0; then : ; else : ; fi @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/at0 proto.at.disk4 >log.at.disk4 at.disk5: mkfs proto.at.disk5 if /etc/umount /dev/at0; then : ; else : ; fi @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/at0 proto.at.disk5 >log.at.disk5 at.disk6: mkfs proto.at.disk6 if /etc/umount /dev/at0; then : ; else : ; fi @getlf "Insert blank diskette in drive 0 and hit return" mkfs -dL /dev/at0 proto.at.disk6 >log.at.disk6  Ą-ķ)ė‹&P/čėžėžU‰åPč'čuø(÷&ī?‰ĆĆę3‰$@ĒFžĒ"@Ēź?üƒ>ģ?|ƒ>ģ?E|ĒFžš’ė‹ģ?Ń拇R/’ЉFžƒ>"@t뮃>ģ?;uƒ~žu럒6ę?’6č?’vž’6ī?čUƒÄėˆU‰åø@PøtPč&^^ Ąt ø€PøŠ-Pč³!^^‹@‰ī?ƒ>ī?’|ƒ>ī?| ’6ī?øā-Pč!^^‹ @‰ģ?‰ģ]ĆU‰åPø(÷f‰ĆĆę3‰^ž‹^žöG&t ‹^žöG&t‰ģ]Ƌ^‰ņ?‹^‰ō?‹^ ‰@øš?P’včr%^^ Ąt ø€Pøš-Pč)!^^‰ģ]ĆU‰åƒģčģ)£°0’6°0čž^ 444\4Ē @‰ģ]ĆU‰åƒģƒ>ī?tø’’PéN¹»” @čü)‰Fģ¹»”@čķ)‰Fź¹»”@čŽ)‰Fī‹@‰^ö‹FźFģ‰Fō‹FōFö‰Fņ‹Fī+Fņ‰Fš’vīč?^1ĄP’6°0Pø@Pč›*‰Fž‹Fņ 1ŪSP1ĄPø@Pč„*‰Fü1ĄP’všPø@Pčs*‰FśøPPø.Pč—$ƒÄ’vžø .PčŠ$^^’vüø".Pč~$^^’vśø4.Pčr$^^‹Fž+Fü+FśPøH.Pč_$^^‹Fž+Fü+Fś= }ø€PøZ.PčD$^^čŽ"ĒFų64‹^ų‹Fö‰G‹^ų‹Fģ‰G‹FģFö‹^ų‰G‹^ų‹Fź‰G ‹^ų‹Fō‰G ‹FōFö‹^ų‰Gƒ~ģt‹^ųƒĆ&‰^č‹ ‰1ĄPX‰ģ]ĆU‰åPPø(÷f‰ĆĆę3‰^ž‹F‰Fü‹^žĒ‹^žĒG‹^ž‹F‰G‹^žĒG‹^ž‹Fü‰G ‹^ž‹F‰G‹^ž‹Fü‰G ‹^žĒG‹FüF‹^ž‰G’vž’vč\!^^‰ģ]ĆU‰åƒģ ‹$@‰^žƒ> @uøõ’Péƒ> @|‹^žƒtøõ’Pé‹^ž‹vž‹G DG‰Fģ‹G +D Fģ‰Fģ1Ą¹‹^ģćŃćŃŠāś‰^ī‰Fš’vģč]^‰Fźƒ~źuøõ’Pé¹1Ą¹‹^źćŃćŃŠāś‰^ā‰Fä‹^ž1Ą¹‹_ćŃćŃŠāś‰^ę‰Fč’vš’vī’vä’vā1ĄPøüP’vč’vę1ĄPøüPčČƒÄ‰Fśƒ~ś} ’vśø€.Pč/^^ĒFüę3~üf6s‹^üöG&uėƒFü(ėč‹Fü-ę3»(™÷ū‰Fų’ @‹Fž‰Fō‹Fü‰FņĒFś(’vś’NśX Ąt’vōƒFō[‹vņŠˆƒFņėąƒ>ī?u’6~.’~.‹^üX‰G‹^ü‹ī?‰O‹^ü‹Fź‰G‹^ü‹GFź‰G‹^ž‹vž‹G+D‹^üG‰G‹^üĘG‹^üĘGĒFö>|.0u}‹|.CSėøP|.ĒFžę3~žf6s‹^ž‹|.9OuĒFöėƒFž(ėą‹^ü‹|.‰Oƒ~öu®‹^ü’w’vų’6ī?čƒÄ1ĄP’vų’6ī?øPč ƒÄ’vü’vųč4^^1ĄPPP’vųčcūƒÄ’6|.X‰ģ]ĆU‰å’6 @’6$@č^^Ē"@1Ą‰ģ]ĆU‰åP‹^‹FˆG‹^ø(÷g‰Ćö‡ 4t ’včć^ė‹^ƒĆ&‰^ž‹ ‰‹^öG&t‹F-ę3»(™÷ū1ŪSPčĆ^^‹F-ę3»(™÷ū‹^P’wčŻ^^‹F-ę3»(™÷ū1ŪSSPøPčGƒÄ‰ģ]ĆU‰åƒģĒFüĒFžę3~žf6s9‹^žöG&t*‹^ž‹ī?9Ou’Fü‹^žöG&t’vžč=^Ē"@1ĄPė,ƒFž(ėĄƒ~ü~‹$@ƒĆ&‰^ś‹ ‰Ē"@1ĄPėøö’PX‰ģ]ĆU‰åƒģ‹F-ę3»(™÷ū‰Fų‹^ø(÷g‰ĆĆę3‰^ž‹^ŠG0ä‰FöŠG0䘹Óą¹»č˜$ Fö‹^‹v1ĄP’vö’w’tčÕłƒÄ‹^‹v‹GD ‰FōöG& t ‹^‹FōG‰Fō‹^’vō’wčY^^‹^ƒĆ&‰^š‹%ū’‰‹^ƒĆ&‰^š‹%÷’‰‹^žƒĆ&‰^š‹%ż’‰‹^ƒĆ&‰^š‹%ž’‰’ @÷\4tøPė1ĄPFśĒFüę3~üf6s4‹^ü‹Fų9Gu#‹^üĒGƒ~śt‹^üöG&t ’vüčäž^ĒFśƒFü(ėʼnģ]ĆU‰åƒģ ‹$@‰^ž‹@‰^ś1ĄP¹»‹Fśč#[ƒÓ-ƒŪ¹ćŃėŃŲāś‰FöFųP’6ī?čķ^^’vų’vö’vžč!ƒÄ‰Füƒ~üu’6@ėø’’Pę?‹Fü‰ģ]ĆU‰åƒģ‹^ƒĆ‰^ü‹^ƒĆ ‰^žĒFņ‹^ž1Ą‹vž1ɋ_ȉ^ź‰F칋FÓč‰Fś1ĄP»‹Fź’vś’vģčé"Pč“" Ą|øō’Pé‹^ž1Ą1ɋ+^śȉ^ę‰Fč‹Fę‹^č-ƒŪu!ĄtC Ū~’vśė‹^ž’7Fö‹^ü‹F‰Fų‹Fų9Fösøō’P鯋^ü‹G‰Fō‹G9Ft‹^ü‹F‰GNņ‹Fę‹^č-ƒŪu!ĄtC Ū逋Fž‰Fä‹^ä1ĄP’7¹»‹Fę’včč2"[YZ)ĮŚ‹^䉋^žƒĆ‰^ä1ĄP’7¹»‹Fę’včč "[YZ)ĮŚ‹^䉋^žƒĆ‰^ä1ĄP’7¹»‹Fę’vččą![YZĮŚ‹^䉁Nņ‹^‹G&% ¹»č½!‰Fī‹^‹v‹~’w ’t’u’w ’t’vīčČƒÄ ‰Fšƒ~šu!ƒ~ņt‹F-ę3»(™÷ū’vPč^^1ĄPé–÷Fņt ‹^ü‹Fō‰G÷Fņt{‹Fž‰Fä‹^ä1ĄP’7¹»‹Fę’včč;![YZĮŚ‹^䉋^žƒĆ‰^ä1ĄP’7¹»‹Fę’včč![YZĮŚ‹^䉋^žƒĆ‰^ä1ĄP’7¹»‹Fę’vččé [YZ)ĮŚ‹^䉸ō’PX‰ģ]ĆU‰åƒģ¹‹FÓą-»1Ņ÷ó¹»č° ‰Fž¹‹FÓą-»1Ņ÷ó¹»č ‰Fü¹‹F Óą-»1Ņ÷ó¹»čn ‰Fś¹»‹Fč_ = u~ž ‹FśFü=~øō’Pė(‹FüFžFś=~øō’Pė‹FF 9Fsøō’Pė1ĄPX‰ģ]ĆU‰åƒģø(÷f‰ĆĆę3‰^ž‹Fž-ę3»(™÷ū^śSPčp^^‹^ž’vś’w ’vžč”üƒÄ‰Füƒ~üu‰ģ]Ƌ^žĒG"ø P’vžčŃ ^^‰ģ]ĆU‰åģ@‹$@‰^ž¹»”@虉†č÷¾č÷vøō’P齃> @~> @€~øź’Pé§‹@‰žņ÷žö÷‰žš÷” @™1Ū1ÉRPS’¶š÷øP1ĄPQ’¶ņ÷øP’6ī?č”ƒÄ‰Fśƒ~śt’vśé_1ĄPP’6ī?ø PčƒÄøP†Ā÷P†ö÷PčƒÄ‰Fų1ĄPøP1ĄPø PčՃă~ų}’vų鋆č÷-¹Ó艆ą÷’¶ą÷†ā÷P†ź÷P†ģ÷P†ī÷PFöP’vųčęƒÄ‰Füƒ~ü}’vųčt^øų’PéĒ‹@‰žņ÷žöū‰žš÷1Ą1Ū1ÉP’¶č÷S’¶š÷øP1ĄPQ’¶ņ÷øP’6ī?č³ƒÄ‰Fśƒ~śt’vųč#^øó’PévøP†ö÷P’¶ä÷’¶ā÷’¶č÷’¶ź÷’¶ģ÷’¶ī÷č"ƒÄ‰Fśƒ~śt ’vųčå^’vśé9‹^ž¹‹G Óą‰†ę÷’¶ę÷†öūPč«^^žöū‰žņ÷1Ą1Ū1ÉP’¶č÷S’¶ę÷øP’6ī?Q’¶ņ÷P1ĄPčƒÄ‰Fśƒ~śt ø€Pø”.Pčy^^’¶ī÷1ĄP’vųč½ƒÄ’¶ģ÷øP’vųč¬ƒÄ’vųčU^÷†Ę÷t$‹^ž‹†Ź÷‰G‹^ž‹vž’w’t’6ī?øPč6ƒÄ÷†Ę÷t)‹^ž‹†Ģ÷ˆG‹^žŠG0ä˜PŠG0ä˜P’6ī?ø.PčƒÄ‹^žĒG"‹^žƒĆ&‰žĄ÷‹%ß’‰‹^žƒĆ&‰žĄ÷’7¹»‹Föčź[ Ų‹žĄ÷‰‹†ę÷‰†ō÷’¶ō÷’6ī?čĘ^^1ĄPX‰ģ]ĆU‰åƒģ0ø PFŅP’včĘƒÄ= tøų’P飸’’»’#FŅ#^Ō-Ūu Ć Ūtøų’Pé1Ą» #FŅ#^Ō-ƒŪu Ć Ūtø Pė1ĄP¹»XčS‹^‰‹FŚ‹^‰‹FŽ‹^ ‰‹^’7¹»Xč/= t‹F ‰FŠ‹^Š‹v‹‰‹^Ē‹Fā‹^ ‰‹^‹Fź‹N쉉O‹^‹‹O-ƒŁu Į Éuøų’P鱋^‹-¹Óč‰Fś‹^ ‹v ‹-Óč‰Fų‹^’w’7»Xč§[ƒÓ-ƒŪ¹ćŃėŃŲāś‰Fņ‹Fņ9Fųrøų’Pé‹^’7¹»Xčn= u1ĄPė’vśFō‹Fņ+FFō‰Fö‹^’vö’vō’v’vų’vś’7čgśƒÄ ‰Fž¹»‹FÖ’vŲč&[%’ć‰Füƒ~ü ~‹Fü- PFŅP’včƒÄ’vžX‰ģ]ĆU‰åƒģ.‹F-¹Óč‰Fų‹FF-Óč‰Fö‹F -Óč‰Fņ»‹F ’vč·[ƒÓ-ƒŪ¹ćŃėŃŲāś‰Fš‹Fš+Fö+Fņ‰Fō¹»‹Fōč„ Ą}øō’Pé8‹FšFųPč÷[9Ćvøõ’Pé"‹$@‰^ž‹^ž‹vž‹GD ‰FģöG& t ‹^ž‹FģG‰Fģ‹^ž’vģ’wč8 ^^‹FšFųPčÆ ^‰Fīƒ~īu ø€Pø¬.Pčå^^‹^žĒ‹^ž‹Fų‰G‹^ž‹Fī‰G‹^žĒG‹^ž‹Fö‰G ‹FųFī‹^ž‰G‹^ž‹GFöFō‰G ‹^ž‹Fņ‰G‹^ž‹GFöFō‰G’vž’6ī?č¾^^‹F‰Fü‹^^9^üs ‹^üĘƒFüėé‹FōFöFņ1Ū¹ćŃąŃÓāś‰Fč‰^ź‹F‰Fś‹^ž1ĄP’w¹»XčQ‹^ž1ÉZGʹ»Rč<‰FäF湋Fä‹^ęćŃąŃÓāś‰Fä‰^湋FÓčÓą1Ū‰F܉^Ž‹Fä‹^ęFÜ^މFä‰^ę‹Fč‹^ź+FÜ^މFč‰^ź‹Fč‹^ź-ƒŪu!ĄtC Ū鋋F™‹^č‹Nź)ĆŃu!ŪtA É}’vź’včė‹F™RPFąFā1Ą’vā’vą’vę’vä1ŪS»üSP’vśøP1ĄPčŁƒÄ Ąt ø€PøŹ.PčD^^‹Fä‹^ęFą^ā‰Fä‰^ę‹Fč‹^ź+Fą^ā‰Fč‰^źé[’1ĄPX‰ģ]ĆU‰åƒģĘFż‹F‰FžƒFžŠFż0ä˜=}C‹^Ć9^žr‰ģ]Ƌ^žƒ?t‹^ž‹‰Fś‹FśF‰Fś‹Fś‹^ž‰ė ŠFż0ä˜@ˆFżƒFž벉ģ]ĆU‰åƒģƒ~u‰ģ]ù‹FÓą¹‹ī?Óć Ų F‰Fžø÷f‰Ć$@¹‹Óą‰Fś¹»‹F苉Fü’vü’vś’vžč’ƒÄ‰ģ]ĆU‰åPPƒ> @~ƒ> @~øź’Péƒ> @ u1ĄPéų‹ @K‰ŁøÓą‰Fžƒ>@uE‹$@ƒĆ ‰^ü’7¹»‹Fžč [ Ų‹^ü‰‹$@ƒĆ"‰^ü‹Fž÷Š’7¹»čž[!Ƌvü‰隃>@uF‹$@ƒĆ ‰^ü‹Fž÷Š’7¹»čŅ[!Ƌvü‰‹$@ƒĆ"‰^ü‹Fž÷Š’7¹»č°[!Ƌvü‰ėM‹$@ƒĆ ‰^ü‹Fž÷Š’7¹»čŒ[!Ƌvü‰‹$@ƒĆ"‰^ü’7¹»‹Fžčl[ Ų‹^ü‰‹$@‹@‰O$1ĄPX‰ģ]ĆU‰å‹$@’w’6@’6 @č ƒÄ‰ģ]ĆU‰åƒģ ƒ>ī?’tƒ>ī?tø’’Péć‹ @‰^ųø(÷fų‰ĆĆę3‰^ž‹^žöG&t ‹^žöG&t1ĄP鵋^ž‹G‰Fś¹»”@č׉FōĒ$@ę3‹^ž‹6$@‹G‰D~ō€u ’vųčŸõ^1ĄPévĒFüƒ~ü}b‹Fü@=t ‹Fü@=u1ĄPė’vśFö‹Fü@= uĒFö’’¹»‹Fü’vōčh¹»č_‰ĮXÓčØt‹Fü@1ŪSP’vöčƒÄ’Füė˜Ē"@1ĄPX‰ģ]ĆU‰åƒģ ƒ~~ƒ~~øź’Pé,ĒFü‹FH‰ĮøÓą¹»č‰FųĒFž^4~žf6réŲ‹^žöG&uéÅĒFś‹^ž‹G9Ft ƒ~tĒFśƒ~~‹^ž‹G9FtĒFś‹^žöG&tĒFśƒ~u‹$@‹vž‹D9GtĒFśƒ~u ƒ~’uĒFśƒ~u‹^žöG&uėJ‹^žƒĆ&‰^ö‹%ļ’‰ƒ~śt4‹^ž‹Fų…G tė'’Fü’v’vžčP^^‹Fž-ę3»(™÷ūPčł^ƒ~~ėƒFž(é’‹$@öG&t ‹$@öG&tĒ"@ƒ~ü~1ĄPėøż’PX‰ģ]ĆU‰åƒģ‹^öG&u‰ģ]ƋFH‰ĮøÓą¹»čĮ‰Fž‹^‹Fž…G"tg‹^ƒĆ"‰^ų‹Fž÷Š#‰‹F-ę3»(™÷ū^śSPč ^^‹Fś-‰Fś‹^’vś’w ’vč9šƒÄ Ąu ‹^‹F-ę3¹(™÷ł’w$’vPč’ ƒÄ‰ģ]ƋFH¹»’6N/č;¹»č2‰ĮXÓč%¹»č!‰Fü‹^‹FˆGƒ~üt’včs^1ĄP’včķ^^‰ģ]ĆU‰åPP¹»” @čč‰Fü’vü’6ī?č ^^‰Fž‹Fž‰ģ]ĆU‰åPPĒ“0‹^‰¶0ø<÷f1Ū£¼0‰¾0ƒ~tø(÷f‰ĆĆ 4‰^ü‹ ‰ėø(÷f‰ĆĆ 4‰^ü‹%ļ’‰ø²0Pøż’Pčˆ ^^ Ąt ø€PøŽ.Pč5 ^^‹¼0‰^ž‹Fž‰ģ]ĆU‰åP‹$@ƒĆ&‰^ž‹ ‰Ē"@1Ą‰ģ]ĆU‰åPPø(÷f‰ĆĆę3‰^ž‹^žöG&t.‹^žöG&u%‹^žƒĆ&‰^ü‹%÷’‰1ĄPPøü’P’vč>ēƒÄ‰ģ]Ƌ^žöG&t.‹^žöG&u%‹^žƒĆ&‰^ü‹%ż’‰1ĄPPøü’P’včēƒÄ‰ģ]Ć1ĄPP’vøAPč„ ƒÄ‰ģ]ĆU‰åģd‹F-ę3»(™÷ū‰†øž1ĄPP’¶øžø PčW ƒÄ‹^‹v‹D9Gt1ĄPøP1ĄPø Pč5 ƒÄ‰ģ]Ƌ$@‰ž ž‹^‰$@øPFāPøH/Pč9ƒÄ‰†ĄžøPFÄPøč.Pč#ƒÄ‰†¾ž‹ž ž‰$@ƒ¾Ąž|’¶ĄžčŅ^ƒ¾¾ž|’¶¾žčĆ^‹^ƒudžĄžƒ¾¾ž}郾Ąž} ƒ¾Ąžžté ø’PøH/PčJ^^‰†Ąž1ĄPøP1ĄPø Pč ƒÄƒ¾Ąž}‰ģ]Ƌ^ƒĆ‰žžž‹žžž1ĄŠP¹»Xčo €¹»čc‹žžžˆĒ†Āžƒ¾Āž}Gø÷¦Āž‰Ć^¹‹GÓą1Ū‰†²ž‰ž“žøP†²žP’¶ĄžčbƒÄ Ą} ’¶Ąžčš^‰ģ]Ć’†Āžė²žÄž‰ž¶ž1Ą‹ž¶ž‰ž¢ž‰†¤žĒ†Āžƒ¾Āž|éQø÷¦Āž‰Ć^1Ą¹‹ćŃćŃŠāś‰ž®ž‰†°žø÷¦Āž‰Ć^1Ą¹‹_ćŃćŃŠāś‰žŖž‰†¬ž‹†Ŗž‹ž¬ž-ƒŪu!ĄtC ŪéĒ‹†Ŗž‹ž¬ž-ƒŪu!ĄtC Ū} ’¶¬ž’¶Ŗžė1ĄPøP†¦ž†Øž’¶Øž’¶¦ž’¶¤ž’¶¢žøP1ĄP’¶°ž’¶®ž’¶Āž’¶øžč~ƒÄ‰†¼ž’¶¦ž†ÄžP’¶ĄžčMƒÄ‰†ŗžƒ¾¼ž|ƒ¾ŗž} ’¶ĄžčĶ^‰ģ]Ƌ†®ž‹ž°ž†¦žžØž‰†®ž‰ž°ž‹†Ŗž‹ž¬ž+†¦žžØž‰†Ŗž‰ž¬žé’’†ĀžéÅž1ĄPøP1ĄPø PčˆƒÄ’¶Ąžčs^‰ģ]Ć’¶Ąžčg^‰ģ]ĆU‰åPP‹$@‰^ž’6ģ?鹋^ž‹G‰Fü‹_‰č?éä‹^žŠG0䘉FüŠG0䘣č?éĢø(÷&ī?‰Ć‹‡ś3‰Fü‹^žø(÷g‰Ć‹Ÿś3‰č?馋^ž‹ @9Ot‹^žƒtø’’P鍋^ž‹ @‰O‹^ž‹ @‰O’6 @’6 @’6ī?øPčĘƒÄĒFüėY‹^žŠG0ä˜P” @˜[9Ćt‹^žƒtø’’Pė:‹^ž‹ @ˆO‹^ž‹ @ˆO” @˜P˜P’6ī?ø.PčtƒÄĒFüė¾ź.Zée ’vüX‰ģ]ĆU‰åƒģ‹Ģ0‰^žƒ~žtb‹^ž‹F9GrF‹^ž‹‰Fś‹Fž‰Fų‹^ų‹F‰‹^žƒĆ‰^ų‹+F‰‹^žƒt’vśė$’vž’vüčĻ^^’vśė‹Fž‰Fü‹^ž‹G‰Fžė˜1ĄPX‰ģ]ĆU‰åƒģ‹Ź0‰^üƒ>Ź0u ø€Pø/PčÆ^^‹F‹^ü‰‹^ü‹F‰G‹^ü‹_‰Ź0‹Ģ0‰^žƒ~žt ‹^ž‹9Fw‹^ü‹Fž‰G‹^ü‰Ģ0’vüč^‰ģ]ƃ~žt‹^ž‹9Fv‹Fž‰Fś‹^ž‹G‰Fžėߋ^ś‹vü‹G‰D‹^ś‹Fü‰G’vśč>^‰ģ]ĆU‰å‹Ģ09^u ‹^‹_‰Ģ0ė ‹^‹v‹G‰D‹^‹Ź0‰O‹^‰Ź0‰ģ]ĆU‰åPP‹^‹G‰Fžƒ~žu‰ģ]Ƌ^‹v‹G‹^ž9u ‹^ƒĆ‰^ü‹vž‹D‰’vž’v聒^^ė‹Fž‰F‹^‹G‰Fžƒ@BCDEF~žu‰ģ]Ƌ^‹v‹G‹^ž9u‹^ƒĆ‰^ü‹vž‹D‰’vž’vč6’^^‰ģ]ĆU‰åPP‹Ģ0‰^žĒFüƒ~žt‹^ž‹Fü9Gv ‹^ž‹G‰Fü‹^ž‹G‰FžėŪ‹Fü‰ģ]ĆU‰åPĒFžĪ0~žĪ3s‹^žƒĆ‹vž‰\ƒFžėēĒŅ0ĒĢ3ĒĢ0Ī0ĒŹ0Ō0ĒĪ0‹^‰Š0‰ģ]ĆU‰åƒģ1ĄP’včÜ^^‰Fžƒ~ž} ‹¤@÷ŪSé!’v’vžčw^^ Ą} ø€Pø/Pč‰^^‹^‹G%š¹»čž ‰Fś¹»‹Fč =u¹»‹Fśč~ =€t’vžčO^øó’P顋$@ƒu ¹»‹FčU =u‹^öGIt’vžé–‹$@‹v‹D9GuĒFüė‹$@ŠG0䘋^9G uĒFüėĒFü‹$@ƒu¹»‹Fč÷ =t’vžėB‹^’w¹»‹FüčŪ ¹»čŅ ‰ĮXÓčP¹»‹FčĄ […Ćt’vžė ’vžčŒ^øó’PX‰ģ]ĆU‰å‹F‹^-ƒŪu Ć Ūu1ĄPėR‹^ˆŅ3‹^‰Ō3‹^‰Ų3‹^ ‰Ś3‹^ˆÓ3‹^ ‰Ö3‹^‰Ü3‹^‰Ž3‹^‰ą3‹^‰ā3øĪ3Pčw^’6Š3X‰ģ]ĆU‰åøź’‰ģ]ĆU‰å’vø(/PčG^^¹»‹Fč =€t ’vøB/Pč*^^øF/Pč!^1ĄPPPø$PčŠƒÄč­‰ģ]ĆU‰å1ĄŠFPø>@P’6¢@’¢@[XĆXˆƒ>¢@duč €~ uč‰ģ]ĆU‰åƒ>¢@u‰ģ]ĆĒ(@Ē,@Ē*@Ē8@>@‹¢@‰.@ø&@Pøł’PčŒ^^Ē¢@‰ģ]ĆU‰å’v’vøPøPč˜ƒÄ‰ģ]ĆU‰åP1ĄPP’vPP’vøPøPč:ƒÄ‰Fž‹Fž‰ģ]ĆU‰å1ĄPPPPP’vøPøPčƒÄ‰ģ]ĆU‰å’v’vøPøPč6ƒÄ‰ģ]ĆU‰åP1ĄPP’vP’v’vøPøPčփĉFž‹Fž‰ģ]ĆU‰å1ĄPP’vP’v’vøPøPč­ƒÄ‰ģ]ĆU‰å1ĄPPPP’v’vøPøž’PčŒƒÄ‰ģ]ĆU‰å1ĄPPPPP’vøPøž’PčmƒÄ‹°@‹v‰‰ģ]ĆU‰å‹^‰Ŗ@‹^‰¬@‹^‰“@øPøž’PčŌ^^‰ģ]ĆU‰å1ĄPPP’v’v’vøPøž’PčƒÄ‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’Pč÷ƒÄ‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’Pčփĉģ]ĆU‰å‹^ĒG’vøž’PčŹ^^ Ąt ø€PøÜ/Pčwż^^‰ģ]ĆU‰å1ĄPP’vPP’vøPøž’P艃Ä‹^‹Ŗ@‹¬@‰‰W‹^‹®@‹°@‰O‰W‹^‹²@‹“@‰O‰W ‹^‹¶@‹ø@‰O ‰W‰ģ]ĆU‰å1ĄPPPPPPø Pøž’Pč)ƒÄ‰ģ]ĆU‰å1ĄPPP’v ’v’v’vøPčƒÄ‰ģ]ĆU‰å‹^‰Ŗ@‹^ ‰¬@‹^ ‰®@‹^‰°@‹^‰²@‹^‰“@’v’včd^^‰ģ]ĆU‰åPP’v č˜^‰Fž‹^ž‰Ŗ@‹^‰¬@‹^ ‰®@ĒFü°@ƒ~ž ’vž’NžX Ąt’v ƒF [‹vüŠˆƒFüėą’v’vč^^‰ģ]ĆU‰åP‹^‰Ø@ø¦@P’vča^^‰Fžƒ~žt’vžėƒ>Ø@}‹Ø@÷Ū‰¤@ø’’Pė’6Ø@X‰ģ]ĆU‰åPĒFž’vƒF[Š0ä˜ Ąt’Fžėź‹Fž@‰ģ]ùė ¹ė¹ėU‰å‹F‹^Ķ ]ĆU‰åƒģ$^‰^ų‹^€?uéc‹^€?%t’vƒF[Š0ä˜PčĘū^ėŁĒFžƒF‹^Š0ä˜=0|+‹^Š0ä˜=9‹^Š0ä˜-0Pø ÷fž[Ɖ^žƒFėȋFų‰Fī‹Fų‰Fō‹^Š0ä˜P醒vųƒFų[‹‰Fü‹Fü™‰Fš‰VņĒFś én’vųƒFų[‹‰Fü¹»‹Füč‰Fö1Ą‹^ö‰^š‰FņĒFśé?’vųƒFų[‹‰Fü¹»‹Füčā‰Fö1Ą‹^ö‰^š‰FņĒFśé’vīƒFī[‹’w‰FšFņĒFś ‹Fī‰Fųéļ’vīƒFī[‹’w‰FšFņĒFś‹Fī‰FųéĪ’vīƒFī[‹’w‰FšFņĒFś‹Fī‰Fųé­’vųƒFų[‹‰Fü’vüčwś^ƒF酾’vōƒFō[‹‰Fą‹Fō‰Fų‹Fą‰FŽ’vąƒFą[Š0äˆFݘ Ąt ŠFŻ0ä˜Pč8ś^ė߃F‹Fą+FŽH+Fž÷Ų‰Füƒ~üé/ž’vü’NüX Ąué!žø Pčś^ėčø%Pčśł^’vƒF[Š0ä˜Pččł^éśż¾š/Z鄍FāP’vś’vņ’vščUƒÄ‰Fü‹Fž+Fü‰Fśƒ~ś~’vś’NśX Ąt ø P観^ėė‹FüH‰Fśƒ~ś|‹vśŠBā0ä˜P艳^’NśėēƒF钿‰ģ]ĆU‰åƒģ ĒFų‹F‹^-ƒŪu Ć Ūu ‹^ Ę0øPéČ‹F‹^-ƒŪu!ĄtC Ū}ƒ~ u‹^‹F÷Ų÷Ū‰^‰F’FųĒFüƒ~ü }‹^ü^ Ę’FüėģĒFüƒ~ u@’v’v1ĄPø Pč‹^ü^ ˆ‹^ü^ Š0䘙‹^‹N)ĆŃQS1ĄPø P迉F‰Nƒ~u=¹»‹F’vč[%ć‹^ü^ ˆ¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^ƒ~u=¹»‹F’vč<[%ć‹^ü^ ˆ¹‹F‹^ćŃūŃŲāś%’’ć’‰F‰^’Fü‹F‹^-ƒŪu Ć Ūté’ĒFś‹FüH‰Fžƒ~ž|b‹^ž^ €?uƒ~śu ‹^ž^ Ę ėA‹^ž^ Š0ä˜= }‹^ž^ ‰^ö‹^öŠ0ä˜0ˆė‹^ž^ ‰^ö‹^öŠ0ä˜7ˆ’Fś’Nžė˜ƒ~ųtø-P’v ’vü’Fü[XĆXˆ’vüX‰ģ]ÌŲĆøÖ@ĆśWø )’ŽĄ&Ǥ„1Ū&‹ū¤„u= uę_ūĆ[1ĄYZ^_9×w r9ĪwtH’ć@’ćĆ­“­‘I|­9Š­u÷“…ŪučĖ’ć_9Ėtƒūt ƒūuƒłu Z’ēƒłu1ŅR’ēPčŸU‰åW)’‹V ‹F‹^‹N…Ņy ÷Ś÷؃Ś÷ׅŪy ÷Ū÷كŪ÷×č…’t÷Ś÷؃Ś_]‰ŃĀ…Ūu‰Ć‰Š)Ņ÷ń“÷ń‰Ń‰Ś)ŪĆUWV)’„’u&GWˆßˆėˆĶ(É‰ĶˆÅ(ɈąˆŌˆņ(öRPQ‰é9Śr ø’’ė WWRP‰Š)Ņ÷ó‰Å÷į_)ĒƒŅ‰Ö‰Ų÷嚃Ņ^)ʃŅX)Šy MĻŽėō‰ł‰ó_…’tˆéˆŻˆūˆĒ‰č)Ņ^_]Ɖę‹\‹D Ąu1Ņ‹L‹D÷ó‘÷ó‰Ē1Ū‹D‹T¹ŃąŃŅŃÓ9ßwr 9TvāķėŪ+Tū@āćėщę‹\‹D™9Āu1!Ņ}÷Ūt)1Ņ‹L‹D!Ą}÷Ų÷ŁŠ÷ó‘÷ó1ۃ|}÷Ū÷ڃŪ‰Ē1Ū!’}÷ß÷\ߋD‹T!Ņ}÷Ś÷ŲڹŃąŃŅŃÓ9ßwr»9Tvāķė¹+Tū@āć미0ėø+0ėøB0ėøY0ėøp0ė ø†0ėø0ė»SPøPčč“ŅU‰åĒĄ@‹^‰Ā@‹^‰Ä@‹^‰Č@ø¾@PøPø»¾@¹Ķ ‰ģ]ĆŚŚMM receive errorMM called byMM can't reply%c 8%c~0Memory size = %dK MINIX = %dK RAM disk = %dK Available = %dK Not enough memory to run MINIX do_fork can't copydo_exec stack copy errMM hole list is inconsistentnew_mem can't zeroalarm er.Ms".Ą/5Hole table fullallowed: fstat failedMemory manager panic: %s %d coreüę?b"“Xb"b"b"b"<b"b"b"b"b"b"b"b"b"ćb"b"b"b"b"b"œb"Gb"b"b"b"b"b"b"Db"b"b"b"b"b"b"b" b"b"b"b"b"b"b"b"b"b"ā b"b"b"b"`b"yb"b"sys_copy can't sendµ(DÉ'Oź'X (c,(dL'ok'sG(xš'Error: Division by 0 Illegal EM instruct'n Err in EM case instr Variable out of range Err in EM set instr Floating pt not impl. Heap overflow root::0:0::/: daemon:*:1:1::/etc: bin:*:2:2::/bin: ast::8:3::/usr/ast: boot 120 95 d--777 2 1 bin d--755 2 1 cp ---755 2 1 ../commands/bin/cp getlf ---755 2 1 ../commands/bin/getlf sh ---755 2 1 ../commands/bin/sh sync ---755 2 1 ../commands/bin/sync $ dev d--755 2 1 ram b--640 2 1 1 0 640 mem b--640 2 1 1 1 640 kmem b--640 2 1 1 2 640 null b--666 2 1 1 3 0 fd0 b--666 2 1 2 0 360 fd1 b--666 2 1 2 1 360 at0 b--666 2 1 2 0 1200 at1 b--666 2 1 2 1 1200 hd0 b--600 2 1 3 0 0 hd1 b--600 2 1 3 1 0 hd2 b--600 2 1 3 2 0 hd3 b--600 2 1 3 3 0 hd4 b--600 2 1 3 4 0 tty0 c--666 2 1 4 0 tty c--666 2 1 5 0 lp c--222 2 1 6 0 $ etc d--755 2 1 mount -u-755 0 1 ../commands/bin/mount umount -u-755 0 1 ../commands/bin/umount update ---755 2 1 ../commands/bin/update passwd ---644 2 1 passwd rc ---644 2 1 rc message ---644 2 1 message ttys ---644 2 1 ttys $ lib d--755 2 1 $ tmp d--777 2 1 $ user d--755 2 1 $ usr d--755 2 1 $ $ boot 240 95 d--777 2 1 bin d--755 2 1 cat ---755 2 1 ../commands/bin/cat cc ---755 2 1 ../commands/bin/cc cp ---755 2 1 ../commands/bin/cp getlf ---755 2 1 ../commands/bin/getlf kill ---755 2 1 ../commands/bin/kill ls ---755 2 1 ../commands/bin/ls mkdir -u-755 0 1 ../commands/bin/mkdir mined ---755 2 1 ../commands/bin/mined rm ---755 2 1 ../commands/bin/rm sh ---755 2 1 ../commands/bin/sh sync ---755 2 1 ../commands/bin/sync $ dev d--755 2 1 ram b--640 2 1 1 0 640 mem b--640 2 1 1 1 640 kmem b--640 2 1 1 2 640 null b--666 2 1 1 3 0 fd0 b--666 2 1 2 0 360 fd1 b--666 2 1 2 1 360 at0 b--666 2 1 2 0 1200 at1 b--666 2 1 2 1 1200 hd0 b--600 2 1 3 0 0 hd1 b--600 2 1 3 1 0 hd2 b--600 2 1 3 2 0 hd3 b--600 2 1 3 3 0 hd4 b--600 2 1 3 4 0 tty0 c--666 2 1 4 0 tty c--666 2 1 5 0 lp c--222 2 1 6 0 $ etc d--755 2 1 mount -u-755 0 1 ../commands/bin/mount umount -u-755 0 1 ../commands/bin/umount update ---755 2 1 ../commands/bin/update passwd ---644 2 1 passwd rc ---644 2 1 rc message ---644 2 1 message ttys ---644 2 1 ttys $ lib d--755 2 1 cpp ---755 2 1 ../commands/bin/cpp cem ---755 2 1 ../commands/bin/cem $ tmp d--777 2 1 $ user d--755 2 1 $ usr d--755 2 1 $ $ boot 360 127 d--755 1 1 ast d--755 8 3 .profile ---644 8 3 profile $ bin d--755 2 1 gres ---755 2 1 ../commands/bin/gres rev ---755 2 1 ../commands/bin/rev roff ---755 2 1 ../commands/bin/roff shar ---755 2 1 ../commands/bin/shar tar ---755 2 1 ../commands/bin/tar $ test d--777 2 1 test0 -u-755 0 1 ../test/test0 test1 -u-755 0 1 ../test/test1 test2 -u-755 0 1 ../test/test2 test3 -u-755 0 1 ../test/test3 test4 -u-755 0 1 ../test/test4 test5 -u-755 0 1 ../test/test5 test6 -u-755 0 1 ../test/test6 test7 -u-755 0 1 ../test/test7 test8 -u-755 0 1 ../test/test8 test9 -u-755 0 1 ../test/test9 test10 -u-755 0 1 ../test/test10 t10a -u-755 0 1 ../test/t10a test11 -u-755 0 1 ../test/test11 t11a -u-755 0 1 ../test/t11a t11b -u-755 0 1 ../test/t11b test0.c ---644 2 1 ../test/test0.c test1.c ---644 2 1 ../test/test1.c test2.c ---644 2 1 ../test/test2.c test3.c ---644 2 1 ../test/test3.c test4.c ---644 2 1 ../test/test4.c test5.c ---644 2 1 ../test/test5.c test6.c ---644 2 1 ../test/test6.c test7.c ---644 2 1 ../test/test7.c test8.c ---644 2 1 ../test/test8.c test9.c ---644 2 1 ../test/test9.c test10.c ---644 2 1 ../test/test10.c t10a.c ---644 2 1 ../test/t10a.c test11.c ---644 2 1 ../test/test11.c t11a.c ---644 2 1 ../test/t11a.c t11b.c ---644 2 1 ../test/t11b.c run ---755 2 1 ../test/run MINIX d--755 2 1 ../test/MINIX makefile ---644 2 1 ../test/MINIX/makefile $ $ commands d--755 2 1 mined.h ---644 2 1 ../include/mined.h mined1.c ---644 2 1 ../commands/mined1.c mined2.c ---644 2 1 ../commands/mined2.c sh.h ---644 2 1 ../include/sh.h sh1.c ---644 2 1 ../commands/sh1.c sh2.c ---644 2 1 ../commands/sh2.c sh3.c ---644 2 1 ../commands/sh3.c sh4.c ---644 2 1 ../commands/sh4.c sh5.c ---644 2 1 ../commands/sh5.c $ doc d--755 2 1 READ_ME ---644 2 1 ../doc/READ_ME $ $ boot 360 95 d--755 1 1 ast d--755 8 3 .profile ---644 8 3 profile $ bin d--755 2 1 ar ---755 2 1 ../commands/bin/ar asld ---755 2 1 ../commands/bin/asld basename ---755 2 1 ../commands/bin/basename chmem ---755 2 1 ../commands/bin/chmem chmod ---755 2 1 ../commands/bin/chmod chown ---755 2 1 ../commands/bin/chown clr ---755 2 1 ../commands/bin/clr cmp ---755 2 1 ../commands/bin/cmp comm ---755 2 1 ../commands/bin/comm date ---755 2 1 ../commands/bin/date dd ---755 2 1 ../commands/bin/dd df -u-755 0 1 ../commands/bin/df dosread ---755 2 1 ../commands/bin/dosread echo ---755 2 1 ../commands/bin/echo grep ---755 2 1 ../commands/bin/grep head ---755 2 1 ../commands/bin/head libpack ---755 2 1 ../commands/bin/libpack libupack ---755 2 1 ../commands/bin/libupack ln ---755 2 1 ../commands/bin/ln login ---755 2 1 ../commands/bin/login lpr ---755 2 1 ../commands/bin/lpr make ---755 2 1 ../commands/bin/make mkfs ---755 2 1 ../commands/bin/mkfs mknod ---755 2 1 ../commands/bin/mknod mv ---755 2 1 ../commands/bin/mv od ---755 2 1 ../commands/bin/od passwd -u-755 0 1 ../commands/bin/passwd pr ---755 2 1 ../commands/bin/pr pwd ---755 2 1 ../commands/bin/pwd rmdir -u-755 0 1 ../commands/bin/rmdir size ---755 2 1 ../commands/bin/size sleep ---755 2 1 ../commands/bin/sleep sort ---755 2 1 ../commands/bin/sort split ---755 2 1 ../commands/bin/split stty ---755 2 1 ../commands/bin/stty su -u-755 0 1 ../commands/bin/su sum ---755 2 1 ../commands/bin/sum tail ---755 2 1 ../commands/bin/tail tee ---755 2 1 ../commands/bin/tee time ---755 2 1 ../commands/bin/time touch ---755 2 1 ../commands/bin/touch tr ---755 2 1 ../commands/bin/tr true ---755 2 1 ../commands/bin/true uniq ---755 2 1 ../commands/bin/uniq wc ---755 2 1 ../commands/bin/wc $ include d--755 2 1 blocksize.h ---644 2 1 ../include/blocksize.h errno.h ---644 2 1 ../include/errno.h sgtty.h ---644 2 1 ../include/sgtty.h signal.h ---644 2 1 ../include/signal.h stat.h ---644 2 1 ../include/stat.h setjmp.h ---644 2 1 ../include/setjmp.h stdio.h ---644 2 1 ../include/stdio.h $ lib d--755 2 1 cg ---755 2 1 ../commands/bin/cg opt ---755 2 1 ../commands/bin/opt crtso.s ---755 2 1 ../lib/MINIX/crtso.s end.s ---755 2 1 ../lib/MINIX/end.s head.s ---755 2 1 ../lib/MINIX/head.s libc.a ---755 2 1 ../commands/bin/libc.a $ $ /bin/getlf "Please insert /usr diskette in drive 0. Then hit RETURN." /etc/mount /dev/fd0 /usr /usr/bin/date -q $ 29,31c29,31 < lpr.c ---644 2 1 ../commands/lpr.c < ls.c ---644 2 1 ../commands/ls.c < make.c ---644 2 1 ../commands/make.c --- > login.c ---644 2 1 ../commands/login.c > lpr.c ---644 2 1 ../commands/lpr.c > ls.c ---644 2 1 ../commands/ls.c 65d64 < changemem ---644 2 1 changemem 72c71 < makefile ---644 2 1 ../commands/makefile --- > makefile ---644 2 1 ../commands/PCIX/makefile 78c77,91 < $ --- > include d--777 2 1 > blocksize.h ---644 2 1 ../include/blocksize.h > ctype.h ---644 2 1 ../include/ctype.h > errno.h ---644 2 1 ../include/errno.h > grp.h ---644 2 1 ../include/grp.h > lib.h ---644 2 1 ../include/lib.h > pwd.h ---644 2 1 ../include/pwd.h > regexp.h ---644 2 1 ../include/regexp.h > setjmp.h ---644 2 1 ../include/setjmp.h > sgtty.h ---644 2 1 ../include/sgtty.h > signal.h ---644 2 1 ../include/signal.h > stat.h ---644 2 1 ../include/stat.h > stdio.h ---644 2 1 ../include/stdio.h > $ > $ 8,71c8,68 < ar ---755 2 1 ../commands/bin/ar < asld ---755 2 1 ../commands/bin/asld < basename ---755 2 1 ../commands/bin/basename < chmem ---755 2 1 ../commands/bin/chmem < chmod ---755 2 1 ../commands/bin/chmod < chown ---755 2 1 ../commands/bin/chown < clr ---755 2 1 ../commands/bin/clr < cmp ---755 2 1 ../commands/bin/cmp < comm ---755 2 1 ../commands/bin/comm < date ---755 2 1 ../commands/bin/date < dd ---755 2 1 ../commands/bin/dd < df -u-755 0 1 ../commands/bin/df < dosread ---755 2 1 ../commands/bin/dosread < echo ---755 2 1 ../commands/bin/echo < grep ---755 2 1 ../commands/bin/grep < head ---755 2 1 ../commands/bin/head < libpack ---755 2 1 ../commands/bin/libpack < libupack ---755 2 1 ../commands/bin/libupack < ln ---755 2 1 ../commands/bin/ln < login ---755 2 1 ../commands/bin/login < lpr ---755 2 1 ../commands/bin/lpr < make ---755 2 1 ../commands/bin/make < mkfs ---755 2 1 ../commands/bin/mkfs < mknod ---755 2 1 ../commands/bin/mknod < mv ---755 2 1 ../commands/bin/mv < od ---755 2 1 ../commands/bin/od < passwd -u-755 0 1 ../commands/bin/passwd < pr ---755 2 1 ../commands/bin/pr < pwd ---755 2 1 ../commands/bin/pwd < rmdir -u-755 0 1 ../commands/bin/rmdir < size ---755 2 1 ../commands/bin/size < sleep ---755 2 1 ../commands/bin/sleep < sort ---755 2 1 ../commands/bin/sort < split ---755 2 1 ../commands/bin/split < stty ---755 2 1 ../commands/bin/stty < su -u-755 0 1 ../commands/bin/su < sum ---755 2 1 ../commands/bin/sum < tail ---755 2 1 ../commands/bin/tail < tee ---755 2 1 ../commands/bin/tee < time ---755 2 1 ../commands/bin/time < touch ---755 2 1 ../commands/bin/touch < tr ---755 2 1 ../commands/bin/tr < true ---755 2 1 ../commands/bin/true < uniq ---755 2 1 ../commands/bin/uniq < wc ---755 2 1 ../commands/bin/wc < $ < include d--755 2 1 < blocksize.h ---644 2 1 ../include/blocksize.h < errno.h ---644 2 1 ../include/errno.h < sgtty.h ---644 2 1 ../include/sgtty.h < signal.h ---644 2 1 ../include/signal.h < stat.h ---644 2 1 ../include/stat.h < setjmp.h ---644 2 1 ../include/setjmp.h < stdio.h ---644 2 1 ../include/stdio.h < $ < lib d--755 2 1 < cg ---755 2 1 ../commands/bin/cg < opt ---755 2 1 ../commands/bin/opt < crtso.s ---755 2 1 ../lib/MINIX/crtso.s < end.s ---755 2 1 ../lib/MINIX/end.s < head.s ---755 2 1 ../lib/MINIX/head.s < libc.a ---755 2 1 ../commands/bin/libc.a < $ < $ --- > ar ---755 2 1 ../commands/bin/ar > asld ---755 2 1 ../commands/bin/asld > basename ---755 2 1 ../commands/bin/basename > chmem ---755 2 1 ../commands/bin/chmem > chmod ---755 2 1 ../commands/bin/chmod > chown ---755 2 1 ../commands/bin/chown > clr ---755 2 1 ../commands/bin/clr > cmp ---755 2 1 ../commands/bin/cmp > comm ---755 2 1 ../commands/bin/comm > date ---755 2 1 ../commands/bin/date > dd ---755 2 1 ../commands/bin/dd > df -u-755 0 1 ../commands/bin/df > dosread ---755 2 1 ../commands/bin/dosread > echo ---755 2 1 ../commands/bin/echo > grep ---755 2 1 ../commands/bin/grep > head ---755 2 1 ../commands/bin/head > ln ---755 2 1 ../commands/bin/ln > login ---755 2 1 ../commands/bin/login > lpr ---755 2 1 ../commands/bin/lpr > make ---755 2 1 ../commands/bin/make > mkfs ---755 2 1 ../commands/bin/mkfs > mknod ---755 2 1 ../commands/bin/mknod > mv -u-755 0 1 ../commands/bin/mv > od ---755 2 1 ../commands/bin/od > pr ---755 2 1 ../commands/bin/pr > pwd ---755 2 1 ../commands/bin/pwd > rmdir -u-755 0 1 ../commands/bin/rmdir > size ---755 2 1 ../commands/bin/size > sleep ---755 2 1 ../commands/bin/sleep > sort ---755 2 1 ../commands/bin/sort > split ---755 2 1 ../commands/bin/split > stty ---755 2 1 ../commands/bin/stty > su -u-755 0 1 ../commands/bin/su > sum ---755 2 1 ../commands/bin/sum > tail ---755 2 1 ../commands/bin/tail > tee ---755 2 1 ../commands/bin/tee > time ---755 2 1 ../commands/bin/time > touch ---755 2 1 ../commands/bin/touch > tr ---755 2 1 ../commands/bin/tr > true ---755 2 1 ../commands/bin/true > uniq ---755 2 1 ../commands/bin/uniq > wc ---755 2 1 ../commands/bin/wc > $ > include d--755 2 1 > blocksize.h ---644 2 1 ../include/blocksize.h > errno.h ---644 2 1 ../include/errno.h > sgtty.h ---644 2 1 ../include/sgtty.h > signal.h ---644 2 1 ../include/signal.h > stat.h ---644 2 1 ../include/stat.h > setjmp.h ---644 2 1 ../include/setjmp.h > stdio.h ---644 2 1 ../include/stdio.h > $ > lib d--755 2 1 > cg ---755 2 1 ../commands/bin/cg > opt ---755 2 1 ../commands/bin/opt > crtso.s ---755 2 1 ../lib/MINIX/crtso.s > end.s ---755 2 1 ../lib/MINIX/end.s > head.s ---755 2 1 ../lib/MINIX/head.s > libc.a ---755 2 1 ../commands/bin/libc.a > $ > $ 100 ööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööööE2’