<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mike &#187; Работа с диском</title>
	<atom:link href="http://mikhail.krivyy.com/category/zametki/rabota-s-diskom/feed/" rel="self" type="application/rss+xml" />
	<link>http://mikhail.krivyy.com</link>
	<description>мнение автора может не совпадать с его точкой зрения ©</description>
	<lastBuildDate>Fri, 10 Feb 2012 08:08:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<mikes>en</mikes>		<item>
		<title>Создание образа дискеты</title>
		<link>http://mikhail.krivyy.com/2003/01/05/disk-image-creating/</link>
		<comments>http://mikhail.krivyy.com/2003/01/05/disk-image-creating/#comments</comments>
		<pubDate>Sun, 05 Jan 2003 16:37:35 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Работа с диском]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2006/09/07/disk-image-creating/</guid>
		<description><![CDATA[Эта, небольшая, программка на паскале читает содержимое дискеты в файл. После этого файл можно переименовать, скажем, в *.ima или *.flp и подсунуть в WinImage или в FAT12. Программа написана на Паскале и использует 25h прерывание. Скачать EXE&#8217;шник можно здесь. Скриншот приведен ниже. Запускается программа следующим образом: dimage.exe disk.flp dimage.pas &#160; type TSector0 = Record Jump [...]]]></description>
			<content:encoded><![CDATA[<p>Эта, небольшая, программка на паскале читает содержимое дискеты в файл. После этого файл можно переименовать, скажем, в *.ima или *.flp и подсунуть в WinImage или в <a href="http://mikhail.krivyy.com/2002/12/20/using-fat12/">FAT12</a>.
</p>
<p>Программа написана на Паскале и использует 25h прерывание. Скачать EXE&#8217;шник можно <a href="http://mikhail.krivyy.com/wp-content/uploads/2006/09/dimage.exe">здесь</a>.
</p>
<p>Скриншот приведен ниже. Запускается программа следующим образом: <i>dimage.exe disk.flp</i></p>
<p><span id="more-63"></span></p>
<p><center><img id="image61" alt=dimage.gif src="http://mikhail.krivyy.com/wp-content/uploads/2006/09/dimage.gif" /></center></p>
<h2>dimage.pas</h2>
<ol class="codelist">
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>type TSector0 = Record</code></li>
<li class="tab7 odd"><code>Jump             : Array[1..3] of Char;   { NEAR-переход на код загрузки }</code></li>
<li class="tab7 even"><code>OEMName          : Array[1..8] of Char;   { OEM-имя компании и версия системы }</code></li>
<li class="tab7 odd"><code>SectSize         : Word;                  { байт на сектор }</code></li>
<li class="tab7 even"><code>ClustSize        : Byte;                  { секторов на единицу распределения (кластер) }</code></li>
<li class="tab7 odd"><code>ResSecs          : Word;                  { резервных секторов (секторов перед первой FAT) }</code></li>
<li class="tab7 even"><code>FatCnt           : Byte;                  { число таблиц FAT }</code></li>
<li class="tab7 odd"><code>RootSiz          : Word;                  { макс.число 32-байтовых элементов корневого оглавления }</code></li>
<li class="tab7 even"><code>TotSecs          : Word;                  { общее число секторов на носителе (раздел DOS) }</code></li>
<li class="tab7 odd"><code>Media            : Byte;                  { дескриптор носителя (то же, что 1-й байт FAT) }</code></li>
<li class="tab7 even"><code>FatSize          : Word;                  { число секторов в одной FAT }</code></li>
<li class="tab7 odd"><code>TrkSecs          : Word;                  { секторов на дорожку (цилиндр) }</code></li>
<li class="tab7 even"><code>HeadCnt          : Word;                  { число головок чтения/записи (поверхностей) }</code></li>
<li class="tab7 odd"><code>HidnSec          : Word;                  { спрятанных секторов (исп. в схемах разделения) }</code></li>
<li class="tab7 even"><code>Ostatok          : Array[1..486] of Char; { Остаток, что-бы сюда можно было читать сектор }</code></li>
<li class="tab5 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>var s0           : TSector0;</code></li>
<li class="tab4 even"><code>b:Array[0..512] of Byte;</code></li>
<li class="tab4 odd"><code>F            : File;</code></li>
<li class="tab4 even"><code>I            : LongInt;</code></li>
<li class="tab4 odd"><code>c            : Integer;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Function ReadSector(A:Pointer;Disk:Byte;Count:Word;Sector:Word):Boolean;</code></li>
<li class="tab0 even"><code>var Error     :Word;</code></li>
<li class="tab4 odd"><code>Offs      :Word;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab1 odd"><code>Offs:=Word(A);</code></li>
<li class="tab1 even"><code>Error:=0;</code></li>
<li class="tab2 odd"><code>asm</code></li>
<li class="tab9 even"><code>mov  al,[Disk]         {Номер диска 0-A}</code></li>
<li class="tab9 odd"><code>mov  cx,[Count]        {Счетчик считываемых символов}</code></li>
<li class="tab9 even"><code>mov  dx,[Sector]       {Начальный сектор}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab9 even"><code>mov  bx,[Offs]</code></li>
<li class="tab9 odd"><code>int  25h</code></li>
<li class="tab9 even"><code>pop  dx</code></li>
<li class="tab9 odd"><code>je   @nError</code></li>
<li class="tab9 even"><code>mov  ax,1</code></li>
<li class="tab9 odd"><code>mov  [Error],ax</code></li>
<li class="tab0 even"><code>@nError:</code></li>
<li class="tab2 odd"><code>end;</code></li>
<li class="tab1 even"><code>if Error=0 then ReadSector:=True</code></li>
<li class="tab12 odd"><code>else ReadSector:=False;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>Function WriteSector(A:Pointer;Disk:Byte;Count:Word;Sector:Word):Boolean;</code></li>
<li class="tab0 odd"><code>var Error     :Word;</code></li>
<li class="tab4 even"><code>Offs      :Word;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>Offs:=Word(A);</code></li>
<li class="tab1 odd"><code>Error:=0;</code></li>
<li class="tab2 even"><code>asm</code></li>
<li class="tab9 odd"><code>mov  al,[Disk]         {Номер диска 0-A}</code></li>
<li class="tab9 even"><code>mov  cx,[Count]        {Счетчик считываемых символов}</code></li>
<li class="tab9 odd"><code>mov  dx,[Sector]       {Начальный сектор}</code></li>
<li class="even">&nbsp;</li>
<li class="tab9 odd"><code>mov  bx,[Offs]</code></li>
<li class="tab9 even"><code>int  26h</code></li>
<li class="tab9 odd"><code>pop  dx</code></li>
<li class="tab9 even"><code>je   @nError</code></li>
<li class="tab9 odd"><code>mov  ax,1</code></li>
<li class="tab9 even"><code>mov  [Error],ax</code></li>
<li class="tab0 odd"><code>@nError:</code></li>
<li class="tab2 even"><code>end;</code></li>
<li class="tab1 odd"><code>if Error=0 then WriteSector:=True</code></li>
<li class="tab12 even"><code>else WriteSector:=False;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>Assign(F,ParamStr(1));If IOResult&lt;&gt;0 then Exit;</code></li>
<li class="tab1 odd"><code>If not ReadSector(@s0,0,1,0) then Begin WriteLn('Error reading 0 sector.');halt(1); End;</code></li>
<li class="tab1 even"><code>If (ParamStr(2)='-s') or (ParamStr(2)='-S') or</code></li>
<li class="tab4 odd"><code>(ParamStr(2)='/s') or (ParamStr(2)='/S') then</code></li>
<li class="tab5 even"><code>Begin</code></li>
<li class="tab6 odd"><code>Reset(F,1);If IOResult&lt;&gt;0 then Exit;</code></li>
<li class="tab6 even"><code>BlockRead(F,s0,512,c);If c&lt;&gt;512 then Exit;</code></li>
<li class="tab6 odd"><code>Reset(F,1);If IOResult&lt;&gt;0 then Exit;</code></li>
<li class="tab6 even"><code>Write('Байт на сектор                                 : ');WriteLn(s0.SectSize);</code></li>
<li class="tab6 odd"><code>Write('Секторов на дорожку (цилиндр)                  : ');WriteLn(s0.TrkSecs);</code></li>
<li class="tab6 even"><code>Write('Число головок чтения/записи (поверхностей)     : ');WriteLn(s0.HeadCnt);</code></li>
<li class="tab6 odd"><code>Write('Общее число секторов на носителе (раздел DOS)  : ');WriteLn(s0.TotSecs);</code></li>
<li class="tab6 even"><code>Write('Общее число дорожек на носителе                : ');WriteLn(s0.TotSecs div (s0.TrkSecs*s0.HeadCnt));</code></li>
<li class="tab6 odd"><code>Write('Резервных секторов (секторов перед первой FAT) : ');WriteLn(s0.ResSecs);</code></li>
<li class="tab6 even"><code>Write('Размер FAT                                     : ');WriteLn(s0.FatSize);</code></li>
<li class="tab6 odd"><code>Write('Количество FAT                                 : ');WriteLn(s0.FatCnt);</code></li>
<li class="tab6 even"><code>WriteLn('¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦');</code></li>
<li class="tab6 odd"><code>For I:=0 to s0.TotSecs-1 do</code></li>
<li class="tab7 even"><code>Begin</code></li>
<li class="tab8 odd"><code>Write(round(I/s0.TotSecs*100),'%',#13);</code></li>
<li class="tab8 even"><code>BlockRead(F,b,512,c);If c&lt;&gt;512 then Exit;</code></li>
<li class="tab8 odd"><code>WriteSector(@b,0,1,I);</code></li>
<li class="tab7 even"><code>End;</code></li>
<li class="tab5 odd"><code>End</code></li>
<li class="tab1 even"><code>else</code></li>
<li class="tab2 odd"><code>Begin</code></li>
<li class="tab3 even"><code>ReWrite(F,1);If IOResult&lt;&gt;0 then Exit;</code></li>
<li class="tab3 odd"><code>Write('Байт на сектор                                 : ');WriteLn(s0.SectSize);</code></li>
<li class="tab3 even"><code>Write('Секторов на дорожку (цилиндр)                  : ');WriteLn(s0.TrkSecs);</code></li>
<li class="tab3 odd"><code>Write('Число головок чтения/записи (поверхностей)     : ');WriteLn(s0.HeadCnt);</code></li>
<li class="tab3 even"><code>Write('Общее число секторов на носителе (раздел DOS)  : ');WriteLn(s0.TotSecs);</code></li>
<li class="tab3 odd"><code>Write('Общее число дорожек на носителе                : ');WriteLn(s0.TotSecs div (s0.TrkSecs*s0.HeadCnt));</code></li>
<li class="tab3 even"><code>Write('Резервных секторов (секторов перед первой FAT) : ');WriteLn(s0.ResSecs);</code></li>
<li class="tab3 odd"><code>Write('Размер FAT                                     : ');WriteLn(s0.FatSize);</code></li>
<li class="tab3 even"><code>Write('Количество FAT                                 : ');WriteLn(s0.FatCnt);</code></li>
<li class="tab3 odd"><code>For I:=0 to s0.TotSecs-1 do</code></li>
<li class="tab4 even"><code>Begin</code></li>
<li class="tab5 odd"><code>Write(round(I/s0.TotSecs*100),'%',#13);</code></li>
<li class="tab5 even"><code>ReadSector(@b,0,1,I);</code></li>
<li class="tab5 odd"><code>BlockWrite(F,b,512);</code></li>
<li class="tab4 even"><code>End;</code></li>
<li class="tab2 odd"><code>End;</code></li>
<li class="tab1 even"><code>Close(F);</code></li>
<li class="tab0 odd"><code>End.</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/dimage.pas">dimage.pas</a></li>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2003/01/05/disk-image-creating/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работа с длинными именами файлов из под DOS</title>
		<link>http://mikhail.krivyy.com/2003/01/01/long-filenames-dos/</link>
		<comments>http://mikhail.krivyy.com/2003/01/01/long-filenames-dos/#comments</comments>
		<pubDate>Wed, 01 Jan 2003 14:16:35 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Работа с диском]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2003/01/01/long-filenames-dos/</guid>
		<description><![CDATA[В этом модуле реализованы функции FindFirst и FindNext, но не простые, а работающие с длинными именами файлов под ГОЛЫМ ДОСОМ. Формат длинных имен, насколько я помню, узнавался методом высоконаучного тыка, так что никаких гарантий. Писал очень давно, и сейчас даже откомпилировать не смог, так как не нашел модуля uni2dos. Зато вспомнил, что он делает :) [...]]]></description>
			<content:encoded><![CDATA[<p>В этом модуле реализованы функции FindFirst и FindNext, но не простые, а работающие с длинными именами файлов под ГОЛЫМ ДОСОМ. Формат длинных имен, насколько я помню, узнавался методом высоконаучного тыка, так что никаких гарантий.
</p>
<p>Писал очень давно, и сейчас даже откомпилировать не смог, так как не нашел модуля uni2dos. Зато вспомнил, что он делает :) Он перекодирует строку из Unicode в DOS кодировку. Таблица Unicodе для русских символов приведена <a href="http://mikhail.krivyy.com/2004/10/09/unicode-russian/">тут</a>.</p>
<p><span id="more-59"></span></p>
<h2>lfn.pas</h2>
<ol class="codelist">
<li class="tab0 odd"><code>uses uni2dos;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>type TStr3=Array[1..3] of Char;</code></li>
<li class="tab5 even"><code>TStr8=Array[1..8] of Char;</code></li>
<li class="tab5 odd"><code>TStr10=Array[1..10] of Char;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>type TSector0 = Record</code></li>
<li class="tab7 even"><code>Jump             : Array[1..3] of Char;   { NEAR-переход на код загрузки }</code></li>
<li class="tab7 odd"><code>OEMName          : Array[1..8] of Char;   { OEM-имя компании и версия системы }</code></li>
<li class="tab7 even"><code>SectSize         : Word;                  { байт на сектор }</code></li>
<li class="tab7 odd"><code>ClustSize        : Byte;                  { секторов на единицу распределения (кластер) }</code></li>
<li class="tab7 even"><code>ResSecs          : Word;                  { резервных секторов (секторов перед первой FAT) }</code></li>
<li class="tab7 odd"><code>FatCnt           : Byte;                  { число таблиц FAT }</code></li>
<li class="tab7 even"><code>RootSiz          : Word;                  { макс.число 32-байтовых элементов корневого оглавления }</code></li>
<li class="tab7 odd"><code>TotSecs          : Word;                  { общее число секторов на носителе (раздел DOS) }</code></li>
<li class="tab7 even"><code>Media            : Byte;                  { дескриптор носителя (то же, что 1-й байт FAT) }</code></li>
<li class="tab7 odd"><code>FatSize          : Word;                  { число секторов в одной FAT }</code></li>
<li class="tab7 even"><code>TrkSecs          : Word;                  { секторов на дорожку (цилиндр) }</code></li>
<li class="tab7 odd"><code>HeadCnt          : Word;                  { число головок чтения/записи (поверхностей) }</code></li>
<li class="tab7 even"><code>HidnSec          : Word;                  { спрятанных секторов (исп. в схемах разделения) }</code></li>
<li class="tab7 odd"><code>Ostatok          : Array[1..486] of Char; { Остаток, что-бы сюда можно было читать сектор }</code></li>
<li class="tab5 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>type TFile = Record</code></li>
<li class="tab7 odd"><code>Name             : TStr8;                 { Имя файла }</code></li>
<li class="tab7 even"><code>Ext              : TStr3;                 { Расширение }</code></li>
<li class="tab7 odd"><code>Attr             : Byte;                  { Атрибут файла }</code></li>
<li class="tab7 even"><code>Reserv           : TStr10;                { Резерв }</code></li>
<li class="tab7 odd"><code>Time             : Word;                  { время создания/модификации в формате filetime }</code></li>
<li class="tab7 even"><code>Date             : Word;                  { дата создания/модификации в формате filetime }</code></li>
<li class="tab7 odd"><code>ClstrNo          : Word;                  { номер начального кластера данных (связь с FAT ) }</code></li>
<li class="tab7 even"><code>Size             : LongInt;               { размер файла в байтах }</code></li>
<li class="tab5 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>type TLongSearchRec = Record</code></li>
<li class="tab7 even"><code>Name             : TStr8;                 { Имя файла }</code></li>
<li class="tab7 odd"><code>LongName         : String;                { Длиное имя файла }</code></li>
<li class="tab7 even"><code>Ext              : TStr3;                 { Расширение }</code></li>
<li class="tab7 odd"><code>Attr             : Byte;                  { Атрибут файла }</code></li>
<li class="tab7 even"><code>Reserv           : TStr10;                { Резерв }</code></li>
<li class="tab7 odd"><code>Time             : Word;                  { время создания/модификации в формате filetime }</code></li>
<li class="tab7 even"><code>Date             : Word;                  { дата создания/модификации в формате filetime }</code></li>
<li class="tab7 odd"><code>ClstrNo          : Word;                  { номер начального кластера данных (связь с FAT ) }</code></li>
<li class="tab7 even"><code>Size             : LongInt;               { размер файла в байтах }</code></li>
<li class="tab7 odd"><code>FPosInSec        : Integer;               { Позиция - в секторе }</code></li>
<li class="tab7 even"><code>FSecPos          : Integer;               { Позиция - сектор }</code></li>
<li class="tab7 odd"><code>FMask            : String;                { Маска для поиска }</code></li>
<li class="tab7 even"><code>FAttr            : Byte;                  { Путь заданный в FindFirst }</code></li>
<li class="tab5 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>type TDTA = Record</code></li>
<li class="tab7 even"><code>Reserved         : Array[1..$15] of Byte; { Зарезервированно для FindNext }</code></li>
<li class="tab7 odd"><code>Attr             : Byte;                  { Атрибут файла }</code></li>
<li class="tab7 even"><code>Time             : Word;                  { время создания/модификации в формате filetime }</code></li>
<li class="tab7 odd"><code>Date             : Word;                  { дата создания/модификации в формате filetime }</code></li>
<li class="tab7 even"><code>Size             : LongInt;               { размер файла в байтах }</code></li>
<li class="tab7 odd"><code>Name             : Array[1..13] of Char;  { Имя файла + . +расширение }</code></li>
<li class="tab5 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>type TDir=Array[0..15] of TFile;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>var s0           : TSector0;</code></li>
<li class="tab4 odd"><code>dir          : TDir;</code></li>
<li class="tab4 even"><code>Root         : Word;</code></li>
<li class="tab4 odd"><code>I            : Word;</code></li>
<li class="tab4 even"><code>Search       : TLongSearchRec;</code></li>
<li class="tab4 odd"><code>LongDosError : Integer;</code></li>
<li class="tab4 even"><code>SecPerCat    : Integer;</code></li>
<li class="tab4 odd"><code>DTA          : TDTA;        { Текущая DTA }</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Function ReadSector(A:Pointer;Disk:Byte;Count:Word;Sector:Word):Boolean;</code></li>
<li class="tab0 even"><code>var Error     :Word;</code></li>
<li class="tab4 odd"><code>Offs      :Word;</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab1 odd"><code>Offs:=Word(A);</code></li>
<li class="tab1 even"><code>Error:=0;</code></li>
<li class="tab2 odd"><code>asm</code></li>
<li class="tab9 even"><code>mov  al,[Disk]         {Номер диска 0-A}</code></li>
<li class="tab9 odd"><code>mov  cx,[Count]        {Счетчик считываемых символов}</code></li>
<li class="tab9 even"><code>mov  dx,[Sector]       {Начальный сектор}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab9 even"><code>mov  bx,[Offs]</code></li>
<li class="tab9 odd"><code>int  25h</code></li>
<li class="tab9 even"><code>pop  dx</code></li>
<li class="tab9 odd"><code>je   @nError</code></li>
<li class="tab9 even"><code>mov  ax,1</code></li>
<li class="tab9 odd"><code>mov  [Error],ax</code></li>
<li class="tab0 even"><code>@nError:</code></li>
<li class="tab2 odd"><code>end;</code></li>
<li class="tab1 even"><code>if Error=0 then ReadSector:=True</code></li>
<li class="tab12 odd"><code>else ReadSector:=False;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>{ Получаем длиное имя файла #################################################}</code></li>
<li class="tab0 odd"><code>function GetUniLFN(I:Word):String;</code></li>
<li class="tab0 even"><code>var Str,Str0,Str1:String;</code></li>
<li class="tab4 odd"><code>Flag:Boolean;</code></li>
<li class="tab4 even"><code>Len:Integer;</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>Flag:=true;Str0:=#255+#255;Str:='';Str1:='';</code></li>
<li class="tab1 odd"><code>While flag do</code></li>
<li class="tab2 even"><code>Begin</code></li>
<li class="tab6 odd"><code>Str1:=copy(Dir[I-1].Name,2,7)+Dir[I-1].Ext+copy(Dir[I-1].Reserv,3,8)+char(Dir[I-1].Time)+</code></li>
<li class="tab12 even"><code>char(Dir[I-1].Time shr 8)+char(Dir[I-1].Date)+char(Dir[I-1].Date shr 8)+char(Dir[I-1].Size)+</code></li>
<li class="tab12 odd"><code>char(Dir[I-1].Size shr 8)+char(Dir[I-1].Size shr 16)+char(Dir[I-1].Size shr 24);</code></li>
<li class="tab3 even"><code>Len:=pos(Str0,Str1);</code></li>
<li class="tab3 odd"><code>If Len&lt;&gt;0 then Begin Flag:=False; Str:=Str+copy(Str1,1,Len); End</code></li>
<li class="tab13 even"><code>else Begin</code></li>
<li class="tab20 odd"><code>dec(i);</code></li>
<li class="tab20 even"><code>Str:=Str+Str1;</code></li>
<li class="tab20 odd"><code>if Dir[I].Attr&lt;&gt;15 then Flag:=False;</code></li>
<li class="tab18 even"><code>End;</code></li>
<li class="tab2 odd"><code>End;</code></li>
<li class="tab1 even"><code>GetUniLFN:=Str;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>{ Long Find First ###########################################################}</code></li>
<li class="tab0 even"><code>Procedure LongFindFirst(Path:String;Attr:Word;var SR:TLongSearchRec);</code></li>
<li class="tab0 odd"><code>var I,Sec                  :Integer;</code></li>
<li class="tab4 even"><code>Drive                  :Word;        { Номер диска }</code></li>
<li class="tab4 odd"><code>NameSeg,NameOfs        :Word;        { Адрес строки для поиска }</code></li>
<li class="tab4 even"><code>ParentDir              :String;      { Родительский каталог }</code></li>
<li class="tab4 odd"><code>Sector,InSect,Data     :LongInt;     { Сектор, и позиция каталоговой записи }</code></li>
<li class="tab4 even"><code>DTASeg,DTASize,DTAOfs  :Word;        { Адрес локальгого DTA }</code></li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>LongDOSError:=0;</code></li>
<li class="tab1 odd"><code>{Drive:=Path[1];} Drive:=0;         { Получаем имя диска }</code></li>
<li class="tab1 even"><code>ParentDir:=copy(Path,4,Length(Path)-1);   { Выделим родительский каталог }</code></li>
<li class="tab1 odd"><code>If not ReadSector(@s0,Drive,1,0) then Exit;</code></li>
<li class="tab1 even"><code>If Pos('\',ParentDir)=0 then</code></li>
<li class="tab2 odd"><code>Begin { Если ищем в корне #################################################}</code></li>
<li class="tab3 even"><code>Path:=Path+#0;</code></li>
<li class="tab3 odd"><code>NameSeg:=Seg(Path);NameOfs:=Ofs(Path)+1;</code></li>
<li class="tab3 even"><code>DTAOfs:=Ofs(DTA);DTASeg:=Seg(DTA);DTASize:=Sizeof(DTA);</code></li>
<li class="tab3 odd"><code>asm                                 { FindFirst - заполняем }</code></li>
<li class="tab9 even"><code>push ds</code></li>
<li class="odd">&nbsp;</li>
<li class="tab9 even"><code>mov ax,[NameSeg]</code></li>
<li class="tab9 odd"><code>mov ds,ax</code></li>
<li class="tab9 even"><code>mov dx,[NameOfs]</code></li>
<li class="tab9 odd"><code>mov ah,$4E                   { Функция DOS - найти первый файл }</code></li>
<li class="tab9 even"><code>mov cx,Attr                  { Аттрибуты файла }</code></li>
<li class="tab9 odd"><code>int 21h</code></li>
<li class="tab9 even"><code>jnc @FilesF</code></li>
<li class="tab9 odd"><code>mov ax,$FF</code></li>
<li class="tab9 even"><code>mov [LongDOSError],ax</code></li>
<li class="tab9 odd"><code>jmp @AsmEnd</code></li>
<li class="tab0 even"><code>@FilesF: mov ah,$2f                   { Получим адрес текущей DTA }</code></li>
<li class="tab9 odd"><code>int 21h</code></li>
<li class="tab9 even"><code>mov ax,es                    { И скопируем ее в нашу локальную DTA }</code></li>
<li class="tab9 odd"><code>mov ds,ax</code></li>
<li class="tab9 even"><code>mov si,bx</code></li>
<li class="tab9 odd"><code>mov di,[DTAOfs]</code></li>
<li class="tab9 even"><code>mov es,[DTASeg]</code></li>
<li class="tab9 odd"><code>mov cx,[DTASize]</code></li>
<li class="tab9 even"><code>cld</code></li>
<li class="tab9 odd"><code>rep movsb</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>@AsmEnd: pop ds</code></li>
<li class="tab3 even"><code>end; { В DTA.Reserved[14] можно узнать номер найденой записи в каталоге}</code></li>
<li class="tab3 odd"><code>If LongDOSError&lt;&gt;0 then Exit;</code></li>
<li class="tab3 even"><code>Sector:=trunc((DTA.Reserved[14]+256*DTA.Reserved[15])/(s0.SectSize shr 5)); { Номер сектора,где находится каталог с именем }</code></li>
<li class="tab3 odd"><code>InSect:=(DTA.Reserved[14]+256*DTA.Reserved[15])-Sector*(s0.SectSize shr 5); { Номер записи в секторе }</code></li>
<li class="tab3 even"><code>Root:=s0.ResSecs+s0.FatSize*s0.FatCnt; { Вычисляем номер сектора с корнем }</code></li>
<li class="tab3 odd"><code>If not ReadSector(@dir,0,1,Root+Sector) then Exit; { Читаем сектор }</code></li>
<li class="tab3 even"><code>SR.Name:=dir[InSect].Name; { Заполнаяем TLongSearchRec }</code></li>
<li class="tab3 odd"><code>SR.Ext:=dir[InSect].Ext;</code></li>
<li class="tab3 even"><code>SR.Attr:=dir[InSect].Attr;</code></li>
<li class="tab3 odd"><code>SR.Reserv:=dir[InSect].Reserv;</code></li>
<li class="tab3 even"><code>SR.Time:=dir[InSect].Time;</code></li>
<li class="tab3 odd"><code>SR.Date:=dir[InSect].Date;</code></li>
<li class="tab3 even"><code>SR.ClstrNo:=dir[InSect].ClstrNo;</code></li>
<li class="tab3 odd"><code>SR.Size:=dir[InSect].Size;</code></li>
<li class="tab3 even"><code>{ Теперь смотрим длиное имя }</code></li>
<li class="tab3 odd"><code>If (InSect&gt;0) and (dir[InSect-1].attr=15) then SR.LongName:=UniToDos(GetUniLFN(InSect))</code></li>
<li class="tab45 even"><code>else SR.LongName:=dir[InSect].Name+'.'+dir[InSect].Ext;</code></li>
<li class="tab2 odd"><code>End</code></li>
<li class="tab1 even"><code>else</code></li>
<li class="tab2 odd"><code>Begin { Если ищем не в корне ##############################################}</code></li>
<li class="tab3 even"><code>Path:=Path+#0;</code></li>
<li class="tab3 odd"><code>NameSeg:=Seg(Path);NameOfs:=Ofs(Path)+1;</code></li>
<li class="tab3 even"><code>DTAOfs:=Ofs(DTA);DTASeg:=Seg(DTA);DTASize:=Sizeof(DTA);</code></li>
<li class="tab3 odd"><code>asm                                 { FindFirst - заполняем }</code></li>
<li class="tab9 even"><code>push ds</code></li>
<li class="odd">&nbsp;</li>
<li class="tab9 even"><code>mov ax,[NameSeg]</code></li>
<li class="tab9 odd"><code>mov ds,ax</code></li>
<li class="tab9 even"><code>mov dx,[NameOfs]</code></li>
<li class="tab9 odd"><code>mov ah,$4E                   { Функция DOS - найти первый файл }</code></li>
<li class="tab9 even"><code>mov cx,Attr                  { Аттрибуты файла }</code></li>
<li class="tab9 odd"><code>int 21h</code></li>
<li class="tab9 even"><code>jnc @FilesF</code></li>
<li class="tab9 odd"><code>mov ax,$FF</code></li>
<li class="tab9 even"><code>mov [LongDOSError],ax</code></li>
<li class="tab9 odd"><code>jmp @AsmEnd</code></li>
<li class="tab0 even"><code>@FilesF: mov ah,$2f                   { Получим адрес текущей DTA }</code></li>
<li class="tab9 odd"><code>int 21h</code></li>
<li class="tab9 even"><code>mov ax,es                    { И скопируем ее в нашу локальную DTA }</code></li>
<li class="tab9 odd"><code>mov ds,ax</code></li>
<li class="tab9 even"><code>mov si,bx</code></li>
<li class="tab9 odd"><code>mov di,[DTAOfs]</code></li>
<li class="tab9 even"><code>mov es,[DTASeg]</code></li>
<li class="tab9 odd"><code>mov cx,[DTASize]</code></li>
<li class="tab9 even"><code>cld</code></li>
<li class="tab9 odd"><code>rep movsb</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>@AsmEnd: pop ds</code></li>
<li class="tab3 even"><code>end; { В DTA.Reserved[14] можно узнать номер найденой записи в каталоге}</code></li>
<li class="tab3 odd"><code>If LongDOSError&lt;&gt;0 then Exit;</code></li>
<li class="tab3 even"><code>Sector:=trunc((DTA.Reserved[14]+256*DTA.Reserved[15])/(s0.SectSize shr 5));</code></li>
<li class="tab3 odd"><code>InSect:=(DTA.Reserved[14]+256*DTA.Reserved[15])-Sector*(s0.SectSize shr 5); { Номер записи в секторе }</code></li>
<li class="tab3 even"><code>Sector:=Sector+DTA.Reserved[16]+256*DTA.Reserved[17]-3; { Номер сектора,где находится каталог с именем }</code></li>
<li class="tab3 odd"><code>Root:=s0.ResSecs+s0.FatSize*s0.FatCnt; { Вычисляем номер сектора с корнем }</code></li>
<li class="tab3 even"><code>Data:=Root+(s0.RootSiz*32) div s0.SectSize;</code></li>
<li class="tab3 odd"><code>If not ReadSector(@dir,0,1,Data+Sector) then Exit; { Читаем сектор }</code></li>
<li class="tab3 even"><code>SR.Name:=dir[InSect].Name; { Заполнаяем TLongSearchRec }</code></li>
<li class="tab3 odd"><code>SR.Ext:=dir[InSect].Ext;</code></li>
<li class="tab3 even"><code>SR.Attr:=dir[InSect].Attr;</code></li>
<li class="tab3 odd"><code>SR.Reserv:=dir[InSect].Reserv;</code></li>
<li class="tab3 even"><code>SR.Time:=dir[InSect].Time;</code></li>
<li class="tab3 odd"><code>SR.Date:=dir[InSect].Date;</code></li>
<li class="tab3 even"><code>SR.ClstrNo:=dir[InSect].ClstrNo;</code></li>
<li class="tab3 odd"><code>SR.Size:=dir[InSect].Size;</code></li>
<li class="tab3 even"><code>{ Теперь смотрим длиное имя }</code></li>
<li class="tab3 odd"><code>If (InSect&gt;0) and (dir[InSect-1].attr=15) then SR.LongName:=UniToDos(GetUniLFN(InSect))</code></li>
<li class="tab45 even"><code>else SR.LongName:=dir[InSect].Name+'.'+dir[InSect].Ext;</code></li>
<li class="tab2 odd"><code>End;</code></li>
<li class="tab0 even"><code>End;</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>{ Long Find Next ############################################################}</code></li>
<li class="tab0 odd"><code>Procedure LongFindNext(var SR:TLongSearchRec);</code></li>
<li class="tab0 even"><code>var</code></li>
<li class="tab4 odd"><code>Drive                  :Word;        { Номер диска }</code></li>
<li class="tab4 even"><code>Sector,InSect,Data     :LongInt;     { Сектор, и позиция каталоговой записи }</code></li>
<li class="tab4 odd"><code>DTASeg,DTASize,DTAOfs  :Word;        { Адрес локальгого DTA }</code></li>
<li class="tab0 even"><code>Begin</code></li>
<li class="tab1 odd"><code>Drive:=0;</code></li>
<li class="tab1 even"><code>LongDOSError:=0;</code></li>
<li class="tab1 odd"><code>DTAOfs:=Ofs(DTA);DTASeg:=Seg(DTA);DTASize:=Sizeof(DTA);</code></li>
<li class="tab1 even"><code>asm                                  { FindFirst - заполняем }</code></li>
<li class="tab9 odd"><code>push ds</code></li>
<li class="even">&nbsp;</li>
<li class="tab9 odd"><code>mov ah,$2f                   { Получим адрес текущей DTA }</code></li>
<li class="tab9 even"><code>int 21h</code></li>
<li class="tab9 odd"><code>mov dx,bx</code></li>
<li class="tab9 even"><code>mov ah,$4F                   { Функция DOS - найти первый файл }</code></li>
<li class="tab9 odd"><code>int 21h</code></li>
<li class="tab9 even"><code>jnc @FilesF</code></li>
<li class="tab9 odd"><code>mov ax,$FF</code></li>
<li class="tab9 even"><code>mov [LongDOSError],ax</code></li>
<li class="tab9 odd"><code>jmp @AsmEnd</code></li>
<li class="tab0 even"><code>@FilesF: mov ah,$2f                   { Получим адрес текущей DTA }</code></li>
<li class="tab9 odd"><code>int 21h</code></li>
<li class="tab9 even"><code>mov ax,es                    { И скопируем ее в нашу локальную DTA }</code></li>
<li class="tab9 odd"><code>mov ds,ax</code></li>
<li class="tab9 even"><code>mov si,bx</code></li>
<li class="tab9 odd"><code>mov di,[DTAOfs]</code></li>
<li class="tab9 even"><code>mov es,[DTASeg]</code></li>
<li class="tab9 odd"><code>mov cx,[DTASize]</code></li>
<li class="tab9 even"><code>cld</code></li>
<li class="tab9 odd"><code>rep movsb</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>@AsmEnd: pop ds</code></li>
<li class="tab1 even"><code>end; { В DTA.Reserved[14] можно узнать номер найденой записи в каталоге}</code></li>
<li class="tab1 odd"><code>If LongDOSError&lt;&gt;0 then Exit;</code></li>
<li class="tab1 even"><code>Sector:=trunc((DTA.Reserved[14]+256*DTA.Reserved[15])/(s0.SectSize shr 5));</code></li>
<li class="tab1 odd"><code>InSect:=(DTA.Reserved[14]+256*DTA.Reserved[15])-Sector*(s0.SectSize shr 5); { Номер записи в секторе }</code></li>
<li class="tab1 even"><code>Sector:=Sector+DTA.Reserved[16]+256*DTA.Reserved[17]-3; { Номер сектора,где находится каталог с именем }</code></li>
<li class="tab1 odd"><code>Root:=s0.ResSecs+s0.FatSize*s0.FatCnt; { Вычисляем номер сектора с корнем }</code></li>
<li class="tab1 even"><code>Data:=Root+(s0.RootSiz*32) div s0.SectSize;</code></li>
<li class="tab1 odd"><code>If not ReadSector(@dir,0,1,Data) then Exit; { Читаем сектор }</code></li>
<li class="tab1 even"><code>SR.Name:=dir[InSect].Name; { Заполнаяем TLongSearchRec }</code></li>
<li class="tab1 odd"><code>SR.Ext:=dir[InSect].Ext;</code></li>
<li class="tab1 even"><code>SR.Attr:=dir[InSect].Attr;</code></li>
<li class="tab1 odd"><code>SR.Reserv:=dir[InSect].Reserv;</code></li>
<li class="tab1 even"><code>SR.Time:=dir[InSect].Time;</code></li>
<li class="tab1 odd"><code>SR.Date:=dir[InSect].Date;</code></li>
<li class="tab1 even"><code>SR.ClstrNo:=dir[InSect].ClstrNo;</code></li>
<li class="tab1 odd"><code>SR.Size:=dir[InSect].Size;</code></li>
<li class="tab1 even"><code>{ Теперь смотрим длиное имя }</code></li>
<li class="tab1 odd"><code>If (InSect&gt;0) and (dir[InSect-1].attr=15) then SR.LongName:=UniToDos(GetUniLFN(InSect))</code></li>
<li class="tab43 even"><code>else SR.LongName:=dir[InSect].Name+'.'+dir[InSect].Ext;</code></li>
<li class="tab0 odd"><code>End;</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Begin</code></li>
<li class="tab1 even"><code>WriteLn;</code></li>
<li class="tab1 odd"><code>InitUni;</code></li>
<li class="tab1 even"><code>LongFindFirst('A:\1\*.*',$FFFF,Search);</code></li>
<li class="tab1 odd"><code>While LongDosError=0 do</code></li>
<li class="tab2 even"><code>Begin</code></li>
<li class="tab3 odd"><code>WriteLn(Search.Name+' '+Search.Ext+' ',Search.Size:8,' ',</code></li>
<li class="tab11 even"><code>Search.FPosInSec:8,' ',Search.FSecPos:8,' ',Search.LongName);</code></li>
<li class="tab3 odd"><code>LongFindNext(Search);</code></li>
<li class="tab3 even"><code>Search.LongName:=copy(Search.LongName,1,30);</code></li>
<li class="tab2 odd"><code>End;</code></li>
<li class="tab0 even"><code>End.</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/lfn.pas">lfn.pas</a></li></p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2003/01/01/long-filenames-dos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Модуль для работы с образами дискет (FAT12)</title>
		<link>http://mikhail.krivyy.com/2002/12/20/using-fat12/</link>
		<comments>http://mikhail.krivyy.com/2002/12/20/using-fat12/#comments</comments>
		<pubDate>Fri, 20 Dec 2002 16:22:30 +0000</pubDate>
		<dc:creator>mike</dc:creator>
				<category><![CDATA[Работа с диском]]></category>

		<guid isPermaLink="false">http://mike.nov.ru/2002/12/20/using-fat12/</guid>
		<description><![CDATA[Программа писалась для упрощения процесса написания своей операционной системы. Кроме того один из нее модулей стал частью ее самой. Программа состоит из модуля mdirend.cpp (который является своим аналогом модуля dirent.h). Все функции модуля работают через функцию чтения &#171;псевдо-сектора&#187;, благодаря чему, модуль легко переделывается для работы с реальными дискетами. Список функций mdirent.cpp: Функция Описание Аналог функции [...]]]></description>
			<content:encoded><![CDATA[<p>Программа писалась для упрощения процесса написания своей операционной системы. Кроме того один из нее модулей стал частью ее самой.</p>
<p>Программа состоит из модуля <a href=http://mikhail.krivyy.com/wp-content/uploads/2006/09/mdirent.cpp>mdirend.cpp</a> (который является своим аналогом модуля dirent.h). Все функции модуля работают через функцию чтения &#171;псевдо-сектора&#187;, благодаря чему, модуль легко переделывается для работы с реальными дискетами.</p>
<p><span id="more-57"></span></p>
<p>Список функций mdirent.cpp: </p>
<table bgcolor=#C0C0C0 cellspacing=1 cellpadding=5 border=0 width=100%>
<tr bgcolor=white>
<td align=center><b>Функция</b></td>
<td align=center><b>Описание</b></td>
<td align=center><b>Аналог функции</b></td>
</tr>
<tr bgcolor=white>
<td valign=top>m_DIR* m_opendir(Byte *path);</td>
<td valign=top>открыть каталог (Byte* &#8212; это char*, уже не помню зачем я его так)</td>
<td valign=top>opendir()</td>
</tr>
<tr bgcolor=white>
<td valign=top>void m_closedir(m_DIR* d);</td>
<td valign=top>закрыть каталог</td>
<td valign=top>closedir()</td>
</tr>
<tr bgcolor=white>
<td valign=top>DirectoryEntry* m_readdir(m_DIR* d, DirectoryEntry* curent_direntry);</td>
<td valign=top>читать содержимое каталога.</td>
<td valign=top>readdir()</td>
</tr>
<tr bgcolor=white>
<td valign=top>m_FILE* m_fopen(char *ipath);</td>
<td valign=top>открыть файл</td>
<td valign=top>fopen()</td>
</tr>
<tr bgcolor=white>
<td valign=top>void m_fclose(m_FILE * fp);</td>
<td valign=top>закрыть файл</td>
<td valign=top>fclose()</td>
</tr>
<tr bgcolor=white>
<td valign=top>int m_fread(char* where, int isize, int count, m_FILE* f);</td>
<td valign=top>читать блок из файла</td>
<td valign=top>fread()</td>
</tr>
<tr bgcolor=white>
<td valign=top>int m_fwrite(char* where, int isize, int count, m_FILE* f);</td>
<td valign=top>писать блок в файл.</td>
<td valign=top>frite()</td>
</tr>
</table>
<p>Главный <a href=http://mikhail.krivyy.com/wp-content/uploads/2006/09/fat12.cpp>файл</a> рограммы реализует лишь более дружественный интерфейс доступа к этим функциям: </p>
<ol class="codelist">
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>Использование: fat12.exe options filename</code></li>
<li class="odd">&nbsp;</li>
<li class="tab2 even"><code>filename - Имя файла образа дискеты.</code></li>
<li class="tab2 odd"><code>options  - Один из следующих параметров:</code></li>
<li class="even">&nbsp;</li>
<li class="tab1 odd"><code>-r	Вывести подсказку на русском языке (то, что вы сейчас видите).</code></li>
<li class="tab1 even"><code>-b	Вывести информацию, хранящуюся в BOOT секторе.</code></li>
<li class="tab1 odd"><code>-v	Вывести список всех файлов.</code></li>
<li class="tab1 even"><code>-l	Вывести список всех файлов корневого каталога.</code></li>
<li class="tab1 odd"><code>-x	Рекурсивно извлечь все файлы.</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Использование: fat12.exe options filename param1</code></li>
<li class="even">&nbsp;</li>
<li class="tab1 odd"><code>-l	Вывести список файлов из каталога &lt;param1&gt;.</code></li>
<li class="tab1 even"><code>-e	Извлечь файл &lt;param1&gt; без сохранения путей.</code></li>
<li class="tab1 odd"><code>-x	Извлечь файл &lt;param1&gt; (или каталог со всем его содержимым).</code></li>
<li class="tab1 even"><code>-d	Удалить файл &lt;param1&gt;.</code></li>
<li class="tab1 odd"><code>-a	Добавить файл &lt;praram1&gt; в образ диска.</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>Использование: fat12.exe options filename param1 param2</code></li>
<li class="even">&nbsp;</li>
<li class="tab1 odd"><code>-md	Создать каталог &lt;param2&gt; в каталоге &lt;param1&gt;</code></li>
</ol>
<p> <P><strong>Download this code:</strong> <a href="/wp-content/uploads/2006/09/cline.txt">cline.txt</a></li>
<p>Кроме того, в <a href=http://mikhail.krivyy.com/wp-content/uploads/2006/09/fat12.zip>архиве</a> есть файл <b>far.ini</b>, который позволяет подключить эту программу к <a href="http://www.rarlab.com/" target="_blank">Far<br />
Manager</a>. (см. рисунок). Делается это с помощью плагина MultiArc. Для подключения необходимо скопировать содержимое far.ini в файл &#171;C:\Program Files\Far\Plugins\MultiArc\Formats\custom.ini&#187;. </p>
<p><center><img id="image52" alt=far.gif src="http://mikhail.krivyy.com/wp-content/uploads/2006/09/far.gif" /></center></p>
<p>В программе нету функций добавления файлов в образ диска, если вы реализуете их, то пришлите плиз.</p>
<p><a href=http://mikhail.krivyy.com/wp-content/uploads/2006/09/fat12.zip>Скачать все в одном архиве</a> (zip, 50Kb) </p>
]]></content:encoded>
			<wfw:commentRss>http://mikhail.krivyy.com/2002/12/20/using-fat12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

