ГЛАВА 9. ФАЙЛОВЫЕ СРЕДСТВА MSX-BASIC Ф а й л (от англ. file - досье, картотека), набор данных,- 1) совокупность упорядоченных и взаимосвязанных записей, имеющая описание для идентификации отдельных записей; 2) последовательность записей, размещаемая на внешних запо- минающих устройствах (внешней памяти) и рассматриваемая в процессе пересылки и обработки как единое целое. Математический Энциклопедический Словарь В персональном компьютере "YAMAHA" предусмотрена работа с двумя версия- ми языка BASIC: MSX-BASIC и MSX-Disk-BASIC. Версия языка MSX-BASIC преду- сматривает работу только с накопителем на магнитной ленте, а в версии MSX- Disk BASIC возможно работать как с накопителем на магнитной ленте, так и с магнитными дисками. Выбор версии языка BASIC, с которой будет работать персональный компью- тер "YAMAHA", осуществляется автоматически и зависит от состава подключен- ных внешних устройств хранения информации. Версия языка MSX-BASIC "прошита" (записана, хранится) непосредственно в ROM компьютера, а версия языка MSX-Disk BASIC записана и хранится в ROM интерфейса (устройства сопряжения и согласования) дискового накопителя - д и с к о в о д а. В зависимости от того, подключен ли интерфейс (вместе с дисководом) к компьютеру или нет, и выбирается версия языка BASIC, с ко- торой мы будем работать. Если интерфейс подключен,то при включении компью- тера "работает" интерпретатор языка MSX-Disk BASIC, а если нет, то "вклю- чается" интерпретатор языка MSX-BASIC. ┌────────────────────────────────────────────────────────────────────────┐ │ Практически для учительского компьютера это делается следующим образом:│ │ нажмите кнопку RESET и в момент начальной инициализации компьютера │ │ держите нажатой клавишу SHIFT ! │ └────────────────────────────────────────────────────────────────────────┘ Будем предполагать,что Ваш компьютер имеет встроенный дисковод. В таком варианте при включении запускается MSX-Disk BASIC, а приоритетным устрой- ством внешней памяти является дисковод А:. Работая на компьютере без дисковода, Вы запускаете при включении MSX- BASIC, а приориритетным устройством является кассетный магнитофон (CAS:), имя которого может опускаться. З а м е ч а н и е. В СССР распространены две версии языка MSX-BASIC: α) версия 1.0 (на компьютерах серии MSX-1); β) версия 2.1 (на компьютерах серии MSX-2). Для определения номера версии в Вашей программе проверьте содержимое ячейки ROM с адресом &H002D: ┌───────────────┬────────────────────┐ │ Номер версии │ Содержимое ячейки │ ├───────────────┼────────────────────┤ │ 1.0 │ 0 │ ├───────────────┼────────────────────┤ │ 2.1 │ 1 │ └───────────────┴────────────────────┘ IX.1. Р а б о т а с ф а й л а м и на д и с к е т а х Под словом "д а н н ы е" мы будем подразумевать содержимое памяти ком- пьютера. Принято различать текст программы,исходные данные для работы про- граммы и результаты работы программы. Работа с внешней памятью подразумевает запись и чтение данных, размеща- емых на внешних носителях информации - кассете магнитной ленты или гибком магнитном диске (д и с к е т е). IX.1.1. Ф о р м а т и р о в а н и е д и с к е т ы Дискеты бывают следующих типов: 1) односторонние одинарной плотности (SS,SD); 2) односторонние двойной плотности (SS,DD); 3) двусторонние двойной плотности (DS,DD). Односторонность и двусторонность свидетельствует о том, имеет ли диско- вод одну или две магнитные головки, которые обеспечивают запись и считыва- ние информации с одной или двух сторон гибкого диска. Лучший способ объяс- нить понятие "плотность записи" - провести аналогию с грампластинкой: счи- тать, например, что на диске двойной плотности в два раза больше"дорожек", чем на диске одинарной плотности. И хотя память на гибком диске является магнитной и никаких, естественно, дорожек нет, на гибком диске четверной плотности может храниться в четыре раза больше информации, чем на диске одинарной плотности. Для работы с 3,5-дюймовым (8,89 см) дисководом MSX-компьютера использу- ются односторонние дискеты MF1-DD, двусторонние дискеты MF2-DD или их аналоги (слова: "диск", "дискета" и "флоппи-диск" мы будем рассматривать как синонимы). Дискета заключена в твердый пластмассовый конверт и имеет переключа- тель защиты записи и скользящую шторку для прикрытия окна, через которое организуется чтение (запись) информации. ┌────────────────────────────────────────────────────────────────┐ │ Вставлять дискету в карман (щель) дисковода и извлекать ее │ │ оттуда можно лишь при в к л ю ч е н н о м дисководе! │ └────────────────────────────────────────────────────────────────┘ Приведем некоторые характеристики дискеты MF2-DD : 1) емкость при записи: a) всего - 730 Кбайт; b) для файлов пользователя - 713 Кбайт; 2) плотность при записи - 8717 бит/дюйм; 3) среднее время доступа - 95 MS ; 4) максимальное количество файлов - 112. Разрешается подключать к компьютеру как одиночные, так и спаренные дис- ководы. В первом случае за устройством закрепляется переменное имя , ко- торое в любой момент времени принимает одно из конкретных значений "А" или "В". Во втором случае основной дисковод получает имя "А", а дополни- тельный - "В". Везде ниже, если это не оговорено специально, изложение ориентировано на использование одного дисковода. Для подготовки диска к работе с командами и функциями MSX-Disk BASIC необходимо осуществить специальную разметку его поверхности, называемую ф о р м а т и р о в а н и е м. Для этого дискета вставляется в карман дис- ковода и выполняется команда ┌─────────────────────┐ │ CALL FORMAT │, └─────────────────────┘ которая вызывает на экране индикацию запроса: Drive name? (A,B) Ответом на него должен быть ввод одной из латинских букв А или В,в зависи- мости от имени устройства, в котором находится дискета. На появившийся второй запрос-"подсказку": 1 - Double Sided 2 - Single Sided ? █ пользователь обязан отреагировать вводом 1, если диск - двусторонний, или 2, если диск - односторонний. Далее, по указанию Strike a key when ready █ нажмите любую клавишу. После этого начинается процесс форматирования, то есть размещение на диске управляющих меток. При этом ранее имевшаяся там информация разрушается. Правильное завершение этого процесса вызывает ин- дикацию сообщения Format complete Ok █ ┌───────────────────────────────────────────────────┐ │ Форматирование н о в ы х дискет обязательно! │ └───────────────────────────────────────────────────┘ Учтите, что именно проведенная разметка дискеты, а не ее потенциальные возможности определяет объем информации, который она может хранить, и с каким дисководом ее можно использовать! В заключении пункта дадим несколько п о л е з н ы х с о в е т о в: 1. В дискетах не предусмотрена идеальная защита записанных на них дан- ных: защитные конверты рассчитаны только на предохранение поверхности но- сителей от повреждений на коротком пути от "дискотеки" до дисковода. Особую осторожность надо соблюдать при нанесении надписей на наклейке, прикрепленной к дискете,так как даже давление карандаша или шариковой руч- ки может оказаться достаточным,чтобы через защитный конверт повредить маг- нитный слой дискеты. Во избежании порчи информации,записанной на дискетах, последние следует хранить подальше от телевизоров, видеомониторов, звоня- щих телефонов и других источников магнитных полей; 2. Для защиты файлов, сохраненных на дискете, позаботьтесь о создании копий файлов на другой дискете или на магнитной ленте; 3. Создайте архив файлов программных текстов и снабжайте дискеты и маг- нитные ленты архива этикетками; 4. Защищайте Ваши программы от неосторожного обращения путем установки переключателя защиты от записи на дискете. IX.1.2. И м е н а ф а й л о в При создании на дискете нового файла ему необходимо присвоить опреде- ленное и м я. Оно должно быть уникальным,то есть не совпадать ни с одним из уже имеющихся имен файлов, сформированных на данной дискете ранее. Имя служит для индентификации файлов и строится из последовательности символов алфавита MSX-BASIC. При этом должны учитываться следующие обсто- ятельства: 1. Количество символов имени не может превосходить 11.Попытка сформиро- вать имя большей длины ни к чему не приводит. Правые лишние символы отбра- сываются; 2. Соответствующие прописные и строчные латинские буквы, используемые в имени, равнозначны; соответствующие прописные и строчные буквы русского алфавита, используемые в имени, н е р а в н о з н а ч н ы; 3. В имени не должно быть символов: ; , + " = [ ] * \ / ? пробел 4. Символ ":" используется только при задании составных имен для разде- ления их на две части, первая из которых есть имя устройства, а вторая - имя файла. В этом случае при записи файла на диск фиксируется лишь вторая часть имени; 5. Нельзя задавать имя, состоящее из одних пробелов или начинающееся с пробела; 6. Имя не должно начинаться с точки ("."). В нем не может быть более одного такого символа и более 8 символов перед ним (если их больше восьми, то после восьмого символа устанавливается "."). Кроме того, десятичной точкой имя можно разделить на две зоны: к о - р е н ь (до точки) и р а с ш и р е н и е (после точки). Расширение со- стоит не более, чем из трех символов. Номер начальной позиции корня - 1,а расширения - 10. Если пользователь фиксирует имя без расширения с количеством символов, большим 8, то компьютер автоматически разбивает его на корень и расшире- ние, вставляя в требуемое место точку. Сообщение об ошибке "Bad file name" ("Н е д о п у с т и м о е и м я ф а й л а") появляется в том случае, когда имя файла содержит более в о с ь м и сим- волов перед явно указанным расширением; если же расширение состоит более, чем из т р е х символов, то интерпретатор игнорирует лишние символы. П р и м е р ы. ┌──────────────┬────────────────────┐ ───────────── │ Имя, заданное│ Представление имени│ │ пользователем│ в компьютере │ │──────────────┼────────────────────┤ │ КАТАЛОГ │ КАТАЛОГ │ │ LESSON.123 │ LESSON .123 │ │ BASIC │ BASIC │ │ВАЛ.процент │ ВАЛ .про │ │ ПРОТИВОГАЗ │ ПРОТИВОГ.АЗ │ └──────────────┴────────────────────┘ Общепринято, что расширение имени файла должно обозначать его тип. Обычно применяются следующие стандартные расширения имен: ┌────────────┬───────────────────────────────────────────────────────┐ │ Расширение │ К о м м е н т а р и й │ ├────────────┼───────────────────────────────────────────────────────┤ │ .ASM │ Исходная программа на языке ассемблера │ │ .BAK │ Резервный файл или копия некоторого файла, сделанная │ │ │ на случай повреждения оригинала │ │ .BAS │ Программа на языке BASIC │ │ .BAT │ Командный файл для пакетной обработки │ │ .C │ Исходная программа на языке C │ │ .COM │ Команда или программа, пригодные для непосредственно- │ │ │ го исполнения под управлением DOS │ │ .DAT │ Файл данных │ │ .DOC │ Файл документов (для текстовой обработки) │ │ .FOR │ Исходная программа на языке FORTRAN │ │ .LIB │ Библиотека программ │ │ .OBJ │ Скомпилированная объектная программа на машинном языке│ │ .PAS │ Исходная программа на языке PASCAL │ │ .PIC │ Данные выводимого на экран изображения │ │ .TMP │ Временный файл │ │ .TXT │ Текстовый файл │ └────────────┴───────────────────────────────────────────────────────┘ М а л е н ь к а я х и т р о с т ь. Оградить Ваш файл от посторонних взглядов можно, дав ему секретное имя AAAAAAAA.AAA,например. Секрет здесь в том, что в этом имени часть букв A из русского, а часть - из латинского алфавита, и об этом знает только хозяин файла. В большинстве случаев желательно, чтобы присвоенные файлам имена были индивидуальными и единственными и точно указывали,какой именно файл имеет- ся в виду. Но иногда удобнее обратиться сразу ко всей группе файлов, а не работать с ними по одному. Для указания р о д о в ы х имен файлов могут использоваться специаль- но предназначенные для этого знаки ? и *. В о п р о с и т е л ь н ы й знак является единственным неоднозначно интерпретированным символом в име- ни файла. Например, имена MAX1.ASM, MAX2.ASM, MAX3.ASM все соответствуют родовому имени файла MAX?.ASM, но ему не соответствует имя MAX10.ASM. З в е з д о ч к а обозначает любое количество неоднозначно интерпрети- руемых символов. Например, Zilog*.A* будет обозначать любое имя файла, ко- торое начинается с Zilog, при условии, что его расширение начинается с A. Однако звездочка имеет смысл только при использовании ее в качестве по- следнего символа имени файла или расширения. Например, родовое имя файла *CALC.BAS - это то же самое, что и имя *.BAS, которое соответствует каждо- му файлу, имеющему расширение имени *.BAS. Отметим, что *.* - родовое имя файлов с любыми именами. IX.1.3. С п р а в о ч н а я и н ф о р м а ц и я о ф а й л а х Старейшим из дошедших до нас каталогов признается список литературных произведений на шумерской гли- няной плитке, относящейся к 2000 г. до н.э. . А.И.Михайлов Сейчас мы расскажем Вам о довольно простых средствах для получения спи- ска имен файлов, размещенных на дискете (FILES), размера ее свободной час- ти (DSKF) и некоторой другой справочной информации. Вывод имен файлов осуществляется по команде (оператору!) ┌───────────────────┐ │ [L]FILES [I] │ , └───────────────────┘ где: FILES, LFILES ("файлы") - служебные слова; I - строковое выражение, значение которого определяет имя файла или родовое имя файлов. При выполнении этой команды без параметра I список имен всех файлов диска или индицируется на экране (если префикс L отсутствует),или распеча- тывается принтером (префикс L есть). В зависимости от типа экрана и его ширины индикация имен организуется в несколько колонок. Вывод списка фай- лов на печать проводится в 1 колонку: каждому имени отводится одна стро- ка. При отсутствии файлов на диске выдается сообщение: "File not found" ("Ф а й л не н а й д е н"). Если параметр I указан и на диске имеется файл с этим именем,то данный факт подтверждается выводом единственного имени I (в противном случае Вы прочтете неприятное сообщение: "File not found"). П р и м е р ы. FILES 100 FILES ───────────── FILES "Игры" LFILES ┌───────────────┐ Функция │ DSKF(n) │ , └───────────────┘ где: DSKF("DiSK Free"-"свободная часть диска") - служебное слово; n - арифметическое выражение, целая часть значения которого долж- на принадлежать отрезку [0,2], возвращает размер в Кбайтах свободной части дискеты. Целая часть значения n определяет имя дисковода: если значение n = 0, то Вы получите информацию о свободном месте на ди- скете, находящейся в текущем активном дисководе; если значение n = 1, то Вы получите информацию о свободном месте на ди- скете, находящейся в дисководе A; если значение n = 2, то Вы получите информацию о свободном месте на ди- скете, находящейся в дисководе B. П р и м е р ы. α) PRINT DSKF(0):PRINT DSKF(1):PRINT DSKF(2) ───────────── β) X=1:PRINT DSKF(X) γ) IF DSKF(0)>200 THEN 1000 Забегая далеко вперед, заметим,что для определения размера в байтах об- ласти дискеты, отведенной под произвольный файл, можно воспользоваться командами: ┌──────────────────────────────────────────────────────────────────┐ │ OPEN "И м я ф а й л а" FOR INPUT AS#1:PRINT LOF(1):CLOSE #1 │ └──────────────────────────────────────────────────────────────────┘ IX.1.4 О п е р а т о р ы NAME, COPY и KILL Изменение имени программного файла или файла данных производится по ко- манде (оператору) ┌───────────────────────┐ │ NAME I AS J │ , └───────────────────────┘ где: NAME("имя") - служебное слово, I - строковое выражение, значение которого определяет "старое" имя файла, J - строковое выражение, значение которого определяет "новое" имя файла. При выполнении этой команды прерывание происходит при отсутствии на дискете файла с именем I (нечего переименовывать!), при наличии на ней файла с именем J (имя J уже зарезервировано!) или при закрытой на запись дискете. В противном случае файл с именем I получает новое имя J. При задании имени J разрешено использование символов "?". Но при реаль- ном формировании имени J на дискете каждый такой символ будет заменен на элемент из соответствующей позиции имени I. П р и м е р ы. α) NAME "алфавит" AS "АЛФ" ───────────── β) name X$ as "X.1" γ) 200 NAME "PQR.XYZ" AS "?.?11" В последнем случае новое имя будет выглядеть так: Р ▲ .Х11 │ 7 пробелов Для дублирования на дисках программных файлов и файлов данных применя- ется команда (оператор) ┌─────────────────────┐ │ COPY i TO j │ └─────────────────────┘ где: 1) COPY ("копировать"),ТО("в") - служебные слова; 2) i - строковое выражение, значение которого определяет имя исход- ного файла; 3) j - строковое выражение, значение которого определяет имя форми- руемого файла. При выполнении команды (оператора) COPY по файлу любого формата с име- нем i создается его копия с именем j. Имена i и j не должны совпадать. В том случае, когда файл с именем j уже существует на дискете, содержимое файла с именем j заменяется на содержимое файла с именем i и, естественно, "старое" содержимое файла с именем j пропадает! Если i или j - файлы данных, то они не должны быть открыты! П р и м е р ы. α) COPY "AL" TO "LA" ───────────── β) COPY "X" TO "X.1" γ) 10 SAVE "U.1" 20 FOR J=1 TO 20 30 COPY"U.1"TO"U."+MID$(STR$(J),2) 40 NEXT δ) COPY "A:ПРОБА" ТО "В:ПРОБА" Копирование всех файлов с одной дискеты на другую при наличии несколь- ких (больше двух) дисководов проводится операторами: COPY "A:*.*" TO "B:*.*" (с А в В) COPY "B:*.*" TO "A:*.*" (с В в А) На одном дисководе эта процедура и ей подобные (см.пример 4) реализу- ются по соответствующим сообщениям на экране периодической сменой дискет в кармане дисковода. Если служебное слово ТО и второй аргумент будут опущены, то файл будет скопирован на активный дисковод (обычно с B: на A:), например: COPY"b:E87.COM" . ┌────────────────┐ По команде (оператору) │ KILL I │ , где: └────────────────┘ KILL("разрушать","убивать") - служебное слово; I - строковое выражение, значение которого определяет имя файла, происходит разрушение на дискете файла с именем I и увеличение на соответ- ствующую величину размера свободной части дискеты. Фактическому разруше- нию (стиранию) подвергается лишь справочная информация о файле. Если I - имя файла данных, то при выполнении команды KILL он не должен быть открыт. П р и м е р ы. α) KILL"Бочка":KILL"R.T" ───────────── β) X$="ЮюЮ":KILL X$ γ) 100 FOR K=1 TO 25:KILL"ЦЕХ."+MID$(STR$(K),2):NEXT IX.1.5. О п е р а т о р ы LOAD, SAVE, RUN и MERGE ┌──────────────────┐ По команде (оператору): │ SAVE I [,A] │ , └──────────────────┘ где: SAVE ("сохранить") - служебное слово; I - строковое выражение, значение которого определяет имя файла, программа из оперативной памяти под именем I записывается на дискету.В за- висимости от наличия или отсутствия параметра А запись проводится соответ- ственно или в формате ASCII, или в форме внутреннего представления. Попробуем прочесть программу 10 X=1 , записанную: α) в кодах ASCII: 10 X=1 β) во внутреннем представлении (по кодам): FF 09 80 0A 00 58 EF 12 00 00 00 . ── ───▲─── ───▲─── ── ▲ ── ─▲ ───▲─── Начало ▲ │ │ ▲ │ ▲ │ └ Конец программы ┘ Адрес следу- Номер └ X = 1 ┘ Конец программы ющей строки строки (10) строки ┌───────────────────────────────────────────────────────────────────────┐ │ Если данная программа впоследствии будет погружаться в память для сли-│ │ яния с другими программными модулями, то ее необходимо записывать в │ │ коде ASCII. │ └───────────────────────────────────────────────────────────────────────┘ Заметим что формат ASCII приводит к увеличению в несколько раз времени записи программ из оперативной памяти на дискету, а также их чтения с дис- кеты в память. К тому же для их размещения на дискете требуется приблизи- тельно на 30% больше места, чем для соответствующих программ, написанных во внутреннем представлении. При наличии на диске программного файла или файла данных с именем I и записи на него новой программы под тем же именем, старый файл пропадает и происходит изменение размера свободной части диска в соответствии с новы- ми размерами файла с именем I. П р и м е р ы. α) SAVE"PROTOOL.SYS" ───────────── β) X$="Z80.ABC":SAVE X$:SAVE"PRIMER.BAS",A γ) 10 FOR M=1 TO 30:SAVE"палата"+MID$(STR$(М),2):NEXT Для считывания программ с дискеты в оперативную память используются команды (операторы) LOAD и RUN. 1. По команде ┌───────────────┐ │ LOAD I[,R] │ , └───────────────┘ где: LOAD ("загрузка") - служебное слово; I - строковое выражение, значение которого определяет имя файла; R - необязательный параметр; прежде всего закрываются все файлы и оперативная память очищается от программ и данных. Далее, программа, записанная на дискете в машинных ко- дах или формате ASCII под именем I, загружается в оперативную память. При наличии параметра R после загрузки производится запуск программы на счет. П р и м е р ы. α) LOAD"X.Y" ───────────── β) Z$=MID$(A$,5,3):LOAD Z$,R ┌──────────────────────────────────────────────────────────────┐ │ Еще раз напомним Вам, что загрузка программы "стирает" │ │ программу, находящуюся в момент загрузки в памяти компьютера.│ └──────────────────────────────────────────────────────────────┘ ┌────────────────┐ 2. По команде │ RUN I[,R] │ , └────────────────┘ где: RUN ("запуск","прогон") - служебное слово, I - строковое выражение, значение которого определяет имя файла, в оперативную память загружается и запускается на счет программа, записан- ная на диске под именем I в машинных кодах или в формате ASCII. При отсутствии параметра R перед загрузкой файла с именем I закрывают- ся все открытые файлы и память очищается от программ и данных. При наличии параметра R из памяти удаляются программы и значения пере- менных. Однако файлы данных н е з а к р ы в а ю т с я ! П р и м е р [5]. ─────────────── 1 'Меню многомодульного файла "MMF" 2 COLOR 1,7,13:SCREEN 1:PRINT:PRINT TAB(7)"Основное меню" 4 PRINT TAB(6)"───────────────":PRINT 6 PRINT"1. программа A - 1":PRINT"2. программа B - 2" 8 PRINT"3. программа С - 3":PRINT"4. программа Д - 4" 11 INPUT R:IF R<1 OR R>4 THEN 11 13 ON R GOTO 14,15,16,17 14 RUN"прог.А",R 15 RUN"прог.В",R 16 RUN"прог.С",R 17 RUN"прог.Д",R Приведем вид отдельного модуля, например, модуля с именем "прог.А": 10 PRINT"Выполняется программа А" 20 RUN"ММF",R Интересные возможности по "соединению" программ предоставляются коман- дой (оператором!) ┌───────────────┐ │ MERGE I │ , └───────────────┘ где: MERGE("слияние") - служебное слово; I - строковое выражение, определяющее имя файла, записанного на дискете в формате ASCII. ┌────────────────────────────────────────────────────────────────┐ │ Выполнение команды MERGE начинается с закрытия всех файлов │ │ и чистки оперативной памяти от данных. │ └────────────────────────────────────────────────────────────────┘ Далее производится слияние программы А, находящейся в памяти, с про- граммным файлом, записанным на диске в формате ASCII под именем I. П р и м е р ы. α) MERGE "TTT" ───────────── β) L$="техника":MERGE L$ γ) 100 MERGE "LIST.3" Обратите внимание на тот факт,что программы, вызываемые командой MERGE, имеют более высокий приоритет, по сравнению с программами, находящимися в памяти компьютера. Поэтому если в объединяемых программах имеются строки с одинаковыми номерами, то строки программы в памяти компьютера будут за- менены соответствующими строками "добавляемой" программы с именем I. Наиболее целесообразно использовать этот оператор при работе с библио- теками подпрограмм на магнитной ленте или на дискете. Покажем, как это де- лается. П р и м е р. Предположим, что программа,находящаяся в памяти,занимает ──────────── строки с 10 по 1290. Для добавления подпрограммы, назван- ной при записи на дискету "ROUT1" и занимающей строки с 10 по 190,сначала Вы должны сохранить программу, находящуюся в памяти. После этого, Вы вызываете подпрограмму "ROUT1", используя команды LOAD или CLOAD. Теперь используйте команду RENUM для перенумерации строк подпрограммы, начиная, например, со строки 10000. Далее сохраните подпрограмму в формате ASCII, назвав ее новым именем, например "ROUT0", после чего повторно загрузите основную программу. Теперь выполнение команды MERGE "ROUT0" приведет к тому, что в конце текста основной программы будет добавлен текст подпрограммы с номерами строк, начинающимися с 10000.