From 64ce6339eb1f01f4325a0b8c22aab9ed7a30d153 Mon Sep 17 00:00:00 2001 From: Alexander Petrov Date: Wed, 29 Jul 2026 18:26:31 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=B6=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B7=D1=83=20Sprinter=20+=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20gfx=5Fscroll=5Fh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docs/new/ — сводные справочники (архитектура, BIOS, DSS, память, графика, акселератор, IRQ, порты, ввод, звук, известные баги); - docs/Original/ — первоисточники, из которых они собраны (BIOS, Estex DSS, мануалы, описание акселератора), + Форум.doc/.docx в reference; - libbgi/common/gfx_scroll_h.c — обход бага скролла при ширине >256 (правка автора: шаг банды 255 и продвижение указателей на cw; старый вариант с 256 оставлен закомментированным с TODO); - удалён applications/PoP/roomtest/hang_variants.png — рабочая раскладка из разбора позы виса, в репозитории ей не место. Большие архивы (docs/extra ~568 МБ, docs/sources с вложенными git-репо ~68 МБ) в коммит НЕ включены — см. обсуждение. Co-Authored-By: Claude Opus 5 --- applications/PoP/roomtest/hang_variants.png | Bin 15800 -> 0 bytes docs/Original/BIOS/bios_2.doc | Bin 0 -> 133120 bytes docs/Original/BIOS/bios_2.md | 893 +++ docs/Original/BIOS/Функции BIOS v3.md | 901 +++ docs/Original/Estex DSS/Estex.doc | Bin 0 -> 33792 bytes docs/Original/Estex DSS/Estex.txt | 155 + docs/Original/Estex DSS/Estex_r.txt | 126 + .../Original/Estex DSS/Programmer manual.docx | Bin 0 -> 109736 bytes docs/Original/Estex DSS/Programmer manual.md | 2312 ++++++ docs/Original/Estex DSS/Programmer manual.rtf | 7028 +++++++++++++++++ docs/Original/Estex DSS/Programmer manual.txt | 2652 +++++++ ...уководство_по_программированию_Иван_Мак.md | 2611 ++++++ docs/Original/Акселератор/accel_r.txt | 97 + docs/Original/Архитектура/ARHITECT.TXT | 635 ++ docs/Original/Разное/Форум.md | 1169 +++ docs/new/01-architecture.md | 272 + docs/new/02-bios.md | 1234 +++ docs/new/03-dss.md | 1082 +++ docs/new/04-memory.md | 387 + docs/new/05-graphics.md | 279 + docs/new/06-accel.md | 221 + docs/new/07-irq.md | 92 + docs/new/08-io.md | 197 + docs/new/09-input.md | 595 ++ docs/new/10-sound.md | 377 + docs/new/11-ports.md | 103 + docs/new/12-bugs.md | 54 + docs/new/13-telegram.md | 169 + docs/new/INDEX.md | 112 + docs/reference/Форум.doc | Bin 166912 -> 152576 bytes docs/reference/Форум.docx | Bin 0 -> 52668 bytes libbgi/common/gfx_scroll_h.c | 12 +- 32 files changed, 23762 insertions(+), 3 deletions(-) delete mode 100644 applications/PoP/roomtest/hang_variants.png create mode 100644 docs/Original/BIOS/bios_2.doc create mode 100644 docs/Original/BIOS/bios_2.md create mode 100644 docs/Original/BIOS/Функции BIOS v3.md create mode 100644 docs/Original/Estex DSS/Estex.doc create mode 100644 docs/Original/Estex DSS/Estex.txt create mode 100644 docs/Original/Estex DSS/Estex_r.txt create mode 100644 docs/Original/Estex DSS/Programmer manual.docx create mode 100644 docs/Original/Estex DSS/Programmer manual.md create mode 100644 docs/Original/Estex DSS/Programmer manual.rtf create mode 100644 docs/Original/Estex DSS/Programmer manual.txt create mode 100644 docs/Original/Manuals/Руководство_по_программированию_Иван_Мак.md create mode 100644 docs/Original/Акселератор/accel_r.txt create mode 100644 docs/Original/Архитектура/ARHITECT.TXT create mode 100644 docs/Original/Разное/Форум.md create mode 100644 docs/new/01-architecture.md create mode 100644 docs/new/02-bios.md create mode 100644 docs/new/03-dss.md create mode 100644 docs/new/04-memory.md create mode 100644 docs/new/05-graphics.md create mode 100644 docs/new/06-accel.md create mode 100644 docs/new/07-irq.md create mode 100644 docs/new/08-io.md create mode 100644 docs/new/09-input.md create mode 100644 docs/new/10-sound.md create mode 100644 docs/new/11-ports.md create mode 100644 docs/new/12-bugs.md create mode 100644 docs/new/13-telegram.md create mode 100644 docs/new/INDEX.md create mode 100644 docs/reference/Форум.docx diff --git a/applications/PoP/roomtest/hang_variants.png b/applications/PoP/roomtest/hang_variants.png deleted file mode 100644 index d4c177c156e31bd91554672edf54897594b7064c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15800 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 D*UIZ( diff --git a/docs/Original/BIOS/bios_2.doc b/docs/Original/BIOS/bios_2.doc new file mode 100644 index 0000000000000000000000000000000000000000..58f6ebb9a3ceac2fd584388e2dc211c0b361915d GIT binary patch literal 133120 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 literal 0 HcmV?d00001 diff --git a/docs/Original/BIOS/bios_2.md b/docs/Original/BIOS/bios_2.md new file mode 100644 index 0000000..e4100dc --- /dev/null +++ b/docs/Original/BIOS/bios_2.md @@ -0,0 +1,893 @@ +# Функции BIOS v2.12 + +### Вызов функций BIOS + +Вызов функций BIOS осуществляется из ассемблерного кода. + +Номер функции задается в регистре C процессора. В остальные регистры, +при необходимости, загружаются входные параметры функции. После исполнения +функции происходит возврат в программу, из которой произошел вызов функции. +Установленный флаг CF (CF=1) означает, что работа функции произошла с +ошибкой. В некоторых регистрах передаются выходные параметры. + +Ниже приведены таблицы входных и выходных параметров для каждой функции: + +- Функции работы с памятью +- Функции управления 'железом' +- Функции управления окнами и режимами экрана +- Функции вывода текста на экран +- Графические функции +- Функции работы с жесткими дисками и дисководами + +При работе функций BIOS необходимо что бы стек находился в области +8000h..0BFFFh, так как часть функций использует переключение страниц +PAGE1 и PAGE3. + +Вызов функций BIOS возможен в различных конфигурациях компьютера Sprinter. + +Конфигурация Spectrum: вызов функций BIOS осуществляется через 3D13h. +При этом работают и все функции TR-DOS. + +Конфигурации Sprinter: вызов функций BIOS осуществляется через RST 18h +при подключенном системном ПЗУ. + +Для постоянного подключения системного ПЗУ можно воспользоваться +такой последовательностью команд: + +```asm + LD A,0 + OUT (07Ch),A +``` + +После ее исполнения в 0-м окне Z80 будет включено ПЗУ BIOSа и программа +может вызывать функции BIOSа через RST 18h. + +Отключение ПЗУ BIOSа из нулевого окна Z80 производится следующей +последовательностью команд: + +```asm + LD A,0 + OUT (03Ch),A +``` + +При необходимости, функции BIOSа могут быть вызваны программой, находящейся +в ОЗУ непосредственно в нулевом окне Z80. Для этого надо установить в +адресе 0008h следующий код: + +```asm +ADDRESS_0008h: + PUSH AF + LD A,0 + OUT (7Ch),A + POP AF + RET +``` + +После этого BIOS можно вызывать командой RST 8. (Функции TR-DOS, так +же как и в случае RST 18 остаются недоступны.) Вызывая программы таким +образом, через RST 8, следует помнить что адреса 3FFFh..0000h после входа +в BIOS будут содержать код ПЗУ, поэтому, если фунция использует данные в +ОЗУ, они должны находиться в других адресах. + +Оптимизация программы для RST 8 недопустима, так как в ПЗУ, для +обратного переключения, стоит такая же программа, только порт 3Ch для +отключения ПЗУ BIOSа. + +Вызов функций BIOS в exe-файлах, вызываемых с помощью операционной +системы Estex, производится командой RST 8. Необходимая программа в адресе +0008h уже имеется в блоке кода ОС Estex. + + +### Функции работы с памятью + +**0C0h (192) EMM_FN0 Определение объемов ОЗУ** + + Значение регистров на входе: + C=0C0h + Значение регистров на выходе: + HL - общий объем ОЗУ в страницах по 16k + BC - объем свободного ОЗУ в страницах по 16k + +**0C1h (193) EMM_FN1 Инициализация распределения памяти** +Стирается вся информация о выделенных ранее блоках ОЗУ. +Блоки с системной информацией и первые 256K ОЗУ объявляются занятыми. + + Значение регистров на входе: + C=0C1h + Значение регистров на выходе: + нет + +**0C2h (194) EMM_FN2 Выделение блока ОЗУ** + + Значение регистров на входе: + C=0C2h + B - число запрашиваемых страниц + Значение регистров на выходе: + CF=0 - нормальное завершение - A - идентификатор блока + CF=1 - ошибка - A=1 - не хватает памяти + +**0C3h (195) EMM_FN3 Освободить блок ОЗУ** + + Значение регистров на входе: + C=0C3h + A - идентификатор блока + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неправильный идентификатор + идентификатор не всегда отслеживается правильно + +**0C4h (196) EMM_FN4 Получить физический номер страницы из блока памяти** + + Значение регистров на входе: + C=0C4h + A - идентификатор блока + B - логическая номер страницы в блоке + Значение регистров на выходе: + CF=0 - A - логический номер страницы + CF=1 - ошибка: + A=0 - блок не существует + A=255 - запрашиваемый номер страницы слишком велик + +**0C5h (197) EMM_FN5 Получить список физических страниц блока** + + Значение регистров на входе: + C=0C5h + A - идентификатор блока + HL - буфер 256 байт для размещения списка страниц + Значение регистров на выходе: + CF=0 - нормальное завершение: + B - число страниц в блоке + HL - тот же адрес буфера, в буфере список физических + страниц по порядку, заканчивающийся байтом 0FFh + CF=1 - неверный идентификатор блока; старая информация в буфере + может быть затерта + +**0C6h (198) EMM_FN6 Получение адресов портов окон** + +Примечание по использованию функции получения адресов портов окон (0C6h): +>Cледует хотя бы один раз вызвать эти функции и сравнить адреса +>портов с теми, что используются в программе и, если они не совпадают, +>выдать соответствующее предупреждение. В данный момент эти порты +>таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h + + Значение регистров на входе: + C=0C6h + A - номер окна процессора - 0,1,2 или 3 + Значение регистров на выходе: + CF=0 - нормальное завершение + C - 8-битный адрес порта окна + B - физический номер подключенной в окно страницы + CF=1 - ошибка - неверный номер окна + +**0C7h (199) EMM_FN7 Получить номер следующей страницы блока** + +Примечание по использованию функции EMM_FN7 (0C7h): +> Информация о распределении памяти хранится в виде RAM Allocation Table, +> похожей на дисковый FAT. Поэтому нахождение физического номера +> следующей страницы по предыдущему физическому номеру происходит +> значительно быстрее, чем поиск по увеличенному на единицу логическому +> номеру. + + Значение регистров на входе: + C=0C7h + A - физическая страница + Значение регистров на выходе: + CF=0 - нормальное завершение + A - следуюшая физическая страница блока + A=0FFh - индицирует конец блока + CF=1 - ошибка - страница не принадлежит никакому блоку. + фактически, это означает, что она свободна. + +**09Eh (158) EMM_FN8 Слияние блоков** + + Значение регистров на входе: + A - идентификатор блока 1 + B - идентификатор блока 2 + Значение регистров на выходе: + CF=0 - нормальное завершение + A - идентификатор объединенного блока + CF=1 - ошибка - неверный идентификатор блока + +**09Dh (157) EMM_FN9 Разделение блока** + + Значение регистров на входе: + C=09Dh + A - идентификатор блока + B - новая длина блока + Значение регистров на выходе: + CF=0 - нормальное завершение + A - идентификатор блока результата + B - идентификатор блока остатка + CF=1 - ошибка - неверный идентификатор блока + +### Функции управления 'железом' + +**0EFh (239) FN_VERSION Выдача информации о версии BIOSа и железа.** + + Значение регистров на входе: + C=0EFh + HL - буфер, куда будет помещена ASCII строка с несколькими + полями, номером версии BIOS и названием модели + компьютера. Конец строки отмечен двойным нулем. + Значение регистров на выходе: + CF=0 - нормальное завершение + HL - тот же буфер с записанной строкой. + DE - версия BIOSа + BC - версия железа подробности ниже + A - количество полей в буфере (в данный момент - 2) + Первое поле - версия BIOS. + Второе - название модели компьютера. + CF=1 - ошибка - Очень старая версия, + не имеющая данной функции + +**0F2h (242) FN_SICF=0 Установка синхронизации, очистка страницы режима экрана** + + Значение регистров на входе: + C=0F2h + A - режим синхронизации + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неверный номер режима синхронизации + +### Функции работы с CMOS данными и Turbo режимом + +Комментарий к функциям CMOS (0F5h-0F7h): +> Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет +> микросхемы CMOS, то эмулируется ее память. Наличие микросхемы +> определяется функцией CMOS_TEST. + +**0F5h (245) CMOS_TEST Проверить наличие CMOS** + + Значение регистров на входе: + C=0F5h + Значение регистров на выходе: + CF=0 - часы есть + CF=1 - часов нет + +**0F6h (246) CMOS_RD Читать из регистра CMOS** + + Значение регистров на входе: + C=0F6h + D - номер регистра CMOS + Значение регистров на выходе: + A - считанные данные + CF=0 - часы есть + CF=1 - часов нет + +**0F7h (247) CMOS_WR Писать в регистр CMOS** + + Значение регистров на входе: + C=0F7h + D - номер регистра CMOS + A - записываемые данные + Значение регистров на выходе: + CF=0 - часы есть + CF=1 - часов нет + +**08Fh (143) FN_TURBO Функция управления турбо режимом.** + + Комментарий к функции FN_TURBO (08Fh): + Переключение режима турбо может не произойти, если прошивка не + поддерживает это переключение. При этом ошибки не происходит. Так + же, переключение режима TURBO блокируется кнопкой "Turbo" в + режиме Turbo-OFF + Значение регистров на входе: + C=08Fh + A - режим турбо: 2 - off, 3 - on + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неверный режим турбо + +### Функции управления окнами и режимами экрана + +**0B0h (176) WIN_OPEN Функция открытия окна.** + + Значение регистров на входе: + C=0B0h + IX - описатель окна + E - флаги окна: + бит 0 указывает какую страницу режима включать после + исполнения функции; + бит 4 указывает на какой странице режима открывать окно + Значение регистров на выходе: + CF=0 - нормальное завершение: + A - идентификатор окна + CF=1 - ошибка слишком много окон + +**0B1h (177) WIN_CLOSE закрытие окна** + + Значение регистров на входе: + C=0B1h + A - идентификатор окна + Значение регистров на выходе: + CF=0 - успешное завершение + CF=1 - ошибка - неверный идентификатор + Окно с номером 0 никогда не закрывается и попытка + закрытия приводит к ошибке + +**0B2h (178) WIN_COPY_WIN Копирование данных текстового окна в память (запоминание окна)** + + При работе этой функции через RST 18h или RST 8, обязателен запрет + прерываний, так как функция пользуется стеком для ускорения своей работы. + + Значение регистров на входе: + C=0B2h + A - идентификатор глобального окна + H - размер окна в символах по вертикали + L - размер окна в символах по горизонтали + D - вертикальное положение окна в глобальном окне + E - горизонтальное положение окна в глобальном окне + IX - адрес буфера для запоминания данных + адрес буфера указывается для окна 0C000h если адрес + указан с 8000h, номер страницы буфера не действителен + ниже 8000h адрес указывать нельзя + A' - страница буфера для данных окна эта страница должна + принадлежать программе + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка - неверный идентификатор окна + +**0B3h (179) WIN_RESTORE_WIN Копирование из памяти в текстовое окно (восстановление окна)** + + При работе этой функции через RST 18h или RST 8, обязателен запрет + прерываний, так как функция пользуется стеком для ускорения своей работы. + + Значение регистров на входе: + C=0B2h + A - идентификатор глобального окна + H - размер окна в символах по вертикали + L - размер окна в символах по горизонтали + D - вертикальное положение окна в глобальном окне + E - горизонтальное положение окна в глобальном окне + IX - адрес буфера для запоминания данных + адрес буфера указывается для окна 0C000h если адрес + указан с 8000h, номер страницы буфера не действителен + ниже 8000h адрес указывать нельзя + A' - страница буфера для данных окна эта страница должна + принадлежать программе + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка - неверный идентификатор окна + +**0B4h (180) WIN_GET_SYM Взять символ с экрана** + + Значение регистров на входе: + C=0B4h + A - идентификатор окна + DE - положение символа в окне: + D - вертикаль, E - горизонталь + Значение регистров на выходе: + CF=0 - нормальное завершение + L - символ, H - атрибут, + B - знакогенератор + CF=1 - ошибка неверный идентификатор окна + +**0B5h (181) WIN_PUT_SYM Положить символ на экран** + + Значение регистров на входе: + C=0B5h + A - идентификатор окна + DE - положение символа в окне: + D - вертикаль, E - горизонталь + L - символ, H - атрибут символа + B - знакогенератор + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка неверный идентификатор окна + +**0B6h (182) WIN_SET_ZG установка знакогенератора** + + Значение регистров на входе: + C=0B6h + A - системный номер знакогенератора + DE - указатель на 2Kb блок данных знакогенератора + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка (старая версия, нет функции) + +**0B7h (183) WIN_MOVE_WIN Перемещение окна** + + При работе этой функции через RST 18h или RST 8, обязателен запрет + прерываний, так как функция пользуется стеком для ускорения своей работы. + + Значение регистров на входе: + C=0B7h + A - идентификатор глобального окна + H - размер локального окна по вертикали в символах + L - размер локального окна по горизонтали в символах + D - положение локального окна по вертикали в символах + E - положение локального окна по горизонтали в символах + IX - новое положение локального окна (подобно DE) + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка - неверный идентификатор окна + +**0B8h (184) WIN_GET_ZG Получение знакогенератора** + + Значение регистров на входе: + C=0B8h + DE - адрес, куда будет загружено 2kb знакогенератора + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка (старая версия, нет функции) + +### Функции вывода текста на экран + +**081h (129) LP_PRINT_ALL Печать символов с атрибутом** + + На экран выводится строка из B одинаковых символов + + Значение регистров на входе: + C=081h + A - символ + E - атрибут + B - число выводимых символов + регистры HL,IX - сохраняются + Значение регистров на выходе: + CF=0 - всегда + +**082h (131) LP_PRINT_SYM Вывод символов на экран без атрибута** + + На экран выводится строка из B одинаковых символов атрибут + остается тот, который был на экране + + Значение регистров на входе: + C=082h + A - символ + B - число выводимых символов + регистры HL,IX - сохраняются + Значение регистров на выходе: + CF=0 - всегда + +**083h (131) LP_PRINT_ATR печать атрибутов** + + На экран выводится строка из B одинаковых атрибутов. + Символы не меняются. + + Значение регистров на входе: + C=083h + E - атрибут + B - число выводимых символов + регистры HL,IX - сохраняются + Значение регистров на выходе: + CF=0 - всегда + +**084h (132) LP_SET_PLACE Установка текущего знакоместа в окне** + + Позиция печати устанавливается в соответстии с регистром DE + + Значение регистров на входе: + C=084h + E - положение символа по горизонтали + D - номер символа по вертикали + Превышение границ приводит не к ошибке, а к переустановке + с начала, за вычетом полного размера окна + Значение регистров на выходе: + CF=0 - всегда + +**085h (133) LP_PRINT_LN Вывод строки символов на экран с текущего знакоместа** + + Значение регистров на входе: + C=085h + HL - адрес строки должен быть между 04000h и 0BFFFh + E - атрибут, с которым будет выведена строка + B - длина выводимой строки + Значение регистров на выходе: + CF=0 - всегда + +**086h (134) LP_PRINT_LN2 Вывод строки символов на экран без атрибутов** + + Значение регистров на входе: + C=086h + HL - адрес строки должен быть между 04000h и 0BFFFh + B - длина выводимой строки + Значение регистров на выходе: + CF=0 - всегда + +**087h (135) LP_PRINT_LN3 Вывод строки символов до разделителя** + + После разделителя выводятся пробелы, что бы вывести B символов + + Значение регистров на входе: + C=087h + HL - адрес строки должен быть между 04000h и 0BFFFh + E - атрибут, с которым будет выведена строка + B - длина выводимой строки + D - символ-разделитель, указывающий конец строки + Значение регистров на выходе: + CF=0 - всегда + +**088h (136) LP_PRINT_LN4 Вывод строки символов до разделителя, без атрибутов** + + символы из выводятся на экран, пока не встретится символ равный D, + далее печатаются пробелы, как дополнение строки до B символов. + Атрибуты не изменяются. + + Значение регистров на входе: + C=088h + HL - адрес строки должен быть между 04000h и 0BFFFh + B - длина выводимой строки + D - символ-разделитель, указывающий конец строки + Значение регистров на выходе: + CF=0 - всегда + +**089h (137) LP_CLS_WIN Очистка экрана** + + Выполнение производится выводом пробелов с заданным атрибутом + + Значение регистров на входе: + C=089h + DE - положение локального окна + H - размер в символах локального окна по вертикали + L - размер в символах локального окна по горизонтали + B - атрибут очистки + Значение регистров на выходе: + CF=0 - всегда + +**08Ah (138) LP_SCROLL_UD Скроллинг части глобального окна вверх/вниз** + + Скроллируются полные строки глобального окна + + Значение регистров на входе: + C=08Ah + B - тип скроллинга: 1 - вверх; 2 - вниз + D - начальная строка скроллинга + E - число скроллируемых строк + Значение регистров на выходе: + CF=0 - всегда + +**08Bh (139) LP_PRINT_LN5 Вывод строки символов на экран до разделителя** + + После разделителя вывод останавливается + + Значение регистров на входе: + HL - адрес строки должен быть между 04000h и 0BFFFh + E - атрибут, с которым будет выведена строка + B - максимальная длина выводимой строки + D - символ-разделитель, указывающий конец строки + Значение регистров на выходе: + CF=0 - всегда + +**08Ch (140) LP_PRINT_LN6 Вывод строки символов на экран до разделителя без атрибутов** + + После разделителя вывод останавливается. + + Значение регистров на входе: + C=08Ch + HL - адрес строки должен быть между 04000h и 0BFFFh + B - максимальная длина выводимой строки + D - символ-разделитель, указывающий конец строки + Значение регистров на выходе: + CF=0 - всегда + +**08Dh (141) LP_CLS_WIN2 Очистка экрана с указанием символа заполнения** + + Значение регистров на входе: + C=08Dh + DE - положение локального окна + H - размер в символах локального окна по вертикали + L - размер в символах локального окна по горизонтали + B - атрибут очистки + A - символ очистки + Значение регистров на выходе: + CF=0 - всегда + +**08Eh (142) LP_GET_PLACE Получить текущее положение вывода на экран** + + Значение регистров на входе: + C=08Eh + Значение регистров на выходе: + CF=0 - всегда + DE - координаты, в которых будет напечатан + следующий символ: + D - вертикаль, E - горизонталь + +### Графические функции + +**0A1h (161) PIC_POINT Установить точку** + + Значение регистров на входе: + C=0A1h + DE - координата по вертикали (пиксели) + HL - координата по горизонтали (пиксели) + Координаты считаются от верхнего левого угла экрана + A - идентификатор окна + B - цвет точки + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неверный идентификатор окна + +**0A4h (164) PIC_SET_PAL Установка палитры** + + Значение регистров на входе: + C=0A4h + HL - данные палитры + E - номер начального цвета + D - количество устанавливаемых цветов + B - маска при установке палитры. + Для нормального режима должнa быть 0FFh + A - номер палитры 0..15; от 8 до 15 - резервные + Значение регистров на выходе: + CF=0 - всегда + +**0A6h (166) SET_PAL_INIT Установка внутренней палитры** + + Значение регистров на входе: + C=0A6h + A - страница палитры + B - номер палитры: + B=2 - установка спектрумовской палитры + B=1 - установка графической плаитры + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неверный номер палитры + +### Функции работы с жесткими дисками и дисководами + +**50h,52h,53h (80,82,83) Зарезервированы** + + Значение регистров на входе и на выходе: + нет + +**51h (81) DRV_RESET Сброс контроллера и настройка на диск** + + Значение регистров на входе: + C=51h + A - номер и тип устройства + бит 7..4 - тип устройства: + #0x - FDD + #6x - RAM-DISK + #8x - HDD + #Cx - CD-ROM + бит 3..0 - номер устройства + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка, нет диска или нет устройства + +**54h (84) DRV_VERIFY Проверка секторов** + + Проверка внутренняя на совпадение ECC + + Значение регистров на входе: + C=54h + A - номер и тип устройства (см. выше) + HL:IX - номер сектора (IX - младшая часть номера сектора) + B - количество проверяемых секторов + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - проверка с ошибкой + +**55h (85) DRV_READ Чтение с устройства** + + Значение регистров на входе: + C=55h + A - номер и тип устройства (см. выше) + HL:IX - номер сектора (IX - младшая часть номера сектора) + B - количество секторов + DE - адрес буфера для данных + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка чтения + HL:IX - номер сектора + кол-во прочитанных секторов + DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) + +**56h (86) DRV_WRITE Запись на устройства** + + Значение регистров на входе: + C=56h + A - номер и тип устройства (см. выше) + HL:IX - номер сектора (IX - младшая часть номера сектора) + B - количество секторов + DE - адрес буфера данных для записи + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка записи + HL:IX - номер сектора + кол-во прочитанных секторов + DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) + +**57h (87) DRV_DETECT Определение параметров устройства** + + Значение регистров на входе: + C=57h + A - номер и тип устройства (см. выше) + Значение регистров на выходе: + CF=0 - нормальное завершение + A - bit7=0 диск 720Кb + bit7=1 диск 1.44Mb + CF=1 - нет устройства или нет носителя + +**58h (88) DRV_GET_PAR Получить параметры носителя** + + Значение регистров на входе: + C=58h + A - номер и тип устройства (см. выше) + Значение регистров на выходе: + CF=0 - нормальное завершение + L - число секторов + H - число головок + DE - количество цилиндров + если HL=DE=0FFFFh - устройства нет + IX - размер сектора в байтах + B - доп. параметры для дискет: + бит7 - тип 1.44Mb/720Kb + CF=1 - нет устройства + +**59h (89) DRV_SET_PAR Установить параметры носителя** + + Значение регистров на входе: + A - номер и тип устройства (см. выше) + L - число секторов + H - число головок + DE - количество цилиндров + IX - размер сектора в байтах + B - доп. параметры для дискет + бит7 - тип 1.44Mb/720Kb + Значение регистров на выходе: + CF=0 - нормальное завершение + +**5Ah (90) EXT_VERSION Номер версии дисковой спецификации.** + + Значение регистров на входе: + C=5Ah + Значение регистров на выходе: + CF=0 - нормальное завершение + D - версия + E - модификация + CF=1 - ошибка + +**5Fh (95) DRV_LIST Список дисковых устройств** + + Значение регистров на входе: + C=5Fh + IX - буфер для списка устройств + Значение регистров на выходе: + CF=0 - нормальное завершение + +В буфере список дисков в формате: + + IX+0 - размер заполненого буфера + IX+1 - кол-во устройств FDD + IX+2 - кол-во устройств HDD + IX+3 - кол-во устройств CD DRIVE + IX+4 - #00 - конец списка, иначе кол-во устройств нового типа + + +### Примечания и комментарии. + +##### *Примечание по использованию функции получения адресов портов окон (0C6h).* +Cледует хотя бы один раз вызвать эти функции и сравнить адреса портов с +теми, что используются в программе и, если они не совпадают, выдать +соответствующее предупреждение. В данный момент эти порты таковы: +PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h + +##### *Примечание по использованию функции EMM_FN7 (0C7h).* +Информация о распределении памяти хранится в виде RAM Allocation Table, +похожей на дисковый FAT. Поэтому нахождение физического номера следующей +страницы по предыдущему физическому номеру происходит значительно быстрее, +чем поиск по увеличенному на единицу логическому номеру. + +##### *Комментарий к функции FN_VERSION (0EFh).* +Значения регистра BC на выходе и соответствующая ему конфигурация + BC=FFFF - Не определено + BC=FFFE - Конфигурация Spectrum, режим Sprinter ZX + BC=FFFD - Конфигурация Sprinter + BC=FFFC - Зарезервировано + BC=FFFB - Зарезервировано + BC=FFFA - Зарезервировано + BC=FFF9 - Зарезервировано +Иные значения BC - новые прошивки. + +##### *Комментарий к функциям CMOS (0F5h-0F7h)* +Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет +микросхемы CMOS, то эмулируется ее память. Наличие микросхемы +определяется функцией CMOS_TEST. + +##### *Комментарий к функции FN_TURBO (08Fh)* +Переключение режима турбо может не произойти, если прошивка не +поддерживает это переключение. При этом ошибки не происходит. Так же, +переключение режима TURBO блокируется кнопкой "Turbo" в режиме Turbo-OFF + +##### *Комментарий к функциям печати текста.* +Эти функции работают с текущим окном, которым всегда является последнее +открытое окно. К графическому экрану функции печати текста не применимы. + +##### *Описатель окна.* +Для открытия окон используется 32-хбайтовый описатель окна (дескриптор), +адрес которого указывается в регистре IX. + + IX - 32-хбайтовый описатель окна + (IX+0) - горизонтальный размер окна в знакоместах + (IX+1) - вертикальный размер в знакоместах + (IX+2) - положение окна по горизонтали на экране в знакоместах + (IX+3) - положение окна по вертикали на экране в знакоместах + (IX+4) - режим знакоместа + bit4=1 - text_mode bit4=0 - graf_mode + bit5=0 - 16, bit5=1 - 8 точек в знакоместе + graf_mode bit3..0 - не существенны + bit7..6 - номер палитры + text_mode bit7..6,3..0 - номер знакогенератора + исключение: bit7..6=B"11" - бордер + (IX+5) - дополнительный режим знакоместа + bit0=1 - указывает на включение спектрумовской + адресации экрана + (IX+6) - положение по X в поле графики (по знакоместам) + (IX+7) - положение по Y в поле графики (по знакоместам) + разъяснения о положении в поле графики - ниже + (IX+8..31) - зарезервировано (переменные окна) + в этих байтах должны быть нули + +При открытии окна описатель копируется в системную страницу ОЗУ и +программа может не сохранять его. Что бы описатель окна не потерялся, +программа получает идентификатор окна. Он же идентификатор глобального +окна. В функциях запоминания, восстановления, перемещения, а так же +функциях стирания, скроллинга и т.п. идентификатор окна определяет +область экрана, относительно которой производится работа с локальными +окнами. Подразумеваются локальные окна в смысле "окно в окне". +Идентификатор окна определяет глобальное окно, отнoсительно которого +адресуются локальные. В части функций глобальное окно определяется по +умолчанию, как последнее, с которым производились действия с явным +указанием идентификатора. + +В данный момент BIOS хранит только один описатель окна - последний, +с которым была произведена функция открытия. Идентификатор окна +выставляется в 0. В дальнейшем планитруется разработка функций со +множеством окон, потому, во избежание неприятностей в будущем, при +работе с окнами, программисту следует запоминать идентификатор окна +и пользоваться этим значением при работе с ним. + + Типы стандартных окон: + 0 - окно 32x24 в формате ZX Spectrum + 1 - текстовое окно 64x24 + 2 - текстовое окно 40x32 + 3 - текстовое окно 80x32 + 4 - окно в формате ZX Spectrum, HL - положение окна на экране в знакоместах + 5 - текстовое окно 64x24, HL - положение окна на экране в знакоместах + 6 - текстовое окно 40x32, HL - положение окна на экране в знакоместах + 7 - текстовое окно 80x32, HL - положение окна на экране в знакоместах + 8 - графическое окно 0, HL - положение окна на экране + 9 - графическое окно 1, HL - положение окна на экране + +Данные палитры должны представлять собой список приблизительно такого вида: + + DB blue1,green1,red1,0 + DB blue2,green2,red2,0 + ..................... + DB blueN,greenN,redN,0 + +N - количество цветов. Значеное равное 0 соответствует 256-ти цветам. +При записи в видео-ОЗУ все данные предварительно проходят функцию AND +со значением регистра маски - B. + +Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в +соответствующей палитре нужно задать соответствующее значение bit7..6 в +байте режима знакоместа + +Страницы 4..7 соответствуют текстовому режиму и спектрумовскому режиму. +В странице 4 задается цвет PAPER для каждого атрибута. В странице 5 +задается цвет INK для каждого атрибута. В странице 6 задается цвет PAPER, +которым он будет моргать в режиме FLASH В странице 7 задается цвет INK, +которым он будет моргать в режиме FLASH. Таким образом, для каждого из +256-ти атрибутов задается четыре цвета если цвета 4,5 совпадают с +цветами 6,7 то режим FLASH оказывается отключенным. Для его включения +в спектрумовском режиме надо поменять местами цвета 6 и 7. Если надо +включить FLASH в режим IBM-CGA, следует установить цвета 6 и 7 +одинаковыми и равными цвету 4. По сути режим FLASH всегда включен, и +на экране постоянно меняются цвета PAPER с 4-го на 6-й, а цвета INK с +5 на 7-й. Если эти пары цветов для атрибута знакоместа устанавливаются +одинаковыми, то FLASH в этом месте не виден. + +##### *Комментарий к функциям работы с устройствами хранения информации.* + +В этих функциях в регистре A обычно задается номер и тип устройства: + бит 0..3 - номер устройства + бит 4..7 - тип устройства: + 0 - дисковод + 6 - ram-disk + 8 - HDD + C - CD-ROM + +остальные номера не используются + +А так же задаются: старшая часть номера сектора в регисте HL, +младшая часть номера сектора в регистре IX. + diff --git a/docs/Original/BIOS/Функции BIOS v3.md b/docs/Original/BIOS/Функции BIOS v3.md new file mode 100644 index 0000000..1369eb1 --- /dev/null +++ b/docs/Original/BIOS/Функции BIOS v3.md @@ -0,0 +1,901 @@ +# Функции BIOS v3.00 + +### Вызов функций BIOS + +**Вызов функций BIOS осуществляется из ассемблерного кода.** + +Номер функции задается в регистре C процессора. В остальные +регистры, при необходимости, загружаются входные параметры функции. +После исполнения функции происходит возврат в программу, из которой +произошел вызов функции. Установленный флаг CF (CF=1) означает, что +работа функции произошла с ошибкой. В некоторых регистрах передаются +выходные параметры. + +Ниже приведены таблицы входных и выходных параметров для каждой функции: + +- Функции работы с памятью +- Функции управления 'железом' +- Функции управления окнами и режимами экрана +- Функции вывода текста на экран +- Графические функции +- Функции работы с жесткими дисками и дисководами + +При работе функций BIOS необходимо что бы стек находился в области +8000h..0BFFFh, так как часть функций использует переключение страниц +PAGE1 и PAGE3. + +Вызов функций BIOS возможен в различных конфигурациях компьютера +Sprinter. + +**Конфигурация Spectrum:** вызов функций BIOS осуществляется через +3D13h. При этом работают и все функции TR-DOS. + +**Конфигурации Sprinter:** вызов функций BIOS осуществляется через RST +18h при подключенном системном ПЗУ. + +Для постоянного подключения системного ПЗУ можно воспользоваться такой +последовательностью команд: + +```asm + LD A,0 + OUT (07Ch),A +``` + +После ее исполнения в 0-м окне Z80 будет включено ПЗУ BIOSа и программа +может вызывать функции BIOSа через RST 18h. + +Отключение ПЗУ BIOSа из нулевого окна Z80 производится следующей +последовательностью команд: + +```asm + LD A,0 + OUT (03Ch),A +``` + +При необходимости, функции BIOSа могут быть вызваны программой, +находящейся в ОЗУ непосредственно в нулевом окне Z80. Для этого надо +установить в адресе 0008h следующий код: + +```asm +ADDRESS_0008h: + PUSH AF + LD A,0 + OUT (7Ch),A + POP AF + RET +``` + +После этого BIOS можно вызывать командой RST 8. (Функции TR-DOS, так +же как и в случае RST 18 остаются недоступны.) Вызывая программы таким +образом, через RST 8, следует помнить что адреса 3FFFh..0000h после +входа в BIOS будут содержать код ПЗУ, поэтому, если фунция использует +данные в ОЗУ, они должны находиться в других адресах. + +Оптимизация программы для RST 8 недопустима, так как в ПЗУ, для +обратного переключения, стоит такая же программа, только порт 3Ch для +отключения ПЗУ BIOSа. + +Вызов функций BIOS в exe-файлах, вызываемых с помощью операционной +системы Estex, производится командой RST 8. Необходимая программа в +адресе 0008h уже имеется в блоке кода ОС Estex. + +### Функции работы с памятью + + +**0C0h (192) EMM_FN0 Определение объемов ОЗУ** + + Значение регистров на входе: + C=0C0h + Значение регистров на выходе: + HL - общий объем ОЗУ в страницах по 16k + BC - объем свободного ОЗУ в страницах по 16k + +**0C1h (193) EMM_FN1 Инициализация распределения памяти** +Стирается вся информация о выделенных ранее блоках ОЗУ. +Блоки с системной информацией и первые 256K ОЗУ объявляются занятыми. + + Значение регистров на входе: + C=0C1h + Значение регистров на выходе: + нет + +**0C2h (194) EMM_FN2 Выделение блока ОЗУ** + + Значение регистров на входе: + C=0C2h + B - число запрашиваемых страниц + Значение регистров на выходе: + CF=0 - нормальное завершение - A - идентификатор блока + CF=1 - ошибка - A=1 - не хватает памяти + +**0C3h (195) EMM_FN3 Освободить блок ОЗУ** + + Значение регистров на входе: + C=0C3h + A - идентификатор блока + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неправильный идентификатор + идентификатор не всегда отслеживается правильно + + +**0C4h (196) EMM_FN4 Получить физический номер страницы из блока памяти** + + Значение регистров на входе: + C=0C4h + A - идентификатор блока + B - логическая номер страницы в блоке + Значение регистров на выходе: + CF=0 - A - логический номер страницы + CF=1 - ошибка: + A=0 - блок не существует + A=255 - запрашиваемый номер страницы слишком велик + +**0C5h (197) EMM_FN5 Получить список физических страниц блока** + + Значение регистров на входе: + C=0C5h + A - идентификатор блока + HL - буфер 256 байт для размещения списка страниц + Значение регистров на выходе: + CF=0 - нормальное завершение: + B - число страниц в блоке + HL - тот же адрес буфера, в буфере список физических + страниц по порядку, заканчивающийся байтом 0FFh + CF=1 - неверный идентификатор блока; старая информация в буфере + может быть затерта + +**0C6h (198) EMM_FN6 Получение адресов портов окон** + +Примечание по использованию функции получения адресов портов окон (0C6h): +>Cледует хотя бы один раз вызвать эти функции и сравнить адреса +>портов с теми, что используются в программе и, если они не совпадают, +>выдать соответствующее предупреждение. В данный момент эти порты +>таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h + + Значение регистров на входе: + C=0C6h + A - номер окна процессора - 0,1,2 или 3 + Значение регистров на выходе: + CF=0 - нормальное завершение + C - 8-битный адрес порта окна + B - физический номер подключенной в окно страницы + CF=1 - ошибка - неверный номер окна + +**0C7h (199) EMM_FN7 Получить номер следующей страницы блока** + +Примечание по использованию функции EMM_FN7 (0C7h): +> Информация о распределении памяти хранится в виде RAM Allocation Table, +> похожей на дисковый FAT. Поэтому нахождение физического номера +> следующей страницы по предыдущему физическому номеру происходит +> значительно быстрее, чем поиск по увеличенному на единицу логическому +> номеру. + + Значение регистров на входе: + C=0C7h + A - физическая страница + Значение регистров на выходе: + CF=0 - нормальное завершение + A - следуюшая физическая страница блока + A=0FFh - индицирует конец блока + CF=1 - ошибка - страница не принадлежит никакому блоку. + фактически, это означает, что она свободна. + +**09Eh (158) EMM_FN8 Слияние блоков** + + Значение регистров на входе: + A - идентификатор блока 1 + B - идентификатор блока 2 + Значение регистров на выходе: + CF=0 - нормальное завершение + A - идентификатор объединенного блока + CF=1 - ошибка - неверный идентификатор блока + +**09Dh (157) EMM_FN9 Разделение блока** + + Значение регистров на входе: + C=09Dh + A - идентификатор блока + B - новая длина блока + Значение регистров на выходе: + CF=0 - нормальное завершение + A - идентификатор блока результата + B - идентификатор блока остатка + CF=1 - ошибка - неверный идентификатор блока + +### Функции управления 'железом' + +**0EFh (239) FN_VERSION Выдача информации о версии BIOSа и железа.** + + Значение регистров на входе: + C=0EFh + HL - буфер, куда будет помещена ASCII строка с несколькими + полями, номером версии BIOS и названием модели + компьютера. Конец строки отмечен двойным нулем. + Значение регистров на выходе: + CF=0 - нормальное завершение + HL - тот же буфер с записанной строкой. + DE - версия BIOSа + BC - версия железа подробности ниже + A - количество полей в буфере (в данный момент - 2) + Первое поле - версия BIOS. + Второе - название модели компьютера. + CF=1 - ошибка - Очень старая версия, + не имеющая данной функции + +**0F2h (242) FN_SICF=0 Установка синхронизации, очистка страницы режима экрана** + + Значение регистров на входе: + C=0F2h + A - режим синхронизации + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неверный номер режима синхронизации + +### Функции работы с CMOS данными и Turbo режимом + +Комментарий к функциям CMOS (0F5h-0F7h): +> Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет +> микросхемы CMOS, то эмулируется ее память. Наличие микросхемы +> определяется функцией CMOS_TEST. + +**0F5h (245) CMOS_TEST Проверить наличие CMOS** + + Значение регистров на входе: + C=0F5h + Значение регистров на выходе: + CF=0 - часы есть + CF=1 - часов нет + +**0F6h (246) CMOS_RD Читать из регистра CMOS** + + Значение регистров на входе: + C=0F6h + D - номер регистра CMOS + Значение регистров на выходе: + A - считанные данные + CF=0 - часы есть + CF=1 - часов нет + +**0F7h (247) CMOS_WR Писать в регистр CMOS** + + Значение регистров на входе: + C=0F7h + D - номер регистра CMOS + A - записываемые данные + Значение регистров на выходе: + CF=0 - часы есть + CF=1 - часов нет + +**08Fh (143) FN_TURBO Функция управления турбо режимом.** + + Комментарий к функции FN_TURBO (08Fh): + Переключение режима турбо может не произойти, если прошивка не + поддерживает это переключение. При этом ошибки не происходит. Так + же, переключение режима TURBO блокируется кнопкой "Turbo" в + режиме Turbo-OFF + Значение регистров на входе: + C=08Fh + A - режим турбо: 2 - off, 3 - on + A - режим FDD: 12h - 720Kb, 13h - 1.44Mb + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неверный режим турбо + +### Функции управления окнами и режимами экрана + +**0B0h (176) WIN_OPEN Функция открытия окна.** + + Значение регистров на входе: + C=0B0h + IX - описатель окна + E - флаги окна: + бит 0 указывает какую страницу режима включать после + исполнения функции; + бит 4 указывает на какой странице режима открывать окно + Значение регистров на выходе: + CF=0 - нормальное завершение: + A - идентификатор окна + CF=1 - ошибка слишком много окон + +**0B1h (177) WIN_CLOSE закрытие окна** + + Значение регистров на входе: + C=0B1h + A - идентификатор окна + Значение регистров на выходе: + CF=0 - успешное завершение + CF=1 - ошибка - неверный идентификатор + Окно с номером 0 никогда не закрывается и попытка + закрытия приводит к ошибке + +**0B2h (178) WIN_COPY_WIN Копирование данных текстового окна в память (запоминание окна)** + + При работе этой функции через RST 18h или RST 8, обязателен запрет + прерываний, так как функция пользуется стеком для ускорения своей работы. + + Значение регистров на входе: + C=0B2h + A - идентификатор глобального окна + H - размер окна в символах по вертикали + L - размер окна в символах по горизонтали + D - вертикальное положение окна в глобальном окне + E - горизонтальное положение окна в глобальном окне + IX - адрес буфера для запоминания данных + адрес буфера указывается для окна 0C000h если адрес + указан с 8000h, номер страницы буфера не действителен + ниже 8000h адрес указывать нельзя + A' - страница буфера для данных окна эта страница должна + принадлежать программе + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка - неверный идентификатор окна + +**0B3h (179) WIN_RESTORE_WIN Копирование из памяти в текстовое окно (восстановление окна)** + + При работе этой функции через RST 18h или RST 8, обязателен запрет + прерываний, так как функция пользуется стеком для ускорения своей работы. + + Значение регистров на входе: + C=0B2h + A - идентификатор глобального окна + H - размер окна в символах по вертикали + L - размер окна в символах по горизонтали + D - вертикальное положение окна в глобальном окне + E - горизонтальное положение окна в глобальном окне + IX - адрес буфера для запоминания данных + адрес буфера указывается для окна 0C000h если адрес + указан с 8000h, номер страницы буфера не действителен + ниже 8000h адрес указывать нельзя + A' - страница буфера для данных окна эта страница должна + принадлежать программе + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка - неверный идентификатор окна + +**0B4h (180) WIN_GET_SYM Взять символ с экрана** + + Значение регистров на входе: + C=0B4h + A - идентификатор окна + DE - положение символа в окне: + D - вертикаль, E - горизонталь + Значение регистров на выходе: + CF=0 - нормальное завершение + L - символ, H - атрибут, + B - знакогенератор + CF=1 - ошибка неверный идентификатор окна + +**0B5h (181) WIN_PUT_SYM Положить символ на экран** + + Значение регистров на входе: + C=0B5h + A - идентификатор окна + DE - положение символа в окне: + D - вертикаль, E - горизонталь + L - символ, H - атрибут символа + B - знакогенератор + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка неверный идентификатор окна + +**0B6h (182) WIN_SET_ZG установка знакогенератора** + + Значение регистров на входе: + C=0B6h + A - системный номер знакогенератора + DE - указатель на 2Kb блок данных знакогенератора + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка (старая версия, нет функции) + +**0B7h (183) WIN_MOVE_WIN Перемещение окна** + + При работе этой функции через RST 18h или RST 8, обязателен запрет + прерываний, так как функция пользуется стеком для ускорения своей работы. + + Значение регистров на входе: + C=0B7h + A - идентификатор глобального окна + H - размер локального окна по вертикали в символах + L - размер локального окна по горизонтали в символах + D - положение локального окна по вертикали в символах + E - положение локального окна по горизонтали в символах + IX - новое положение локального окна (подобно DE) + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка - неверный идентификатор окна + +**0B8h (184) WIN_GET_ZG Получение знакогенератора** + + Значение регистров на входе: + C=0B8h + DE - адрес, куда будет загружено 2kb знакогенератора + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка (старая версия, нет функции) + +### Функции вывода текста на экран + +**081h (129) LP_PRINT_ALL Печать символов с атрибутом** + + На экран выводится строка из B одинаковых символов + + Значение регистров на входе: + C=081h + A - символ + E - атрибут + B - число выводимых символов + регистры HL,IX - сохраняются + Значение регистров на выходе: + CF=0 - всегда + +**082h (131) LP_PRINT_SYM Вывод символов на экран без атрибута** + + На экран выводится строка из B одинаковых символов атрибут + остается тот, который был на экране + + Значение регистров на входе: + C=082h + A - символ + B - число выводимых символов + регистры HL,IX - сохраняются + Значение регистров на выходе: + CF=0 - всегда + +**083h (131) LP_PRINT_ATR печать атрибутов** + + На экран выводится строка из B одинаковых атрибутов. + Символы не меняются. + + Значение регистров на входе: + C=083h + E - атрибут + B - число выводимых символов + регистры HL,IX - сохраняются + Значение регистров на выходе: + CF=0 - всегда + +**084h (132) LP_SET_PLACE Установка текущего знакоместа в окне** + + Позиция печати устанавливается в соответстии с регистром DE + + Значение регистров на входе: + C=084h + E - положение символа по горизонтали + D - номер символа по вертикали + Превышение границ приводит не к ошибке, а к переустановке + с начала, за вычетом полного размера окна + Значение регистров на выходе: + CF=0 - всегда + +**085h (133) LP_PRINT_LN Вывод строки символов на экран с текущего знакоместа** + + Значение регистров на входе: + C=085h + HL - адрес строки должен быть между 04000h и 0BFFFh + E - атрибут, с которым будет выведена строка + B - длина выводимой строки + Значение регистров на выходе: + CF=0 - всегда + +**086h (134) LP_PRINT_LN2 Вывод строки символов на экран без атрибутов** + + Значение регистров на входе: + C=086h + HL - адрес строки должен быть между 04000h и 0BFFFh + B - длина выводимой строки + Значение регистров на выходе: + CF=0 - всегда + +**087h (135) LP_PRINT_LN3 Вывод строки символов до разделителя** + + После разделителя выводятся пробелы, что бы вывести B символов + + Значение регистров на входе: + C=087h + HL - адрес строки должен быть между 04000h и 0BFFFh + E - атрибут, с которым будет выведена строка + B - длина выводимой строки + D - символ-разделитель, указывающий конец строки + Значение регистров на выходе: + CF=0 - всегда + +**088h (136) LP_PRINT_LN4 Вывод строки символов до разделителя, без атрибутов** + + символы из выводятся на экран, пока не встретится символ равный D, + далее печатаются пробелы, как дополнение строки до B символов. + Атрибуты не изменяются. + + Значение регистров на входе: + C=088h + HL - адрес строки должен быть между 04000h и 0BFFFh + B - длина выводимой строки + D - символ-разделитель, указывающий конец строки + Значение регистров на выходе: + CF=0 - всегда + +**089h (137) LP_CLS_WIN Очистка экрана** + + Выполнение производится выводом пробелов с заданным атрибутом + + Значение регистров на входе: + C=089h + DE - положение локального окна + H - размер в символах локального окна по вертикали + L - размер в символах локального окна по горизонтали + B - атрибут очистки + Значение регистров на выходе: + CF=0 - всегда + +**08Ah (138) LP_SCROLL_UD Скроллинг части глобального окна вверх/вниз** + + Скроллируются полные строки глобального окна + + Значение регистров на входе: + C=08Ah + B - тип скроллинга: 1 - вверх; 2 - вниз + D - начальная строка скроллинга + E - число скроллируемых строк + Значение регистров на выходе: + CF=0 - всегда + +**08Bh (139) LP_PRINT_LN5 Вывод строки символов на экран до разделителя** + + После разделителя вывод останавливается + + Значение регистров на входе: + HL - адрес строки должен быть между 04000h и 0BFFFh + E - атрибут, с которым будет выведена строка + B - максимальная длина выводимой строки + D - символ-разделитель, указывающий конец строки + Значение регистров на выходе: + CF=0 - всегда + +**08Ch (140) LP_PRINT_LN6 Вывод строки символов на экран до разделителя без атрибутов** + + После разделителя вывод останавливается. + + Значение регистров на входе: + C=08Ch + HL - адрес строки должен быть между 04000h и 0BFFFh + B - максимальная длина выводимой строки + D - символ-разделитель, указывающий конец строки + Значение регистров на выходе: + CF=0 - всегда + +**08Dh (141) LP_CLS_WIN2 Очистка экрана с указанием символа заполнения** + + Значение регистров на входе: + C=08Dh + DE - положение локального окна + H - размер в символах локального окна по вертикали + L - размер в символах локального окна по горизонтали + B - атрибут очистки + A - символ очистки + Значение регистров на выходе: + CF=0 - всегда + +**08Eh (142) LP_GET_PLACE Получить текущее положение вывода на экран** + + Значение регистров на входе: + C=08Eh + Значение регистров на выходе: + CF=0 - всегда + DE - координаты, в которых будет напечатан + следующий символ: + D - вертикаль, E - горизонталь + +### Графические функции + +**0A1h (161) PIC_POINT Установить точку** + + Значение регистров на входе: + C=0A1h + DE - координата по вертикали (пиксели) + HL - координата по горизонтали (пиксели) + Координаты считаются от верхнего левого угла экрана + A - идентификатор окна + B - цвет точки + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неверный идентификатор окна + +**0A4h (164) PIC_SET_PAL Установка палитры** + + Значение регистров на входе: + C=0A4h + HL - данные палитры + E - номер начального цвета + D - количество устанавливаемых цветов + B - маска при установке палитры. + Для нормального режима должнa быть 0FFh + A - + 0..3 биты - значения 0..7 - номер палитры + - значения 8..15 - зарезервированы + 4..6 биты - зарезервированы (установить в 0) + 7 бит - + - значение 0 - установить + - значение 1 - загрузить палитру в память + Значение регистров на выходе: + CF=0 - всегда + +**0A6h (166) SET_PAL_INIT Установка внутренней палитры** + + Значение регистров на входе: + C=0A6h + A - страница палитры + B - номер палитры: + B=3 - установка текстовой палитры CGA + B=2 - установка спектрумовской палитры + B=1 - установка графической плаитры + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - неверный номер палитры + +### Функции работы с жесткими дисками и дисководами + +**50h,52h,53h (80,82,83) Зарезервированы** + + Значение регистров на входе и на выходе: + нет + +**51h (81) DRV_RESET Сброс контроллера и настройка на диск** + + Значение регистров на входе: + C=51h + A - номер и тип устройства + бит 7..4 - тип устройства: + #0x - FDD + #6x - RAM-DISK + #8x - HDD + #Cx - CD-ROM + бит 3..0 - номер устройства + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка, нет диска или нет устройства + +**54h (84) DRV_VERIFY Проверка секторов** + + Проверка внутренняя на совпадение ECC + + Значение регистров на входе: + C=54h + A - номер и тип устройства (см. выше) + HL:IX - номер сектора (IX - младшая часть номера сектора) + B - количество проверяемых секторов + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - проверка с ошибкой + +**55h (85) DRV_READ Чтение с устройства** + + Значение регистров на входе: + C=55h + A - номер и тип устройства (см. выше) + HL:IX - номер сектора (IX - младшая часть номера сектора) + B - количество секторов + DE - адрес буфера для данных + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка чтения + HL:IX - номер сектора + кол-во прочитанных секторов + DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) + +**56h (86) DRV_WRITE Запись на устройства** + + Значение регистров на входе: + C=56h + A - номер и тип устройства (см. выше) + HL:IX - номер сектора (IX - младшая часть номера сектора) + B - количество секторов + DE - адрес буфера данных для записи + Значение регистров на выходе: + CF=0 - нормальное завершение + CF=1 - ошибка записи + HL:IX - номер сектора + кол-во прочитанных секторов + DE - адрес буфера для данных + (кол-во прочитанных секторов * размер сектора) + +**57h (87) DRV_DETECT Определение параметров устройства** + + Значение регистров на входе: + C=57h + A - номер и тип устройства (см. выше) + Значение регистров на выходе: + CF=0 - нормальное завершение + A - bit7=0 диск 720Кb + bit7=1 диск 1.44Mb + CF=1 - нет устройства или нет носителя + +**58h (88) DRV_GET_PAR Получить параметры носителя** + + Значение регистров на входе: + C=58h + A - номер и тип устройства (см. выше) + Значение регистров на выходе: + CF=0 - нормальное завершение + L - число секторов + H - число головок + DE - количество цилиндров + если HL=DE=0FFFFh - устройства нет + IX - размер сектора в байтах + B - доп. параметры для дискет: + бит7 - тип 1.44Mb/720Kb + CF=1 - нет устройства + +**59h (89) DRV_SET_PAR Установить параметры носителя** + + Значение регистров на входе: + A - номер и тип устройства (см. выше) + L - число секторов + H - число головок + DE - количество цилиндров + IX - размер сектора в байтах + B - доп. параметры для дискет + бит7 - тип 1.44Mb/720Kb + Значение регистров на выходе: + CF=0 - нормальное завершение + +**5Ah (90) EXT_VERSION Номер версии дисковой спецификации.** + + Значение регистров на входе: + C=5Ah + Значение регистров на выходе: + CF=0 - нормальное завершение + D - версия + E - модификация + CF=1 - ошибка + +**5Fh (95) DRV_LIST Список дисковых устройств** + + Значение регистров на входе: + C=5Fh + IX - буфер для списка устройств + Значение регистров на выходе: + CF=0 - нормальное завершение + +В буфере список дисков в формате: + + IX+0 - размер заполненого буфера + IX+1 - кол-во устройств FDD + IX+2 - кол-во устройств HDD + IX+3 - кол-во устройств CD DRIVE + IX+4 - #00 - конец списка, иначе кол-во устройств нового типа + + +### Примечания и комментарии. + +##### *Примечание по использованию функции получения адресов портов окон (0C6h).* +Cледует хотя бы один раз вызвать эти функции и сравнить адреса портов с +теми, что используются в программе и, если они не совпадают, выдать +соответствующее предупреждение. В данный момент эти порты таковы: +PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, PAGE3=0E2h + +##### *Примечание по использованию функции EMM_FN7 (0C7h).* +Информация о распределении памяти хранится в виде RAM Allocation Table, +похожей на дисковый FAT. Поэтому нахождение физического номера следующей +страницы по предыдущему физическому номеру происходит значительно быстрее, +чем поиск по увеличенному на единицу логическому номеру. + +##### *Комментарий к функции FN_VERSION (0EFh).* +Значения регистра BC на выходе и соответствующая ему конфигурация + BC=FFFF - Не определено + BC=FFFE - Конфигурация Spectrum, режим Sprinter ZX + BC=FFFD - Конфигурация Sprinter + BC=FFFC - Зарезервировано + BC=FFFB - Зарезервировано + BC=FFFA - Зарезервировано + BC=FFF9 - Зарезервировано +Иные значения BC - новые прошивки. + +##### *Комментарий к функциям CMOS (0F5h-0F7h)* +Функции CMOS_RD, CMOS_WR, CMOS_TEST работают всегда. Если в машине нет +микросхемы CMOS, то эмулируется ее память. Наличие микросхемы +определяется функцией CMOS_TEST. + +##### *Комментарий к функции FN_TURBO (08Fh)* +Переключение режима турбо может не произойти, если прошивка не +поддерживает это переключение. При этом ошибки не происходит. Так же, +переключение режима TURBO блокируется кнопкой "Turbo" в режиме Turbo-OFF + +##### *Комментарий к функциям печати текста.* +Эти функции работают с текущим окном, которым всегда является последнее +открытое окно. К графическому экрану функции печати текста не применимы. + +##### *Описатель окна.* +Для открытия окон используется 32-хбайтовый описатель окна (дескриптор), +адрес которого указывается в регистре IX. + + IX - 32-хбайтовый описатель окна + (IX+0) - горизонтальный размер окна в знакоместах + (IX+1) - вертикальный размер в знакоместах + (IX+2) - положение окна по горизонтали на экране в знакоместах + (IX+3) - положение окна по вертикали на экране в знакоместах + (IX+4) - режим знакоместа + bit4=1 - text_mode bit4=0 - graf_mode + bit5=0 - 16, bit5=1 - 8 точек в знакоместе + graf_mode bit3..0 - не существенны + bit7..6 - номер палитры + text_mode bit7..6,3..0 - номер знакогенератора + исключение: bit7..6=B"11" - бордер + (IX+5) - дополнительный режим знакоместа + bit0=1 - указывает на включение спектрумовской + адресации экрана + (IX+6) - положение по X в поле графики (по знакоместам) + (IX+7) - положение по Y в поле графики (по знакоместам) + разъяснения о положении в поле графики - ниже + (IX+8..31) - зарезервировано (переменные окна) + в этих байтах должны быть нули + +При открытии окна описатель копируется в системную страницу ОЗУ и +программа может не сохранять его. Что бы описатель окна не потерялся, +программа получает идентификатор окна. Он же идентификатор глобального +окна. В функциях запоминания, восстановления, перемещения, а так же +функциях стирания, скроллинга и т.п. идентификатор окна определяет +область экрана, относительно которой производится работа с локальными +окнами. Подразумеваются локальные окна в смысле "окно в окне". +Идентификатор окна определяет глобальное окно, отнoсительно которого +адресуются локальные. В части функций глобальное окно определяется по +умолчанию, как последнее, с которым производились действия с явным +указанием идентификатора. + +В данный момент BIOS хранит только один описатель окна - последний, +с которым была произведена функция открытия. Идентификатор окна +выставляется в 0. В дальнейшем планитруется разработка функций со +множеством окон, потому, во избежание неприятностей в будущем, при +работе с окнами, программисту следует запоминать идентификатор окна +и пользоваться этим значением при работе с ним. + + Типы стандартных окон: + 0 - окно 32x24 в формате ZX Spectrum + 1 - текстовое окно 64x24 + 2 - текстовое окно 40x32 + 3 - текстовое окно 80x32 + 4 - окно в формате ZX Spectrum, HL - положение окна на экране в знакоместах + 5 - текстовое окно 64x24, HL - положение окна на экране в знакоместах + 6 - текстовое окно 40x32, HL - положение окна на экране в знакоместах + 7 - текстовое окно 80x32, HL - положение окна на экране в знакоместах + 8 - графическое окно 0, HL - положение окна на экране + 9 - графическое окно 1, HL - положение окна на экране + +Данные палитры должны представлять собой список приблизительно такого вида: + + DB blue1,green1,red1,0 + DB blue2,green2,red2,0 + ..................... + DB blueN,greenN,redN,0 + +N - количество цветов. Значеное равное 0 соответствует 256-ти цветам. +При записи в видео-ОЗУ все данные предварительно проходят функцию AND +со значением регистра маски - B. + +Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в +соответствующей палитре нужно задать соответствующее значение bit7..6 в +байте режима знакоместа + +Страницы 4..7 соответствуют текстовому режиму и спектрумовскому режиму. +В странице 4 задается цвет PAPER для каждого атрибута. В странице 5 +задается цвет INK для каждого атрибута. В странице 6 задается цвет PAPER, +которым он будет моргать в режиме FLASH В странице 7 задается цвет INK, +которым он будет моргать в режиме FLASH. Таким образом, для каждого из +256-ти атрибутов задается четыре цвета если цвета 4,5 совпадают с +цветами 6,7 то режим FLASH оказывается отключенным. Для его включения +в спектрумовском режиме надо поменять местами цвета 6 и 7. Если надо +включить FLASH в режим IBM-CGA, следует установить цвета 6 и 7 +одинаковыми и равными цвету 4. По сути режим FLASH всегда включен, и +на экране постоянно меняются цвета PAPER с 4-го на 6-й, а цвета INK с +5 на 7-й. Если эти пары цветов для атрибута знакоместа устанавливаются +одинаковыми, то FLASH в этом месте не виден. + +##### *Комментарий к функциям работы с устройствами хранения информации.* + +В этих функциях в регистре A обычно задается номер и тип устройства: + + бит 0..3 - номер устройства + бит 4..7 - тип устройства: + 0 - дисковод + 6 - ram-disk + 8 - HDD + C - CD-ROM + +остальные номера не используются diff --git a/docs/Original/Estex DSS/Estex.doc b/docs/Original/Estex DSS/Estex.doc new file mode 100644 index 0000000000000000000000000000000000000000..a9e07eed57875e5cb86d94b39e7c315ceff43459 GIT binary patch literal 33792 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 literal 0 HcmV?d00001 diff --git a/docs/Original/Estex DSS/Estex.txt b/docs/Original/Estex DSS/Estex.txt new file mode 100644 index 0000000..cf91007 --- /dev/null +++ b/docs/Original/Estex DSS/Estex.txt @@ -0,0 +1,155 @@ +Estex: Disk SubSystem (DSS) Programming Guide + +Table of Contents +1. Introducing +2. Identification of system functions +3. Disk devices functions + + +1. Introducing + + This document contains the list of functions and concepts of +interaction with a disk subsystem. + DSS is a collection of very useful functions that reside in +DSS itself, ready for use by any your programs. These functions +are stored in library SYSTEM.DOS and allow management of files, +memory allocation, loading and execution of the programs. + +File specification + + The file specification is a string, containing a names of disk, +directories separated by a symbol "\" and name of file. The names +of disk drive and directories can be discard. + +for example: +C:\TEXT\DOC\text.doc +A:file.txt +\TEXT\info.txt + + The DSS used chars with colon suffix as names of disk devices +(A:, B:, C: etc.) The name of disk can be written down before +filename for specified disk there it placed. +For example: command +DIR C:DATFILE +searches for DATFILE in the current directory of disk C:. + When disk name not specified DSS used current disk. At start +DSS, the current disk is a disk whence was loaded DSS. + The filenames consist of two parts. The first part contain 8 +chars of file name. The second part is not necessary and contain +3 chars of file type (also known as extentsion). At the writing +of filename, both parts are separated by char point. +For example: the names "NAME" and "NAME." is specified same file. +In the name don't allows symbols with codes less 32 and chars +. " / \ [ ] : | < > + = ; , + As the subdirectories files too, their names are formed by +same way. The name of root directory always "\". And each +subdirectories contain two items with names "." and "..". The +name "." specified a current directory and name ".." specified +name of parent(uplevel) directory. + Some console commands and DSS functions allow to use global +symbols ? and * which can be used for filename templates. + The symbol ? means that any one char of filename. The +symbol * means that it char can be replaced by any symbols. +For example: +*.txt - means, all files with type "txt" +a??.* - means, files which contain three or less symbols and + first symbol is "a" +dc*.exe - means, files with type "exe" and began "dc" + +File attributes + + The each bit of byte attributes specified various attribute. +And it can be changed by DSS function. + +bit 0 - Read only +bit 1 - Hidden +bit 2 - System +bit 3 - Volume label +bit 4 - Directory +bit 5 - Archive +bit 6 - Reserved +bit 7 - Reserved + + Attribute "read only". When value is 1, file can be read, +but can't be written or deleted. + Attribute "hidden". When value is 1, DSS can't manipulate +with this file. + Attribute "system". Specified system file. + Attribute "volume label". In old version of MSDOS used for +specified volume laben, now it can be used for long filenames. +And must be 0 for compatibles. + Attribute "directory". When value is 1, means that this +file is directory. + Attribute "archive". This bite sets in 1 when DSS writing +in this file. It can be used in backup utilities for detect +changed files. + +File handle + When any file are opened, DSS build File Control Block in +DSS working areas. + The Handle (and assigned file) identified by number which +returned DSS to program after file opening and used it in all +further DSS calls. In other words, when file is opening, the +program informs DSS his name and has taken back file handle. +Which used in further file operations. + All necessary information for working with file are placed +in DSS working areas. + + +2. Identification of system functions + +00h (00) VERSION (Version of DSS) +input: +C - 00h +output: +D - version number +E - modification +The function return version number of DSS. + + +3. Disk devices functions + +01h (01) CHDISK (Change current disk) +input: +A - disk number (0-A,1-B...) +C - 01h +output: +A - error code, if CF=1 +A - number of disks, if CF=0 +The function changes current disk device. + +02h (02) CURDISK (Current disk number) +input: +C - 02h +output: +A - current disk number (0-A,1-B...) +The function returns number of current disk device. + +03h (03) DSKINFO (Disk information) +input: +A - disk number (0-A,1-B...0FFh-current) +C - 03h +output: +A - error code, if CF=1 +A - sectors per cluster, if CF=0 +HL - clusters per disk +DE - free clusters +BC - bytes per sector +The function returns information about disk device +(capacity and free space). +for example: + LD C,03h ;Function DSKINFO + LD A,0FFh ;Information about current disk + RST 10h ;Execution of function + LD A,D ;There is a free + OR E ;space? + JR Z,NO_SPACE ;No, the disk is completely filled + +09h (09) BOOTDSK (Number of boot disk) +input: +C - 09h +B = 0 +output: +A - number of boot disk (0-A,1-B...) +The function returns number of boot disk device whence was loaded DSS. + diff --git a/docs/Original/Estex DSS/Estex_r.txt b/docs/Original/Estex DSS/Estex_r.txt new file mode 100644 index 0000000..9d060b6 --- /dev/null +++ b/docs/Original/Estex DSS/Estex_r.txt @@ -0,0 +1,126 @@ +Estex: Дисковая подсистема (DSS) – Обзор + +1. Введение +2. Загрузка подсистемы +3. Системная консоль +4. Файловая система + +1. Введение + Estex - операционная система компьютера Sprinter, включающая +в себя различные модули. Данный документ описывает модуль дисковой +подсистемы. + В DSS используется та же самая файловая система, как и в +MS-DOS FAT16 и полностью с ней совместима. + +2. Загрузка подсистемы + После включения питания или сброса компьютера, BIOS считывает +первичный загрузчик с 1-го сектора загрузочного диска. + Если загрузка происходит с HDD или дискеты, то сначала загрузочный +сектор считывается в память и ему передается управление по загрузке +модуля дисковой подсистемы SYSTEM.DOS. + Затем выполняются следующие действия: +• инициализация дисковой подсистемы и вывод сообщения "Starting DOS..." +• загрузка системной консоли SYSTEM.EXE +• выполнение команд указанных в файле SYSTEM.BAT +Обычно файл SYSTEM.BAT содержит путь к программе файловой навигации +пользователя или другому часто используемому приложения. +Например "c:\fn\fn.exe". + + Если во время загрузки вы хотите пропустить выполнение SYSTEM.BAT. +То вам следует нажать клавишу "SHIFT", как только появиться +сообщение "Starting DOS..." и удерживать пока не появится приглашение +консоли ("C:\>"). + +3. Системная консоль + В DSS многие задачи могут быть выполнены через интерфейс командной +строки называемой системной консолью. Основная задача консоли ввод +команд и их исполнение. Также она имеет ряд функций, которые выполняют +такие действия как управление файлами, перемещение по файловой структуре +каталогов, редактирование командной строки и переменных среды. + Системная консоль позволяет пользователю взаимодействовать с +операционной системой. Для DOS системная консоль это SYSTEM.EXE. Если вы +видите на экране приглашение командной строки (A:\> или C:\>), то это +означает что SYSTEM.EXE загружен и активизирован. Когда вы вводите +командную строку, командный процессор интерпретирует команду и выполняет +необходимые действия. + На сегодняшний день в консоли доступны следующие команды: +CD Displays the name of or changes the current directory. +CHDIR Displays the name of or changes the current directory. +CLS Clears the screen. +DATE Displays or sets the date. +DEL Deletes one or more files. +DIR Displays a list of files and subdirectories in a directory. +ECHO Displays messages, or turns command echoing on or off. +ERASE Deletes one or more files. +EXIT Quits the SYSTEM.EXE program (command interpreter). +HELP Provides Help information for console commands. +MD Creates a directory. +MKDIR Creates a directory. +PAUSE Suspends processing of a batch file and displays a message. +RD Removes a directory. +REM Records comments (remarks) in batch files or SYSTEM.BAT. +REN Renames a file or files. +RENAME Renames a file or files. +RMDIR Removes a directory. +TIME Displays or sets the system time. +VER Displays the System version. + +4. Файловая система + Сейчас, в качестве файловой системы Estex использует FAT12 и FAT16. +С помощью файловой системы FAT (File Allocation Table) организуются +данные на винчестере и дискетах. + Для указания спецификации файла используется следующая форма: + +[drive:][directory\]filename[.ext] + + Файловая спецификация - это строка символов содержащая наименования +диска, директорий отделенных символом "\" и имя файла. Имена диска и +директории могут быть опущены, если требуемый файл расположен в текущей +директории. + +Например: + +C:\TEXT\DOC\text.doc +A:file.txt +\TEXT\info.txt + + В DSS в качестве имен дисковых устройств используются буквы с +последующим символом двоеточия (A:, B:, C: и.т.д.) Имя диска может быть +набрано перед именем файла для указания диска, на котором он расположен. + +Например: +команда +DIR C:TESTFILE +ищет TESTFILE в текущей директории диска C:. +Если имя диска не указанно используется текущий диск. После запуска DSS, +текущим диском является диск, с которого была загружена DSS. + + Имена файлов состоят из двух частей. Первая часть может содержать +8 букв, цифр или следующие специальные символы: +$ % ' – _ @ { } ~ ` ! # ( ). +Вторая часть не является обязательной и содержит любую комбинацию из трех +букв, цифр или специальных символов с предшествующей точкой (.). +Например имена "NAME" и "NAME." указывают на одинаковый файл. +В имени файла не допускаются символы с кодом меньше 32, а также символы +. " / \ [ ] : | < > + = ; , + Поскольку директории также являются файлами их имена образуются по +тем же правилам. + Имя корневой директории всегда "\". И каждая поддиректория содержит +два элемента с именами "." and "..". Имя "." указывает на текущую +директорию, а имя ".." указывает на родительную (на уровень выше) +директорию. + Некоторые команды и функции DSS позволяют использовать глобальные +символы * и ? которые могут использоваться для задания шаблона имени +файла. + Символ ? означает любой один символ в имени файла. + Символ * означает, что он может быть заменен на любое количество +любых символов. + +for example: +*.txt - означает, все файлы с типом "txt" +a??.* - означает, файлы содержащие три и менее символов и первый символ "a" +dc*.exe - означает, файлы с типом "exe" и начинающиеся на "dc" + + В именах файлов не делается различий между заглавными и прописными +символами. + diff --git a/docs/Original/Estex DSS/Programmer manual.docx b/docs/Original/Estex DSS/Programmer manual.docx new file mode 100644 index 0000000000000000000000000000000000000000..a30bfbb31d0360dae25b68788808d37c1bf4d560 GIT binary patch literal 109736 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

c0d8rA7m2h28WExl;4Jhm3ffTg!qE zA)HJ$uyCMJANuA6k#y>$^HoxkJh3O*bT8A~{?(ipG>>(hm&6`_m*xRy775Q;M_QkE zV%J*M=K)h9Fgs36H-{R%?gypN?!3;g@COK?7X#}+FbBXQzRW#$+gdLspJocytqtkSnaJwhzqpD3Qz0*jQinZKFNm_EISBp zu~Re*mSLXFWx;RPgmm$lnss1ELo}v;))<_+w9C-k&tOn9wTG9dujc_p+;V4z#&qtJ}sP}u_iQyg} z??DoGw=1a}g5>^mzN}Mma`{*YNdms>aw4~cH_m<4K?d2B7NAcR}5!(Y-=XHpUy^w5q^t<3S*=5%zzd2EcXi+>`fcA1Y zr_(7h!`=j?dmst>UUfx4MI(0$5pTQb!(Su=b>mS2bM9Buq`7y zyfhqX3seYESQvXC6bq#ZCBOGnI%aVY|lW;{G1$gRMbnsfo(x8%DX+7)$wnak@RWkK=V230kkw*5IJQ z1B|AW4mwBfXe)V~66$#qd}2i(CNP`}FcZskM2@tvYu1CXhVsl>3FlwNHcIQjF4=ZP#F)Nds&dPY%?cm+%-{fBlj5c*K}7 zq7W9TDgjpmQX?g!iU~=KAMO%5!Uj8R;LrdkwZdhpJZVt>$J2<_>mWTRSX`d(sn0Y@ zyVUUYO0R1@xFUE<5Szi0KS)VN-n~BofSAOHhE)@nB`@P$wNM#JKz@vc7j~E(i{kg%URTJ%VnD!L7A(_qX_1x0(`>MUfwm(#rtoI+(c}?{t z_crhAMenn?;AB$;mmiWyl$eY#qA|1?B)l0kJ;+Ip;`vG&kbpIqSd?~j@x7xX4mOI$ zLU;$~Qtb<;ICBj8KMqj5z2jO0c&ERkm~P5QLXsYjmwdfiSThP&kWQ* zfYx**bFuO8;>!i46fL~`@&hci+=d_u88vgUTMZk+bN(O0L~^ldy^ih}xoDp&(H?zR zk8#B6qNM4h{Sr)?JJV2{-QkhZj*NmLYcpqry*7OQZ@cfAILb*WaVCyk1nIEwJ#mr3 zQt}VIOk^6SGG6VmEhb(|R%@&`kkLrLk7PbCqmpYu^O2F#|0Q-(SX}TUsW#m;Eg9ev z4^Ji=E{`NlE!452-jkS$MRpP~aBl3;k~i5p4DQT)ieH}%9dTT>f7m!*uFd!EXEP-d z9Y_iODB!#M7OFDn^=JkW>jLES)t+5>Mw#-o(j2}IFkBbngsoLPvfic%~@tx{Nz)ju`Z`ZOd-Wh(n)$xtdT zX7xWU9%4X@XLvhW+Wle|Mn?8QzFrzqPfo@0ZR|1<(!OgCgeYhM{%!P*OctI$`I4w5=`5!B}*Ba^I0; zOv8IZe|qM)V^iI5?QdM8OF}}5(w{OWCo%X_tnFd*=Kom>AT=T5O0OM3F)iBaL~w}T zh=J$--UYhYikqeF60n9No-#$d`aQNYTDm-3v+eNuR?{MDowk7Q(shFIF82JCtnc-H z0P%~1c^$Y&h>F zjr+{KxbJB+8g#PnBXRMDLtF%!4Lq|a9=m3%!dQ{SKgG#J&8MQ2Z96)dS+pb#GG>{R z?0-xf+Mw2rut!njsrFn$Dd!Y1*+~zEqZ}5g>%WK_t6zDl5^9OnL$3=o$cs;!M&x1r z=MqIVsW0R^-tF5VX`*_}~^LI!6zRZp%S0FXr}IUhAdy z8*O%nT}NDi!t}j$h}iDsP4}14dTS272G@HPtx5F+s=?=-HgjqUSw*ab`Fc)XZ}-E= zBO?G4+Q50~#ueDpO}D?AhUl4^(+eV?}pW8p7@@&aRu?nY{h_*_}9VnHJ0b? z4y!3q=WVx9uN9_95Y6O!P9IE&xV(!*CBgv9G1K}41mCZYo&N2O7PG^y^7F_{4*hw* zd$yOe%h}#8J-?$vgE|v%6B^_|6D2aCVVe-Cqb*Lxr-NsBp08#sd(?x<-YkR*{wF>6 z>)opyYYrE??p@&S)*C27S^$g|a@>aZYYfhMj(_uYC>{s_tl91{=J{@PQutui?^Qr! zPP7-YWWk?W8GYy%lsFbda}!8rFj}C&0IE@BR2C|IQ-&*L{!Kjcsk=4P6+hRHvlC3e+*FJ{M_r?gmPX(sOzJkp9qWvJ2 zpu6eg`9u>%AF*U`&RKP4tZ8Nq(E~lN^-1!)AH|im8jkcHsq}TW+&SS`HAaC2S~0ck znZZS+DFm;6()+l@i$Q}l%(kmLc9&W1ZxoTCnwK#yO|Hc#&aD#{yb-}9m@@{;_z&>$ z7&&%z#PMdNxoz%WPx3>y)>j9@lO~xAZ2liD_@gMsgusE8;gFK#a|TDTyaZ+~wW&%t z^RjWH>WU5}Om`!DAQ<63iIA1#lqzz{X7ZNB;Mz z33lBjE*Nv!3jr{OJgpKy+2x<`*TIUp=XZTg|G^T~<54xX*U6Nr?>D*jRdl&PrU+%< zP@Vb^#7B{byG&krpU>sek$vLptk6=oj$~DA|KO~z-j`s0tyw-c(q9;3stL81AvZFI zMd`Fj58P`w^JA-L+plLXN5BG+U|5H-Hmh@A)|E5O`CaAHm{j2|1LNKo(MvqUqtucN zcyaEu>Bhxi%Vkn_+W)iy$wz`CUyV@@j-#D{+KBwt;Fbrkx=$`C7!_n!^%ZSPV;oCanEsjZYxaZQI?wcUYTC|z=(5s1~OSom*%b+e697Gi%Jti#a zM_Qrt-?Vaf=Hu<>m)PUnuAcL%Xkpn6L@)@y5Jn+ViuW?JilFiOC9Y2#j_R0^=~{J< z!#xuTE<*~qe5^v{&Tu5Ap`?F?m|^oh^8Ij%S@;NnLN9~lDL=O2E;Q!6^gPIuAt*U- z$cQ~toh}8r=pN0imB(4li_AC#{J=eAyeDxg;zZS}ZTX*Ryh{vKgjmv}al*JP2acs;5pH33xDm;Z0>1>j>6DnQ^E0 zc5CkJm}s!6rqgD|v@r%|#}u9{W)hZggwAKWEMnbYmK_f%QC>5&n0MpKW@nt2ljII{ zBR@6CV3%c{w}kp9z-2H{TvHF%BPEf#)X&i!+gStWtL@ZE|jw<*j(4 z@HoqN#`}lSx&_ldw52i8pw;$3Q6wOdLJAIU)Cf~#$vaD~Hg9+ciz)-C)0wpYWY~Ef zfwW~KGnJA!%1?_Q3%rN%pZ@U0g4hR+jfYJ;lnDc-mg6x#?xhk43Y?k5C3ZkrLT&e& z9Tg)JIm;A|ob1aw`Fx&=X_p7B|qcG#NHT@ya&J{EKNo zNb)P3QJ!M=VOXp3r%aM;cQpY32pj*+1#m$^!CEoJEI|x`DPcthF+UJoL1af^Z-X*q zwi9d%FpvqW5`@ zSCtstw;wQSkTFT7cs-*o+4&mfdEM0Ad*Rr@CeR2R_(GI@*XPL6^SHgNYIrz!eklobQP6d?BEo? z&-az;r7YURNy@_u4lV^m?FNQ*ga~~DrH!H!@+4hQrf>a`L^YiuUD)9m&Yysi{sseX zR&8yr33NCrX(tUdGC@W|K@Z>awF-Sy02EI`K|{YSOx|l8G7^Zt1;@63B`Q=IB5)Q; zs6c;vFgBL40do@SD3JuUU^+i!ObLc&LBhuR?k4E&#g<|_!ear)tJ8|WXWkWV>bc<9 zULos%A#6+^^QRL_@AT4M4H?VFB0`wEefO6VZtA5WVN3%F%#G&=7vW60ES+~fC{D~I_ zH9z*_y{Io-cw%kZ6Y+sZL)8~h@z1SnG>)M9Je@#9&j+F&$D}iejdW#IN7IJuU_DEM z>v6f(1%YFaQJ4dK*dsQUhHo;atjCYam%T4q3 znw4A-dg^HqeLx6Icb&5UAr2#*mdtu9g*yby#{)NyKA#DL9DPoigFe*ndU?@G&||I0 zD<;Z|tC!HWic^_DstV@p?wm4Oov~XwWRIc07wZJ{h5|{6*c1@YV9o!BZO4<6Az36^ zCvicRS9jI{4r36L^O@Z>`9VnQ&@yFpuFC?`@d_@>nY{4|xptz?(F61MjE;=(lorQp zqD@|nf;$bZtf{S`y|($==RA}J9W)m$Gz<|CbMOK45fie3y-(TkH~H77Ik){LvaZ)m zo(a}PIH9ne z30(c|!O8tL!OQ+gYt3aDp0%_lXMEqOqYqEGNMy-zZ=ylh-#c+CPXUy2U-!$d?;P#a zV)HlD8J4tjq$6T(isVj6&+25wPbDmL0|Vg5j(~Wx)q>qMcp6=y3czxhrL1_)5zjty zQnM^hM}cZ1v5!d5N{bvWPpVRLU5Ny~w(NYhNFOGqA*-qXap?yRLQ`lHHchY(7Q-j( z%s0e1ddQ9lYJ7bSUcDO-2f^VWP6l)9^-0fp>Qw%}0#|tTQSdWp*W)_C#oCFJRCyvXnwaMpeZ-@x7~A3>a&!3+@{0m7j^5_$llzQr7DxuG4JA zu0?P%SQ4pBStCWU4H0n=v;N?##O=5T&tVj4p1;O%QQHeCb2t6BTWY_Cw<1%42#pEP za|yUHs_ObcVW4c;%&#WC3!T|NVm^7bIYg-M01jaAWVd?2w@^L~n5AK(O@bkoysN>) z-k^t#`d@po+nyI&3T1c7*|P~uJME0e=q4|M790q6PeV(3F7qnDVnGKbx_q%3gEvT~#|mQj<0UO=@eNPv&EHmP^JFPy?L~9)jLask>`T0)l55vPl0>;Yy zvk+h@M9*x;@!QRpDQwFkRSC~N(Sy4`fpgFpkBlz?eb#Yls~AcL??UVTt)SOZ@$8^9WL zA%RJV5@785a0?%}O|nAMJ)SCi9~Mxa-J9sRk{zZUCqrpy$^TpwU;$|k9aM_HbOxj3 zt}iy6XM|niH08+s$^-Oy;NS8fo8n3rYKZZ~l8i8=Akmvgw~@jok5IV=L?;xVj3qOs z1X~u^+?{@y_1?mG-XsxqWENuJ*iNA)OsZ4ZSLD_hE{}B&HDBakf+E@kWr;+m+eM7795B5q!8W+)iHo(JHUo zT<*P<_!`J<1VWOI;m7%BnQoD;ToA{K!W<45I?n-JQuE^4U+bfmB!c0>vgh>dW(mKU zj{4QoO_@s!22*19(U{W*d0&}PW*4d#CE8#>#4>;aL4e=+8}IzMMirtH6$ zuwW>P13bg)>TDkM0l|R#U?a;86Img-%a>n+?4%+gn6?m9h>i!1>Pab(kcR%o;25Qn5YH3Uys)GKC3@g2I6|F$<{an5fm}kG%75^nyV^CSBeLpL9<9gCUt3|Dnj_NQwVyLK1v`W zTTc6w!;?`WtJAAKS(=QMuRY)TJ=A7~$H`ZbBj*YY@7JMyg%b_-dEfE zi6&OqQrG@3xxc==)%u=2;VkhyZwB+fts*7?PfAE9QjY;q{R=a|u>8?CJ5d{W$?Tb5 zLPw&dC*!0Ti6Jwn90~hJ6WZV@2CJZ`>}CY^=N!g3Ld(Jbx&~^jxM27HA9{AFb+mtz%*v0OP2Z5^38>Y%wggU zT}(usvnK~+$5(*a>vVl&-uv~Q$?>SNoJ4o)9I@fSV~9gVeVk4R*&mM5Iwl9hy*!Uq zwpCui^?D-GgYH=e?b-5oMpj48^V3+4FNxB@I8|W}-*Lh`s!VNWtpp}hl`df9wRWqd z`(}_xGnMRDwS{it8c`8reE>hsMtg=SHJlx0#gXjfzb*s@|{XrzCx@FAekra}Ngkz7RP7yG}qe*S_ z>ynrxD%gl__;y4Bui48jyx-z88x4hG_b)V7Adg`kZWUB;SK^ao@+^7K#0D8<+XN&b?dpl-sWtfn`jm zSZ+PcE{f`YluSf;2>|dwaNQ2N_i|P5iTb(95^jyGUh{;-5)X^huS2}cnS)X}7#fz} z|1wRZ*p=<8o*;{#$S?c3J7RGOJnw@+jggavv6A{oCFdj}`o0r!B$UA1+keT0Dx1ju zed};)7ZUxAW(UdBWxsxPY5jGWVqDw9>vHpgNs3j>B*{fgB}lds8-@?vV%PvYG1q8*`FQ2Cikwj@AiE$aHVHu>VZ}MA~tB>eiO9a#3tPj=J-HsC- z)*P;z59K}QtxxQtX=#M}<`T}acU?Y4Kh0lU4V3OFJL@8E-{mtr?JG|w|2+!($KG4N zkCVO`7!+I?u39M%LW~Wd*1oCAC63GP%d>aBM&sp}%uMVwB1>vjPL7Qk=h7WCrX-=u zQgPvxo9M0P%)*qlS=tnzqTFNoe%AFNzZ}PxRo$-5$+7{ zWd_Tm^{I8W-j|C@hF;INLk@`8oE+K{zsSiACrbaX3=q9Ab**)B{mo4}o>FM@?Y9*yxE(T+6+;3 zXgaJVN}();W4p5|)Y=a^2m$uL62PlFD@|R!=Z|FTEe?pK`=_&HV`a^pJ&kRMt=Cw- z?A8EfwdSgz&ur)@j%S)C-pgW@5c%qLL1;SAYPd_x@rw!61JuF{FvLcA>0VxOSr0PGn`pnAf38#c z0Lww0LzMIIa}Y(gCn_RGLy+!LoFKKqf5NVgZC$~A+fT>+#KiSCa!?DLd~WzOFkg!CI z6?W(2nT4;X+ubX}ae3be)RH$ZZ!i7);8g3>3VzIIX+3V7={I{RwlUk$;^OOaR3pRp zTe`#OMO^@FZ-_vc0T5OYmYfA;?aB)HJpw8P;*?_sFB7MScVNT2mbEdFOd|5pxn zeXJlYIV{8QFBZJSc#8rmX=YJq_JY!teM_k7fl5u6RWHY(i{+J-q~yg}qDemv3v@;RVK$!8xHir$6@{i!TB6 z2FLR8j{U(G8f;tEPr* z1~)2aF_Me!n`UfboQ?v(#^q0Y=TZK;KK_pIS5sylky)8EpCrWJq(PN|REFYG+*(k+ zkNbsD_fZ7&`1)DjFZnj#g#7$V4gDL+1U_RBA%Q3o9kDuGd8H#KGMoVd^amo#j*oH5 z-JXS7kVy5yEut;)?v2C`ZK&+*%*+*F^n z!jg^M?s=i!1Ob)@TqLC2(fWy5<)+=y2{3cvK`PpoCHv+Q+XcW0O5B+-RNeJq(C`@R47Q#sg{v4c_=!9J#=14ed` zF!ltT7PywUZrxBj&6u;oEq4Hc1@*>SIp{hQwk;2zU7f zs~7~T;Or6`FM7cn4cB?KPgR&T4eEgq%=cF<33opNN!B`Fn={oTf}ANO0?X0^f&o0NHq1zFdVr6b5OXk_C<_>ddG_Sn5G_lJ;$bIzB`7s9N|cR2j9IES%^5Mi;{K`=MhOa`q9LhpA5zxy03zeo z@eU*w)|ulrsB7J12J6BGMI%qrxKKm;sr7=YOJ zT>~etJa}Y1*GiJEYDbi5YbVU2rphmf3#5CYfg9D1)F4h-#Qk!?z=1r2OwMG|$-14L zNyL)D=!t22D^=o5l44W>U!DDz7a!++z5J0dNKB)guXW@+5$nr4frZ=@{|g%HVUC%( zzPHXcmWT;m17ectufa^JU2*vCS93U*oR*DYN@n_Rx680Iv00S;gI{R>?A2dK-}X+A z^)>3!lrL8TYn6^Kq{uQCr|37#WLffP`|SNBSwf-?0At#Jfx9a#YN#`|eMKA3dGr^V z)Lkc4@r*G%;an#>TxJnM)Z%=bQeQ%IfuBW}9As0KaNG1<3CZ>%Y z-H^R^G`f`w%BLG;idBAc`BW#4i`fxItb&wADodZH4>X-m9{4LXV3jHnsh7hfGM;iN zCuqMd7o{dUGKKJr8+cK(2t?Quft=D!`)jHXk*Qc|7p|IL z?ybEYJU=Fk^(w5{LodNDguFVRJP%URE^kpcnHgeUO1eHz4HtiaI0b;8HW_ciqWCsy zmoWOh3Ve1)4O*?n2Ikx~U<%QKI1T)P5efs<-B2|IW2jrQjvC%*bO@XKt7;Uxy;!AY zwV~icKfb^J%zB$P`)pP=F?R$un{(shLXJ2)imaSIZ<9+txDi1PhyYxH2v))(|5R8>qclP9R5Fe!T&evZGW7Jfb?f5<{tik<6k+O zy0}={ng0*ztw~+m8Jh#u?^@;?WY8Jv!ig#0kvTT-PqeOgP|}lXCl^eG>uN%iLE@?Z zbwZO-zZ|a{mnYDvP7euQ_Ii(}JA;Qc$QmP={Q6j>UMCo{dh*z!<@^0*7mHnMG+82Y z4QW=3yTRJ^*4Nua=H=gjW=bB2xY>*I z4)A%RX~u~I84q$2l1O$74IKrWfOwq_O(FET4il7k`FFwa5mijgj-p-WLr!3~YQ_~? zjx#~2f>lZ|)5~}ef6p8{77y^+x?gCEHHJ5(ioBPftH<5$1Yk}aP>6e_AI4O})KTUc zK6oOZW57q zT@(!R?#SW3W~(u9Yw`oP^OtVfMffymNES;D->P7y(7{%v@)x}iJv;jQK|SYO>F6*( zU!gLyAKEbp|OmiFmfw1vWyUAK~V-i?y)+; zg*+N{YnT%;=#E0I70xF_Yi%Xf)>19_7xshhENaH97(*B2vk+rQHq)O)-te3)<*vA|!8h=g=F*$0=1=*)+J`nvLq4T*3KD8P6@PMg z$2Lpans;uTv#;2+hcv|o7IS!1lGtADgU8qREyOvv6V`~9N@$$Mr-A*1>dqzpC1jU% zppQu$t4V2E+~81%;BGN@=uH6yjvwER(t+SAI47P7!8x)3>0E@#m8*^P=5BgHmgE3r z)7%2%c~1N?T8PoAp2l&)3R~>ttEQ>yJq@D@e$*)4pqv7C_4se%U+OJvA|#~VX6qV_ zXn&|#@#_8jG*yTLc9^x_cKpC--!r&>RPm;xLwSRV{;teioQG;y_^zt|2dF$Aps3L& zruxE7eE>JSnlZ~Sk?C8=d3v0tq zk09Ro<~EYmcss_5wfJORX|#7Fo>pLZDAY<8H2e!G-K@yx}1Id}cbU%qAr$$3kc#n*>+c(NK_$6+^x zRHBRqRj0M1no%-(0PPi}ALNT{iE8N)TltPCdYZL1n{J~qolD$Q+1P*JH zVG$h8&uTug*p}h9{QAsoLxYjxLX1e~W-zbW8-fIQttFwOu7ZGB0aZKnxhZHvmm3@P znHl3547g)l zIVkjTNE?4OmIJR68fM}k%pFl=rWsSyxD(i_-&-B5r|X!6Bj6^e@jQFI^_cslk6}0> z;m-1pU72x9$If}VF*P9@f-J|d`x%o+2YLG#|MeE%_qTE2JaQkK?|UAba7l1qdw&{I zoW_|^%scX9$(w&Kc;fe}ZGZi+q5j`h>MAZ~ru7e6#vbo~qi5Q=+8UWU{Zy*|!PXZ3 ztlRCg|IjmG9`Il{DH>u^V`S0Si|Cb5qkzYZYAqvLLT?BalJTA!80N)Kj33dsisaM| zs2j3S-ROnVSw2`levA9QeF%+N1dC!jyBTXN8ykmcju!r@wu`oxzpw1WEJm(}M4G;d zsUIxAeSI1s;IlQSErg-%a|DG=oo?=F)K+AvzAfxlHFIhNoF{79W5VAo8bI= zlo~bKG_s_@PZso>Q#R1~_X>EiSRjo4+bnTl%RdbuT^1b@qFd>yy4Wy}qXpPCLT>=1 zmxZ=%vNP*AhpGx)JU1k$Vza~+<6PkM>!5^NCM%Yh(^`=MW;t7yg?GR`C<`Nfd!EFA zd_6N2@{Fbv*beBJ2U3#8Rlu(&8W{p9{CQpkmdNyl%Rt&?GSHz5Pl47vRna^-7gj?f zC49p@5wcL@IRxOCQgXip(iBr|CKbp)D2WNpj@Trt{uOey8K_%*n18-oGuSH>Jwmur zcmK8sYviJCF!~#dN`^{j@z46}Was8J;;fT*tQ0md(+wJdT~q@XivAqt6;Nv1bZFU7 zmhUwU^R7@gRfy)2vcD@GB@U2Q>hoAQT#9cwC(r@8!R-8gX^UQe^$7VAm;f(5KGGUS zUdXayQ^{&OhE{Sq^Vs7ORGZ=5cV+YrU`?ET`>GB-@ zxs>xlPAy%Wps64$U#>?{>et#Th(JnbU>Gv8ItQhsoCFw!v)9Tbz1SB!B$ zyd&+5pHu_w4XO9UE2VJHP;x;yIcA~2c4NR2nNEpHfwI@kW#Q!!ApFzz0^~x$iYw+* z-v=M37609%2%K$nQbbLySe|BwRN`3n4>bNWF2q8-zkLIqRH_>!O~AGewY1otSp;PX ze00Ad#6FHFtk@$1q0FV-j)5C_+*F}s5@Mj)>>qSl%ldhLysi3KYp5xG)8HWQhrxxf zP(Ue7-~l$uB+Xg1(o@-Kz7)%(3`{9!7fN9LSM81G`elEhGcT&(k2AS4nK$-u-2l(k zNf65B0}N${K2iys^W+X2k{+=_tAKS$`Frt1w@OdC`FRMB{0!-j<@1e%v!N4^B>mER zg}ao;f<$`+$uE<)`wge->yE@)>#?Ef+lb8+Gt*E1dDwyv#o_edC019c-nCbc1{RUl z+4S`O5SDbymvd^Fzr(#pSdfgF-XdGQp?fP-nS0$nAgeE*F-QHogV$OX+YK!55u1C1 zTi*;)t}Hjpl%+Vb`Gm}mZCv1klU9JMweEPZG zf7~2b8*t4(fpW59rjw?96*3t#j(2oio;Lr-EoI*5ns4+*JoIEYb2d0ZJN{sfrTXiZ zX9B*&kM9jfy++JUCdQKKvG{^*zP?1x;Qwgvs-vQ8-Zm*AEu8{OH%lnB(j7~Pq;$j5 zCDI@$-QCjNDInb-B}jLdf|T&>YkVs2@AuF5_xGH0@7eRrUf0ZX_MUlW?zzugNH*{6 z$&BKTDGUn3aaeMBYvEq(wQ+kYr5xzzZu0B0_m$a8_H2_KG*KWp=cSzq0ogtm?d`Wh zqc8s+n#!VHl<8o>z&wbBW??{o@%?lM2S+!nAE)}R=?vM=bz{HFV?6YpRk4rg`?j3k zU;QR4Cju`jSDcY=1g=Uu;o0E5w$}ysqXjyVTs^H+vW)SvQG#dHV7k9nNXFi+lRXq$TJ9{z0mM-*h z-_2ZN#aoOy_o_uJ=}hQmD-U#Ww4t9gFTr*C=t+uD%EeWSdE5|%jaAM~%&^oYZ1Q*l zMM}Am1m_KR!)!w2nmdQrQq@d~(ek5^_j}HUoAjmG6%!Q4V=&$E*Ij`)-86Du2;L@{>E$up{ijJI|AyZ8Egj3MZ(1*`tB7^Y2~DDdb#r9k2*#76D70i5(-8YzvWC2|3& zPqFE+G3;_EHzcq*ZZ&&y>V0ftz3Zx8FZdyrns&fRU1P5ZLN-7G?_O(&bYmal)yagD z#L@9H+^k;*fljDj(tHYdJ^4x+AY_{mUcY;9&`XZa2-~>eJSl~4r|6RQR>0UU&Yc%i zdgs+L%^_#&7W3LPh%acoyeC{K$^^+=>WiPEYVso?Jh~~FOY>ZA5UO8!9VM%~d~^bZ zr}U$6zh;JS@-ys=ni%4(jMmt}Wv^?Ej+bT}TD&yJ6P{bNN=6|OASsuF+zA8J0a^fo zm|zGFWw@)fZLivs=f?MOf}?q3Y))E}x;Kgzjo3CjF^%(j0oelOr**vIm|04lW9`E> z$Llj9qtf_9Dg==*7mGN~@DbgsWZ|9!ZdeSLfDV6YAhWv3fF8G>E)?sTN$gP@bg{WST+5Y1kDk_ivaRi} z>&ZpyI}W783a%npK3P$|o<@B3eC#P5=&jfwNSA_z~Q@q{5!IP%X6Do zO+qQ3mP^AIoa=Y}xXF1HHJc3&OziF*5BWamu1qkVc#vpd`W3*@6BS!bBEZo)hQLpr zB1WDxAvfF5BNVwft-{LJqt2JIy-8vIq&Se&#iJOXcM#@Tfpr)3a_Vqe9$hI!<4 zI;_#q=(>O&uQTLJd4{3k!A#8&tQJpwo;95#0BElD8Mwq#YPj6j;%ggcmriXE7A%Ip zFZAFdJ7Zk@T=NWv8^qSt_+r!o#y*1zW;-K(B`kxoo+>lUW|M1qa)?`ERZ#=Cf`ph0 znYzg?l7_i1g3iZgms;8ry z`-)CwL;jGz!5oZ`fkwBvCek& z%JJ$C{7Tvyi1+lxK5%g@U{rTIaL>VwoVqqmTcC!EGbb`rxu7z`q?(t*IOdArvzXZJ z*mvTLEPKd0e?B5gw^EEK$jXIGwi^!{|C*n8dHx^%wc{NLH)BM%P z2b&V&-hAd8JloLh%hD?gDrwbA9j=?iq_gN!Fvnsw5tnp;FGI%sbYJ#ODKY`5+YC$B z1P8CLBrfVG>C-MvyoSBFecoF@^M;MA^mZOzAFY?GT-2_n=tuL)^vZ4^;i5t`UhMmt zcx%oa<;r0Mm!#tS6~+ah!#5=G5vk5XhH;Qh0TZ_nfeEz%2#=Ya+$ zJqYq{EhoWti-t2JnA_6n$HOCF7BCH?nWEq zJ4m3^M0yAmE0Qw8l?(s?Wp+Or1)7oN3}S7WA(|p+SNopSn<1`SXW@xe1V1IKgaL}} zI<}$tI78>f&J!4kzC>{A`A_Eh!IY@8U`m7^rVkhBph_POHOOi{R#*35g};8p;_xE7 zJ~mqfw>nz{`G@s;RQP3!xTQdiL^6P$Ckz!l8iq=F*ObCgJ4;CMvNFiaCS`4HknBVVEtqAX9YIkq_q6QRdvBo z%+0!1r?-5ka<>Il7~EEvYG3+8Xe=+EJ_{#oITJh%i86Tb!M&H)mw0eM(wUr9LyMs{hnvkUoWGpgTZ|%t$lGNoZ#(dy-A&EC=xti< zz@{v$Nc3Y1WPTHW+A4o-yk$Z@39S!<$ksDJ>gu;+A>J$F$bNKFXaOc4(TpXz9f8b~ zXJHl+ZOZ7_#rgNx&s0U}Eek1Q$R^p@4GIF0pB3)=RS~tnwtz8I^QFsN}5Lv4-*eHad2>swe_eA#8}?BvyZt1v0d%{HQVL zy`RYPEaJ9bFnQGhwHVY%`ao_wZJb<`6j2y{GEzU>InY*<&V+cOrH+>& zaGXFLDc?{LxfPIi7Oi|m)HhtHRdZ4`yCuCh2k->RP=FW!F~O|iDJ7(^$)ej@qM`k4 zr&^*!wOg}?I)T6>chfK3FS<>{q8`>Q6$-B8m1~^IFZva29oS=*R*HY}ldUyxGL$wh z1$z}735|ZWzom04;8@1>Qg#l`C+}Qg31_l?&-A+XorRXWxt)mK{*9KqxblULQnXheUc~K-1UUD5jP#b*F)YNO z%AvS)pGXS46XpvB=IvKYdB_A1zjXFn^_P}aFH%{6qSU~hJ~UaAK+r?rhujp7&pb6C zPK)O{{mNHeDvTiiv$yljG_AHB0iboG^PSX)Tn17FhCuaVUdGwEU^$}zc`|Q~s*~Yf z?rYYn)ay=}QtISNyBL)Y5NQuAQazYKY@vM#uP^ibSd>^i4**IY8p@M!q}n@?7)&{F z5@PD9A0~#+%Q~c4IY_FR7LmGJH8wU)3h=7yP;aQh$PyySiEG9 zZNBF1ia(&zS`F8PWC7joDBzbY-RVbD0lnTk}M_fF4{`#m9VrN@Cq)`6) zr+|3=`qvwh>lmeKdDGFclpjZ(W-8GT+(ulpEdUtd8EZ%*fVT_6Xo^;x*Qk(^29FH_Bv&^MCrf&G!iHqDE?PvcJi^1)f(WvVg&p!n z`EK7Ni1TbURp!JWEtluLns2WUK3y%&x7r-=%zn}D&pOkv zsm$yL0By`giHHVBG_E0bf%UM7MW(~9%!H?Ps)QegBj0eWGc}BQ5SJ1nkJZ*kk=N!jf(O8=DF)D?Y<= z6@dsNKEryQ=CuyTZZk{u&|b&xDKm(?Vx8nSZozpX{5Q(EKxd>b%oP&c+T6T3PM0YL zCkF^b{`u9nmLcxceN5*!JHxL1wt4lz<^smmEvL1)L37ILEVl<`9wO&SBk;G)S4pOH zWon}l7(QtfIgpa$0B2w)r51ovUaXhEPwCj;t(q8mi!|K3T@8IWzdq~Zhnmp~gT%^= z(p7-w;pt|N;{=_@^f!y+c}3JfBpJ_wEJ~A##(|{6@rqfDSS1e`&?Vb{j6@uV6p#Bt zPqLPQ21;>%MIu~`4OITvdP zHM_Cok(JO3kAxU$lwC|@pR_O73{!Lx3L4}hk+uiM7!v2K_i0{x zq__f*ElR3UB^Sb1vH3X;$PugLq+P`ufO?{-BV=YcW0%@^H^s4E&1f2{ZRy)z%!ZG( zreXK%CM+!7+@%L!G{1yXNgv$+Zn31^Q%*VjgJ_u zAKfzL!k%;GxG}x;I$$cZ7sqNix~NImc3#P#ydg&owg1GGIWO^w;K;1>GVNei?aVQ- zFjK}fGP2L!a4fhcw{S~U!m&K7v3E!2Fpqc#3**#%az!O#oAIHE#3CEMFwrUceMdG7 zSq7E=9wkM|^5R!`^?$ zLfJT~>Kj-Y{}b3=gDNomQW5bz2*w{^GC&%>_vM3Vbe3sS7BiJLLe#>|J5d?uwO))t zd@0Nty*I>BiXEGojt)>!>}L<&7T}JvH-vR~BQrZN#*H6s4vbIIqg4x2Ny?#eqPvK_ zs;hzuL-9n5pk~7-uzm4gHGf8|BA+F-8fBYPW-N~2h_7sCw4}^J9X7FB*!Vt5y>}GR zcw#S$D-22B4;-XhwG2k6>Sg(Oojy!WOLU^RdHwR(uAI#d;^i%zTAk@UF8jTCIx z2GBt2WO%AP@Ls#aASr|tHJ7f!((dfu))njr3_b6@sc;SpLhL~+2eX47BGN}(5W5@Z zMEob4v}`T(+Y6RPn^b->IRl0U?bksXZ=Mk#MxWOV0X*;TQ+V@xt_eQBFrND4x7VkD z2_Htc7$?G5trvl(Y77&AR}a`{y9S-DB^m9mJhdCAPq2nDncADv17ZikZ@KjlL^Zeu z_)h?QO1a^p?I^+kwRnOdNVW$(9qg6xcEK^UabQfjU0a_=#!WA|=m?{@9p!fxUK48{ z@J~yDn<5%z$7vjkzfj$K_8DbY3QqCus?;peIDeR44-uJU)D&U8sjAl2N7u}httI{$ z1Q0-SB?n*YwO>6FALn`QXupD`or`;!_~X*>NXg#EFFoAdf%ce@%lTf@9Go}3K}~WN z!|M_U>oVZ1;%FdGpq}1d@iUUdcyv~WEQM|Qt++K)?ZGD2$_3NwK4= z>_Nr#luv*QLHM!F&md@YEUW1^Q4gdHzU$gj@I zoF}>}2Fh9uoF$!w@h;9#jxhkY_p-9r_BeUkn;eS}UZPe`*CUDMl1xd??- z;;}?VJ-+e~-TD3=;6+&EXE~H9GsFkYaIeC*#_70u@uu-}pOTd8`ie&8Xm<@EJa>aI zijcPY#x;N)^AnmUYK?_t_~`uuJEJUZkM4Y_Oj8ng=#a%iJU7Hn52x=pgX1 z7cs$#vaf4H78~)iZYP*Gxl7hwQ>|(52H%UE$%+rG5gN6mj^=`}=ohSN5<6HOJdbu< zoqf#{<5!uz;$mM_QI%ozsHHvs!g4SPg85_(e=9!+%Trg~I{)RLF#f*-{Vn0XpZ%e} zJ`EkNvHtXReOudq2I~KJ_3xezlcGET)se(%ras05he=JCGgu32QLFktI*KA*vYJWm zd|$!x>EY#9D`I5fxn6UZDgLxXLRKNo=oZ7E*%>FHR9v^fr+ja%TZYs7cURTYx&XyE z-5T1P{2>>JAOY{5C4s;k4iho`RX&LF$!3W7j2_d9e|H>h?EMm{iNK_W!VfrQDIS(% zv^-3&5j(>DpJwu%!Rs#o(^~UxqZsMv&)@}v*>oT6J1WBbeDQa#5nn!){u>?3;^8b<|gyH*%j z$|_PmD_2i-LTl@m^iHt?ze7xQPED}8UpE^SG!A@!6@_pQjI>OGQ}c0v)cvE3zOCrv zBbkJtHcyz3^;7qoRwV&vMSCBguST=YtHt+C4?}F%PQ~*~b^`!-MbQRsJkEki?Qu$~ zMutipFt(ztbO{IdW^1?$4}o4tI$cV>A2Su|yAPo9s1JVpO@Dl9i9&1~p^~W2Ro!fj9d!P2W+mCb3CJUf>kgq11*r2w zrz(G3Q_!LRhqCH-HPySoa#5PAIVM;bToC4WF~Hx*GidVE_sz0D6xNesiXA+{rdp=yV^v*(GJ2t(f?8^y329*5c}U8VY2_`_0#gsZ*%1OD@Ms3eOB?co2cYH(oupu-YoK6Lzn`5%MH;K%>~ literal 0 HcmV?d00001 diff --git a/docs/Original/Estex DSS/Programmer manual.md b/docs/Original/Estex DSS/Programmer manual.md new file mode 100644 index 0000000..6ee2eb3 --- /dev/null +++ b/docs/Original/Estex DSS/Programmer manual.md @@ -0,0 +1,2312 @@ +# Программирование дисковой подсистемы Estex v1.54 + +( c таблицей функций Estex DSS v1.55 ) + +(C) 2002 Петерс Плюс + +## Программирование приложений Estex DSS DOS) v1.54 + +Взаимодействие с ДОС осуществляется при помощи инструкции RST 10h. В +зависимости от конкретной функции, в качестве входных и выходных +параметров используются различные регистры, при этом номер функции задается в +регистре C. Функции организуют управление файлами, выделение памяти, +выполнение программ и взаимодействие с различными устройствами. + +*Файловая спецификация:* + +Файловая спецификация - это строка символов, содержащая имя дискового +устройства, имена каталогов разделённые символом "\\" и имя файла. +Имена дискового устройства и каталогов могут быть пропущены. Например: + +C:\\TEXT\\DOC\\text.doc +A:file.txt +\\TEXT\\info.txt + +ДОС использует для дисковых устройств имена A:, B:, C: и т.д. Имя +устройства может быть записано перед именем файла, чтобы указать его +местонахождение. Например, команда DIR C:DATFILE ищет DATFILE на +устройстве C: в текущем каталоге. Когда имя устройства явно не указано, +ДОС использует текущее устройство. После запуска системы текущим +становится устройство, с которого загружена ДОС. + +Имена файлов состоят из двух частей. Первая содержит 1 до 8 символов. +В зависимости от контекста под именем файла иногда подразумевается +именно эта первая часть. Вторая часть, которая не обязательна и служит +для пояснения типа информации находящейся в файле, содержит до 3 символов +и называется расширением. При написании имени файла обе части разделяются +символом точка. Так, например, имена 'NAME' и 'NAME.' одинаковы. В имени +файла не допускаются символы с кодом меньше 32, а также символы: + +. " / \\ \[ \] : \| \< \> + = ; , + +Поскольку подкаталоги тоже файлы, их имена образуются тем же способом. +Имя основного (или корневого) каталога всегда "\\". Кроме этого, при создании +каталога в нём записываются два специальных элемента, с именами "." и "..". +Имя "." обозначает текущий каталог. Имя ".." обозначает каталог верхнего уровня. +Некоторые команды и функции ДОС в именах файлов позволяют использовать +глобальные символы это символы ? и \*, которые можно вставлять в имя и в +расширение файла. Символ ? означает, что вместо него может быть любой +другой символ. Символ \* означает, что вместо него может быть любое количество +символов. + +*Например:* + +\*.txt - означает все файлы с расширением txt +a??.\* - означает файлы с именем в три символа и первым символом "a" +dc\*.exe - означает программные файлы с именем любой длины и начинающимся с "dc" + + +**Атрибуты файла:** + +Каждый бит байта атрибутов задаёт определённый атрибут файла. Атрибуты +файлов можно изменять специальной функцией ДОС. + +*бит 0 - Только для чтения* +*бит 1 - Скрытый* +*бит 2 - Системный* +*бит 3 - Метка тома* +*бит 4 - Каталог* +*бит 5 - Архивный* +*бит 6 - Не используется* +*бит 7 - Не используется* + +Атрибут "только для чтения". При значении 1 из файла можно читать, но в +него нельзя писать и его нельзя стереть. + +Атрибут "скрытый". При значении 1 файл невиден для обычных операций ДОС. + +Атрибут "системный". Указывает, что файл является системным. + +Атрибут "метка тома". В старых версиях MSDOS использовался для задания +метки диска. + +Атрибут "каталог". При значении 1 идентифицирует файл как каталог, +подчинённый данному каталогу или элементы "." и "..". + +Атрибут "архивный". Этот бит устанавливается при операциях записи в +файл. Его могут использовать утилиты создающие архивные копии для сохранения +изменённых файлов. + +*Файловый манипулятор:* + +При открытии файла, ДОС автоматически создаёт блок управления файлом. +Блок создаётся в рабочих областях ДОС и его адрес неизвестен пользовательской +программе. Блок (и соответствующий файл) идентифицируется номером, который +ДОС возвращает приложению после открытия файла - этот номер называется файловым +манипулятором. Во всех дальнейших обращениях к функциям ДОС +используется файловый манипулятор. Другими словами, при открытии файла +пользовательская программа сообщает ДОС его имя и получает обратно +номер, который служит логическим именем файла при всех дальнейших операциях с +файлом. Необходимая для работы с файлом информация сохраняется в рабочих +областях ДОС. + +### Функции для идентификации системы: + +**00h (00) VERSION (Версия DOS)** + + входные данные: + C - 00h + выходные данные: + D - номер версии + E - модификация + +Функция возвращает номер версии дисковой системы. + + +### Функции для работы с диском: + +**01h (01) CHDISK (Смена текущего диска)** + + входные данные: + A - номер диска (0-A,1-B\...) + C - 01h + выходные данные: + A - код ошибки, если CF=1 + - максимальный номер диска, если CF=0 + +Функция меняет текущее дисковое устройство. + + +**02h (02) CURDISK (Номер текущего диска)** + + входные данные: + C - 02h + выходные данные: + A - код ошибки, если CF=1 + A - текущий номер диска (0-A,1-B...), если CF=0 + +Функция возвращает номер текущего дискового устройства. + + +**03h (03) DSKINFO (Информация о диске)** + + входные данные: + A - номер диска (0-A,1-B\...0FFh-текущий) + C - 03h + выходные данные: + A - код ошибки, если CF=1 + A - размер кластера в секторах, если CF=0 + HL - общее кол-во кластеров + DE - свободных кластеров + BC - размер сектора в байтах + +Функция возвращает информацию об общем и свободном пространстве +дискового устройства. + +*Пример:* +```asm + LD C,03h ;Функция получения информации о диске + LD A,0FFh ;Текущий диск + RST 10h ;Выполнение функции + LD A,D ;Есть свободное + OR E ;пространство? + JR Z,NO_SPACE ;Диск полностью заполнен +``` + +**09h (09) BOOTDSK (Номер системного диска)** + + входные данные: + B = 0 + C - 09h + выходные данные: + A - код ошибки, если CF=1 + A - номер системного диска (0-A,1-B...), если CF=0 + +Функция возвращает номер дискового устройства c которого загружена +система. + +### Функции для работы с файлами: + +#### *Создание файла:* + +Файл можно открыть системной функцией 11h (OPEN), только если он +существует. Есть специальные функции для создания файлов. Если файл +был создан и сразу же закрыт, он будет пустым, но его можно открыть +функцией OPEN для записи информации. Для удобства функции, которые +создают файл, затем открывают его. + +**0Ah (10) CREATE (Создание файла)** + + входные данные: + HL - указатель на файловую спецификацию + A - атрибут файла + C - 0Ah + выходные данные: + A - код ошибки, если CF=1 + A - файловый манипулятор, если CF=0 + +Функция ищет в каталоге файл с именем, совпадающим с именем в +файловой спецификации. Если такой файл существует, делает его +длину равной 0 и открывает файл для чтения/записи. Если файл +не обнаружен, создается новый файл с таким именем и длиной 0 +и открывает файл для чтения/записи. + +*Пример:* +```asm + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,0Ah ;Функция создание файла + LD A,00h ;Атрибут обычного файла + RST 10h ;Выполнение функции + RET C ;Возврат по ошибке + LD (FILE1),A ;Сохранение файлового манипулятора + +NAME DB "newfile.ext",0 +FILE1 DB 00h ;Переменная для сохранения файлового манипулятора +``` + +**0Bh (11) CREATE NEW FILE (Создание нового файла)** + + входные данные: + HL - указатель на файловую спецификацию + A - атрибут файла + C - 0Bh + выходные данные: + A - код ошибки, если CF=1 + A - файловый манипулятор, если CF=0 + +Функция аналогична функции 0Ah и необходима, когда нужно создать файл +с определённым именем и проверить, что файла с таким именем не существует. + +**0Eh (14) DELETE (Удаление файла)** + + входные данные: + HL - указатель на имя файла + A - атрибут файла + C - 0Eh + выходные данные: + A - код ошибки, если CF=1 + +Функция ищет файл в текущем каталоге и удаляет его. Глобальные символы +\* и ? в имени файла не допускаются. Файлы с атрибутом только для чтения нельзя +стереть данной функцией - сначала нужно изменить этот атрибут. + +*Пример:* +```asm + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,0Eh ;Функция удаления файла + RST 10h ;Выполнение функции + NAME DB "newfile.ext",0 +``` + +**10h (16) RENAME (Переименование файла)** + + входные данные: + HL - указатель на старое имя файла + DE - указатель на новое имя файла + C - 10h + выходные данные: + A - код ошибки, если CF=1 + +Функция ищет файл в текущем каталоге и заменяет его имя на новое. +Глобальные символы \* и ? в именах файлов не допускаются. + +*Пример:* +```asm + LD HL,OLDNAME ;HL указывает на ASCIIZ строку со старым именем файла + LD DE,NEWNAME ;DE указывает на ASCIIZ строку с новым именем файла + LD C,10h ;Функция переименования файла + RST 10h ;Выполнение функции + +OLDNAME DB "oldfile.doc",0 +NEWNAME DB "newfile.txt",0 +``` + +#### *Открытие/закрытие файла:* + +Открыть файл - это означает выделить для него область памяти (блок +управления), обнаружить файл и перенести определённую информацию из +каталога в блок управления файлом. Приложение указывает в качестве +параметра функции 11h (OPEN) имя и атрибуты файла. ДОС создаёт и +заполняет блок управления файлом в своих рабочих областях. После +выполнения функции пользователь получает номер (файловый манипулятор), +которым файл идентифицируется во всех последующих операциях, вплоть +до его закрытия. + +При работе с файлом, ДОС изменяет некоторые из полей блока управления +файлом: размер файла, текущая позиция файла и др. Пользовательская +программа также способна изменять поля блока управления с помощью +функций ДОС. Закрытие файла означает прекращение обмена информации с +файлом. При этом файловый манипулятор и блок управления закрываемого +файла освобождаются, а информация в каталоге заменяется информацией +из блока управления, по этому всегда следует закрывать файлы. + +**11h (17) OPEN (Открытие файла)** + + входные данные: + HL - указатель на файловую спецификацию + A - режим доступа + A=0 чтение/запись + A=1 чтение + A=2 запись + C - 11h + выходные данные: + A - код ошибки, если CF=1 + A - файловый манипулятор, если CF=0 + +Функция ищет файл с именем, совпадающим с именем в файловой +спецификации. Если такой файл существует, открывает его. +Указатель текущей позиции в файле устанавливается на начало +файла. При открытии файла в режиме доступа 1 - только чтение +ДОС будет блокировать попытки записи в файл, при открытии в +режиме доступа 2 - только запись ДОС будет блокировать +попытки чтения из файла. + +**12h (18) CLOSE (Закрытие файла)** + + входные данные: + A - файловый манипулятор + C - 12h + выходные данные: + A - код ошибки, если CF=1 + +Функция закрывает файл, освобождает файловый манипулятор и блок +управления файлом. Переносит информацию из блока управления файлом в +каталог. + +#### *Чтение и запись в файл:* + +Все операции чтения и записи в файл осуществляются в зависимости от +значения в поле блока управления файлом, которое называется указателем +текущие позиции в файле. Значение указателя рассматривается как +смещение в байтах от начала файла. Указатель можно изменять с помощью +функции ДОС 15h (MOVE_FP), чтобы он указывал произвольную позицию в файле. +Кроме этой функции, значение указателя изменяют функции чтения и записи +в файл. При выполнении функции чтения или записи в файл задается +количество байт, которое нужно прочесть или записать и адрес в памяти, +где располагаются эти байты. Байты считываются или записываются в файл +в зависимости от значения указателя текущей позиции в файле. После +каждого чтения или записи указатель увеличивается на количество +перенесённых байт. При открытии файла, указатель текущей позиции +устанавливается на начало файла (обнуляется). + +**13h (19) READ (Чтение из файла)** + + входные данные: + A - файловый манипулятор + HL - адрес в памяти + DE - количество читаемых байт + C - 13h + выходные данные: + DE - реальное количество прочитанных байт + если CF=0: + A = 0 прочитаны все байты + A = 0FFh прочитано меньшее число байт + A - код ошибки, если CF=1 + +Функция читает указанное количество байт с текущей позиции в файле. +После чтения значение указателя текущей позиции увеличивается на +количество прочитанных байт. Количество прочитанных байт не всегда +равно заявленному. Например, при достижении конца файла. + +*Пример:* +```asm +; Открытие файла newfile.doc для чтения + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,11h ;Функция открытия файла + LD A,1 ;Режим доступа: чтение + RST 10h ;Выполнение функции + JR C,OPEN_ERROR ;Ошибка открытия файла + LD (HANDLE),A ;Сохранение файлового манипулятора + +; Перемещение Указателя текущий позиции в конец файла + LD C,15h ;Функция перемещение указателя + LD B,2 ;Перемещение от конца файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + ;В HL:IX размер файла + LD (L_FILELEN),IX ;Запоминаем младшие 16 бит длины + LD (H_FILELEN),HL ;Запоминаем старшие 16 бит длины + +; Перемещение Указателя текущей позиции в начало файла + LD C,15h ;Функция перемещение указателя + LD B,0 ;Перемещение от начала файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + LD DE,(H_FILELEN) ;Берём старшие 16 бит длины файла + LD A,D ;Проверяем что длина файла + CP E ;меньше 64 килобайт + JP NZ,BIG_FILE ;ошибка файл очень большой + +; Чтение из файла + LD C,13h ;Функция чтение из файла + LD A,(HANDLE) ;Файловый манипулятор + LD DE,(L_FILELEN) ;Берем младшие 16 бит длины файла + LD HL,BUFFER ;Буфер для чтения + RST 10h ;Выполнение функции + JR C,READ_ERROR ;Ошибка чтения + +; Закрытие файла + LD C,12h ;Функция закрытия файла + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,CLOSE_ERROR ;Ошибка закрытия файла + +NAME DB "newfile.doc",0 ;Файловая спецификация +HANDLE DB 0 ;Переменная для сохранения файлового манипулятора +L_FILELEN DW 0 ;Переменная для сохранения младших 16 бит длины +H_FILELEN DW 0 ;Переменная для сохранения младших 16 бит длины +BUFFER DS 256,0 ;Буфер для чтения +``` + +**14h (20) WRITE (Запись в файл)** + + входные данные: + A - файловый манипулятор + HL - адрес в памяти + DE - количество записываемых байт + C - 14h + выходные данные: + DE - реальное количество записанных байт + A - код ошибки, если CF=1 + +Функция записывает указанное количество байт с текущей позиции в файле. +После записи значение указателя текущей позиции увеличивается на количество +записанных байт. + +Количество записанных байт не всегда равно заявленному. Это может +получиться, например, если на диске нет свободного места. При закрытии +файла его длина определяется не текущем значением указателя в файле, а +его максимальным значением или старой длиной файла, если она больше. +Если, например, открыть файл длиной 1000 байт при помощи функции 11h +(OPEN), записать в него 500 байт и затем закрыть. Первые 500 байт будут +записаны новой информацией, а оставшиеся будут без изменения. Если же +требуется перекрыть существующий файл, его следует открыть функцией +0Ah (CREATE), которая уменьшит длину существующего файла до 0. + +*Пример:* + +```asm +; Открытие файла newfile.doc для записи + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,11h ;Функция открытия файла + LD A,2 ;Режим доступа: запись + RST 10h ;Выполнение функции + JR C,OPEN_ERROR ;Ошибка открытия файла + LD (HANDLE),A ;Сохранение файлового манипулятора + +; Перемещение Указателя текущий позиции в конец файла + LD C,15h ;Функция перемещение указателя + LD B,2 ;Перемещение от конца файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + +; Запись в файл (добавление строки в конец файла) + LD C,14h ;Функция записи в файл + LD A,(HANDLE) ;Файловый манипулятор + LD DE,12 ;Берем длину записи 12 байт + LD HL,BUFFER ;Буфер со строкой "end of file!" + RST 10h ;Выполнение функции + JR C,READ_ERROR ;Ошибка чтения + +; Закрытие файла + LD C,12h ;Функция закрытия файла + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,CLOSE_ERROR ;Ошибка закрытия файла +; После записи длина файла увеличится на 12 байт + +NAME DB "newfile.doc",0 ;Файловая спецификация +HANDLE DB 0 ;Переменная для сохранения файлового манипулятора +BUFFER DB "end of file!" ;Буфер для записи +``` + +**15h (21) MOVE_FP (Перемещение указателя в файле)** + + входные данные: + A - файловый манипулятор + HL:IX - смещение указателя в файле + B - способ перемещения + B=0 от начала файла + B=1 от текущего значения указателя + B=2 от конца файла + C - 15h + выходные данные: + A - код ошибки, если CF=1 + HL:IX - новое значение указателя + HL:IX интерпретируется как 32-битное число. + Если число меньше 65536, регистр HL содержит 0. + +Возможны следующие способы перемещения указателя: + B=0 Смещение считается от начала файла, если HL:IX=0, указатель + устанавливается на начало файла. + B=1 Смещение считается от текущего значения указателя. + B=2 Смещение считается от конца файла, если HL:IX=0, после перемещения + HL:IX получится длина файла в байтах. + +**16h (22) ATTRIB (Получение/изменение атрибута файла)** + + входные данные: + HL - указатель на файловую спецификацию + B - режим доступа + B=0 получить атрибут + B=1 установить атрибут + A - атрибут файла + C - 16h + выходные данные: + A - код ошибки, если CF=1 + A - атрибут файла, если CF=0 + +Функция возвращает/изменяет атрибут файла. + +**17h (23) GET_D_T (Информация о дате и времени файла)** + + входные данные: + A - файловый манипулятор + C - 17h + выходные данные: + D - день + E - месяц + IX - год + H - час + L - минуты + B - секунды + A - код ошибки, если CF=1 + +Функция возвращает информацию о дате и времени создания или последней +модификации файла. + +**18h (24) PUT_D_T (Изменение даты и времени файла)** + + входные данные: + A - файловый манипулятор + D - день + E - месяц + IX - год + H - час + L - минуты + B - секунды + C - 18h + выходные данные: + A - код ошибки, если CF=1 + +Функция изменяет информацию о дате и времени создания или последней +модификации файла. Изменение информации о дате и времени реально +произойдет только после закрытия файла. А любая операция записи в +файл установит текущую дату и время. + +**19h (25) F_FIRST (Поиск первого совпадающего файла)** + + входные данные: + HL - указатель на файловую спецификацию + DE - рабочий буфер 44 байта, если B=0, иначе 256 байт + A - атрибуты, используемые при поиске + B = 0 - имя найденного файла в формате 11 байт "FilenameExt" + B = 1 - имя найденного файла в формате DOS "filename.ext",0 + C - 19h + выходные данные: + A - код ошибки, если CF=1 + +Функция осуществляет поиск конкретного файла или первого (по его +положению в каталоге) из группы файлов. Можно указать произвольное +устройство и каталог для поиска. В имени файла допускаются +глобальные символы ? и \*. Если значение атрибутов для поиска +равно 00h, осуществляется поиск только обычных файлов. Если в байте +атибутов биты для скрытого, системного, только для чтения или +каталога (или их произвольная комбинация) равны 1, осуществляется +поиск всех файлов, чьи атрибуты соответствуют указанным, а также всех +обычных файлов. + +Если файл обнаружен, по адресу, на который указывает регистр DE будет +заполнен буфер с информацией о файле. Иначе функция завершится с ошибкой +"файл не обнаружен". + +*формат буфера:* +```asm + +00 8 db "FILE????" ; шаблон имени + +08 3 db "???" ; шаблон расширения + +11 1 db #20 ; атрибуты для поиска + +12 10 ds 10 ; зарезервировано + +22 2 dw #0000 ; время создания файла + +24 2 dw #0000 ; дата создания файла + +26 2 dw #0000 ; номер первого кластера + +28 4 dw #0000,#0000 ; размер файла в байтах + +32 1 db #20 ; атрибут обнаруженного файла + +33 11 db "FILENAMEEXT" ; имя обнаруженного файла копия из каталога +``` +или +```asm + +33 n db "filename.ext",0 ; имя обнаруженного файла в формате ДОС +``` + +**1Ah (26) F_NEXT (Поиск следующего совпадающего файла)** + + входные данные: + DE - указатель на рабочий буфер + C - 1Ah + выходные данные: + A - код ошибки, если CF=1 + +Параметры берутся из функции F_FIRST, если она не выполнялась, то +F_NEXT вернется с ошибкой "невозможная операция", не следует выполнять +операции, которые могут разрушить рабочий буфер. + +*Пример:* +```asm +; Поиск первого совпадающего файла + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD DE,BUFFER ;DE указывает на рабочий буфер + LD C,19h ;Функция поиска первого совпадающего файла + LD A,30h ;Поиск обычных файлов и каталогов + RST 10h ;Выполнение функции + JP C,FIND_ERROR ;Ошибка поиска (файл не найден) +; Вывод имени найденного файла +NEXTN: + LD HL,BUFFER ;Рабочий буфер + LD DE,33 ;Имя файла находится со смещением 33 + ADD HL,DE +; Вывод имени файла + LD C,5Bh ;Функция печати символа + LD B,8 ;Размер имени файла 8 символов +NEXTS: + LD A,(HL) ;Берем очередной символ имени + PUSH BC + RST 10h ;Выполнение функции + POP BC + INC HL + DJNZ NEXTS + LD A," " ;Вывод пробела + RST 10h +; Вывод расширения файла + LD C,5Bh ;Функция печати символа + LD B,3 ;Размер расширения файла 3 символа +NEXTE: + LD A,(HL) ;Берем очередной символ имени + PUSH BC + RST 10h ;Выполнение функции + POP BC + INC HL + DJNZ NEXTE +; Перевод строки после каждого имени файла + LD C,5Bh ;Функция печати символа + LD A,13 ;CR - переход в начало строки + RST 10h + LD C,5Bh ;Функция печати символа + LD A,10 ;LF - перевод строки + RST 10h +; Поиск следующего совпадающего файла + LD DE,BUFFER ;DE указывает на рабочий буфер + LD C,1Ah ;Функция поиска следующего совпадающего файла + RST 10h ;Выполнение функции + JP NC,NEXTN ;Переход на печать имени файла +FIND_ERROR: +NAME DB "A:\TEXT\*.s*",0 +BUFFER DS 44 +``` + +**1Bh (27) MKDIR (Создание каталога)** + + входные данные: + HL - указатель на файловую спецификацию + C - 1Bh + выходные данные: + A - код ошибки, если CF=1 + +Функция создаёт на диске подкаталог, указанный в файловой спецификации. + +*Пример:* +```asm + LD HL,DIRNAME ;HL указывает на ASCIIZ строку с именем подкаталога + LD C,1Bh ;Функция создание подкаталога + RST 10h ;Выполнение функции + +DIRNAME DB "TEXT",0 ;Создать подкаталог TEXT в текущем каталоге +DIRNAME DB "\TEXT",0 ;Создать подкаталог TEXT в корневом каталоге +DIRNAME DB "C:\DOC\TEXT",0 ;Создать подкаталог TEXT в каталоге DOC на + ;диске C: каталог DOC должен существовать +``` + +**1Ch (28) RMDIR (Удаление каталога)** + + входные данные: + HL - указатель на файловую спецификацию + C - 1Ch + выходные данные: + A - код ошибки, если CF=1 + +Функция удаляет пустой подкаталог, указанный в файловой спецификации. +Нельзя удалить текущий каталог и каталог, который содержит файлы или +другие каталоги. + +*Пример:* +```asm + LD HL,DIRNAME ;HL указывает на ASCIIZ строку с именем подкаталога + LD C,1Ch ;Функция удаления подкаталога + RST 10h ;Выполнение функции + +DIRNAME DB "TEXT",0 +``` + +**1Dh (29) CHDIR (Смена текущего каталога)** + + входные данные: + HL - указатель на файловую спецификацию + C - 1Dh + выходные данные: + A - код ошибки, если CF=1 + +Функция меняет текущий каталог и текущий диск, если он указан в файловой +спецификации. Если путь начинается с "\\" - это означает путь от +корневого каталога, иначе от текущего. + +*Пример:* +```asm + LD HL,DIRNAME ;HL указывает на ASCIIZ строку пути к новому + ;текущему каталогу + LD C,1Dh ;Функция смены текущего каталога + RST 10h ;Выполнение функции + +DIRNAME DB "\DOC\TEXT",0 +``` + +**1Eh (30) CURDIR (Информация о текущем каталоге)** + + входные данные: + HL - буфер в памяти 256 байт + C - 1Eh + выходные данные: + A - код ошибки, если CF=1 + +Функция переносит строку пути текущего каталога из областей ДОС в +пользовательскую программу по адресу заданном в регистре HL. На конце +пути код ноль. Имя дискового устройства в путь не включается. + +*Пример:* +```asm + LD HL,BUFFER ;HL указывает на буфер + LD C,1Eh ;Функция получения пути к текущему каталогу + RST 10h ;Выполнение функции + +BUFFER DS 256 +``` + +**21h (33) SYSTIME (Текущая дата и время)** + + входные данные: + C - 21h + выходные данные: + D - день + E - месяц + IX - год + H - час + L - минуты + B - секунды + C - день недели + +Функция возвращает текущую дату и время. + +**22h (34) SETTIME (Установить текущую дату и время)** + + входные данные: + D - день + E - месяц + IX - год + H - час + L - минуты + B - секунды + C - 22h + выходные данные: + A - код ошибки, если CF=1 + +Функция устанавливает системную дату и время. + + +### Функции для работы с памятью: + +**38h (56) SETWIN (Подключение страницы памяти)** + + входные данные: + A - идентификатор блока памяти + B - номер страницы в блоке (0,1,2...) + H - биты 6 и 7 задают номер окна, в которое будет подключена страница + C - 38h + выходные данные: + A - код ошибки, если CF=1 + A - номер страницы, если CF=0 + +Функция вычисляет физический номер страницы в блоке памяти и подключает +её в окно адресного пространства в зависимости от значения регистра HL. То +есть, если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница +подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000h до +0FFFFh - третье. + +На выходе в регистре A содержится физический номер страницы, которая +была подключена до выполнения функции. + +**39h (57) SETWIN1 (Подключение страницы памяти в первое окно)** + + входные данные: + A - идентификатор блока памяти + B - номер страницы в блоке (0,1,2...) + C - 39h + выходные данные: + A - код ошибки, если CF=1 + A - номер страницы, если CF=0 + +Функция аналогична функции 038h (SETWIN), но страница подключается в +первое окно независимо от регистра HL. + +**3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно)** + + входные данные: + A - идентификатор блока памяти + B - номер страницы в блоке (0,1,2...) + C - 3Ah + выходные данные: + A - код ошибки, если CF=1 + A - номер страницы, если CF=0 + +Функция аналогична функции 038h (SETWIN), но страница подключается во +второе окно независимо от регистра HL. + +**3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно)** + + входные данные: + A - идентификатор блока памяти + B - номер страницы в блоке (0,1,2...) + C - 3Bh + выходные данные: + A - код ошибки, если CF=1 + A - номер страницы, если CF=0 + +Функция аналогична функции 038h (SETWIN), но страница подключается в +третье окно независимо от регистра HL. + +**3Ch (60) FREEMEM (INFOMEM - Информация о памяти)** + + входные данные: + C - 3Ch + выходные данные: + HL - общее количество страниц + BC - количество свободных страниц + +Функция возвращает в регистре HL общее количество памяти в страницах по +16 килобайт и свободное количество страниц в регистре BC. + +**3Dh (61) GETMEM (Выделение блока памяти)** + + входные данные: + B - размер блока в страницах по 16 килобайт + C - 3Dh + выходные данные: + A - код ошибки, если CF=1 + A - идентификатор блока памяти, если CF=0 + +Функция выделяет блок памяти и возвращает его идентификатор приложению. + +**3Eh (62) RETMEM (FREEMEM - Освобождение блока памяти)** + + входные данные: + A - идентификатор блока памяти + C - 3Eh + выходные данные: + A - код ошибки, если CF=1 + +Функция освобождает выделенный ранее блок памяти. Нельзя освободить +блок памяти, выделенный другим приложением. + +**3Fh (63) SETMEM (Изменение блока памяти)** + + входные данные: + A - идентификатор блока памяти + B - новый размер блока + C - 3Fh + выходные данные: + A - код ошибки, если CF=1 + +Функция позволяет уменьшить или расширить выделенный ранее блок памяти. +sНельзя изменить блок памяти, выделенный другим приложением. + +### Функции для работы с клавиатурой: + +При наборе символов на клавиатуре каждое нажатие клавиш воспринимает +специальная программа драйвер клавиатуры. Каждая клавиша имеет номер (от +0 до 90), который определяет её позицию на клавиатуре. Таблица всех кодов +клавиш приведена в приложении. + +Каждое нажатие или отпускание клавиши вызывает прерывание. Программа, +обслуживающая это прерывание, читает scan-код и преобразует его в два +байта. Первый байт содержит символьный ASCII код, а второй - позиционный +код. Первый байт получается преобразованием позиционного кода клавиши по +определённой процедуре в зависимости от состояния клавиш Shift, Alt, Ctrl, +Caps Lock и Num Lock, от режима латиница или кириллица и от раскладки +клавиатуры в символьный (ASCII) код. Для специальных клавиш, например +функциональный или клавиш управления курсором, код ASCII равен нулю. +Это позволяет программе различать обычные печатные символы и нажатия +других клавиш. + +Драйвер записывает эти два байта в буфер клавиатуры, который может +хранить информацию о 15 нажатий на клавиши. Кроме этого, драйвер +отслеживает информацию о состоянии некоторых клавиш, таких как Shift, +Alt, Ctrl, Caps Lock, Num Lock, Scroll Lock и др. + +Чтобы считать очередную клавишу из буфера клавиатуры, нужно воспользоваться +одной из функций работы с клавиатуры. Функции возвращают в регистре E +ASCII код клавиши, в регистре D её позиционный код. Если установлен седьмой +бит регистра D, это означает что нажата не одна клавиша, а одновременно +с ней нажаты \, \ или \. + +В регистре B указываются какие именно клавиши удерживаются (побитово): + + D7 = 1 - удерживается левый + D6 = 1 - удерживается правый + D5 = 1 - удерживается + D4 = 1 - удерживается + D3 = 1 - удерживается левый + D2 = 1 - удерживается левый + D1 = 1 - удерживается правый + D0 = 1 - удерживается правый + +Биты 5 и 4 указывают, что удерживаются любой \, \ правый +или левый. + +В регистре C указываются режимы ввода (побитово): + + D7 = 1 - RUS, 0 - LAT + D6 - зарезервирован + D5 - зарезервирован + D4 - зарезервирован + D3 = 1 - режим Num Lock + D2 = 1 - режим Scroll Lock + D1 = 1 - режим Insert + D0 = 1 - режим Caps Lock + +**30h (48) WAITKEY (Ожидание символа с клавиатуры)** + + входные данные: + C - 30h + выходные данные: + A - код символа + D - позиционный код + Е - ASCII код + C - режим клавиатуры - побитово: + D7 - RUS/LAT + D3 - Num Lock + D2 - Scroll Lock + D1 - Insert + D0 - Caps Lock + B - состояние модификаторов - побитово: + D7 - Left Shift + D6 - Right Shift + D5 - Ctrl + D4 - Alt + D3 - Left Ctrl + D2 - Left Alt + D1 - Right Ctrl + D0 - Right Alt + +Функция читает информацию об очередном нажатии из буфера клавиатуры. +Если буфер пуст, ожидает появления информации. В регистре E выдается +ASCII код символа, а в регистре D - позиционный код клавиши (0..127). +Если бит 7 регистра D установлен - это означает, что вместе с клавишей +удерживается Ctrl/Alt/Shift. Регистр A дублирует содержимое регистра +E для удобства в написании программ. + +*Пример:* +```asm +LOOP: + LD C,30h ;Функция ожидания нажатия клавиши + RST 10h ;Выполнение функции + CP 0Dh ;Нажата ? + JP Z,ENTER ;если да, то ввод + LD HL,011Bh ;Позиционный и ASCII код клавиши <Еsc> + AND A + SBC HL,DE ;Нажата ? + JP Z,EXIT ;если да, то выход + JP LOOP ;иначе, повторить ожидание клавиши +``` + +**31h (49) SCANKEY (Опрос клавиатуры без ожидания)** + + входные данные: + C - 31h + выходные данные: + ZF - нет клавиш + A - код символа + D - позиционный код + Е - ASCII код + C - режим клавиатуры - побитово: + D7 - RUS/LAT + D3 - Num Lock + D2 - Scroll Lock + D1 - Insert + D0 - Caps Lock + B - состояние модификаторов - побитово: + D7 - Left Shift + D6 - Right Shift + D5 - Ctrl + D4 - Alt + D3 - Left Ctrl + D2 - Left Alt + D1 - Right Ctrl + D0 - Right Alt + +Функция возвращает флаг Z, если буфер клавиатуры пуст. Иначе читает +информацию об очередном нажатии из буфера клавиатуры. Возвращаемые +регистры, как и в функции 30h (WAITKEY). + +*Пример:* +```asm +NO_KEYS: + LD C,31h ;Функция опроса клавиатуры без ожидания + RST 10h ;Выполнение функции + JR Z,NO_KEYS ;Если клавиша не нажата повторить опрос + BIT 7,D ;Нажата одна клавиша? + JP Z,ONEKEY ;Если да, переход + LD A,B + AND 0C0h ;Биты 7 и 6 равны 0 + JP NZ,SHIFT ;Если нет, то нажаты +<клавиша> + BIT 5,B ;Бит Ctrl в нуле? + JP NZ,CTRL ;Если нет, то нажаты +<клавиша> + BIT 4,B ;Бит Alt в нуле? + JP NZ,CTRL ;Если нет, то нажаты +<клавиша> +ONEKEY: + CP 0Dh ;Нажата ? + JP Z,ENTER ;если да, то ввод + LD HL,011Bh ;Позиционный и ASCII код клавиши <Еsc> + AND A + SBC HL,DE ;Нажата ? + JP Z,EXIT ;если да, то выход +``` + + +**32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью)** + + входные данные: + C - 32h + выходные данные: + A - код символа + D - позиционный код + Е - ASCII код + C - режим клавиатуры - побитово: + D7 - RUS/LAT + D3 - Num Lock + D2 - Scroll Lock + D1 - Insert + D0 - Caps Lock + B - состояние модификаторов - побитово: + D7 - Left Shift + D6 - Right Shift + D5 - Ctrl + D4 - Alt + D3 - Left Ctrl + D2 - Left Alt + D1 - Right Ctrl + D0 - Right Alt + +Функция аналогична функции 30h, но после получения кода символа он +печатается на экране. Возвращаемые регистры, как и в функции 30h +(WAITKEY). + +**33h (51) CTRLKEY (Получить состояние клавиатуры)** + + входные данные: + C - 33h + выходные данные: + A = 0 - нет символов в буфере + C - режим клавиатуры - побитово: + D7 - RUS/LAT + D3 - Num Lock + D2 - Scroll Lock + D1 - Insert + D0 - Caps Lock + B - состояние модификаторов - побитово: + D7 - Left Shift + D6 - Right Shift + D5 - Ctrl + D4 - Alt + D3 - Left Ctrl + D2 - Left Alt + D1 - Right Ctrl + D0 - Right Alt + +Функция возвращает состояние клавиатуры на данный момент. То есть, +данные берутся не из буфера клавиатуры (как в остальных функциях), +а непосредственно из результатов последнего сканирования клавиатуры. +Регистр A равен нулю, если буфер клавиатуры пуст. + +**35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию)** + + входные данные: + B - номер функции 30h, 31h, 32h, 33h или 34h + C - 35h + выходные данные: + смотри вызываемую функцию (в соответствии с функцией + переданной в регистре B) + +Функция очищает буфер клавиатуры, после чего выполняет функцию +указанную в регистре B. Она позволяет предотвратить использование +программой символов, введенных с опережением. Например, команда +FORMAT очищает буфер клавиатуры перед запросом о необходимости +форматировать диск. Поэтому случайное наличие в буфере символа, +разрешающего форматирование, не вызовет действительного +форматирования. + +**36h (54) K_SETUP (Управление настройками клавиатуры)** + + входные данные: + B - номер подфункции + C - 36h + выходные данные: + В зависимости от указанной функции в регистре B. + +Функция управления клавиатурой. + +Передаваемые и возвращаемые параметры в зависимости от функции +переданной в регистре B - + + B = 0, установить раскладку клавиатуры + A - номер раскладки + 0 - normal + 1 - shift + 2 - caps lock + 3 - caps lock + shift + 4 - normal (альтернативная кл.) + 5 - shift (альтернативная кл.) + 6 - caps lock (альтернативная кл.) + 7 - caps lock + shift (альтернативная кл.) + B = 1, получить состояние звуковых переменных + B = 2, установить звуковые переменные + A - значение переменной + D0 - сигнал переполнения буфера клавиатуры + D1 - сигнал переключения на альтернативную раскладку клавиатуры + +**37h (55) TESTKEY (Опрос буфера клавиатуры)** + + входные данные: + C - 37h + выходные данные: + ZF - нет символов в буфере + A - код символа + D - позиционный код + Е - ASCII код + C - режим клавиатуры - побитово: + D7 - RUS/LAT + D3 - Num Lock + D2 - Scroll Lock + D1 - Insert + D0 - Caps Lock + B - состояние модификаторов - побитово: + D7 - Left Shift + D6 - Right Shift + D5 - Ctrl + D4 - Alt + D3 - Left Ctrl + D2 - Left Alt + D1 - Right Ctrl + D0 - Right Alt + +Функция возвращает флаг Z, если буфер клавиатуры пуст. Иначе читает +информацию об очередном нажатии из буфера клавиатуры. Возвращаемые +регистры, как и в функции 30h (WAITKEY). Информация о нажатии +остается в буфере. + +### Запуск приложений: + +Программы хранятся на диске, как программные (выполняемые) файлы. Одна +из основных задач операционной системы - организовать их выполнение. + +Командная строка для выполнения программ имеет формат: + +*[устройство:][\\путь\\]имя[параметры]* + +Устройство и путь указывают место нахождения приложения на диске. Если +они пропущены, поиск осуществляется в текущем каталоге текущего диска. +Если указано расширение файла, оно игнорируется, так как, у программных +файлов расширение может быть только EXE. + +EXE файлы состоят из двух частей, префикса и выполнимого модуля. Префикс +содержит в себе различную вспомогательную информацию: + +*Префикс EXE файла:* +```asm + +00 2 dw 5845h ; Идентификатор EXE файла + +02 1 db 45h ; Зарезервирован + +03 1 db 00h ; Версия EXE файла + +04 4 dd 00000200h ; Начало исполняемого кода (смещение в байтах) + +08 2 dw 0000h ; Размер первичного загрузчика или 0 + +10 4 dd 00000000h ; Зарезервированы + +14 2 dw 0000h ; Зарезервированы + +16 2 dw ???? ; Адрес расположения кода в памяти + +18 2 dw ???? ; Адрес запуска (регистр PC) + +20 2 dw ???? ; Адрес расположения стека (регистр SP) + +22 490 ds 0 ; Зарезервированы + + +512 ; Код программы +``` + +**40h (64) EXEC (Выполнить файл)** + + входные данные: + HL - указатель на файловую спецификацию + B = 0 - загрузить и выполнить программу + C - 40h + выходные данные: + A - код ошибки, если CF=1 + A - код завершения, если CF=0 + +Выполнение EXE-файла осуществляется по следующим пунктам: +1) Открывает exe-файл на чтение; +2) Считывает в рабочую область префикс exe-файла; +3) Выделяет блок памяти, требуемый для загрузки всего файла или +первичного загрузчика, если его размер не равен нулю; +4) Сохраняет стек; +5) Подключает страницы из выделенного блока; +6) Строит префикс запуска программы и устанавливает на него регистр IX; +7) Считывает файл по адресу указанному в смещении 16 (Адрес +расположения кода в памяти); +8) Закрывает exe-файл, если это не первичный загрузчик; +9) Устанавливает стек равным значению из смещения 20 (Адрес +расположения стека); +10) Передает управление по адресу указанному в смещении 18 (Адрес +запуска); + +*Префикс запуска файла:* +```asm + -03 1 db ? ; Файловый манипулятор, если exe-файл с первичным загрузчиком + -02 1 db ? ; Идентификатор блока памяти + -01 1 db ? ; Уровень текущей программы + +00 1 db ? ; Длинна командной строки + +01 127 ds ? ; Параметры командной строки, заканчивается нулем +``` + +*Пример:* +```asm + LD HL,NAME ;HL указывает на ASCIIZ строку с именем еxe-файла + LD C,40h ;Функция выполнения файла + LD B,00h ;Подфункция загрузить и выполнить + RST 10h ;Выполнение функции + RET C ;Возврат по ошибке + LD (ENDCODE),A ;Сохранение кода завершения + +NAME DB "\PROG\UTILITY\prog.exe",0 +ENDCODE DB 00h +``` + +**41h (65) EXIT (Завершение программы)** + + входные данные: + B - код завершения + C - 41h + выходные данные: + A - код ошибки, если CF=1 + A - код завершения, если CF=0 + +Функция завершает выполнение текущей программы, освобождает +занимаемую память и передаёт код завершения в родительную +программу. Код завершения также сохраняется в системной +переменной ДОС и его можно позднее получить при помощи +функции 42h (WAIT). + +**42h (66) WAIT (Получить код завершения программы)** + + входные данные: + C - 42h + выходные данные: + A - код завершения + +Функция возвращает код завершения, последней завершенной программы. + +### Функции для работа с командной строкой: + +**43h (67) GSWITCH (Выделить параметр командной строки)** + + входные данные: + HL - указатель командной строки + DE - буфер для выделяемого параметра + C - 43h + выходные данные: + HL - указатель на следующий параметр командной строки + CF=0 - конец строки не достигнут (есть другие параметры) + CF=1 - конец строки (в буфер перенесён последний параметр или ноль) + +Функция выделяет параметр командной строки. Параметрами считаются +любые последовательности символов разделённые пробелами. Ведущие +пробелы игнорируются. Параметр в буфере завершается кодом ноль, +если параметры отсутствуют, в буфер записывается ноль. + +*Пример:* +```asm + LD HL,COMLINE ;HL указывает на командную строку +NEXTP: + LD DE,BUFFER ;DE указывает на буфер для параметров + LD C,43h ;Функция выделения параметра + RST 10h ;Выполнение функции + PUSH AF + PUSH HL + ... + ... Обработка параметра командной строки + ... + POP HL + POP AF + JP NC,NEXTP + +COMLINE DB "file1.txt file2.txt -x",0 +BUFFER DS 127,0 +``` + +**44h (68) DOSNAME (Преобразовать имя файла)** + + входные данные: + C - 44h + B = 0, преобразовать из 11 символьного формата в формат ДОС + HL - 11 символов имени файла + DE - буфер для имени в формате ДОС + B = 1, преобразовать из формата ДОС в 11 символьный формат + HL - имя файла в формате ДОС + DE - 11 символов имени файла + + db "name.ext",0 ; формат ДОС + db "name ext" ; 11 символьный формат + выходные данные: + A - код ошибки, если CF=1 + +Функция преобразовывает имя файла из 11 символьного формата в формат ДОС +и обратно. + +**45h (69) EXCMDLN (Разбор командной строки)** + + входные данные: + HL - указатель командной строки + DE - указатель на буфер пользователя + C - 45h + B - номер подфункции: + 0 - Разобрать строку; + 1 - Выделить имя диска; + 2 - Выделить директорию; + 3 - Выделить имя файла; + 4 - Выделить расширение файла; + 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла; + 6 - Зарезервирована; + 7 - Выделить параметр командной строки; + 8 - преобразовать из 11 символьного формата в формат ДОС; + 9 - преобразовать из формата ДОС в 11 символьный формат; + +Функция осуществляет разбор командной строки в зависимости от номера +подфункции в регистре B. Возвращаемые значения зависят от выполняемой +подфункции. + +***Подфункция 0 - Разобрать строку:*** + + входные данные: + HL - указатель командной строки + C - 45h + B = 0 - Разобрать строку + выходные данные: + A - код ошибки, если CF=1 + A - побитово, если CF=0: + D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и возвращает результат в +регистре A. + +*Пример:* +```asm + LD HL,STRING ; HL указывает на строку для разбора + LD C,45h ; Функция разбор командной строки + LD B,0 ; Подфункция разобрать строку + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D2, D3. + +STRING db "c:\dir1\name",0 +``` + +***Подфункция 1 - Выделить имя диска:*** + + входные данные: + HL - указатель командной строки + DE - буфер (макс. 13 байт) + C - 45h + B = 1 - Выделить имя диска + выходные данные: + A - код ошибки, если CF=1 + A - номер диска (0 - A, 1 - B, 2 - C и т.д.) если CF=0: + буфер - имя диска "A:",0 + +Функция осуществляет разбор командной строки и копирует в буфер имя +диска, если имя диска не указывалось в буфер помещается 0. + +*Пример:* +```asm + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,1 ; Подфункция выделить имя диска + RST 10h ; Выполнение функции + ; В регистре A будет 2 (drive C:) + ; В буфере "C:",0 + +STRING db "c:\dir1\name",0 +BUFFER ds 13 +``` + +***Подфункция 2 - Выделить директорию:*** + + входные данные: + HL - указатель командной строки + DE - буфер (макс. 256 байт) + C - 45h + B = 2 - Выделить директорию + выходные данные: + A - код ошибки, если CF=1 + A - побитово, если CF=0: + D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + буфер - директория "DIR1\DIR2\DIR3\",0 + +Функция осуществляет разбор командной строки и копирует в буфер путь к +файлу, если директория не указывалась в буфер помещается 0. + +*Пример:* +```asm + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,2 ; Подфункция выделить директорию + RST 10h ; Выполнение функции +; В регистре A будут установлены разряды D0, D1, D2, D3. +; В буфере "\DIR1\DIR2\",0 + +STRING db "c:\dir1\dir2\name.ext",0 +BUFFER ds 256 +``` + +***Подфункция 3 - Выделить имя файла:*** + + входные данные: + HL - указатель командной строки + DE - буфер (макс. 13 байт) + C - 45h + B = 3 - Выделить имя файла + выходные данные: + A - код ошибки, если CF=1 + A - побитово, если CF=0: + D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + буфер - имя файла "FILE.EXT",0 + +Функция осуществляет разбор командной строки и копирует в буфер имя +файла и расширение файла, если имя файла не указывалась в буфер +помещается 0. + +Пример: +```asm + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,3 ; Подфункция выделить имя файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере "name.ext",0 + +STRING db "c:\dir1\dir2\name.ext",0 +BUFFER ds 13 +``` + +***Подфункция 4 - Выделить расширение файла:*** + + входные данные: + HL - указатель командной строки + DE - буфер (макс. 4 байт) + C - 45h + B = 4 - Выделить расширение файла + выходные данные: + A - код ошибки, если CF=1 + A - побитово, если CF=0: + D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + буфер - расширение "TXT",0 или "C ",0 + +Функция осуществляет разбор командной строки и копирует в буфер +расширение файла, если расширение файла не указывалось в буфер +помещается 0. + +*Пример:* +```asm + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,4 ; Подфункция выделить расширение файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере "ext",0 + +STRING db "c:\dir1\dir2\name.ext",0 +BUFFER ds 4 +``` + +***Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла:*** + + входные данные: + HL - указатель командной строки + DE - буфер (макс. 8 байт) + +0 адрес буфера для имени диска (макс. 13 байт) + +2 адрес буфера для директории (макс. 256 байт) + +3 адрес буфера для имени файла (макс. 13 байт) + +4 адрес буфера для расширения файла (макс. 4 байта) + C - 45h + B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла + выходные данные: + A - код ошибки, если CF=1 + A - побитово, если CF=0: + D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буферы +обнаруженные элементы командной строки, если какой-либо элемент не +указывался в буфер помещается 0. + +*Пример:* +```asm + LD HL,STRING ; HL указывает на строку для разбора + LD DE,PBUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,5 ; Подфункция выделить расширение файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере DRIVE_A "C:",0 + ; В буфере DIR_A "\DIR1\DIR2\",0 + ; В буфере NAME_A "NAME.EXT",0 + ; В буфере TYPE_A "EXT",0 + +STRING db "c:\dir1\dir2\name.ext",0 +PBUFFER dw DRIVE_A + dw DIR_A + dw NAME_A + dw TYPE_A + +DRIVE_A ds 13 +DIR_A ds 256 +NAME_A ds 13 +TYPE_A ds 4 +``` + +***Подфункция 7 - Выделить параметр командной строки:*** + + входные данные: + HL - указатель командной строки + DE - буфер для выделяемого параметра (макс. 256 байт) + C - 45h + B = 7 - Выделить параметр командной строки + выходные данные: + HL - указатель на следующий параметр командной строки + CF=0 - конец строки не достигнут (есть другие параметры) + CF=1 - конец строки (в буфер перенесён последний параметр или ноль) + +Функция выделяет параметр командной строки. Параметрами считаются любые +последовательности символов разделённые пробелами. Ведущие пробелы +игнорируются. Параметр в буфере завершается кодом ноль, если параметры +отсутствуют, в буфер записывается ноль. + +***Подфункция 8 - преобразовать из 11 символьного формата в формат ДОС:*** + + входные данные: + HL - 11 символов имени файла + DE - буфер для имени в формате ДОС + C - 45h + B = 8 - преобразовать из 11 символьного формата в формат ДОС + db "name.ext",0 ; формат ДОС + db "name ext" ; 11 символьный формат + выходные данные: + A - код ошибки, если CF=1 + +Функция преобразовывает имя файла из 11 символьного формата в формат +ДОС. + +***Подфункция 9 - преобразовать из формата ДОС в 11 символьный формат:*** + + входные данные: + HL - имя файла в формате ДОС + DE - буфер для 11 символов имени файла + C - 45h + B = 9 - преобразовать из формата ДОС в 11 символьный формат + db "name.ext",0 ; формат ДОС + db "name ext" ; 11 символьный формат + выходные данные: + A - код ошибки, если CF=1 + +Функция преобразовывает имя файла из формата ДОС в 11 символьный формат. +В имени файла допускаются глобальные символы ? и \*. В этом случае +символ \* будет заменен на несколько символов ? . Например +\"name\*.c\*\", будет преобразован в \"name????c??\". + +### Работа с экраном: + +Сейчас DOS поддерживает четыре режима экрана. +Два текстовых: +> 40x32 символов c 16 цветами (режим 02h); +> 80x32 символов c 16 цветами (режим 03h); + +и два графических: +> 320x256 точек с 256 цветами (режим 81h); +> 640x256 точек с 16 цветами (режим 82h); + +Основным режимом является текстовый режим 80x32 (03h), если ваша +программа работает в другом режиме, то вам следует перед переключением +режима получить номер текущего режима функцией 51h GETVMOD и сохранить +его, а перед завершением программы восстановить его. + +*Например:* +```asm + LD C,51h ;получить режим экрана + RST 10h + LD C,A ;поместить номер режима экрана в регистр C + PUSH BC ;и сохранить на стеке (B - страница, C - режим) + ... + ... ;ваша программа + ... + POP BC ;взять со стека режим экрана + LD A,C ;поместить номер режима экрана в регистр A + LD C,50h ;установить режим экрана + RST 10h + LD C,41h ;завершить программу. + RST 10h +``` + +DOS имеет функции вывода на текстовый экран символов и символьных строк. +Для графических режимов требуются собственные процедуры вывода на экран. +Например, при завершении программы вы можете выдать строку на текстовый +экран: + +```asm + LD HL,STRING ;указатель на строку символов + LD C,5Ch ;вывод строки символов + RST 10h + +STRING DB "Thank you for using my program..." ;текстовая строка +DB 13,10 ;символы возврата каретки и перевода строки +DB 0 ;символ конца строки +``` + +Для вывода на графический экран, вам необходимо подключить видео память +в одно из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. +Это осуществляется выводом значения 50h в соответствующий порт 0A2h, +0C2h или 0E2h в зависимости от окна памяти. При подключении обратите +внимание на то, чтобы стек вашей программы не попадал в это адресное +пространство. + +Например, если вам нужно поставить точку на экране, то подпрограмма для +режима 81h будет выглядеть так: + +```asm +; HL - горизонтальная координата +; DE - вертикальная координата + + IN A,(0E2h) ;считать из порта номер страницы подключенной в + ;третье окно памяти + LD C,A ;запомнить в регистре C + LD A,50h ;страница видео памяти + OUT (0E2h),A ;подключение видео памяти + LD A,E ;поместить вертикальную координату в регистр A. + OUT (89h),A ;выдать в порт + LD DE,0C000h ;адрес начала третьего окна памяти + ADD HL,DE ;получить адрес точки (адрес начала окна + + ;горизонтальная координата) + LD A,255 ;цвет выводимой точки (от 0 до 255) + LD (HL),A ;вывод точки на экран + LD A,C ;вспомнить номер страницы памяти + OUT (0E2h) ;подключить страницу памяти вместо страницы видео + ;памяти +``` + +Перед выводом точек следует установить необходимые цвета в палитре. +Различные режимы вывода на экран задаются номером видео страницы от 50h +до 5Fh. Подробнее о режимах вывода вы можете прочитать в описании +архитектуры компьютера. + +**50h (80) SETVMOD (Выбор режима экрана)** + + входные данные: + A - режим экрана + 02h - текстовый 40x32x16 цветов + 03h - текстовый 80x32x16 цветов + 81h - графический 320x256x256 цветов + 82h - графический 640x256x16 цветов + B - страница экрана 0/1 + C - 50h + выходные данные: + A - код ошибки, если CF=1 + +Функция устанавливает режим экрана. Седьмой бит режима экрана +установлен для графических режимов и сброшен для текстовых. +Существуют два текстовых режима и два графических. + +**51h (81) GETVMOD (Получить текущий режим экрана)** + + входные данные: + C - 51h + выходные данные: + A - код ошибки, если CF=1 + A - текущий режим экрана, если CF=0 + B - страница экрана (0/1) + +Функция возвращает текущий режим экрана. + +**52h (82) LOCATE (Установить позицию курсора)** + + входные данные: + D - строка курсора + E - столбец курсора + C - 52h + выходные данные: + нет + +Функция устанавливает новую позицию курсора. Вывод символов +будет производиться в эту позицию. Верхний левый угол имеет +координаты (0,0). + +**53h (83) CURSOR (Получить текущую позицию курсора)** + + входные данные: + C - 53h + выходные данные: + D - строка курсора + E - столбец курсора + +Функция возвращает текущую позицию курсора. + +**54h (84) SELPAGE (Выбрать активную страницу экрана)** + + входные данные: + B - страница экрана 0/1 + C - 54h + выходные данные: + A - код ошибки, если CF=1 + +Функция устанавливает активную страницу, которая будет выводиться +на ыэкран. + +**55h (85) SCROLL (Прокрутка окна)** + + входные данные: + D - строка левого верхнего угла окна + E - столбец левого верхнего угла окна + H - высота окна + L - ширина окна + B = 1 - прокрутка вверх + B = 2 - прокрутка вниз + A = 0 - очищать строку + C - 55h + выходные данные: + нет + +Функция определяет окно активной видеостраницы и его содержимое +перемещается вверх или в низ на одну строку. Если регистр A равен +нулю, освобождённая строка очищается (заполняется пробелами). + +**56h (86) CLEAR (Очистка окна)** + + входные данные: + D - строка левого верхнего угла окна + E - столбец левого верхнего угла окна + H - высота окна + L - ширина окна + B - атрибут заполнитель + A - символ заполнитель + C - 56h + выходные данные: + нет + +Функция очищает окно экрана, записывая во все позиции окна +символ с кодом из регистра A и атрибутом из регистра B. + +**57h (87) RDCHAR (Считать символ с экрана)** + + входные данные: + D - строка + E - столбец + C - 57h + выходные данные: + A - символ + B - атрибут + +Функция считывает символ и его атрибут из позиции заданной +регистрами D и E. + +**58h (88) WRCHAR (Напечатать символ на экране)** + + входные данные: + D - строка + E - столбец + A - символ + B - атрибут + C - 58h + выходные данные: + нет + +Функция печатает символ и атрибут на экране в позиции +заданной регистрами D и E. Управляющие символы выводятся +как обычные символы. + +**59h (89) WINCOPY (Запомнить окно экрана)** + + входные данные: + D - строка + E - столбец левого верхнего угла окна + H - высота окна + L - ширина окна + B - страница буфера + IX - адрес буфера + C - 59h + выходные данные: + нет + +Функция копирует окно в память на страницу заданную в +регистре B и по адресу заданному в регистре IX. Если +значение IX меньше 0C000h, копирование производится в +страницу памяти подключенную по этому адресу. В буфере +получается массив из идущих подряд символов и атрибутов. + +**5Ah (90) WINREST (Восстановить окно экрана)** + + входные данные: + D - строка + E - столбец левого верхнего угла окна + H - высота окна + L - ширина окна + B - страница буфера + IX - адрес буфера + C - 5Ah + выходные данные: + нет + +Функция выполняет обратное копирование окна из памяти на +странице заданной в регистре B и с адреса заданного в регистре +IX. Если значение IX меньше 0C000h, копирование производится +из страницы памяти подключенной по этому адресу. + +**5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора)** + + входные данные: + A - символ + C - 5Bh + выходные данные: + нет + +Функция печатает символ на экране в текущей позиции курсора. После +печати символа текущая позиция увеличивается. Печать осуществляется +с управляющими кодами. + +**5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора)** + + входные данные: + HL - указатель на начало строки символов + C - 5Ch + выходные данные: + нет + +Функция печатает строку символов на экране в текущей позиции +курсора. При печати текущая позиция увеличивается. Печать +осуществляется с управляющими кодами. Строка должна заканчиваться +кодом ноль. + +**5Fh (95) PRINT (Вывод символа на принтер без ожидания)** + + входные данные: + A - символ + C - 5Fh + выходные данные: + B - символ + CF = 1 - принтер не готов + +Функция посылает символ на принтер. Если принтер не готов +принимать символ, то выставляется флаг переноса (CF). + +*Пример:* +```asm + LD HL,TEXT ;HL указывает на текстовый массив, который +NPRINT: + PUSH BC ;необходимо распечатать на принтере +APRINT: + PUSH HL ;Сохраняем указатель текущего символа + LD A,(HL) ;Берём очередной символ и печатаем + LD C,5Fh ;Функция печати символа + RST 10h ;Выполнение функции + JR NC,PRNOK ;Переход на печать следующего символа + +;Принтер не готов, ожидаем пока не нажата [Esc] + LD C,31h ;Функция опроса клавиатуры без ожидания + RST 10h ;Выполнение функции + POP HL ;Восстанавливаем указатель на текущий символ + JR Z,APRINT ;Клавиши не нажимались + CP 1Bh ;Нажата клавиша [Esc]? + JR NZ,APRINT ;если нет, повторяем печать + POP BC ;Восстанавливаем счетчик символов + +;Печать прервана (пользователь нажал [Esc]) + SCF + RET + +PRNOK: + POP HL ;Восстанавливаем указатель на текущий символ + POP BC ;Восстанавливаем счетчик символов + INC HL ;Переходим к следующему символу + DEC BC ;Уменьшаем счетчик символов + LD A,B ;Счетчик равен нулю? + OR C + JP NZ,NPRINT ;если нет, продолжаем печать + +;Успешно напечатаны все символы + XOR A + RET +``` + +### Интерфейс для работы с мышью: + +Взаимодействие с драйвером мыши осуществляется при помощи +инструкции RST 30h. В зависимости от конкретной функции, +в качестве входных и выходных параметров используются +различные регистры, при этом номер функции задается в +регистре C. Любые перемещения мыши и нажатие на клавиши +воспринимает специальная программа драйвер мыши. Каждое +нажатие и отпускание клавиш или перемещение мыши вызывает +прерывание. Программа, обслуживающая это прерывание, читает +пакет данных от мыши и перемещает курсор мыши в зависимости +от полученных данных. + +**00h (00) INITIALIZATION (Инициализация драйвера мыши)** + + входные данные: + C - 00h + выходные данные: + A - драйвер не установлен, если CF=1 + A - успешная инициализация, драйвер установлен, если CF=0 + +Функция производит начальную инициализацию драйвера мыши. При +возвращении флага переноса драйвер не установлен. + +**01h (01) SHOW MOUSE CURSOR (Вывести курсор мыши на экран)** + + входные данные: + C - 01h + выходные данные: + A - код ошибки, если CF=1 + +Функция выводит на экран курсор мыши и отслеживает все +перемещения курсора и перерисовывает его. + +**02h (02) HIDE MOUSE CURSOR (Убрать курсор мыши с экрана)** + + входные данные: + C - 02h + выходные данные: + A - код ошибки, если CF=1 + +Функция стирает курсор мыши с экрана, но драйвер продолжает +отслеживание перемещения мыши и нажатие на кнопки. + +**03h (03) READ MOUSE STATE (Чтение состояния мыши)** + + входные данные: + C - 03h + выходные данные: + A - код ошибки, если CF=1 + A - состояние кнопок, если CF=0 + D0 - левая + D1 - правая + HL - x-координата + DE - y-координата + +Функция возвращает текущие координаты курсора мыши и +состояние ее кнопок. Координаты возвращаются в точках и +для текстовых режимов необходимо их делить на восемь для +получения координат в знакоместах. + +**04h (04) GOTO MOUSE CURSOR (Установка координат курсора мыши)** + + входные данные: + C - 04h + HL - x-координата + DE - y-координата + выходные данные: + A - код ошибки, если CF=1 + +Установка координат курсора мыши. Функция перемещает курсор +мыши в заданные координаты. + +**07h (07) VERT. BOUNDS (Задание вертикальных границ перемещения курсора)** + + входные данные: + C - 07h + HL - y-минимальная + DE - y-максимальная + выходные данные: + A - код ошибки, если CF=1 + +Функция задает верхнюю минимальную и нижнюю максимальную +координаты в которых может перемещаться курсор мыши по +вертикали. + +**08h (08) HORZ. BOUNDS (Задание горизонтальных границ перемещения курсора)** + + входные данные: + C - 08h + HL - x-минимальная + DE - x-максимальная + выходные данные: + A - код ошибки, если CF=1 + +Функция задает левую минимальную и правую максимальную +координаты в которых может перемещаться курсор мыши по +горизонтали. + +**09h (09) LOAD CURSOR (Загрузка изображения курсора мыши)** + + входные данные: + C - 09h + B = 0 + IX - изображение курсора + H - высота курсора + L - ширина курсора + D - Y активная точка + E - X активная точка + выходные данные: + A - код ошибки, если CF=1 + +Функция загружает новое изображение курсора мыши в драйвер +и задать активную точку изображения. + +**0Ah (10) CURSOR TEXT MODES (Установка курсора мыши в текстовом режиме)** + + входные данные: + C - 0Ah + B = 0 + H - AND SIMBOL MASK + L - XOR SIMBOL MASK + D - AND ATTRIBUT MASK + E - XOR ATTRIBUT MASK + выходные данные: + A - код ошибки, если CF=1 + +Функция устанавливает символ и атрибут курсора мыши для +текстового режима. + +**0Bh (11) RETURN CURSOR (Получение изображения курсора мыши)** + + входные данные: + C - 0Bh + IX - буфер для изображения курсора + выходные данные: + A - код ошибки, если CF=1 + H - высота курсора + L - ширина курсора + D - Y активная точка + E - X активная точка + +Функция возвращает изображение курсора мыши из драйвера. + +**0Eh (14) GET SENSETIVE (Чтение чувствительности мыши)** + + входные данные: + C - 0Eh + выходные данные: + A - код ошибки, если CF=1 + H - чувствительность по вертикали + L - чувствительность по горизонтали + +Функция возвращает значения чувствительности перемещения +мыши по вертикали и горизонтали. + +**0Fh (15) SET SENSETIVE (Установка чувствительности мыши)** + + входные данные: + C - 0Fh + H - чувствительность по вертикали + L - чувствительность по горизонтали + выходные данные: + A - код ошибки, если CF=1 + +Функция устанавливает значения чувствительности перемещения +мыши по вертикали и горизонтали. + +**80h (128) MOUSE HARDWARE INTERRUPT (Обработчик аппаратного прерывания от мыши)** + + входные данные: + C - 80h + выходные данные: + A - код ошибки, если CF=1 + +По приходу прерывания от мыши вызывается данная функция +драйвера. В случае когда требуется работа подпрограммы +при запрещенных прерываниях, используйте данную функцию, +для избежания потерь пакетов данных от мыши. + +**81h (129) CHANGE VIDEO MODE (Информирование о смене режима экрана)** + + входные данные: + C - 81h + A - режим экрана + выходные данные: + A - код ошибки, если CF=1 + +Функция информирует драйвер мыши об изменении режима +экрана. Номера режимов соответствуют функции установка +режима экрана. + +**83h (131) MOUSE REFRESH (Принудительная перерисовка курсора)** + + входные данные: + C - 83h + выходные данные: + A - код ошибки, если CF=1 + +Функция перерисовывает изображение курсора мыши на +экране не дожидаясь очередного прерывания. + +*коды ошибок от драйвера мыши:* + + 0 - нет ошибок + 1 - неизвестная функция + 2 - зарезервирована + 3 - курсор уже на экране + 4 - курсор отсутствует на экране + 5 - изображение курсора слишком велико + +#### + +## Приложения + +### Приложение А. Коды ошибок DOS + + 00h (00) - нет ошибок + 01h (01) - неверный номер функции + 02h (02) - неправильный номер устройства + 03h (03) - файл не обнаружен + 04h (04) - неверный путь + 05h (05) - несуществующий файловый манипулятор + 06h (06) - нет свободного файлового манипулятора + 07h (07) - файл существует + 08h (08) - файл только для чтения + 09h (09) - переполнение ROOT (корневого каталога) + 0Ah (10) - нет свободного места на диске + 0Bh (11) - каталог не пуст + 0Ch (12) - попытка удалить текущий каталог + 0Dh (13) - неизвестный формат + 0Eh (14) - невозможная операция + 0Fh (15) - каталог уже есть + 10h (16) - неверное имя + 11h (17) - неправильный EXE-файл + 12h (18) - не поддерживаемая версия EXE-файла + 13h (19) - ресурс не доступен + 14h (20) - нет готовности + 15h (21) - ошибка позиционирования + 16h (22) - сектор не найден + 17h (23) - ошибка CRC + 18h (24) - защита записи + 19h (25) - ошибка чтения + 1Ah (26) - ошибка записи + 1Bh (27) - общая ошибка + 1Ch (28) - зарезервирован + 1Dh (29) - зарезервирован + 1Eh (30) - недостаточно памяти + 1Fh (31) - несуществующий блок памяти + 20h (32) -- зарезервирован + +### Приложение Б. Таблица позиционных кодов + + ----------- ---------- ---------- ---------- ---------- ---------- + Key ASCII SCAN key ASCII SCAN + + ` 000h 000h V 056h 02Dh + + Esc 01Bh 001h B 042h 02Eh + + 1 031h 002h N 04Eh 02Fh + + 2 032h 003h M 04Dh 030h + + 3 033h 004h , 02Ch 031h + + 4 034h 005h . 02Eh 032h + + 5 035h 006h / 02Fh 033h + + 6 036h 007h RShift --- 034h + + 7 037h 008h \ 05Ch 035h + + 8 038h 009h LCtrl --- 036h + + 9 039h 00Ah LAlt --- 037h + + 0 030h 00Bh Space 020h 038h + + - 02Dh 00Ch RAlt --- 039h + + = 03Dh 00Dh RCtrl --- 03Ah + + BackSpace 008h 00Eh F1 000h 03Bh + + Tab 009h 00Fh F2 000h 03Ch + + Q 051h 010h F3 000h 03Dh + + W 057h 011h F4 000h 03Eh + + E 045h 012h F5 000h 03Fh + + R 052h 013h F6 000h 040h + + T 054h 014h F7 000h 041h + + Y 059h 015h F8 000h 042h + + U 055h 016h F9 000h 043h + + I 049h 017h F10 000h 044h + + O 04Fh 018h F11 000h 045h + + P 050h 019h F12 000h 046h + + [ 05Bh 01Ah PrScrn --- 047h + + ] 05Dh 01Bh ScrlLock 000h 048h + + CapsLock 000h 01Ch NumLock 000h 049h + + A 041h 01Dh / 02Fh 04Ah + + S 053h 01Eh * 02Ah 04Bh + + D 044h 01Fh - 02Dh 04Ch + + F 046h 020h + 02Bh 04Dh + + G 047h 021h Enter 00Dh 04Eh + + H 048h 022h Del . 000h 04Fh + + J 04Ah 023h Ins 0 000h 050h + + K 04Bh 024h End 1 000h 051h + + L 04Ch 025h Down 2 000h 052h + + ; 03Bh 026h PgDn 3 000h 053h + + ' 027h 027h Left 4 000h 054h + + Enter 00Dh 028h 5 000h 055h + + LShift --- 029h Right 6 000h 056h + + Z 05Ah 02Ah Home 7 000h 057h + + X 058h 02Bh Up 8 000h 058h + + C 043h 02Ch PgUp 9 000h 059h + ----------- ---------- ---------- ---------- ---------- ---------- + +### Приложение В. Байт атрибутов текстового экрана + + бит 7 - Признак мерцания символа + биты 6,5,4 - Цвет фона символа 8 цветов (0\...7) RGB + биты 3,2,1,0 - Цвет символа 16 цветов (0\...15) IRGB + +*Цвета для фона и для символа:* + + 0 0h 0000b - Чёрный + 1 1h 0001b - Синий + 2 2h 0010b - Зелёный + 3 3h 0011b - Голубой (циан) + 4 4h 0100b - Красный + 5 5h 0101b - Фиолетовый + 6 6h 0110b - Коричневый + 7 7h 0111b - Белый + +*Только для символа:* + + 8 8h 1000b - Серый + 9 9h 1001b - Ярко-синий + 10 Ah 1010b - Ярко-зелёный + 11 Bh 1011b - Ярко-голубой + 12 Ch 1100b - Ярко-красный + 13 Dh 1101b - Ярко-фиолетовый + 14 Eh 1110b - Жёлтый + 15 Fh 1111b - Ярко-белый + diff --git a/docs/Original/Estex DSS/Programmer manual.rtf b/docs/Original/Estex DSS/Programmer manual.rtf new file mode 100644 index 0000000..4d0cf42 --- /dev/null +++ b/docs/Original/Estex DSS/Programmer manual.rtf @@ -0,0 +1,7028 @@ +{\rtf1\ansi\ansicpg1251\uc1 \deff0\deflang1033\deflangfe1049{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Times;} +{\f5\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Helvetica;}{\f6\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Courier;}{\f7\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Geneva;} +{\f8\froman\fcharset0\fprq2{\*\panose 00000000000000000000}Tms Rmn;}{\f9\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Helv;}{\f10\froman\fcharset0\fprq2{\*\panose 00000000000000000000}MS Serif;} +{\f11\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}MS Sans Serif;}{\f12\froman\fcharset0\fprq2{\*\panose 00000000000000000000}New York;}{\f13\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}System;} +{\f14\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f15\fswiss\fcharset0\fprq3{\*\panose 020b0604030504040204}Tahoma;}{\f16\froman\fcharset238\fprq2 Times New Roman CE;}{\f17\froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f19\froman\fcharset161\fprq2 Times New Roman Greek;}{\f20\froman\fcharset162\fprq2 Times New Roman Tur;}{\f21\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f22\fswiss\fcharset238\fprq2 Arial CE;}{\f23\fswiss\fcharset204\fprq2 Arial Cyr;} +{\f25\fswiss\fcharset161\fprq2 Arial Greek;}{\f26\fswiss\fcharset162\fprq2 Arial Tur;}{\f27\fswiss\fcharset186\fprq2 Arial Baltic;}{\f28\fmodern\fcharset238\fprq1 Courier New CE;}{\f29\fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f31\fmodern\fcharset161\fprq1 Courier New Greek;}{\f32\fmodern\fcharset162\fprq1 Courier New Tur;}{\f33\fmodern\fcharset186\fprq1 Courier New Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; +\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; +\red192\green192\blue192;}{\stylesheet{\widctlpar\adjustright \fs20\lang1049\cgrid \snext0 Normal;}{\s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs28\lang1049\kerning28\cgrid \sbasedon0 \snext0 heading 1;}{\s2\sb240\sa60\keepn\widctlpar\adjustright +\b\i\f1\lang1049\cgrid \sbasedon0 \snext0 heading 2;}{\s3\sb240\sa60\keepn\widctlpar\adjustright \f1\lang1049\cgrid \sbasedon0 \snext0 heading 3;}{\s4\sb240\sa60\keepn\widctlpar\adjustright \b\f1\lang1049\cgrid \sbasedon0 \snext0 heading 4;}{\*\cs10 +\additive Default Paragraph Font;}{\s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext15 List;}{\s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext16 List 2;}{\s17\fi-360\li360\widctlpar +\jclisttab\tx360{\*\pn \pnlvlbody\ilvl0\ls1\pnrnot0\pndec }\ls1\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext17 \sautoupd List Bullet;}{\s18\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext18 \sautoupd List Bullet 2;}{ +\s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext19 Body Text;}{\s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext20 Body Text 2;}{\s21\li720\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext21 +Normal Indent;}{\s22\sb100\sa100\keepn\nowidctlpar\adjustright \b\fs20\lang1049\cgrid \sbasedon0 \snext0 H5;}{\*\cs23 \additive \b \sbasedon24 Strong;}{\*\cs24 \additive \'ce\'f1\'ed\'ee\'e2\'ed\'ee\'e9 \'f8\'f0\'e8\'f4\'f2;}{\s25\widctlpar +\tqc\tx4153\tqr\tx8306\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext25 header;}{\s26\widctlpar\tqc\tx4153\tqr\tx8306\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext26 footer;}{\*\cs27 \additive \sbasedon10 page number;}{ +\s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext28 Body Text 2;}{\s29\sb100\sa100\widctlpar\adjustright \f1\fs16\lang1049\cgrid \sbasedon0 \snext29 \'ce\'e1\'fb\'f7\'ed\'fb\'e9 (Web);}{\s30\widctlpar +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\adjustright \fs20\lang1049\cgrid \sbasedon0 \snext30 \'d1\'f2\'e0\'ed\'e4\'e0\'f0\'f2\'ed\'fb\'e9 HTML;}{\*\cs31 \additive +\strike\fs16\ulnone\cf2\animtext0\striked0 \sbasedon10 Hyperlink;}}{\*\listtable{\list\listtemplateid508877878\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fbias0 \fi-360\li643\jclisttab\tx643 }{\listname ;}\listid-125}{\list\listtemplateid1310068810\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \s17 +\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid-119}{\list\listtemplateid-1013577098{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li720 +\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fs20\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0 +\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 +\fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0 +\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers +;}\f14\fs20\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23 +\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid2045711580}}{\*\listoverridetable{\listoverride\listid-119\listoverridecount0\ls1} +{\listoverride\listid-125\listoverridecount0\ls2}{\listoverride\listid2045711580\listoverridecount0\ls3}}{\*\revtbl {Unknown;}}{\info{\title \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e9 DOS v1}{\author Parinov} +{\operator Alex}{\creatim\yr2002\mo10\dy3\hr10\min58}{\revtim\yr2002\mo10\dy3\hr10\min58}{\version2}{\edmins0}{\nofpages46}{\nofwords12039}{\nofchars68624}{\*\company *}{\nofcharsws84275}{\vern89}} +\paperw11906\paperh16838\margl709\margr849\margt851\margb709 \widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\viewkind1\viewscale75\pgbrdrhead\pgbrdrfoot \fet0\sectd +\psz9\linex0\headery709\footery709\colsx709\endnhere\sectdefaultcl {\header \pard\plain \s25\widctlpar\tqc\tx4153\tqr\tx8306\pvpara\phmrg\posxo\posy0\adjustright \fs20\lang1049\cgrid {\cs27\lang1033 +\par }\pard \s25\qc\fi360\ri360\widctlpar\tqc\tx4153\tqr\tx8306\adjustright {\lang1033 +\par }}{\footer \pard\plain \s26\qc\widctlpar\tqc\tx4153\tqr\tx8306\adjustright \fs20\lang1049\cgrid {\fs16\lang1033 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\b\fs72\lang1033 {\*\shppict +{\pict{\*\picprop\shplid1025{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'44\'3a\'5c\'d0\'e0\'e1\'ee\'f7\'e8\'e5\'5f\'e4\'ee\'ea\'f3\'ec\'e5\'ed\'f2\'fb\'5c\'53 +\'50\'52\'49\'4e\'54\'45\'52\'5c\'53\'70\'72\'69\'6e\'74\'65\'72\'20\'70\'69\'63\'74\'75\'72\'65\'73\'5c\'50\'65\'74\'65\'72\'73\'6c\'6f\'67\'6f\'2e\'6a\'70\'67}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn fillColor}{\sv 268435473}} +{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw2646\pich1244\picwgoal1500\pichgoal705\jpegblip\bliptag-769316105{\*\blipuid d2252af7b60351e8c90b792328f88abf} +ffd8ffe000104a46494600010100000100010000ffdb00430006040506050406060506070706080a100a0a09090a140e0f0c1017141818171416161a1d251f1a +1b231c1616202c20232627292a29191f2d302d283025282928ffdb0043010707070a080a130a0a13281a161a2828282828282828282828282828282828282828 +282828282828282828282828282828282828282828282828282828282828ffc0001108002f006403012200021101031101ffc4001f0000010501010101010100 +000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a10823 +42b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a +838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1 +f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b5110002010204040304070504040001027700 +0102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a43444546474849 +4a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4 +c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00faa6b98f11f88e7d2bc61e14d1e2822921 +d624b949646621a311c5bc151d0e4f1cd7387e2f69c1987fc231e32f94e3fe40f27f8d7927c50f8b82f7c75e1b96cb48d66c23d37ce24cf079574fe727944c48 +73ca8c919c8278a00f7af1bfc41f0d782a12daf6a51457057725ac7f3cd20f641cfe2703debc57c43fb426bfa840efe0ef0b4b1db12516eef15a4c907b2af00f +23232719af1abef0a6a979a84f348757bab899cb1967d32632cbe8587273edc81f4aef74ed593489960b5f0cff006b69d6f6b15adac7a9e9b3662c02d23ed1c6 +e7919989f40a3b50073bacf8ff00e286ae4fda752d5e04273e5da45f675fcd467f5ae4efa0f13ea059afc6b574cdc9333c9267f024d7af7fc25e3fe89de89ff8 +2a9ffc293fe12f1ff44eb43ffc14cffe1401e2bfd85aaf51a65e13ea6335243a4eb76f206b6b2d46171d1a256423f118af67ff0084c07fd13ad0ff00f0533ff8 +57a37c33b7d13c497535aeb1e0ff000fdbdd0b48ef636b583188dd9976488c331be549c1ea0e7b1a00f9cf4df12fc44d16332d96a5e248618c65b71795147a90 +db801f90aec7c35fb45f8bb4fd8baac361abdb8c65990c5263d99783f957d277bf0e7c2b71115874986c651f767b126de443ea1931fae47ad7cabf1bfc331683 +abdc61e392ea1ba16d2cc8a13ed2af179b1bb28181201956c601f91b0327201f40f81fe3bf84bc4b2456d792b68d7f210ab15e30f2d89e81641f2e7d8e0d7aba +32ba8642195864107208afcd82015dae010782319cd7a97c21f8c3aaf81eea2b2d49e4d47c3cec035bb31692dc7f7a227b0fee1e31d307a807dad4555d2b50b5 +d574db6bfd3a74b8b3b98c4b14a872194f20d140195f1035a7f0ef8275bd5e200cb6969249183d37e3e5cfe38af8d3c2da95ebe891dfcd752bdf5a49a8cd05c3 +b65a276b6dc594f63bc961e879183cd7da1e34d14788fc27abe8ecc17edb6b240ac7f858a900fe0706be31d0b45d52cfc33ad25c595c23698d7d0de3953b607f +20280c7b64f033d7b668027f833e1cb9d6f5c5785e55b9bb91aca19bab46a573713027bac67683fde957d2beb48fe1bf832389635f0c691b55428dd6ca4e07a9 +2327eb5f2e782fe20e93e104b79345bdbfb7992cd2d9d64d2d260a725e42ade68fbce727d42afa0aeb3fe17fcfff00419bbffc11a7ff001ea00eebe2adb7837c +1b6f00b5f0a787dee5e37b999e7b4052081300bb051924b32aa8ee49f4ae074ef10e9fa941e7699f0fb48bcb73cacb0f872e5d587b11c1acfd33c5769f103c7b +61697524ba94b70cd71325e40b04772f044c6dad55031c47bcb39c9f998fb0af31d77c67e27d4b51964d5759bf8e74255a0499e158083ca2c6080a063a60631d +e803da3fb457fe89969dff0084ddcff856c689e37d67408658f44f02c761148c19c5ae83751873d327039f4e6bc97479ede5d074e9db5dbcbdbe991cddacbe25 +5b130386202047524fca15b7670738c0c559f322ff009fbb9ffc2de1ff00e22803d6f50f89de34b9b578e2d1353b463fc569a0dc3cc47fb2652101f720fd0f4a +f11f1769de31f115d21ff84575e86ce17791166b792492491f1be595cafceed8519c000000000569f9b113817b7393ff0053bc3ffc453d594b2817571c9000ff +0084de1193e9f73f9d00717ff08578b3fe858d6bff0000a4ff000ac9d434fbdd2e7fb3ea7677567705432c57311462a4919c1c1ec467d41aeef59d57fb03508a +db59d2bc550c8ca24546f10964953230cacb190ca7d413f8572be37f12ddf8b7c4b79ad6a1fbb96e1808e30c596245185404f500739e32726803b9f867f19754 +f03f86ce8f0db2de40b3bcb1176ff56ad8ca8f6ce4fe345743f093e07a78bbc1d0eb5accb2da9b9918db27237420001b1ee7711ed8a2803eb3af21f8d3f08d7c +650cfa8e8171f61d6d94099379586f957eeaca071b876623d8f1823d7a8a00fce6d7b45d4bc3da9be9fae594f657c99fddcabb770f507a30ef91915409207dd6 +cf655e493e83d4f6afd13f11f87748f12d81b3d7b4eb6beb73d1664c953eaa7aa9f7041af15f137ecdba54d2fda7c2dacdde993ab0758e71e722b0e461b861cf +b9a00f1dbaf87d0f87e5b21abf88aeb4fd67ca8af0c369a45c4e6d9986e51e621c6f1c74c60d74f36b4d70449a8789adefae768469eefc0ef24ae00e3739196f +a9ad3d6fe1f7c6ad3771b6f135dea3129277c1ab3c6c7fe02e40fd6bce759f10fc46d11dd755d7b5db664c839d48b7fe82e6803b03a95b1393abe984ff00d886 +ff00e140d52dc0c0d5f4cc7fd884dfe15e75ff000b07c63ff435eb7ff81d27f8d58b1f1b78eb509d61b2f136b92ccdd145fb8cfe2580a00ef5b53b023fd2ef6c +2eed87facb78fc0cd13cabdd03f1b49e4672319ce78af201a56a534c52df4ad489773e5c7f65958e0f419dbd471cf7af60f0ff00863e34eb912cb69ac6a90c0f +8fdecface001eb85627f0c57a2f87fe1178e6600f89fe246aeb130c3c161732124771bdcf1f80a00f0af1659de68bf0fbc3fa0ebaac35e37d2dddbd893996d2d +9d546c65ea0bb8dc13a800f0335defc1ff008117babdc5beade35824b2d2d4878ec0fcb2dc77fde0fe05f6ea47a77f7ff06fc37f0bf8464371a569c1efdb97beba733dc39f52ed923f0c0aec280190c490431c50a2c7146a1511000140e0003b0a29f45007ffd9}}{\nonshppict +{\pict\picscalex100\picscaley99\piccropl0\piccropr0\piccropt0\piccropb0\picw2646\pich1244\picwgoal1500\pichgoal705\wmetafile8\bliptag-769316105{\*\blipuid d2252af7b60351e8c90b792328f88abf} +010009000003ce1b00000000ac1b000000000400000003010800050000000b0200000000050000000c022f0064000400000007010400ac1b0000430f2000cc00 +00002f006400000000002f0064000000000028000000640000002f00000001001800000000001437000000000000000000000000000000000000ffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6f6f6fffffffffffffefefef9f9f9fcfcfcffffffff +fffffffffffefefef4f4f4f7f7f7fbfbfbfcfcfcfffffffefefefffffffffffffffffffffffffefefefafafaf0f0f0e0e0e0bcbcbc9d9d9d8080806b6b6b5353 +533d3d3d2929291616162121212121212121212121212121212121212121212121212222221f1f1f1b1b1b1a1a1a242424414141666666828282808080afafaf +d5d5d5e7e7e7f9f9f9fffffffffffffefefefffffffffffffffffffffffffefefefffffffffffffffffffffffffbfbfbfffffffffffffffffff2f2f2f1f1f1ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffff7f7f7f7f7f7fffffffffffffffffffcfcfcfdfdfdf7f7f7fffffffffffffffffffffffff9f9f9 +fffffff8f8f8f8f8f8e1e1e1c9c9c9aeaeae8989896262623b3b3b1b1b1b1515150909090909091212121818182020202424241f1f1f23232323232323232323 +23232323232323232323232323232020202222222525252424242020201919191212120d0d0d1a1a1a1919191e1e1e3131314b4b4b646464919191c3c3c3dada +daf4f4f4fffffffffffffffffffbfbfbf9f9f9fcfcfcf9f9f9fffffffffffff7f7f7fcfcfcfffffffffffffefefeffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffdfdfdfffffffffffff6f6f6f1f1f1fcfcfcfffffffffffffafafafffffff8f8f8fffffffcfcfce5e5e5cdcdcd9494947070704c4c4c2626260b0b0b0000 +000707071a1a1a2222222626261e1e1e2020202323232020202222222323231d1d1d1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1717171a1a1a +1f1f1f2424242727272525252121211e1e1e2020201616161414142121211e1e1e0606060505052121213030305353537b7b7baaaaaadededef5f5f5f9f9f9ff +fffffffffffffffffbfbfbfefefefefefefbfbfbfbfbfbfdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f8f8f9f9f9fcfcfcffffffffffffffffff +fdfdfdfafafafdfdfdffffffebebebc2c2c27f7f7f4141412828280d0d0d0909090808081414142121212121212020202222221f1f1f1f1f1f1c1c1c21212123 +23231e1e1e2020202323231e1e1e2121212121212121212121212121212121212121212121212828282525252020201b1b1b1818181818181a1a1a1d1d1d2424 +242f2f2f2929291c1c1c1f1f1f2424241e1e1e1919190c0c0c1111110e0e0e1717173838386161619d9d9ddadadafdfdfdffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdfcfcfcfefefeffffffbbbbbb8484843d3d3d1414141212 +121212121111111e1e1e1414141313132020202a2a2a2222221919191717171515151d1d1d1c1c1c2121212121211b1b1b1e1e1e2222221c1c1c1b1b1b1b1b1b +1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1515151a1a1a2020202323232222221f1f1f1d1d1d1c1c1c1010101b1b1b1a1a1a1717172222222727271d1d1d14 +14141e1e1e2424242222221616160606060000000c0c0c272727616161b2b2b2f8f8f8fffffff4f4f4f9f9f9fffffffcfcfcffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffff9f9f9fffffffdfdfdf3f3f3ffffffffffffafafaf4747471e1e1e1212121717171d1d1d3030302424240a0a0a3434344242423737373838383b +3b3b3333333131313838383d3d3d3838383737373a3a3a3838383232323636363a3a3a3434343838383838383838383838383838383838383838383838383f3f +3f3d3d3d3939393636363535353535353737373939394242423a3a3a3131313636363d3d3d3636363131313b3b3b3d3d3d3333332f2f2f3737374646464d4d4d +3535351111110000000000002b2b2b8c8c8cdfdfdffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfffffff6f6f6a6a6 +a63b3b3b1010102020202929291d1d1d2525251818182121211b1b1b1b1b1b7f7f7ff8f8f8efefeff3f3f3fdfdfdfafafaf6f6f6f8f8f8f8f8f8f7f7f7f6f6f6 +f9f9f9f7f7f7f2f2f2f9f9f9fffffff9f9f9f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7fbfbfbf9f9f9f7f7f7f8f8f8fafafafcfcfcfbfbfbfa +fafaf0f0f0fafafaf7f7f7f2f2f2fafafafffffffbfbfbf8f8f8f2f2f2f9f9f9fefefef3f3f3ecececf9f9f9f0f0f0cbcbcb8888884848480909090000002d2d +2d797979cbcbcbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffbfbfbf6f6f6fefefefefefefffffffffffff9f9f9fdfdfdfafafaacacac4747470404040808082c2c2c1a1a1a2929291818182929292a +2a2a1e1e1e151515181818444444dededefafafa9494946262627373737878786b6b6b7979797272727f7f7f7474746e6e6e7171716f6f6f7373736c6c6c7373 +737373737373737373737373737474747575757575757171717272727272727373737373737373737373737373737e7e7e6b6b6b7575757474747b7b7b707070 +7676766d6d6d7070707e7e7e7373737a7a7a7474747c7c7c8b8b8bbdbdbdfdfdfdf4f4f48484841b1b1b1212120000001f1f1f727272d1d1d1fffffff4f4f4ff +fffffffffff7f7f7fffffffbfbfbfffffffefefefffffff5f5f5fffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfefefefffffffbfbfbfbfb +fbf7f7f7f6f6f6ffffffcdcdcd5c5c5c0e0e0e0f0f0f2222222323231f1f1f2727272828282626261c1c1c1b1b1b2323232626261c1c1c070707858585ffffff +8080800000000505050000000303030000000505050000000000000a0a0a0a0a0a00000000000009090901010101010101010101010101010101010100000000 +00000101010101010101010101010101010101010101010101010000000000000404040101010000000c0c0c0000001d1d1d0a0a0a0000000202020a0a0a0000 +000000000909091a1a1a2e2e2eb8b8b8ffffff7676761515153939391d1d1d0c0c0c292929848484f4f4f4fffffffefefef5f5f5fffffffffffffefefefafafa +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedededfffffff8f8f8ffffffffffff8a8a8a2525251717172929291e +1e1e1616162121211919192222221313132a2a2a1c1c1c1c1c1c222222242424262626000000292929e5e5e5eeeeeeb7b7b7b9b9b9b3b3b3c3c3c3a2a2a2b8b8 +b8b5b5b5b0b0b0b9b9b9b9b9b9b5b5b5bababaaeaeaeb8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b7b7b7b6b6b6b5b5b5b4b4b4b3b3b3b3b3b3b2b2b2b2b2b2b2b2b2 +b3b3b3b3b3b3a9a9a9bdbdbdb7b7b7aaaaaab8b8b8bbbbbba9a9a93333331717172b2b2b2727271c1c1c3131312b2b2b1e1e1e1e1e1e1e1e1e131313aaaaaaff +ffff3737371111110f0f0f202020101010151515565656c8c8c8f0f0f0fffffff2f2f2fffffffffffff7f7f7fefefefcfcfcffffffffffffffffffffffffffff +ffffffffffffffffffffffffffedededfffffffbfbfbfbfbfbefefef4b4b4b1f1f1f1e1e1e1414142222222424242626262e2e2e1f1f1f151515121212212121 +2020202424242121211c1c1c282828252525121212696969c5c5c5cacacac4c4c4b4b4b4bcbcbcc1c1c1b6b6b6c8c8c8d1d1d1d1d1d1c3c3c3c1c1c1cbcbcbbd +bdbdc2c2c2c3c3c3c3c3c3c4c4c4c4c4c4c3c3c3c2c2c2c2c2c2c6c6c6c5c5c5c4c4c4c3c3c3c3c3c3c3c3c3c4c4c4c4c4c4cfcfcfc5c5c5bcbcbcd1d1d1cccc +ccabababddddddcccccc2424241c1c1c161616141414323232202020151515161616101010121212323232e0e0e09393931717171919192323232626262b2b2b +000000191919bababaedededfffffffffffffffffffffffffffffffafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbf6f6f6fd +fdfdd9d9d93333332525251b1b1b2222221b1b1b1616162727272424241818182727272929292c2c2c1d1d1d2121212020202222222525251d1d1d2828282121 +210808080b0b0b0606062626261e1e1e0b0b0b1414141313130707070000000707070909090202020a0a0a090909060606060606070707080808080808080808 +0808080808080707070707070707070606060606060707070707070707070606061111110000000505050000001919190808088a8a8a6969690b0b0b15151533 +33331e1e1e0a0a0a2929291d1d1d1a1a1a1e1e1e0a0a0abcbcbcd8d8d80f0f0f2626261818181c1c1c262626171717222222121212868686f4f4f4fffffff4f4 +f4fefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2f2f2fdfdfdf6f6f6e4e4e43030300e0e0e1a1a1a1d1d1d121212242424 +1d1d1d2424242020201f1f1f2d2d2d1212122a2a2a1e1e1e2828281c1c1c1e1e1e2a2a2a1818181d1d1d1e1e1e2a2a2a2e2e2e2929292121211a1a1a27272716 +16161313133c3c3c4f4f4f5d5d5d6565656161616464646262626767676767676666666666666666666767676868686969696262626363636464646565656565 +65656565646464646464666666636363626262717171606060616161616161d8d8d84949491010101b1b1b2b2b2b1616161818182f2f2f181818212121232323 +131313bababaaeaeae2121211010102d2d2d2121211818183a3a3a1b1b1b1919190e0e0e5c5c5cecececfffffffffffff4f4f4fbfbfbffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffd9d9d91414140808081212121212123131312525252323232626262727271717170f0f0f1f1f1f2929291a1a +1a2020202828282222221e1e1e2121212020202222222d2d2d1b1b1b1313132323232020201f1f1f1e1e1e1d1d1d848484e3e3e3fffffff3f3f3ebebebe7e7e7 +e9e9e9eaeaeaecececeaeaeae8e8e8e6e6e6e5e5e5e5e5e5e7e7e7e8e8e8eaeaeaecececeeeeeef0f0f0f1f1f1f1f1f1efefefeeeeeeebebebf0f0f0f8f8f8ed +ededf9f9f9e9e9e9e3e3e37878780d0d0d2020201d1d1d1919191f1f1f2c2c2c212121181818303030000000595959ffffff5555552020201515152626262e2e +2e1f1f1f2525252222221414141a1a1a121212666666ebebebfffffffcfcfcfafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffdadada +2d2d2d2121219090909595953535350f0f0f2525251818182323231818181919192c2c2c2222221e1e1e2121212424241919192828282929291a1a1a27272725 +25251f1f1f1c1c1c1f1f1f232323292929121212161616cfcfcfffffffdedede6d6d6d2b2b2b4343435353534848483f3f3f4b4b4b4949494545454141413f3f +3f4040404141414242423e3e3e4040404444444747474848484747474545454444444545453f3f3f4b4b4b3e3e3e3f3f3f3e3e3e3e3e3e161616262626202020 +1d1d1d2f2f2f1e1e1e1d1d1d191919252525111111383838d1d1d1dddddd2f2f2f1919192121212121211a1a1a1b1b1b20202023232328282822222220202012 +1212808080f0f0f0fffffffdfdfdfffffff7f7f7fdfdfdfffffff8f8f8f9f9f9fffffffcfcfcfdfdfd5757570f0f0f8e8e8efffffffdfdfd8181811515151a1a +1a2626261818182929292a2a2a1d1d1d2828281919192222222222222222222222222222222222222222222222221f1f1f2727271c1c1c111111202020151515 +969696ffffffa9a9a91a1a1a0e0e0e1515151919191010102b2b2b0b0b0b2222221515150404041919191515150d0d0d1e1e1e11111118181818181818181818 +18181818181818181818181818181515151515151515151313131212121414141919191d1d1d2424241b1b1b1919192424242323231111111616163434347373 +73e3e3e3d4d4d45050500909092525252323232929291616162a2a2a2626262525252929290d0d0d242424131313111111abababfffffffffffffffffff8f8f8 +ffffffffffffffffffffffffffffffffffffa1a1a10202022121219f9f9f505050696969ababab1515152f2f2f0c0c0c1c1c1c0606061010101111111a1a1a0f +0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f1616160606060e0e0e2d2d2d161616313131edededdedede1919191111112828282626262626 +262222222222222020201616161f1f1f6d6d6dc3c3c3b7b7b7b5b5b5c5c5c5c1c1c1bdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbcbcbcbdbdbd +bdbdbdbbbbbbbabababbbbbbbfbfbfc2c2c2b6b6b6c1c1c1c7c7c7c7c7c7c1c1c1b7b7b7c1c1c1dadadadcdcdc9f9f9f4040401313131717172525250d0d0d1d +1d1d3131310f0f0f1919192f2f2f0f0f0f1818181c1c1c2929290d0d0d353535d5d5d5fffffffffffffbfbfbfffffff6f6f6fffffffffffffdfdfde4e4e43a3a +3a2020201313137373734b4b4b4949499090902222221010103b3b3b3636363d3d3d3b3b3b4444442a2a2a393939393939393939393939393939393939393939 +3939393939394343434343432929291f1f1f090909777777f2f2f27b7b7b1e1e1e2f2f2f2121211515152525253131311515152020202222223c3c3cf2f2f280 +80804545455353534f4f4f4444444747474747474747474747474747474747474747474747474949494949494a4a4a4949494747474848484949494b4b4b4c4c +4c4c4c4c4242423f3f3f4e4e4e5555554b4b4b4242422323230000001010103131310f0f0f1515151f1f1f2424241d1d1d2525251b1b1b2323232121212d2d2d +1c1c1c1d1d1d242424000000868686fefefefffffffffffffffffff4f4f4fffffffbfbfbfcfcfc9b9b9b1313131414142727278e8e8e4747474646469e9e9e0e +0e0e575757dcdcdcc4c4c4ccccccd5d5d5b9b9b9ccccccc8c8c8cbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbbcbcbcbebebededede7676761313 +13686868f9f9f96e6e6e0d0d0d1414143535352e2e2e0505051b1b1b2d2d2d2727270b0b0b535353f7f7f73131311010101a1a1a090909202020181818181818 +1818181818181818181818181818181818181919191a1a1a1a1a1a1a1a1a1919191818181818181818181313131f1f1f1c1c1c12121214141417171714141415 +15152222222a2a2a2626262020201d1d1d2e2e2e1d1d1d2020201010101a1a1a3434341818182121212020201d1d1d2828282121211a1a1a282828d7d7d7fefe +fefffffffbfbfbfafafafefefef8f8f8fafafa4848480c0c0c1d1d1d2c2c2c8484844e4e4e4a4a4a8f8f8f1818182e2e2eb2b2b27272724949494a4a4a3d3d3d +5555553f3f3f4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4444444242427f7f7fe2e2e2292929262626e8e8e89d9d9d0c0c0c2626261b1b1b01 +01012828282929291212122626262020201a1a1a9c9c9cf9f9f9cacacaaeaeaed3d3d3c8c8c8cdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcccc +cccccccccccccccccccccccccccccccccacacac9c9c9c6c6c6cdcdcdccccccc9c9c9cacacac8c8c8cbcbcbd6d6d6c2c2c2c0c0c0d3d3d3d9d9d9bbbbbbcacaca +d2d2d2dededebbbbbb2020201313131a1a1a2828283131312020201010101313132d2d2d040404989898fcfcfcfffffff7f7f7fffffffffffffafafae7e7e717 +17172020201414142121218080805050505656569595951616161a1a1a8181818080801313138f8f8fa8a8a8a0a0a0a9a9a9a2a2a2a2a2a2a2a2a2a2a2a2a2a2 +a2a2a2a2a2a2a2a2a2a2a5a5a58f8f8f030303b4b4b4919191010101a6a6a6ffffff6b6b6b2020201d1d1d2b2b2b2a2a2a2323232626261e1e1e070707252525 +1f1f1f3434343c3c3c4a4a4a5656563838384141414141414141414141414141414141414141414141414141414040403f3f3f3f3f3f4040404040403e3e3e3c +3c3c4a4a4a4242423939393d3d3d4848484545454040404646464b4b4b5757573c3c3c3737374a4a4a4c4c4c414141818181f9f9f99191911010102e2e2e2424 +240909092323231d1d1d2222222323231919194a4a4afcfcfcfffffffcfcfcfffffffffffffafafabcbcbc0f0f0f1010101818182525258585854a4a4a424242 +9191911e1e1e0f0f0f333333b0b0b0212121c0c0c0f4f4f4f9f9f9fffffffefefefefefefefefefefefefefefefefefefefefefefefeffffffffffff7070703c +3c3cececec1d1d1d363636cfcfcfffffff8e8e8e3636361d1d1d0d0d0d1818181313131919191b1b1b0e0e0e1515151010102020201717170a0a0a1313131111 +111111111111111111111111111111111111111111111313131212121010101111111212121313131111110f0f0f0f0f0f1a1a1a1d1d1d191919111111080808 +0c0c0c1e1e1e0a0a0a1212121818181616160707071212120e0e0e232323d4d4d4e1e1e12525250e0e0e2c2c2c1212122929292020202424241a1a1a23232316 +1616fdfdfdfffffffffffffcfcfcfffffff8f8f89696961717171f1f1f2929291f1f1f8484845252524848489f9f9f2222221919190808088d8d8d8282822e2e +2efdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9ffffffeaeaea212121a5a5a5a0a0a0000000343434adadadf9f9f9 +fafafacecece969696a6a6a68e8e8e9f9f9f999999a4a4a48a8a8aa2a2a28b8b8b9e9e9e9a9a9a99999999999999999999999999999999999999999999999999 +99999d9d9d9b9b9b9999999a9a9a9c9c9c9d9d9d9c9c9c9a9a9a9696969a9a9a969696969696a0a0a0a1a1a19b9b9b9a9a9a9797979a9a9a9797979999999999 +99a3a3a38b8b8b8d8d8df1f1f1f9f9f99999991111112020202727271515152a2a2a1414142e2e2e2626261e1e1efffffffffffffafafaffffffffffffffffff +8888881717171b1b1b1b1b1b2323238888885e5e5e4545459595951717172020201b1b1b363636c0c0c02d2d2d9b9b9bfbfbfbfffffffffffffffffffffffffb +fbfbf5f5f5fffffffffffff7f7f7fcfcfcffffffffffff808080434343d1d1d14040400606061010105353539e9e9ec7c7c7d5d5d5dededee3e3e3e3e3e3dddd +dddddddddddddddddddddddddddddddddddddddddddddadadad4d4d4ecececdbdbdbe1e1e1f0f0f0d0d0d0dfdfdfe1e1e1e5e5e5e6e6e6dddddddbdbdbdedede +dddddde7e7e7dadadae5e5e5dcdcdcdfdfdfdededee5e5e5d3d3d3d5d5d5dededededededededededededededededededededededededbdbdbbababac5c5c50e +0e0e1d1d1d1d1d1d1c1c1c2626261717171e1e1e1e1e1e252525fcfcfcfffffffffffffffffffefefefafafa9d9d9d1d1d1d2121211c1c1c2828288888884d4d +4d474747a2a2a22222222323231616160909098e8e8e7d7d7d414141eeeeeefffffffdfdfdf0f0f0f5f5f5fffffffffffffffffffefefefffffffbfbfbffffff +ffffffeaeaea1d1d1d8989898484840404040c0c0c0909090303030303031010101d1d1d1c1c1c1212121b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b +1b1b1e1e1e1d1d1d2121211b1b1b1c1c1c1a1a1a1212121f1f1f1414141818181212121818181414141e1e1e3636362323232828282323232323233535352828 +283a3a3a2323233838382c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c1c1c1c2a2a2a2929291919192a2a2a1e1e1e1d1d1d2525252727271c1c1c +222222212121fcfcfcfffffffffffffffffffcfcfcfbfbfbbababa1a1a1a1c1c1c1616161818188f8f8f4e4e4e464646a8a8a81e1e1e2525251e1e1e1818183d +3d3dc4c4c41e1e1ea4a4a4f5f5f5fffffffffffffffffffffffffafafafbfbfbfffffffffffffefefefffffffdfdfdffffff6f6f6f404040adadad8383838282 +827676766a6a6a6b6b6b7272727575756e6e6e6565656e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e7878787070705b5b5b6767677575756c6c6c +6b6b6b6666667474746b6b6b7272727070707d7d7d6363631b1b1b1414141717170d0d0d0909091919191919190d0d0d30303016161617171717171717171717 +17171717171717171717171717171212122828280707071d1d1d2020201f1f1f1c1c1c1b1b1b2727271a1a1a2222221e1e1efffffffcfcfcffffffffffffffff +ffffffffd7d7d72020201414142222221515159292925c5c5c4040409a9a9a2323231d1d1d1e1e1e272727131313a5a5a5797979424242f5f5f5f0f0f0fefefe +fffffffafafafdfdfdfffffffdfdfdf6f6f6fefefeffffffffffffefefefe3e3e33737374b4b4b7575757d7d7d7878787676767878787575757171717575757d +7d7d6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6b6b6b7474746c6c6c6f6f6f6f6f6f6464646868686d6d6d6464646b6b6b6565657c7c7c8686 +86a2a2a2c9c9c9a1a1a14040402424242323231515151e1e1e1616161a1a1a1515151f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f2323231b1b1b +2727271b1b1b2f2f2f3737372222222828281f1f1f1f1f1f1c1c1c3f3f3ffffffffbfbfbfffffffefefefcfcfcfffffff3f3f35555550c0c0c2d2d2d1313139b +9b9b5b5b5b303030b1b1b1151515252525262626161616222222414141c1c1c1222222a7a7a7fffffffffffff3f3f3fafafafffffffffffff9f9f9ffffffffff +fffffffffefefefdfdfdfefefeb4b4b47171717272727676766a6a6a646464676767696969656565646464686868707070707070707070707070707070707070 +7070707070706f6f6f7171717575756f6f6f7777777e7e7e7676767c7c7c8686866c6c6c6e6e6e6161614f4f4f2e2e2e323232969696e3e3e395959517171712 +12122929292828282323232b2b2b1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f3333330f0f0f2f2f2f1c1c1c2d2d2d2222220707071c1c1c2525 +251c1c1c1616168b8b8bfffffffffffffffffffffffff4f4f4ffffffffffffababab0c0c0c1010101d1d1d8282826060604e4e4ea2a2a21a1a1a181818212121 +1d1d1d202020141414a0a0a07c7c7c282828f1f1f1fffffffffffff9f9f9fdfdfdfbfbfbf9f9f9fffffffdfdfdfefefefafafafffffff3f3f3ffffffffffffed +ededf9f9f9f7f7f7fcfcfcfffffffffffffffffffffffffffffffdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfffffffffffffffffff8f8f8fefe +fefffffff3f3f3f8f8f8f8f8f8fffffffffffffffffffcfcfcd3d3d3959595282828363636c0c0c0b9b9b92525251616161c1c1c151515171717232323232323 +2323232323232323232323232323232323231c1c1c1b1b1b1a1a1a1919191b1b1b2525252a2a2a2e2e2e2727270b0b0b272727d1d1d1ffffffffffffffffffff +fffff4f4f4ffffffffffffeaeaea565656000000303030c7c7c73636360c0c0cf2f2f23e3e3e1313131212122424241313131e1e1e545454d7d7d73232327f7f +7fc5c5c5e2e2e2d2d2d2d5d5d5dbdbdbd1d1d1cccccccfcfcfd6d6d6d6d6d6d2d2d2d1d1d1c4c4c4d7d7d7dadadad2d2d2d4d4d4d5d5d5d3d3d3cfcfcfcfcfcf +d4d4d4dbdbdbd7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d2d2d2dddddde4e4e4fefefefffffff5f5f5fcfcfcfffffff8f8f8fffffffffffff4 +f4f4fffffffffffff2f2f2eeeeee676767181818bfbfbfa5a5a50a0a0a1414142b2b2b3131312121212121212121212121212121212121212121212121211010 +102c2c2c2323232525251c1c1c2626262f2f2f1313131f1f1f0f0f0f757575f8f8f8fffffffdfdfdfcfcfcfffffffcfcfcfffffff8f8f8fefefeafafaf232323 +b5b5b5a2a2a2272727191919787878f5f5f55555552929291b1b1b262626181818161616bebebe9191911919193434342e2e2e2020202e2e2e33333327272729 +29292e2e2e2929292020201c1c1c3030302c2c2c2323232a2a2a2727272929292a2a2a2b2b2b2d2d2d2e2e2e2b2b2b2525252a2a2a2a2a2a2a2a2a2a2a2a2a2a +2a2a2a2a2a2a2a2a2a2a2626261d1d1d1a1a1a8d8d8df1f1f1fefefefffffff5f5f5fffffffdfdfdf9f9f9fffffffffffffcfcfcfffffffffffffdfdfd7b7b7b +252525e1e1e14343431111112121211818182222222222222222222222222222222222222222222222222626261d1d1d2323232323232626261a1a1a26262620 +20201a1a1a2a2a2ad1d1d1ffffffdcdcdccececec6c6c6cdcdcdd3d3d3d0d0d0cdcdcdcececec9c9c9b3b3b3a3a3a32d2d2d1111111f1f1f272727777777b3b3 +b3afafafa1a1a19d9d9d919191979797bebebecccccc9b9b9b9b9b9b9191918e8e8e9999999292929c9c9c969696979797979797979797979797979797979797 +979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797949494acacac8a8a8a18 +1818c9c9c9f8f8f8fffffff9f9f9fefefefbfbfbfffffffffffffbfbfbfffffffffffff3f3f3f8f8f8ffffff3838389494948888880808082020202424242323 +232121212121212323232020201d1d1d2121212727271e1e1e2323231e1e1e2121211717171b1b1b2424242121210a0a0aaeaeaefbfbfbfafafa1f1f1f121212 +0c0c0c1111111717171414141212121313131f1f1f1010100e0e0e2222222929291c1c1c1d1d1d0101011212121d1d1d3232322424243333333434340909091e +1e1e1616161f1f1f1c1c1c2a2a2a3232322525252828282f2f2f2626262626262626262626262626262626262626262626262424242424242424242424242424 +242424242424242424242424242424242424242424242424242424242424242424240c0c0c959595ffffff6161616d6d6dfffffff1f1f1ffffffffffffffffff +f1f1f1f8f8f8fffffff5f5f5ebebebfffffff9f9f9fafafa828282515151a7a7a70f0f0f1717172424242626262323232121212222222020201c1c1c1a1a1a1d +1d1d1919192020202626261d1d1d232323151515222222111111818181e6e6e6ffffffffffff6666665c5c5c5656565b5b5b5f5f5f5d5d5d5b5b5b5c5c5c4949 +494d4d4d3333330202021b1b1b3a3a3a1010102828285757575f5f5f4f4f4f5757574b4b4b4d4d4d717171565656696969616161616161545454565656585858 +4e4e4e5454545a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a59595959595959595959595959595959595959595959595959595959595959595959 +59595959595959595959595959595b5b5b949494cccccc262626aaaaaafffffffffffff3f3f3fffffff9f9f9fffffffffffff4f4f4fffffffffffff5f5f5ffff +fffdfdfd535353757575ababab0909093b3b3b1111112222222020202020202323232525252222222121212121212d2d2d1e1e1e242424252525272727313131 +000000565656e6e6e6fffffffffffffffffffffffffffffffbfbfbfefefefffffffffffffefefefffffffffffff2f2f2c3c3c35151511b1b1b222222242424c2 +c2c2c1c1c1555555444444606060585858555555515151454545c5c5c5d2d2d24e4e4e5656564747474848484e4e4e4a4a4a4747474747474747474747474747 +474747474747474747474646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646464c4c4c4b4b4b +242424454545e8e8e8f7f7f7fffffff5f5f5fefefefdfdfdf5f5f5f8f8f8fffffffefefef6f6f6fefefefcfcfcc6c6c61f1f1fa9a9a96161610101012121211b +1b1b1c1c1c1d1d1d2020202323232323232424242525252727271313131f1f1f1515151e1e1e2b2b2b000000656565e6e6e6fffffffefefefafafafcfcfcffff +fffdfdfdfbfbfbfcfcfcfefefefdfdfdfdfdfdfefefef4f4f4ffffffffffffdcdcdc2626260404049a9a9ad1d1d12020201414141c1c1c1a1a1a171717131313 +0c0c0c1e1e1e656565e5e5e50c0c0c3d3d3d7b7b7b6a6a6a7d7d7d67676773737373737373737373737373737373737373737373737371717171717171717171 +71717171717171717171717171717272727272727272727272727272727272727272727272726363636d6d6d7d7d7de7e7e7f6f6f6fffffff6f6f6fffffff9f9 +f9fffffffffffffffffffefefefbfbfbfafafaffffffc8c8c82323236b6b6bd7d7d72020203737371a1a1a2727271d1d1d2121212323232121211d1d1d1d1d1d +2020202424241b1b1b3030301414141c1c1c040404757575f6f6f6fffffffffffff9f9f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffff0f0f0ffffff4c4c4c313131cdcdcd3d3d3d0808082929291f1f1f2222221d1d1d1f1f1f3434340e0e0e181818c6c6c68989892d2d2defef +effffffffffffffbfbfbfefefefefefefefefefefefefefefefefefefefefefefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffcfcfcfbfbfbfffffffffffffffffffdfdfdfbfbfbfafafafffffff3f3f3f8f8f8fbfbfbfefefeffffffdfdfdf81 +81812b2b2b686868e8e8e83030301e1e1e0f0f0f2d2d2d1818181e1e1e2323232525252323232020202121212323232424242d2d2d1212121e1e1e121212a4a4 +a4fffffffafafafbfbfbfefefefafafafffffffffffffafafafcfcfcfdfdfdfcfcfcfafafafbfbfbfcfcfcfdfdfdfdfdfdfcfcfcfbfbfbffffff5e5e5e222222 +dbdbdbb1b1b14747470404041e1e1e3232322222221d1d1d1818183535351a1a1a696969e3e3e3202020969696d1d1d1d7d7d7d7d7d7d5d5d5d5d5d5d5d5d5d5 +d5d5d5d5d5d5d5d5d5d5d5d5d5d5d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9dede +deeaeaeacdcdcdc7c7c7d5d5d5d0d0d0d5d5d5d6d6d6d5d5d5e4e4e4dbdbdbcbcbcbaeaeae6464643030303e3e3ea0a0a0b5b5b54a4a4a262626272727232323 +2626262020201e1e1e2121212323232323232626262828282323231c1c1c242424000000363636d1d1d1f6f6f6f5f5f5fffffffffffffcfcfcf8f8f8fffffffc +fcfcfefefefffffffffffffffffffffffffffffffffffffffffffbfbfbfffffffbfbfbf7f7f75858581c1c1cfbfbfbfdfdfdcdcdcd7e7e7e1010100000002727 +272727271d1d1d1a1a1a1d1d1d222222d3d3d39b9b9b3131314f4f4f414141424242454545454545454545454545454545454545454545454545424242424242 +4242424242424242424242424242424242424343434343434343434343434343434343434343434343434444442c2c2c5252523b3b3b35353544444454545446 +46464141413838383f3f3f464646474747636363989898bcbcbc9696964141411515151616162121212929291e1e1e1e1e1e2222222121211f1f1f1f1f1f2424 +242323231515150505051c1c1c9a9a9ae0e0e0eeeeeefffffffffffff5f5f5fefefefffffffbfbfbfffffffdfdfdffffffffffffffffffffffffffffffffffff +fffffffffffffbfbfbfffffffffffff4f4f45050502e2e2ee0e0e0ffffffffffffffffffc3c3c35252520c0c0c1111112121211919192e2e2e181818545454bb +bbbb7e7e7e8383837373737979797878787b7b7b7e7e7e7d7d7d7b7b7b7979797676767474747676767b7b7b7c7c7c7979797878787d7d7d8282828282827878 +787979797b7b7b7d7d7d7d7d7d7c7c7c7b7b7b7a7a7a7e7e7e7d7d7d7c7c7c7c7c7c7d7d7d7d7d7d7c7c7c7a7a7a7575758383837f7f7f797979959595aeaeae +8181813838380505051b1b1b2626262323232424242323232020202222221919191a1a1a151515262626282828000000131313767676d0d0d0eeeeeeffffffff +fffffafafafffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfcfcfbfbfbffffff5656 +56272727f4f4f4fffffffefefefafafafffffffbfbfbbdbdbd5d5d5d1f1f1f1212120d0d0d2323231c1c1c2020202e2e2e3c3c3c1d1d1d2c2c2c3030302f2f2f +2b2b2b2828282828282c2c2c3232323636363030303535353737373434343232322f2f2f29292922222230303030303031313132323233333333333333333333 +33333030302f2f2f2c2c2c2a2a2a2a2a2a2e2e2e3434343939393535352e2e2e3030303636362727270e0e0e0c0c0c1e1e1e2323232020201414141414142323 +232828281e1e1e1616161b1b1b3d3d3d2626260000002020206e6e6ebfbfbffdfdfdf4f4f4fffffffffffffffffffafafafffffffffffffefefeffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef4f4f4ffffff5b5b5b1c1c1cf4f4f4f3f3f3ffffffffffffffffffed +ededffffffffffffc4c4c46161612424241111111616160909091919191b1b1b2121212525251717171818181c1c1c1f1f1f2020202020201e1e1e1e1e1e1717 +171717171616161616161a1a1a1f1f1f2020201e1e1e1a1a1a1a1a1a1919191818181818181818181919191919192020202121212020201d1d1d181818151515 +1414141515150f0f0f1010101111111414141b1b1b2121212020201b1b1b2222222525252222222222222525252020201b1b1b2121210f0f0f1616163434347d +7d7dd2d2d2fbfbfbfefefefffffffffffffffffffffffffcfcfcfcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffdfdfdfffffffffffffdfdfd4545450d0d0de4e4e4fffffffffffff8f8f8fbfbfbfffffffffffff7f7f7f8f8f8ffffffe7e7e7757575 +5757573535351717170c0c0c2121210606062323232222222222222424242323231d1d1d1818181717172929292727272323232020201f1f1f21212122222222 +22222424242424242323232222222121211f1f1f1e1e1e1d1d1d1c1c1c1d1d1d1f1f1f2121212222222323232323232323232a2a2a2828282828282727271f1f +1f1818181e1e1e2a2a2a1717172020202121211a1a1a0f0f0f080808171717353535616161909090d5d5d5fffffffffffff7f7f7f7f7f7fffffffefefefbfbfb +fafafafefefefffffffffffffffffffefefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffafafafffffffffffffe +fefe9d9d9d838383f3f3f3fffffffffffffdfdfdfcfcfcfffffffffffffffffffdfdfdf8f8f8f8f8f8fefefeffffffc9c9c99090905a5a5a3030301919190b0b +0b0b0b0b1010101c1c1c2424242525252626262828281616161a1a1a2222222727272828282424242020201e1e1e212121222222242424242424232323222222 +1f1f1f1e1e1e2d2d2d2727272121211e1e1e1f1f1f2121212020201f1f1f1d1d1d1a1a1a1818181c1c1c2424242929292323231a1a1a1a1a1a1414140c0c0c16 +1616373737616161979797c7c7c7fcfcfcfffffffffffffffffff7f7f7fffffffffffffcfcfcfffffffffffffffffffffffffffffffffffffdfdfdffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbfdfdfdfffffffffffffffffffffffff0f0f0fffffffefefe +fffffffffffffdfdfdfafafafffffffffffffefefefffffffffffff4f4f4ffffffffffffc5c5c5ababab7474745555552f2f2f1414140606060606061111111f +1f1f2323232121212121212323232222221e1e1e1b1b1b1b1b1b1d1d1d1e1e1e2020202222222323232323232323232222221a1a1a1a1a1a1c1c1c2020202323 +232323232020201d1d1d1818182c2c2c2f2f2f171717030303070707111111131313353535555555828282b6b6b6e4e4e4f8f8f8fffffffffffffffffff7f7f7 +f9f9f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffdfdfdfffffffbfbfbf1f1f1f8f8f8fffffffffffffdfdfdfffffffffffffdfdfdfbfbfbfffffffffffffbfbfbffff +fff6f6f6f9f9f9f6f6f6fffffffffffffffffffdfdfdfbfbfbeaeaead4d4d4bbbbbb9595956464643c3c3c2828282020201313130808080a0a0a121212181818 +1c1c1c1f1f1f1c1c1c1c1c1c1b1b1b1b1b1b1c1c1c1e1e1e2020202121212525252727272727272222221818181111110e0e0e0e0e0e1c1c1c0707070b0b0b32 +32325a5a5a767676999999bcbcbcd0d0d0e9e9e9fcfcfcfffffffffffffffffff9f9f9fbfbfbfffffffffffffefefef3f3f3f7f7f7fffffffffffffdfdfdfcfc +fcfdfdfdfbfbfbfafafafcfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f9f9 +fffffffffffffffffffffffffffffff8f8f8fffffffcfcfcf9f9f9fbfbfbfffffffffffffffffffefefefffffffffffffffffffafafafffffffdfdfdfefefeff +fffffffffffbfbfbfcfcfcfffffffffffff9f9f9eeeeeeebebebd7d7d7b9b9b99696967d7d7d6969694f4f4f3333332222222626262323231f1f1f1b1b1b1b1b +1b1c1c1c2020202222221414141a1a1a1f1f1f2424242f2f2f4949496c6c6c868686959595b9b9b9dadadae6e6e6efefeffdfdfdfffffffffffffafafaffffff +fffffffafafafbfbfbfefefefefefefffffff8f8f8fffffffffffffffffffffffffdfdfdfafafafffffffffffffffffffffffffdfdfdfffffffffffffffffff7f7f7ffffffffffffffffffffffff0400000007010100030000000000}} +\par }\pard \qc\widctlpar\adjustright {\b\fs72\lang1033 +\par +\par }{\b\fs36\lang1033 {\*\shppict{\pict{\*\picprop\shplid1026{\sp{\sn shapeType}{\sv 75}}{\sp{\sn fFlipH}{\sv 0}}{\sp{\sn fFlipV}{\sv 0}}{\sp{\sn pibName}{\sv \'44\'3a\'5c\'d0\'e0\'e1\'ee\'f7\'e8\'e5\'5f\'e4\'ee\'ea\'f3\'ec\'e5\'ed\'f2\'fb\'5c\'53 +\'50\'52\'49\'4e\'54\'45\'52\'5c\'53\'70\'72\'69\'6e\'74\'65\'72\'20\'70\'69\'63\'74\'75\'72\'65\'73\'5c\'53\'70\'72\'69\'6e\'74\'65\'72\'5f\'6c\'6f\'67\'6f\'2e\'74\'69\'66}}{\sp{\sn pibFlags}{\sv 2}}{\sp{\sn pictureGray}{\sv 1}} +{\sp{\sn pictureBiLevel}{\sv 0}}{\sp{\sn fillColor}{\sv 268435473}}{\sp{\sn fFilled}{\sv 0}}{\sp{\sn fLine}{\sv 0}}}\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0 +\picw10583\pich5027\picwgoal6000\pichgoal2850\pngblip\bliptag1887078077{\*\blipuid 707a86bd44206243c41e357a6f4bf32f}89504e470d0a1a0a0000000d4948445200000190000000be0802000000940cce690000000467414d410000b1889598f4a60000200049444154789cecdc69901c +f579c7f1dfbf8fe939f6d01eac565a091dab954048e8408e0c81e208a7c10eb643b0e3c490544c552e27850bbb48d9a9bc482595e29d53e594e18de31c65bbec +1003c10611288491142124a173a55dedcede3b3bf7d9e7ffffe4c5aef08a43415aedcef6eaf9bc9156aa9d7ebaa7e73b3d3d3d2388088c3116065abd07608cb1 +4f8a83c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c642 +8383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c64283 +83c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383 +c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d0e06031c6428383c5 +180b0d0e16632c3438588cb1d0e06031c6428383c5180b0d0e16632c3438588cb1d030ea3d005b0a6c1f87c6f05f87fcea64feeb0f5a9bd735d77b22b634f111 +16bb02fa0a783b85916ced64eff0c163234aa97a4fc496260e16bb020e8f60701cc9fef4a913c73ca72ca5acf7446c69e260b12be0e400ce9cc540d22964c6d6 +ae880b21ea3d115b9a3858ec0a383d844c06e5b2addcd40d1b3a0c83cf8db279c1c16273954ca35c41b5624b27bb696d5b2c6ad57b22b66471b0d85cf5a7e006 +f09c2abcfc969e4e3ebc62f38783c5e6aa3f8540c2771df28a5b37ae3439586cde70b0d85c9d9b02019e1f905fde76fd2ac334eb3d115bb238586c4e8868300d +5d872f350aaa5b36aee097846cfe70b0d89c642ba84998a6f283a0a3256e57b27c4d039b3f1c2c3627c379118b434121b01be3faa1a3bdf59e882d651c2c3627 +a31544e3703c08559bc8da4319ddf7fd7a0fc5962c0e169b939403a9902f4223d745b300150a857a0fc5962c0e16bb7cffbe1f7d39a4d3c81785a9294d377ff0 +b37d159b3ff9cce60b078b5d0e228c64e9a444d5c1b921d45c52d64a2dd234e55d7bf2bd83f59e8e2d591c2c76c96a2ede1ac0b303c2b671ba17993c48911451 +33dae41bad4fff207be0e07bf59e912d4d8288ea3d030b8d5c59bd334847f27a25825a15274fe09df7a858252232a96279c3b0477ccfbd6b0bfded1f6dd8b9fd +065dd7eb3d325b5238580c4424a5f47d4f4a397b77100202625aa5527ea53771a4d2803834423e87f78ea32f49151b52418034041194626a520bca81942d46f6 +89fbcc2fdcd57d4d4787aeeb02c0cce5590b70951681400011e9ba6e5996c917df2f151cacab5db6865353d8d78f5303c8e5e1b9fef4f7856a9aa6e986658958 +1cd10658cd8858208253c5c933181842a1a2fc40a8f3bb8f0069f02dadda28d2a62685a6e94634662161699615334c4bd70da169c0bc5f58aa9492816fd7cac5 +dc64544d7efd8bd7fece3d1b9b1af83b249602fe14c5d5ee27479105266d0c6490cfc3f7cdd94f6104488222488940c2f5e0fae4072415145d101e8290301dd5 +e893a5c3d5856f04a848b3e05ba617310c53d3b030d7c013410611dff1ed7ccd2ba45efb55f1b1dfdeb2100b66f38f8375554b1564eff1c2c15385e4e854a1a6 +4925881466154b0042902684a6ebc288c268545a13441c300534fac0eb3b524481948ef44b08ca500e484dbf181400b060c7f244d2273763d6ce6c5c29eedcf9 +295de34f0b2d111cacab5a638c7eef3703b39cccf61ecd8e8cfb9e0ba25f9745688006cd846e418f0b33a1471acd785b34b1ca8faef745a38271be59249427fc +1c4a27297f84bc02822ad4ec5b13e78faf2eaf1d9ffcb7085020658a60ddeaa6c71ebaed8b9ff98dcb5a225b8cf81cd6d58e886ab55a3a9dcee7729ee75df07f +e74fbaeb869ece16fee3c5c32f1ca855c42aaba14d6f58e347d6786894300429a16cd492943d40a5337033a6cadcb2b5fdf7bf70c7f5d76dd0a63b252ef794fb +f9dfbbc82fd2fb7fd2af7fd475bdadad6dc58a15f178fc5297c93ee0b5d73ef82f1b36a0bf1f77df3df3e3d1a300b07dfbbc4fb21482359647328bb11c863318 +c9c2f5904c235d42f0a12baee311742f473c82a881ee0e6a4d049dcd6a578fd9d2c0d7a3fdff822078f995d79f7e6eb43fdb186f6ca3d8b5b6e8086041da289f +a2cc7e2af70b67ec2b9fd9f8e49ffdc1961b36f37b734bc633cf00c09e3d0070cf3d33fff8cd6f62cf9e9966b5b662d72ebcfaeabc4f12d660a52b3890447f06 +27a750711004083cf81ea404cdead4473e2f2b852080e7c1b561db9eebd4d6b6fb0fec346edf6a6d5b1f33743edf71317bdf7cf3f37f9772a9c9b2a28eb9ca55 +512af7a9f45ed446e2c1d04b3ffc9bdb6ebd79697c25d66411bf7cd7ffe14b67feeae1e6076ee9328dabfd596d3a5b4f3d35f3f7fe7e00f8fef7f1dc73387408 +83830b11ac90ed58bec2b149bc3d8c13695080c087ef42ba70aa4865502aa3e6c00b54204911d4ecb33142681a0c5d444c6199884610331131a0c5cc88119f2c +fbfffc8afddd9fa7ae5fe93d76cfb22fddb5bcae6bb9a8ddb863d767b7fecb8fdf85439e2a1f86efa8d280b0c7bb9acb6ffce47b1b7a7aea3de09c28c2581107 +92d83780e3e754f26cce4e8db4249ab8561fb66103f6ec4132893d7bf0c82378eeb9855868688225098305bc3c88a1123c1b7e0db90c86c791caa05455ae4f52 +098200290105920201488ae9f31a42001a844ec22061d0f4cf1a999a8a452811a14444442386a0e8f121efc9ef0dffec8df16f7f75ddb69e65f55ee9c5a8216e +3dfcd0dd3f3db8df0b02e51595938597dbb9a9e9bbdf793cbcb5f224860a38388ae353c8d5e07b2866514c578ba9b33dad4e633c340f9305f6b5afe18927b063 +075a5a166889e1b8274a2ef6a5f0ce144a656426d1770ec91194aae4fa24150800491194353725aa43648f20a84cbf3d3f731a161a345dd32ddd8c69b14e9158 +a7229d120957e94e204ab632342da28b84a122a6257df39583d952b9fcedc737ddb69d0fb53ec8308ccea6e0ce1b23af1e71497a249d845efdfcbdbb77efde5d +efd12ec754156f8fe3580e551f6e0db5328a798c8e6364ccaf64534e6162fd0df1c644a4de632e528f3c826f7d0bcf3e3bf3f27001842058aec47f0fa3b78062 +0e478ea2f71c8a65f22529122008929a2cc31ea1fc61654f742cd3bbbb9bb6f6ac59bda2d98ae8004d5f4bd43f921f9daa9d19ae8e6587949335131d7a625d60 +2c97222e499752f3a45ef5cc8888c4e0eb46e9cdc3539dcdaaa325b269cd423d7784c7a7776d7e71d7e67a4f71654c54316cc323d8259ce9c5b921e48a64bba4 +a4128e27bd5af7aacec644b4de632e5e0303003858b3bcdc875359647378f32d0c8d93ed41110001228140c8126ac9477795eedfbdf3ee9bd775b6376a17bd4a +f0f460ee8d4393fff4d3c189fc59cdaa054667a0254818048da0b914f5a8cbd41451eadf5e3cfe5b37b5ae5ede108ff2bb5d4b96ad50a8223b8937f76174921c +6ffadc0234824e024a76af6e6b48f0c77a168b45fd2e2101b90afee205583ade3d8abe2172fd59974b93d2542d46e997bed374c7cef64bb859422a6f7feea9b7 +4f0d5695de20f5668241334bd4214c521e4a27357be84bf7acf9d767be7ca5578b2d1692b077143f3a84bdfb901cbb60ef12e419de78acbcffe7cfdc7ec7aeae +7a4ec96659d44758151baf1e476a04be87c929f892667d168404e4b2b87cfcf6864baa150021704d73f41ffff4c6dffdeb5f95ca632a1820e591f24949900449 +5201a4ab824a5fbfaa549d862bfa8a402ae4aae84b61b280aa03452005256119aa7bb9ea68c6face05ba536c1f03698ce6902e424a48094b97eb3b544733ba57 +2ca2834ac747328b741923192805a5400439bdc53ae6b4c52a1ec6d2387602632978c1ecbd0b02027aac67d396a6c62b76dda9ed239941ba84e1eccc5a00c0f9 +7559d3a61aa2b47dfd826e79dbc7b9298ce6902e414ac8802c43765fa33a96a17bc5623c73b7a883e5077264dc191b0a14f4c0d341115cb04ba1549593791acb +b85ded9776d0aeeba2b5c9baeba68ee7ffa7a0029ba443d26b8a6bebbb1aaf69b1a002280f3271cbceb58562f9e382952ce0f9d3d83f804216a5025c0732800c +10f8d2f7bd6d6bd5939f8bdcb67966ff1bcee3e030060a18caa35483e7c2f710f8080204017c1faea3d935726c376e963ed54df76e37775f17eb6abf84dd7730 +8fe74fe3c0e085f34828052569c73afce583e2e68df025fa3378bd1fc7265076e07b701db80e9c1a2a6555cce54bb989b658f5a14f377fe5be55db7b9aa76f7c +bc8ad7467074124e159512aa653836ec1aca452f3b95ca8cf7dd7da3f8873fb971d3bab68f1b6f7a731d48a29045290fd741104006f03de9b9f6f635ea1b0f47 +6fbb61e641527470660ac727717a0aa9329444e05fb0c53c0faea3393639b6d31a2f6f5b236fde64dcb53dded57eb187d9e149bcd08faa8065427a48a770e224 +7a07a8e6d2073fcb2d34d21b7aa7dc7b9f4e468c61dd4a082de2b94eb5946e8fe6bff1e89a3f7f74eb27b953c60b78770467d3389b45c10614fce96b71829966 +91820ce0799ae3688e1344b4dab5ed72f32aba65937ecbf5d196c64bfb42b14bdb07faceef03fefbfb80a894a998cde533232d46e6b3bb135f7d70c38ecd2b2f +698679b5a883d5daa867b3d97236afe986a0161d2d0a113aff2da9040d5ae4f9fde57c2effc70fb4deb9b3b5a5f11256675b4ff38ffffe56e0d6cb1eafecc148 +60dd5ae41b904ba05681ef4d3f9674cf8df574a1b305ae8f2323f8452f868a20c0ae617018c3e3a8d824256942983aac88885b688c21666a66c2f2037d6faffb +cb77cb2db1d4fd3b227f78ff351b577fa227f98a0fb3e123e691124a8a9e55e868467f1aff790ca7a620253c0fe934a632a8da5012a402f24b5e79c22e0ef78f +a5e9a6eb3a9ad7be7fe3b5000e2162c096f05df82e020f4a420541e056a55b5cbfa2a32171b1bc4e6faeb5d7221f472e865a059e07df83e7eaae13efeea2e52d +1a8013e3f8c5699ccdc193083ca4a630348a5c099e4f000c4d5811c42c24a24858884674438b557dfdf513f68bfbf35dcbc6be7c7bc3237776ac6c8f7de40cd9 +1a840e5da294c1993e9ce947264f8e07491f3eefa92961797a3b44a316f16396d228f06b3569a71b6295ee95d75dfcbe28bbd83f84b78630519ee985ef22a861 +6c02a3292a559577fe421c4d90a9236e89d646d19c3074cd182dd2b929f7477b4bcbaca9fbb69b8fdfd7b671f547afcec76de47573db07dce2849d4f16f283da +4dd775b47ed2452f8c451d2c005bd7883872e93c9956d1d449692d1216410304844622026dd9ff0e96ff8fbb2b0faeb3baeebf7befb7bc55bbe5459637196321 +436d30360e4b0d24b609842186863681093304689369096d333434a5d34233d032cc34ed1fa10b4d274c934c863649818696253560631b2f605b58c612d66ae9 +e9edef7dfbbdf7f48f271b59d66237646a7ae6fd2369bea3df3d3af7a77b967bbec37f5f6cacf33b97a63675c6962f3096ce1317b7f198f5abed59cf95902b23 +f211baa896e0385012d0600403b4a081ed398ec7fe0d274b182b6028a34b2ed35a73edf228cf549931a644521a758e9f1c87c5c00cae13b6ae8ba13ec613f158 +c995fff872f1e76f8f3d74c782dbae5b58372b1d00c895a7c3738ae05b5278e9205e7b1ffd198ce5912feb4032224cba8ac7b83659b1a8f31fdcbd6dc9d77fab +6b516bf2b4f27c15a33938250c0f6164048e5b3b1f49e9bb4e391b3ae32b16b6a513b39d6eb2679b2b0269902601b9a091f58eb1effc9cf5e6309ac750868a55 +480dae03ae4a4c551808221e887485c7350cc66070b20d4ad83a6553cc60b1987962347ae4999e83474f3ef6c0658b5ba761f9ee5ebcdb83aa83de411a2f693f +82524c4f77c191001093301519ae8f9c4f4c7bacd4ab8a1f26e7191d8beb665aa627f15a3fde1a42c543e0237091cfa16f0023e3daf1a13418454c3b4c5698f2 +1867108950a4fd2891ad1a8253d2a286241a933c9988951df9bd572b3f792b7bd78d0df77f6e514bfddc315aae8c7ce597f681dc499d3b7af7b6b687eeb9a66d +c1855525bfd009ebaeaded3bdf3df9ecbff74741ccb4aa3a7e11448b464c4310630a66080e660a2e03e89e51ebd8b801406b05468b5b8ca5f371711b1a1358d4 +88ba38d6aff83847328d16d037041de2b59d2857496b4d00033190603492a342558792455a9096dcedc7e8cb88ca5a799a149800b799116746ca88a5edd45295 +5a1da1a9e419159fb282274c566746f1586c20eb3ff097874e8e97bf7177179f15fdd88c78c019f58f225745249924c1483159e0ce0938bd888a8c71304144da +cfea20bf6c3e7ffae1fb9b1b5393958f6471bc1f990c0ebe8f8a434a4ff4bf312558654c7ab98eb6647ad66ada34f0088c1187e64cfded8b94af04a1121199d0 +92bb2768ec3f1155b4f2b4d6601c22c6cc9461d7c793cdd4b03614f32365468abb212f38dce22c26b46d70c3e0cffd47efeac5e637eeb9fc6c73eddad3bfe39d +319221e78c5bed066f22661389a973720010812226cbf047997382aac7b574115520cb697359c792e9d3a6fb47f1c220bc10952a0a59bcd78d910c2a9e928a81 +148b8adce945611f45154d8a310e6e733321aca49568456a9534e757fd5835c05849244cabc18e2513aaecd15ffd68f48d0363cf3dbab6b97e8ed4c7c7e303fe +f8b296e8e9471e6c6e9a9197ffafe442272c007ffa954bc320f8e717fb5464f3e090195ba0626d9aa76bb4a598e12b1105ba2a75dca4648ceae22c11134288a2 +8ff2200e0f7f94a9350cb4d6a3b30dcbe761611d1637e94b97fe2faf5c145d64cbc86791cfa158213f0211073e1afc54cd2ba6248231e477db5ecf555d8ddbef +ecbabcabfdb2ce25e9541c801f4407ba87df7e6fe4e55dc3afec3f6a85f964ba23b0574414f7a4112ae6863cc1996dbb32167bfa07c7832078f4be2b66c193ab +a090456e063c4e586bafad72e71865fe5b8765680fa46b675500d01164a57d9ef9dd3fbf6f0a5b953c8ce5313e8ed10c4a0e05a79473100f7d84deb2f9765dd2 +9e6596e8cce6228003cc091494076710b95d491afbcc558baebff392c9e672dcf0f53d7d3b0f657ff0ca68aeda93ac8b3cbe28d2b622a694908a053261eb1681 +3146ead99f1cbaebe6556dade9c9180a95f0fa4eff8a2531c6e24298bed23b8e96761c6ff0758ca68484a499f69acccc173f956b6f0ca0d3d06b4011b4121c4b +dae60931d56d5c893747f04606a187e101ecde8fd12cbc406b0d22cd6515ee87c9e0c8a7d7c6aedf70f9faaeb64d6b97d41e74bce817fb46f7f6945f7afbe407 +393732db02a4422922657a512a2e44d2d031dbdddb937fe089ddfff4adab66e962fd987ca0dcdeccbefbf8fd17205be1134158f39be28fffce152b1625ffe647 +47b2e51c0f2bdc1d66f63c6eb56aa38e449298a59421b5e94528b8e05c9b9c2c23b24c669bcc369865b2b809db621ac8149029e2758528d251183624e4c68b70 +d52ab1fe22b3adf93cac91af225785efa25826a5e8b4c74f0c7fd29245592aec4fbafb6fb9a6ed8fbf7aef9a8bdba76888d9e6a675cb36ad5b76ff17a217dee8 +7ff2fb477b332349d370c5d290628a84afb8d4757148c3f42ae5f2cf760c5eb1bae9e66b974f8ba7e0205781373d1e0668a65ce6f45176d782f8f8676f5a7adb +a76fdcb86ee5bce63a00a399e2db078ebdd7dd77f8c8b16b375eb275f3545acc579129c3f7e0b8672a274d511991d3b1383d7b77e5cce662003115c2eba7dcee +05f6f0bd5f5cf37bf77ca9066cb22413d62d9b57dfb219777faefcd40f075e78c765865b95066941601a9cc80425396b207522698983dd436dad9d933534a6ad +07b65f7cfacb6343fe60a9b26f40ca50478a9d5180a690f9c3ebda33f7dfba6acd4573df76c87ad8318a035994f3387c18078fa0ec9252208069c965b1910f7d +febae0c1dfdcb666e5bca9eb8a9b375fd37ef335f8eaedd1bfbc5e7ee6e560b06406642b128164522542c66c844ae6de3830f6e4f70e3cfeb5196f14e4abbf9c +0fec3ff65e77efe1ee9e6b37746ebde102bdb7f009202c000b5a128fdc7bf98d1bdb9e7fb5ef851d031f0c66e1e718ebe18c9388c3ac87d900b39e8c7a1249a2 +98af4c5f0af8138f331067640832052c01c38029c8121433295f652fee533fdd1d26cdf2da65d87e75fceaae645d62eed24cbe8abc832882e3939edcca46c448 +b2708cb26f2d327b1ffdc3cd5fbe7d936dcd967e4ac6cd3bb7ac34add8533f1ceccd8609e168654664109824cb43438c9785913fd69fdddf3d76cdba45f5d38d +27afe19167e3011869a61c940e516ed7edd735ffc9d7eeb96cf519ecb9a0b5e1b6ad1b6edb3ae3a0bbda4e90127e38a96faf56e28a4a24dd8ef6f6746a0ec29a +d95c01f3fa697ce7c615ee9ffdeee7b75cdb358b1e009dcbea6ebbae6da85c3a34ac03ada43efdc7621a066440d2b385651a7304ffb90a55032b1e331c89487d +f47d469ac90acaefaf68b2d273e50d01b812bbc7f16e069993d877003d7de406b5de66d42685b5d555bf7567db97b7b4d8d66c7ed5da60fef62d4d862dbff3a2 +1ec84129223045c2a7b842a3e039af9479f75866efe1912bd74c5fb62b38c8bbd319f91c7d60db86dbb65de8c30e3f198455938d6be66f5c33ffd1fbd6bfb667 +e8cdfd43afefedef3e9e719d31d45e6cc04cc64d262c214c6136c06c80918048929122234d3c119215480e3006628c4c4e96c162a64e982c69911bd12f0efb2f +bd3db4759d78f08e855dcb52c659c7fec992775070a135bc53de59130662aa82dcce5478f4996fdfb1f5da4ec338a7caf4f6cd8bdffb503ebf2bcc0508422595 +2062042e6107a255f091289043a3c562d99b96b00a0e0a2ed4597840040a99d7af0bef7c6173f3630f7df6a265e77d41325f45c1036904e199caa121cba4fc8e +250d739cb066349766b28cc2bef9b1934f3dfca5abaf58712e78962eb06d3b9e8819ae6281a25a8daf369b83a4a7951ff97e4be31ca5d582c32b326dd9e06eed +9c77fa278a8559ed8d74b475a51373b7cbec3d89832318cf60d71ef40e90179e6eb0229066249fb877fef64fc56d6beee443cc649b2f357ffcb61ec813632002 +816988084926d260e68e3d1f66b6af96521bd34d8fc8575170a631f2c7e20317887c9208ab26a98479ebe6e5b76e5e0e5c5baa0607ba870e1c19fce044f6c3e1 +e2abbbfb239f29c681c189b09c1b8c5bdc880933cee38b29d14e568be2290d2b503c54f0425d11dc12226e46295399b6f5b39dd937f6f53ffbcdcb365dd63a0b +674dec40052fa05aa600a8ed9888f9c3aad2f7fb5f597fc3a655e7c85635f9cc95cdfffa4eb9d9164e813189537d855cb18410f544f4f29b3d4f7cfdd7a7c7e3 +22ef9c85a776ba94551a7f839cfebff8833f5ad13e35243917c95591afed84f04ce5a4992c93f43bda1bd3c9d9eadff9ea74e602408a0519e58e6cd9d2fe6bab +cfb5a1bca9ce18298874c2ca7bec8cd63c22c82a492f1d8f772c9963a505d7a84a6e5bd05a8126c7838af96314e4e78c7301b8217eda0dd7c3eebde8ed272f3c +63703d63b4f952fb960d89732f58af699fe0bbc951b386a94423e9a05cad1ceb1bbef1aa65d313d6b43ef931f9c005229f3cc29a2cf5297bf3868ecd1b3a6a5f +6aa26cde3970a4ffc4702e5f747bfbc78f0f960ef68c97dc921271e69778b54f5875766ab98e2f5746838229894bc943497e24aa5cc41819227732e7dff7f88e +e79fbcbeebac8c434ddc1005077e8430422427fba866aa82cab1d63afd1b37ad8dc7ceaf5778e5e264483a61270da119a353bb881131c593d0611886d3be4fc1 +0d519c1e0f8142f8c32695b66febec58d27a5e782694072838f02522799672ed413a2df5666b53ca3467a46637407e06784c7bcc1baa8f4557ad6d3ff72b7ba6 +61544233998c1b863a75bf1d0091f698746c2117b624ebd3b311a81ba0e0890810028ace5c94f210665bea786b53729645018814f6f6636c1c6e150327e14767 +f4ca8341309e75c43ffc5720a04ca16d8b1ba66d18063720c4c48773700ea551a9c27151a860a48048b1334e4820a58949276ea89edea1983d4da03ab34f7e0c +3e70e1c8279bb0a60867acb539b5f5baa949906cc1d97960b06fb87ca8b7f8e67b8581ec80c523255646bc519245601a2cd4426a16b194454da093995ce5ef7e +7ce0afbfb965da5f94afa2e842d5fe959d91ac8d5890216fe4ca0d8bbb562d3e5ffc99325fdf597f7484ce2c4211a0b5f448054b1624fa06336b2f5932e5c189 +78702a1e3022262be40eae5818bffda675e78ba726f919956b169549f91dcb1be7486039d39a0b8c1493250ac6572f6fda74f9ca7387f4fe1059568c7166f08f +e6c3325dc3e3a513a263e91cdb325745d1038048d2e41221d39a45258aca1dcb1b665f14804c197b7a512d23334e5e40534b8d80247668403cfc7d25383304b7 +4c1eb7743ca66d8b9b26c0a034c2087e38f109238ae4c450248689c611002049518994347960cf909bab9d617f453e70e1c8ff2bc29a495a1a93b7de30d19a5c +aa46bbbb8bcfbd927bbddb2dc8146943d1c4ebaa3478441690662ce995078ef767de3934b0fed2a9ec805304410aeed48c8c4254840ed7769e375b0118ab80db +e0269bf42e05000045141628723ada5aa6ed752a3813f1e0143c8062519efcb1452b62adcde9b31f3c17391dcd9da55c4396497a1ded2d73960867d41016ff87 +bd6b0d8eab3ccfcf772e7b76b5bbbacbb26cad2d5b32186c6302361843cca5314348710aa131eda434dc324dca84a653da6168d3763a9d3630d34e493b857626 +e9649a364d32d36909d0403a60c2a5aeb10dbe4a4896d6b2b492f67e3967cff5fbdefe38922cc9ab5dc997ccd2d133faa5cba3e79c7dcf7bbeeffdde0bb9c5de +58cbb25ab8f427a440489524060662b30ba4693dd12656d361e50c144c00b05ccc6ffd2fe0f9c7086d3525654a48e6a19790c981f30b7fcefc7d1907e3028e90 +0c97e54c86022a4e3c63e7bf29408281cfcc1c227013d614b97ad1c846239597ed3963b19b7c196ca07e50770eab6863b080bc89641ef1247403fefbc2b03134 +8ef109734353fed9fd4d375e759125a94d11f5ee9b3aaeddd8f2ccf7ccd73e94fd36f0e7419280c6b80b6e39b6b158a39ae9b799f08305b37f0b008c3c92029b +7a3a5c9757df505c888c0529088fc3f1309b7ecd488097c99c24b7d81b6bacf814f967700bf580000e274b6e7ef70dd75ebd71f5b2c4cc259f8997cf3f229c8d +b82f3180752103097879f2cabdb18dcb725803134cd39810f088ce47b867f4441ba4def53582cafe31c24249fe88304f27e1f4c65aab5f148023dfbcb400000f +dc4944415474111319d86518a610840ba634120367e441d810361336b80961326e41b880604c86ac410933254c5288248d9842c4fc381a88037eb52127ae9395 +20b704615fb8be3e7f4517dae465b281fa41dd39ac460dff7e02148263239b47b1305d25ebda28ebb0cdf2fba3c9e4dd01c70d06d48b6fb3ddddae6c5a177d67 +88eb59cc8dda4e77817772e419a681d51d9573e7e64637c56c7493811193d430c95a51b7ede53bac2349388482ee670fcca822ceac296e8ec3cd3f7cffee55ed +4d15f4e895f4f81b1c2707afdc176b89442eb2286c517212cc2d829b7db1e648ad2d612d86e5c91b9880a6c1b2603b345b5b3acb160d294b7258152541306141 +787debdaaa5f1400093c91a2b2c16d0ba0f98f1211037f6837df7fab1409a810029c138540c1b9831a196360329314c821482a41993f088da61759a291dcdbe1 +dd04e1ecde51b90ff5a237f972d840fda0ee1c96eb41c9e2a334c2610c8dc032fd7233bfced6e2ae2533fcd50f86776fbdfe521c96ed61208db2230bf079c73a +20f0b2305312375ac3e1359d15daba7b1c390345139e07db9d372699980cb529a08586ce9522550beb168008237918806b239d9f9316449cf112e53f92ece4ae +edabfb7a2aec743c8e6cb9921e02c88557d4141eeb6a6c58e609c079720345ebc28bf5c94b9a22625d4d55c897c6b00c79a683b11c3adb41028ee71332807c36 +89dcd6c6f09ace6a1570d3922a7c82000906a669726c4d4b75494458db4a23a32955011321200ccc33484512aae47dfee608a001e1c578968c6a4186456df272 +d8405da1ee668108a29debf48f0e258e1e3247cef2d371712a2efacf89a184773685a41ef210fc789cffeeb70726b3f6c5fd8b9481bf7b078393705ccc6b2a42 +025e89f44161a7631deca17d3b2bfef99c94a285e979608ce420022def9ed407470b4b979434f14a1cc5023e3c0dd316d39b0b128ceb289e16c5c175edecb71f +be6b513d46453d1c5e91b8d91bab9124550573777395c8ad9ae1a7c56f175fe28e7201fa13082810b480902f6b3f9835e079282f94448c5c92d44d3d5dd1700d +17c31838f7367594f4425ae56995d9d2bc681871ee0d9c7326b3ee12afcbb071781887cf5c4c43cd5a37f9926ca0ae50772b2c4d656d616f5b67fafdd309682d +0a3a2c0a0b21013283e432e63112606f7ca8e7ff26fec8673b6fdd125d7acfa06419ef8ee37fcfe2583fc6a650b649ccda1871e69558e12825dfd6786adf9d3b +efbf677745929c9f9ec751b6b1e0608820436e640db1e1e4e8f3df1ff8e3c7b7aeeda81d6b4b593890c0e9717c3c88448aa6e7bf9260bcc4f24729794013a97d +77edbcff9e5b96a567fa14cf3397eb11e6223b2794bb0879ad9451fd5219166060028aba809066d9a2e1da0e2b5d42aa00d786694d479ee63ce31293b54d1bba +a255b3227c4482d8b64e1c3c9652b5b0a6481e5b4dd3ad44c018186134657fe7a7fc1b0fb485b41a2b837c192ffd0ccfff07ca1684e0441490b1ae1db1760137 +1fe5c31b9a32b7efe8beeb96cda1d0a2750e57c806ea0a75e7b000ecdad27cd775c91303895426a504739abad6959b390204c92595a351305551f247e2eed117 +0b6b3aec3bae6bd8be31d01e9536744a6bdb6475ce35a575a40d4c194896319cc7a48eb2898f07d17f06d922b91ce4f78627977939ca1c14b9a3289fdd7fdfb6 +affec6de8a9601206320eb9f1f3b17acb0c0040b096d3567eecbffa37336fc8dfd3d5b37442af20070050e25f15e02f1097c7018a786c8b44184693dd983227b +04e5b35ffee28edf79ecde50a8f2539dd19131e0b930e71664f84168370f6ef6c5d65e74d3543f65945723ef8ed48cb8ebd5199627af7f1c8a3c9f700e5b3424 +d53c224ce5bdf124330d324d4e24cf698bcc2005e460abce0399628563bf05e8ee08deba257ce003de3f9a56838ea631c8ab3c680419c4882919437de9d59c69 +9a8fdfbb6afdea45af71a284effc1c3f3ee86fe588888480c9a97f9c0f0c2745ea6dca1eb967d7aa07f76e5acc26670bb3ae840dd415ead1610178745fcff854 +ee9f5e1929e68b6a2081865ea67672292c1010504c8ab84eb041b55bc3bce828af7ea4bd765c168204813152022c144624828608821a64f97c146c3481f818b2 +05b25d08022321910b6ec01ca3f43b649c859978f6abbff4d413f777b42d3a9470ce71cc852b2c2698eca2190159c5e4ab47f8bb83139fdbd5b2eb9a86ed1bb4 +9e4e39a000c0781ef13c12651c4ba358463c8e23c73195112e678cb8240c94c72975808c91a5e8c99430958369a26cf2e9fc66bff10b79f09321ba9ba3171b6d +cd1491cc57276faa9eaf942e62aa06c3f2e49d3a07c161db3384f3d9a22156738515d5bcc464be98e38e159428ccc0fc651131465085baeae0b078fa1f93bfbc +9bb7358508d20783e5e343b926adfcb74f5db5a97bde92f9813b62032399177e3898d72dd52da9411b6a27670d020aa070164959ecef7f5afcaf23892fec69be +e9eaf0d61eb52d2af96976533a460b1848e1f563387c12e353304ce109bf138c60c2446980270f403f73ff1debfefa4f1e591f5bf4baaea80dd415ead461451b +02cf3d7573678bfc072f1cf46c4d360b8aaa49e13ea1ae127254484197d482a3161d0a1479284091a0170d2212921495053404350464c085696322855416f912 +0c4bd8ee748a93448ecc4db87994cf51f6b070b2b0332d9afe177ffae013bff9f9ea6da7b23ab2e78f6316fe261104640751974514f23cc77de3b8746030a004 +e440100d61441a110e43552138c6c6707c00e9bcf00463c425ae336b82b287843e022b096bf2c53f7fb8a69e64ce8b8f91a9a72d3328098511087e59729ef421 +720b350bfdaa209573e363b814f254fe32cbfb70b0dc10526d639a1004109f658b869a6b3aac8d5d4a3c1e2f59a4484c96d6cbac8943f5bb420ac82e8b40899d +4e5be9377930489cbb7ab1944b25343eb9a16bfb856ccf3c727d51379effde49cfd614aba46aad2cb4912b6d420a71042c289c1acee4ec975e17fffaaea56a2c +d4108844118e42d3609471e62cc626512a0b4efe62df615e01c60825df222b096bf2f71eddf3ad6f7e4592aa6d2aafa80dd415ead461f9f8faaf7deaf61bd63c +f7dd833ffad9109302cc484b922ac90129d086601769eda434bb14b23d256f32f885c78c4bcc8f4a3022089a297120c1c891b80e27c3ac092a8f9395145e199e +01b7d012769ffcf2a79ffeda17a2911aa1d67c793a69db72e6c4bf6641bc23e23d78b3fb9383c5f10c779570c68ca62d556614d278638314d41863302d944c98 +b6ff3a151237647b0aa5212a9ee24e016e3ea218bf72efe667bffefb9b37f554d7932df17389dc783c611b292ae7992008c18813b7c94e0b3bd7d319a8dea9aa +3af9e844be1679b00a79b6c4cf4d5c4e79fd634e3e932870639650e21e71cb678ba856cfdaa60b9b552d80c7f9afdea6bdf0c32159962539ad685d92da21a430 +b1803f1bdca1a0e3840a5921332e099399252f3bb8bac39bca14d7aeaa9056f2878fedbc667de3b3df7e773c5360664e2a9d9395a01c8a89608cd436576ac839 +c18223145da832a98a27499220c9f5c872890bc6c893b82edb491823541a10761e6e2140f99dd7b63dff47cfdcb2a346f3f82b6a03f586ba7658aa2aefd8bae6 +bb7ff6b9271f1afbb7d78ebffaf6603c510493c1ce413ac9644d9235496d90d56604da4809430a42d2c014627e0f364716265c1d768aac29e196b86743d8102e +840d6eb544d81dbb7af6df77cf5db76dafb2e79a8bd9e8a66963e1f28a3813e6f66eeb89cf041fdd23ffc38f8fffe75b23e912495a0b0bafb743b164b991980a +1084cb44196e413113428f939d169e01af0cafd4d5227ff1b3d73ffeeb7bb75e53b9efd5024c65cd33f17866eca4b072e419100e480002c283b0e0167bd7acbf +e857eb54d61cae4d5eb5cb68d63c337239e51dedcfe4a74e0b2b3387d09b658b36536facf608a5f626edc13bba8e1c1f79f38304631293c61993c02449d24889 +c0ff921b48520577b9394e8553644dc4faba72b9424587156e083cbc6fdbeeed6bfee59563afbe3d74f0f8182419a531493a22294125d88e861e0ab47325ec31 +cd6432c000ce78993919451f16fa907075e226bc32b8d112a6bd9feefdad2f7de9cedb6e58ca3db9a236506fa86b87e523dc10d8b373e39e9d1b7305e3d0b1f8 +e113a3270727de397cf6ec44924b0148ca4c72c64c11acff26f133eefc8ce1690f658734f4ad6bbd71cbba6b3775ddf4a9beebb7f63645979720e36748738ef2 +bc7c623022261c5813bdcd6e6ba47b7dd7ea1d5bee79727fe2276ff5bff17efce8c0cf0b131c4c3aaf4a782017dc01b7c0cdabd637edbdedeafb3eb363d78d9b +9b1a9721692a553837dccf73a7e015319342eda74743d8f08cdeb59ba395dad12c957ca49fe74fc15d8cfc9aea01ac25302c4fde9113c36ef6149ccc79c2e98f +d88667443b9a7bd72f69e6dbcddb56bff8eced2fbf79fae537078e9e9e2ce87e8accdc72287ffe9a035e86575adb265fdddd2d3ca70a67dffab66f7eedcea71f +bdedd0b1f87fbf3770e8c4d8e15353c99c0d2381ec0930c91f420e36434e1eb80d61819bad5179cb55ab765eb7e5ee3dd7d7950dd41bea7a906a4d1c3911cfe6 +0dddb0c626b2a675615a1601d4d7d3190d079b22a1cd9b62971e777cfd18fef9204626317056648ae717598c3ce666907ceb2fbfb2e1b107b6b536cd0bcdea65 +fbd460e2e3e1c954b6e879de8cdb127d3d9dddab5b2f8bb0155c34a6528533a3c9e1d1542a5bf45c0f806f399106adbbab65757bd3e64db168e4224bc1ce9c4d +8e4d667379636c226bda33fe6eda00a8af675534acddb0adafb5e5135fe5f78bc127db61fde2f183f7f0fd43c8e670ec0c372c69f6de49c266e52131f1fa8f9e +dbbbefce6b975b94b38215ac6029a8bb4cf77ac6e27d9d0484c9ac445b84af6a09ae78ab15ace00a61c5612d03191db9323c1765737e00cbefc464267bd746ab +07a157b082155c0a561cd63290d5912ac22a432f0b2262a0997a7a8f9cf44c53dd1587b582155c297c024e09eb07a93c3f37218ab99251128c0724e127e811b8 +0efd0cd9c9deee0dff6fce8f57b0823ac48ac35a0626d2c6e98189c9e4946d64e07226382341ffd7beddabc415856118dd228421a04d2a45c1c214b90cef9ff4 +42ea60e14f1007e4cccc9993425206048be419d6ba825d3dcd7ebffdbc6c1ef7d3af313d5d5f9c1ec6c516fc9f04ebbdb6bbe5e7ddfd8fdbeff3ebe3b27d19f3 +3496f9cfa86a1abbf5ea687d7976f2f92fe7a9c0c709d67b3d3dbf2ed3c3cdb7cdd81e8dfda7b11c8f65ff36a71a6335e6d5d5f9d78bb32ffffa9970c8ecb080 +0cbf8440866001198205640816902158408660011982056408169021584086600119820564081690215840866001198205640816902158408660011982056408 +16902158408660011982056408169021584086600119820564081690215840866001198205640816902158408660011982056408169021584086600119820564 +08169021584086600119820564081690215840866001198205640816902158408660011982056408169021584086600119820564081690215840866001198205640816902158408660011982056408169021584086600119820564fc0612ad04ab718fa6890000000049454e44ae426082}}{\nonshppict +{\pict\picscalex100\picscaley100\piccropl0\piccropr0\piccropt0\piccropb0\picw10583\pich5027\picwgoal6000\pichgoal2850\wmetafile8\bliptag1887078077{\*\blipuid 707a86bd44206243c41e357a6f4bf32f} +01000900000394bd0100000072bd010000000400000003010800050000000b0200000000050000000c02be009001040000000701040072bd0100430f2000cc00 +0000be00900100000000be009001000000002800000090010000be0000000100180000000000a07a030000000000000000000000000000000000ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ece8c89c869f6345935e458b5c45885b45865a45855a458359457f59 +45785645897065e0dcdaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffefbfadca387a53a04923101852c007e29007b28007a2800772700702500642100582208cdc3beffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffff1bca2d86229c14c11ae410aab3c06a83a04a63904a337039031027f2a00692200c0aaa1f8f6f5ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcd0bbfa8952ed6b2aeb +5a13f15306f25103f15102f05002e44d02a939027b2901b28e7df0ebe9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0d0ffa26fff7c38fc671efb5605fd5401fd5400fd5300f652 +01cc4502913002a4725ae8e0dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffece2ffb084ff8640fe712afc5706fe5400fe5400fe5400fa5201e04b03a33703975637e1d5cfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffff8f5ffba95ff8b44ff7a34fc5807fe5400fe5400fe5400fc5400ee5002b940048a3b14dacac2ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5a7ff904cff +7f3afc5c0cfe5401fe5400fe5400fe5400f75202d348038d2f01d2b9acfcfafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfd3cdd4c3bbccb8af +ba9f93b3978ab3978ab3978ab3978ab3978ab3978ab2978ab1978ac8b7aed0c2bbd9cecaf6f3f2ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd1b9ff9a5dff823cfd6315fd5502fe5400fe5400fe54 +00fa5301e74e02a73802c89e8af5f0edfffffffffffffffffffffffffffffff8f5f3ded0c9c6aea3b89c8eb4988ab3978ab2978ab0968ac7b6aed9cecaf6f3f2 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0eae8 +daccc5c5aea3b79c8eb3978ab3978ab2978ab1978ab8a196c9bab2d8cecaf5f3f2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffe9e0dcd7c8c0ccb8afba9f93b4988ab4988ab4988ab3978ab2978ab1968ac7b6aecec1bbf2ee +edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffff4f0eed4c2b9b696869d715b7e3e1f7225007827007c29007e29007e29007d29007e29007e29007f2a007f +2a007e29007d29007a28007727007225006b230064200064270976452d947060ad958ad1c6c0f4f2f0ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffddcbffa46eff843efd6a1efd5604fe5400fe5400fe5400fd5301f55102d94902d48b67f0e6e0 +ffffffffffffe5d7d1bd97859d5e4088370f852c00872d00862c00852c00822b007e29007928007325006b2200621f00713e26987a6bccbeb8f4f1f0ffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4cbbfa25f3f7526006722005f1f005a1d00581d00571c +00541b004d1900421500877166e5e2e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffe4cbbfa2603f7527006722005f1f005a1d00581d00571c00541b004d1900421500887166e6e2e0ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffe4cbbfa2603f7527006722005f1f005a1d00581d00571c00541b004d1900421500877166e5e2e0ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffc48f74882d007527006722005f1f005a1d00571c00541b004d1900421500523426b8afaaffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffece0dac39f8d9c5e4084350f7d29007d29007c29007c29007c29007c +29007b28007927007325006922005c1e005f311b8f766adbd4d1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf7f6dac9 +c1b38f7e9763498039167928007e2900802a00822b00832b00842b00842c00832b00812a007d29007626006e2400652100682e127e523d9c8072ccbeb8f4f1f0 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4cbbfa25f3f7526006722005f1f005a1d0058 +1d00571c00541b004d1900421500877166e5e2e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f5f4dd +cac1b0816a8b43207d2900802a00832b00882d008f3001963303a03804b03d05c34305ce4704d64904dd4b04e14c04e14d04df4c04d94a04d04804c44304af3c +049834038b2f01842b007d29007827007125006922006a2e118a6351c0b0a8efeceaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffe9ddffad7fff8741fe7128fd5705fe5400fe5400fe5400fe5400fb5300f25101ea7b44f2dacee7d4cbb78065964017953303a63a05c5 +4506e24e05f05204f55303f45303ef5103e54f04d64a04bc41049c3502882e017d2a00732600662200693319997c6fded6d3ffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffff3e0d6ca815c9f37038e2f01832b007d29007b28007928007526006d24005f1f007e5643ded6d3 +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e0d6ca815c9f37038e +2f01832b007d29007b28007928007526006d24005f1f007e5643ded6d3fffffffffffffffffffffffffffffffffffffffffffffffffffffff3e0d6ca815c9f37 +038e2f01832b007d29007b28007928007526006d24005f1f007e5643ded6d3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffe6bba6b23f059f37038e2f01832b007d29007928007526006d24005f1f005e2f19a49087ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffe7d2c8ad65429331019532029834039a35049c3604a33805af3c04bb4004c74404d14704d64903d14603b63d028c2e +017326008c5a43e1d8d3ffffffffffffffffffffffffffffffffffffffffffffffffffffffece0dbbe95819a5737812a00842c00892e00903002983404ac3c05 +cc4605e04c04eb5003f25102f55202f65202f35202e94f03d64904b43d04903102842c017b2900712500662200652d11886756cdc3beffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3e0d6ca815c9f37038e2f01832b007d29007b28007928007526006d24005f1f007e56 +43ded6d3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfafae5d3cbae72558a2e009030019533029a3504a03805b33e +05cc4605e04d04f05103f95302fd5300fe5400fe5400fd5401fc5502fc5604fc5605fd5604fd5503fe5401fe5400fe5400fc5300f65201ea4f03d74903be4104 +a337038d2f02832b00782700692200642d11a1897df4f3f2fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5efffb891ff +8a43fe7831fc5807fe5400fe5400fe5400fe5400fe5400fb5300f75f15f29669e45f1de14c02ec5002f95301fe5400fd5503fc5c0cfe661aff6d22ff6e23ff66 +1aff5d0dfd5604fe5400fc5400f15102da4a03b63d038c2f027d29006d240062280c8a6c5cdfdad7ffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffcf2edeaa17fd05316bb480fab3e08aa3c05a83a04a539049e36038a2f02792800773c20d6cbc6ffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf2edeaa17ed05316bb480fab3e08aa3c05a83a04a539049e36 +038a2f02792800773c20d7cbc6fffffffffffffffffffffffffffffffffffffffffffffffffffffffcf2edeaa27fd05316bb480fab3e08aa3c05a83a04a53904 +9e36038a2f02792800773c20d6cbc6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9e3d7db5615d0 +5316bb480fab3e08aa3c05a639049e36038a2f02792800692a0c907364fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f0 +ebce9274aa3c06ad3f09b3420bcc4908e14e06ec5004f25103f65202fa5301fc5300fd5300fb5402f85505ef5307d04a089a3604964b26f0e9e4ffffffffffff +fffffffffffffffffffffffffffffff9f5f4d2b1a197441c9131019734029d3704a53b06c24406df4c04f25103fc5301fe5400fc5402fa5706f95a0bfb5e10fd +6012ff5f10fe5b0bfd5603fe5400fa5301ee5003d84903b73e03903102802a00712500612406744e3bd2cbc6ffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffcf2edeaa17fd05316bb480fab3e08aa3c05a83a04a539049e36038a2f02792800773c20d6cbc6ffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffcba18c9433039b3503a23906a93e09cd4907e34e05f05103f85301fd5300fe5400fd5401fa5707f95d10 +f9651cf96d29fb7635ff7b39ff823fff8b47ff934eff9752ff9551ff8038ff6e23ff6113fd5908fe5401fe5400fd5400f75302ee5003de4b03c141038e2f027c +29006922005d2911af9f98fefefdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc2a1ff8d46ff7e39fc5a09fe5400fe5400fe54 +00fe5400fe5400fe5400fc5300fa5301f75202f65303f25407ed5c14ef6d2dfb7533ff7b37ff833dff8e47ff9c53ffa75effac63ffa961ff8d45ff6618fd5604 +fe5400fa5301ee5002d54803a036027f2a00692200511a00af9f98fefefdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbb9cfa +7331e66728ee5409f25204f25103f15102ef5002df4b028e3002712500cfc0b8fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffaba9cfa7331e66728ee5409f25204f25103f15102ef5002df4b028e3002712500cfc0b8fefefe +fffffffffffffffffffffffffffffffffffffffffffffffffffffffbbb9cfa7331e66728ee5409f25204f25103f15102ef5002df4b028e3002712500cfc0b8fe +fefefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff56925fa722fe66728ee5409f25204f25102ef50 +02df4b028e3002712500815844fdfcfcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf3efc7561fc64e12c75016e6520af55304 +fa5301fc5300fd5300fd5300fb5301f45406ec5911e96626f16e2eef6b2bdd5d1fbf480ea74515fefcfbffffffffffffffffffffffffffffffffffffffffffc4 +9278993403a03704a83d08ba440adc4d06ef5103f85301fd5300fb5401f65506ef5a11ed6320f06e2ef97533ff7f3cff8c48ff9953ffa05aff964fff772cff5f +10fd5503fe5400fc5300f75201e84e02c74302872d01712500591d00977f74fdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fbbb9cfa7331e66728ee5409f25204f25103f15102ef5002df4b028e3002712500cfc0b8fefefeffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +f9f5f2c89075a74515a83c07b1420cd44c09eb5105f65302fc5300fe5400fd5401f95505f25a0fef6521f36e2dfa7331fd7532fc7330fc722efe732fff7933ff +843cff9048ff9c52ffa35affa65dffa45cffa25bff9f59ff853bff691bfe5a09fe5502fe5400fc5301f75202ec4f02d046029432017527005b1e009e877befec +eaffffffffffffffffffffffffffffffffffffffffffffffffffffffffceb3ff9758ff813bfd6112fe5502fe5400fe5400fe5400fe5400fe5400fc5401f75303 +ea5208d25213d05518da6227eb9a72f5c3aafce4d9fffbf9ffffffffffffffefe4ffdfc4ffd5aaffc17cffb76eff974eff6a1cfd5705fe5400fb5301f05102d5 +47029632017527005b1e009e877befeceaffffffffffffffffffffffffffffffffffffffffffffffffffffffffccb2ff8f51ff7834fa5d11fc5502fd5400fd53 +00fc5300f25102b23c03802a01bfa295f6f3f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffcbb1ff8f51ff7834fa5d11fc5502fd5400fd5300fc5300f25102b23c03802a01bfa295f6f3f1ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffcbb1ff8f51ff7834fa5d11fc5502fd5400fd5300fc5300f25102b23c03802a01bfa295f6f3f1ffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8e55ff7f39ff7834fa5d11fc5502fd5300fc5300f25102b23c03802a01814f37e6ddd9 +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7dacde7763fe46324ec5b15f75507fc5401fe5400fe5400fe5400fa5302ef5206d7 +500fd66d3ae9a786f2b699f4b698ea9164d96d37cf7446f5e3daffffffffffffffffffffffffffffffffffffcf9e86aa4818ac3e08b5450dd74d0aee5205f853 +02fc5300fc5301f75303ec5409de5613dd6b34eda987f8d0bdfdf0e9fffdfcfffffffffffffff3e8ffe4caffcfa3ffa15dff762aff5f0ffd5604fe5400fd5400 +fb5301f15102ca44028b2e00682200866251e8e2e0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffccb2ff8f51ff7834fa5d11fc5502fd +5400fd5300fc5300f25102b23c03802a01bfa295f6f3f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9a790b75222b6440dcb4c0ee65109f6 +5404fc5401fe5400fd5400fa5502f1560ae15b19dc5e20e05f21e8743bf2a27bf8c4aafad1befce8dffffbfafffffffffffffffffffffffffff3ebffe8d7ffdd +c0ffd3aaffc388ffb770ffae66ff8940ff6618fe5806fe5401fe5400fd5300f85201e74e02b03b017f2a006020008d6d5ee0dad7ffffffffffffffffffffffff +ffffffffffffffffffffffffffdac5ffa169ff833efd681bfd5603fe5400fe5400fe5400fe5400fd5401f95303e75208ca4c0ebe4e18d38762f3ded3ffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffdfaffe7c5ffcd8bffb46bff8035fe5c0bfe5401fd5300f95201e84e02b13c017f2a006020009476 +67e5e0deffffffffffffffffffffffffffffffffffffffffffffffffffd9c5ffa068ff813dfd661bfd5603fe5400fe5400fd5300f65201c342038b2f02af8672 +ede7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9c4ff9f67ff +813dfd661bfd5603fe5400fe5400fd5300f65201c342038b2f02b08672eee7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9c5ff9f +68ff813dfd661bfd5603fe5400fe5400fd5300f65201c342038b2f02af8672ede7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffab7fff823bff813dfd661bfd5603fe5400fd5300f65201c342038b2f0281462acfbeb6ffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffbd3c0fc8e59fb7432f8641bfb5605fe5400fe5400fe5400fd5301f55203d94d08cd7246ecd2c5ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffe2bfadba6033b4420bc24a10de510cf45405fb5401fe5400fd5301f85302eb5206da5c1ee19d7c +f7e7e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e6ffb584ff7a30ff6112fd5a09fb5706fb5504fa5403f75302e14c03a3370171 +2500875d48d9cec9ffffffffffffffffffffffffffffffffffffffffffffffffffd9c5ffa068ff813dfd661bfd5603fe5400fe5400fd5300f65201c342038b2f +02af8672ede7e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefd4c7d1794ecb5015dc5715f1570afc5502fe5400fe5400fd5401f85505ec560cd955 +15cd571dd87e52efc7b3fcf2eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5e9ffdaaeffbb78 +ff934aff6819fe5706fd5401fe5400fe5400fb5300ee4f01bd40027f2a016626079b7d6ef8f6f6ffffffffffffffffffffffffffffffffffffffffffffe5d8ff +ab7bff8641fe6e24fd5705fe5400fe5400fe5400fe5400fc5401f05205cf4b0ab14611c98665f5eae4ffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffff7eaffdba9ffb369ff8237fe5b0afd5501fe5400fc5300ef5001be40027f2a016626079b7d6ef7f6f6ffffffffffffffffff +ffffffffffffffffffffffffffe5d8ffab7bff8641fe6e24fd5705fe5400fe5400fe5400f85201d347039432029f694ee5dcd8ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5d7ffaa79ff8640fe6e24fd5705fe5400fe5400fe54 +00f85201d347039432029f694ee5dcd8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe5d7ffab79ff8640fe6e24fd5705fe5400fe5400 +fe5400f85201d347039432029f694ee5dcd8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a7ff +7f37ff8640fe6e24fd5705fe5400fe5400f85201d347039432027f3d1db99f93ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3 +d5ffa474ff7f3bfd6d24fc5706fe5401fe5400fe5400fc5400ef5003c74505bd7552efe0d8ffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffff7eae3d79472bd480ec84f13dd5310f55405fc5401fe5400fe5400fc5401f45203e65d19eaa685fdf8f6ffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff5efffb188ff6213fe5a09fc5807fb5706fb5a0cfb6e2af98247e97d47c77a54b48975d0bdb4f8f6f6ffffffffff +ffffffffffffffffffffffffffffffffffe5d7ffab7aff8641fe6e24fd5705fe5400fe5400fe5400f85201d347039432029f694ee5dcd8ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffefaf8f3c9b4e56221f66d2afc6216fd5806fd5604fd5705fb5707f7580aed5910d85617c7551ed38762f8ede7ffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4eaffbf8dff7f35ff5e10fd5603fe5400fe +5400fe5400fc5300ee4f01bf41027b2900743c20beaea5fffffffffffffffffffffffffffffffffffffffffffff1e9ffb68cff8943fe752efc5806fe5400fe54 +00fe5400fe5400f95402e24f05b24109b15c33f0e1daffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff5e8ffce92ffa75dff7024fd5705fe5400fe5400fc5300ef5001c241027b2800743b20beaea5fffffffffffffffffffffffffffffffffffffffffffff1e9ff +b68cff8943fe752efc5806fe5400fe5400fe5400fa5300e14c029d36038e4c2bdcd1cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffff0e9ffb48aff8942fe752efc5806fe5400fe5400fe5400fa5300e14c029d36038f4c2bddd1cb +fffffffffffffffffffffffffffffffffffffffffffffffffffffffff1e9ffb58aff8942fe752efc5806fe5400fe5400fe5400fa5300e14c029d36038f4c2bdd +d1cbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfceff7a33ff8942fe752efc5806fe5400ff54 +00fa5300e14c029d36037d3410a28070fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0e9ffb389ff8640fe752dfc5806fe5400 +fe5400fe5400fc5400ed5003c04204a4542de6d3cbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7e2d7d97645d25619db +5919f35609fc5402fe5400fe5400fe5400fc5300f45202ed7237faede7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffff8f4ffddccfedcccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff1e9ffb68cff8943fe752efc5806fe5400fe5400fe5400fa5300e14c029d36038e4c2bdcd1cbffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfaffab7f +ff9750ffa25bff8137ff782fff762eff742dff712bf76d29e46526d0561bca7044faf4f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf8ff975aff6316fc5705fe5400fe5400fe5400fe5400fb5301e44d038f30 +0273270389604dfffffffffffffffffffffffffffffffffffffffffffffcfbffc09dff8b45ff7c37fc5908fe5400fe5400fe5400fe5400f85302da4c06a13b09 +bd876efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefeffeeddffb66bff9954ff5e0efd +5401fe5400fe5400fb5300eb4f02a036027327027c503afffffffffffffffffffffffffffffffffffffffffffffcfbffc19dff8b45ff7c37fc5908fe5400fe54 +00fe5400fd5300ef5002a639047e2f08d4c6beffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffcfbffbe9bff8b44ff7c37fc5908fe5400fe5400fe5400fd5300ef5002a539047e2f08d5c6beffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffcfbffbf9bff8b44ff7c37fc5908fe5400fe5400fe5400fd5300ef5002a539047e2f08d4c6beffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9f6ff762dff8a44ff7c37fc5908fe5400ff5400fd5300ef5002a539047b2a038b614d +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfbffbe9bff8a44ff7c37fc5908fe5400fe5400fe5400fd5400f25102bb40058b +3408dbc8befffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefbe5dae66120e66525ef5c14fa5504fe5400fe5400fe5400fe54 +00fd5300f85505f38f5effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcfbffc09dff8b45ff7c37fc5908fe +5400fe5400fe5400fd5300ef5002a639047e2f08d4c6beffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbd7bffc67affbf74ffaa62ff9b54ff934dff +8f49ff8844ff7c3aec6a29d05518ecc8b6fdfaf9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffab81fc6920fc5707fe5401fe5400fe5400fe5400fc5300ee5003a439047e2a0189553befe8e5ffffffffffff +ffffffffffffffffffffffffffffffffcbaeff9453ff803bfc5e0ffe5501fe5400fe5400fd5400f55203cb4706983403caa492f9f5f3ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb676ffa059ff6e22fd5706fe5400fe5400fe5400f85201cf46 +03892e00642100e9dfdbffffffffffffffffffffffffffffffffffffffffffffcbafff9453ff803bfc5e0ffe5501fe5400fe5400fd5400f45102b43d04812b01 +c6ada1f9f7f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9adff +9352ff803bfc5e0ffe5501fe5400fe5400fd5300f45102b23d04802b01c6ada1f9f7f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffca +adff9352ff803bfc5e0ffe5501fe5400fe5400fd5300f45102b23d04802b01c6ada1f9f7f5ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff8749ff8640ff7e38fc5d0efe5501fe5400fd5300f45102b23d04802b0184533beee8e5ffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffc9adff9352ff803bfc5e0ffe5501fe5400fe5400fd5400f45202ba4004882d01caaea1f9f7f5ffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffcd3bffb7f41f87331f85e13fc5504fe5400fe5400fe5400fe5400fd5300fa5301f78d59f8c8b0f4cebc +edccbce5c9bce1c8bbe0c7bbdfc7bbdfc7bbe0c7bbe1c8bbe2c9bce5cabce9ccbdf2cfbdf7d1bdfbd1bcfcd1bcfcd1bcfcd1bcfcd1bcfbd1bcfad0bcf9d0bcf6 +cebce3c9bbdac5bbd4c3bbf9f7f5ffffffffffffffffffffffffffffffffffffffffffffcbaeff9453ff803bfc5e0ffe5501fe5400fe5400fd5400f45102b43d +04812b01c6ada1f9f7f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffff8f1ffe9ccffe0bcffd0a6ffba86ffaf7affae79ffae7affa76fff8c4bf67330e68251f5d9 +ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fbebe3f28d5cf55d13fb5706fd5401fe5400fe5400fe5400fc5301ee5004b53f05892e02986044e1d3cdffffffffffffffffffffffffffffffffffffffffffff +d6c0ff9e64ff833dfd6518fd5603fe5400fe5400fd5300f45202c04204913102d1b0a0fcfafaffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffcca8ffa15fff7a31fe5d0efe5501fe5400fe5400fb5301e64e02a43702742600af8e7df0ebe9ffffff +ffffffffffffffffffffffffffffffffd7c1ff9e64ff833dfd6518fd5603fe5400fe5400fd5400f65301c543038b2f01b5907df0ebe9ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5bfff9d63ff833dfd6518fd5603fe5400fe54 +00fd5300f65201c04203892e01b6907df1ebe9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5bfff9d63ff833dfd6518fd5603fe5400 +fe5400fd5300f65201c04203892e01b5907df0ebe9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +a070ff7f39ff7d37fd6315fd5502fe5400fd5300f65201c04203892e01824a2ed7c9c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffd5bfff9d63ff833dfd6518fd5603fe5400fe5400fd5400f65201c242038c2f01b7907df1ebe9ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffd3bdff945bff7e3bfc661afc5604fe5400fe5400fe5400fe5400fe5400fd5300fa5301f65202ef5002e84e02e14c03d84903cf4703c74404c2 +4204c04204c34305ca4605d54a05e04e06e95005f05204f45303f55202f45202f15103ee5003ec5003eb4f03e84e03dc4b02a438017a2800612000c8b5abffff +ffffffffffffffffffffffffffffffffffffffffd6c0ff9e64ff833dfd6518fd5603fe5400fe5400fd5400f65301c543038b2f01b5907df0ebe9ffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf3f0eac9b9d7855ddc5b1cf2570bfb5504fd5401fe +5400fe5400fe5400fa5401e75006ba4207913102a3674ae1d2cbffffffffffffffffffffffffffffffffffffffffffffe2d2ffa875ff8540fe6c21fd5704fe54 +00fe5400fd5400f45202c443038b2f02bc907bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffd4bbff995dff7d35fe6114fd5503fe5400fe5400fd5400f05102bc4003822b01a1715ae8e0dcffffffffffffffffffffffffffffffffffffff +e3d3ffa976ff8540fe6c21fd5704fe5400fe5400fe5400f95301d749039b3402975e43d8c9c2ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d1ffa774ff853ffe6c21fd5704fe5400fe5400fe5400f85201ce4603913102a5735a +e8e0dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d1ffa774ff853ffe6c21fd5704fe5400fe5400fe5400f85301d04603933202a4 +735ae8e0dcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb997fd7832ff7a34fe6419fd5603fe54 +00fe5400f85201ce4603913102804021c0aa9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d1ffa674ff853ffe6c21fd5704 +fe5400fe5400fe5400f85201ce4603923102a5735ae8e0dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d1ffa774ff8842fe +6f25fd5706fe5401fe5400fe5400fe5400fe5400fe5400fd5300fb5301fa5301fa5301fc5301fd5300fe5400fe5400fe5400fe5400fe5400fe5400fe5400fe54 +00fe5400fd5401fd5401fd5401fb5401f95301f65302f55202f45202f35202ea4f02be4002872d01682200aa8b7bffffffffffffffffffffffffffffffffffff +ffffffffe2d2ffa875ff8540fe6c21fd5704fe5400fe5400fe5400f95301d749039b3402975e43d8c9c2ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffff4eeebd7bdb1c9a28fb97f62a85126a93d08c2490de6530af75505fd5401fe5400fe5400fe5400fc5402f45506da500caf41 +0b9c3f11b9866effffffffffffffffffffffffffffffffffffffffffffffffffede3ffb286ff8841fe732bfd5806fe5400fe5400fd5400f75201d44803913102 +a0674bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d2ff925bfe7833fd +6115fd5503fe5400fe5400fd5400f55202cd46048d3002945637e1d5cfffffffffffffffffffffffffffffffffffffffeee4ffb488ff8842fe732bfd5806fe54 +00fe5400fe5400fc5301e94e02b23c028f4a29cbb6acffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffede3ffb185ff8841fe732bfd5806fe5400fe5400fe5400fa5201dc4a039a3503945637e0d5cfffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffede3ffb185ff8841fe732bfd5806fe5400fe5400fe5400fa5301e04c03a13703955637e0d5cfffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcd3bff86f2cfe7632fd6319fd5504fe5400fe5400fa5201dc4a039a35037f3714 +aa8b7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffece2ffaf83ff853ffe7129fd5706fe5400fe5400fe5400fa5201dd4a039c +3503955637e0d5cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeee4ffb78aff954efe8038fd5a09fe5401fe5400fe5400fe54 +00fe5400fd5400fb5401f95302f65304f55507f4580bf65d11f9631afd6b23ff712aff762fff772fff752cff7026ff6a1eff6416ff5e0efe5908fd5503fd5402 +fd5401fc5401fc5301fb5301fb5301f65201d548029332027a320ea47f6effffffffffffffffffffffffffffffffffffffffffffede3ffb286ff8842fe732bfd +5806fe5400fe5400fe5400fc5301e94e02b23c028f4a29cbb6acffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefdf3ece9d4c1b8c1a698b79686a27763935a3f7e330f7e29 +00872c008f3001983503a63b06c74709e85007f85404fd5401fe5400fe5400fd5402fb5606f6580be85913c85117b1420ba95227eadbd4ffffffffffffffffff +fffffffffffffffffffffffffffffffff9f5ffbc96ff8b44ff7a34fc5807fe5400fe5400fe5400fc5300ea4f02ab3a03843a16e3d9d4ffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdefe8f06927fb7331f95e12fc5503fe5400fe5400fe5400f752 +02d64a069433038a3e19f7f2f1fffffffffffffffffffffffffffffffffffffff9f5ffbe99ff8b45ff7a34fc5807fe5400fe5400fe5400fd5400f65201cf4603 +8631079a6d59fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f5ff +bb96ff8b44ff7a34fc5807fe5400fe5400fe5400fc5300ea4f02a23804833814d8c9c2fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8 +f5ffbb95ff8b44ff7a34fc5807fe5400fe5400fe5400fd5400ef5002b63e0483350fbca396ffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffdefe8f06926fd7431fa6115fc5503fe5400fe5400fc5400ea4f02a338047c2d07946c59ffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffff8f5ffb893ff853fff752efc5807fe5400fe5400fe5400fc5400ec4f02aa3a04853914d8c9c2ffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffcfaffdac0ffa35aff9750ff6112fd5502fe5400fe5400fe5400fe5400fd5400fa5505f6712ff7b08d +f4b090f2b395f4b99cfbbea0ffc2a4ffc6a6ffc9a9ffccacffcfafffd1b1ffd3b3ffd1b0ffc5a3ffbb98ffae87fd6b23fd5502fe5400fe5400fe5400fe5400fa +5300e44d03973504813009a37b67fffffffffffffffffffffffffffffffffffffffffffff9f5ffbc97ff8b45ff7a34fc5807fe5400fe5400fe5400fd5400f652 +01cf46038631079a6d59ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffff8f3f0dcc9bfbf9e8eab7e699b63487c2c057d29007f2a00802a00812a00832b00872d008d2f019533039e3805ba4107d74b06eb5105f75302 +fd5400fe5400fe5401fc5504fa5808f85b0ef36017e96523db5e1fc74e13b95524e7cec2fdfcfbffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffc7a7ff904cff7f3afc5c0cfe5401fe5400fe5400fe5300f75201d14703862c00b3907ff9f7f6ffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffff2d3c4e46a2ded6c2cf85b0efd5402fe5400fe5400fd5400f65303cb48099a350390441ff6f0eeffffff +ffffffffffffffffffffffffffffffffffffffc9a9ff904dff7f3afc5c0cfe5401fe5400fe5400fe5400fc5301ea4e03953202712500e9e1dcfefefeffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a7ff8f4cff7e39fc5c0cfe5401fe54 +00fe5400fd5300f35102ad3c047e2900ccb7acfcfafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6a7ff904cff7f3afc5c0cfe5401 +fe5400fe5400fe5400f85201d24703882d009f735ef8f4f3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9 +ebe3eb6f33f47030f95d11fd5503fe5400fe5400fd5400f35103ae3c04802a00895840f6f2f0ffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffcc1a4ff8544ff722bfc590afe5401fe5400fe5400fd5400f55202be4004832b00cdb7acfcfafaffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffff9f5ffb871ffaf67ff7a30fe5a0afe5401fe5400fe5400fe5400fd5300f85302f37c43fef5f1ffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7c3dfc5807fe5401fe5400fe5400fe5400fb5301e54f06a23905842c00bf9e8efaf8 +f7ffffffffffffffffffffffffffffffffffffffffffffc7a8ff904dff7f3afc5c0cfe5401fe5400fe5400fe5400fc5301ea4e03953202712500e9e1dcfefefe +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf5f3debfb1c28d75a358348d340a872d00872d00 +882e018d2f019231029834039d3705ad3c05bd4105c74505d24805de4c04eb5003f55202fb5401fd5400fe5400fd5401fc5502fb5707fa5b0df86015f5651ff0 +6b2aec6a2ae46324d5571ad88861f1dcd0fdfcfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2b9ff9a5dff823cfd6315fd55 +02fe5400fe5400fe5400fc5301ec4f02a839027f320dd3beb4fcfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffdf9e7fd9652cea5e19f7580afd5501fe5400fe5400fb5401ec5206bc45099b3604b78066efe5e0ffffffffffffffffffffffffffffffffffffff +ffffffd3bbff9b5fff823cfd6315fd5502fe5400fe5400fe5400fd5300f65201d247039030019e6e57e8dfdaffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2baff9a5eff803bfd6215fd5502fe5400fe5400fd5300f55201bb4003862d01 +bb9a89f3efedffffffffffffffffffffffffffffffffffffffffffffffffffffffffd2b9ff9a5dff823cfd6315fd5502fe5400fe5400fe5400fb5301e84e02a2 +3702823b18ddccc4fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ddd1e8804dee6623f85b0ffc5503fe54 +00fe5400fd5400f45202ba4004892e01894f33e1d4cdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8cbb5fd8950fd6c24fc5b0c +fd5501fe5400fe5400fe5400f85301d54803953201c09b89f4efedffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe2c0ff +c784ffb169ff792dfe5b0afe5501fe5400fe5400fd5300f95201ec4f03f4bfa5fdf9f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffe2d3fd7d3efc5807fd5502fe5400fe5400fd5401f65303d44c09a93b0691380edac0b4fdfbfbffffffffffffffffffffffffffffff +ffffffffffffffd2baff9a5eff823cfd6315fd5502fe5400fe5400fe5400fd5300f65201d247039030019e6e57e8dfdaffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffe8d3c8c69075a852299a35049b36049c37059e3806a73b05b64005c64505d54a05e44e04ef5103f75302fc +5300fe5400fe5400fe5400fe5400fd5401fc5503fb5807fb5b0cfb5e12fb6216fa651bf96821f66d29f4702ff16e2ded6a29e86f34e88f64f1cab6fcf5f1ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffddcbffa46eff843efd6a1efd5604fe5400fe5400fe5400fd5300f95201 +e24c02a73801843d1bc1a699faf9f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe3bfadc66739d05316ea5811fa +5505fe5400fe5400fc5401f45405d64f0db3430c9f3d0dc79882f8f3f0ffffffffffffffffffffffffffffffffffffffffffffdeccffa570ff843ffd6a1efd56 +04fe5400fe5400fe5400fe5400fc5301f15002c441028b2e019e6c54e2d7d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffdeccffa36fff823cfd681cfd5604fe5400fe5400fd5300f75201c944038e3002ab7c66ebe4e0ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffddcbffa46eff843efd6a1efd5604fe5400fe5400fe5400fd5300f65201d548029b3301915538d4c2b9ffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeec5b2df7946ea5e19f7580afd5401fe5400fe5400fd5401f45203c34405913103 +975738d7c3b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6d6c6f08d5df4651efa590afd5401fe5400fe5400fe5400fb5301e9 +4e02af3b02b58066ede5e0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf5ffe1b4ffc87effaf66ff7e33fe5c0cfe55 +02fe5400fe5400fb5301f05002dd5c1de8b399fcf9f8fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefaf7fab593f86a25 +fb5707fd5401fe5400fd5401fa5403eb5308c7490ba43a06b26e4ce5d3caffffffffffffffffffffffffffffffffffffffffffffffffffdeccffa56fff843efd +6a1efd5604fe5400fe5400fe5400fe5400fc5301f15002c441028b2e019e6c54e2d7d1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5 +ebe7cd9c85a245189e3704a43a06ae3e08c34507d94b06e74f04f25203f85302fc5301fe5400fe5400fe5401fc5603fb5808fa5c0efb6114fc661bfd6a22fe6f +28fe7431ff7a38ff7d3bff7f3dff803dff7d3bfd7836f77231f37c41f3a178f6c7b0fbece4ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffe9ddffaf80ff8943fe7229fd5706fe5400fe5400fe5400fe5400fd5400f95201e54d02b33c0181320c9c6e58e2 +d8d3fffffffffffffffffffffffffffffffffffffffffffffffffffffffaf6f4dbb9a8b35c31b8460ed65211f55507fd5401fe5400fd5401f65505e4550ec54d +12ae3f09af5c33dec2b4ffffffffffffffffffffffffffffffffffffffffffffffffffeadeffb082ff8943fe7229fd5706fe5400fe5400fe5400fe5400fe5400 +fc5400f25101d04602973201823b19a17763cdbbb3f1eceaffffffffffffefe9e7c9b8afa78e81816355ab9a92ffffffffffffffffffffffffffffffffffffff +eadeffb082ff8640fe6e24fd5705fe5400fe5400fe5400f95301d849039834039a5f43e3d8d3ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffe9ddffaf80ff8943fe7229fd5706fe5400fe5400fe5400fe5400fd5400f45101d548029e3501833c19af8c7cf1eceaffffffffffffffffffffffffffffff +fffffffffffffffffffffffff1dfd6d38762d25316ec5a11fa5605fd5401fe5400fe5400fc5401f05205ca48079a35049d5431d6bfb4ffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffff7e3d9ea9469f05d15fa5706fd5401fe5400fe5400fe5400fd5400f65201d84902c26e44e8dad3ffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ebffdeadffca7cffb86eff8c42ff6112fe5704fe5401fd5400f95201e94e02 +cd5013c68364eadbd3fffffffffffffffffffffffffffffffffffffffffffffffffffffffaefe9ecae8fe86728f4580bfb5504fe5401fd5401fa5504f1560bda +5312ba470faa4716c8947bffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9ddffaf81ff8943fe7229fd5706fe5400fe5400fe5400fe54 +00fe5400fc5400f25101d04602973201823b19a17763cdbbb3f1eceaffffffffffffefe9e7c9b7afa68d817f6355a89992ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6ede8c28263a03704a73c07b14009c94809e450 +06f15204f95302fc5300fe5400fd5401fb5604f95909f85e12f8661df96f2bfc7735ff7a38ff7e3bff803dff823eff803cff7e3aff7d39ff813dff9053ffab7c +ffc09dffceb6fde0d2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff5efffbb93ff934bff8039fe5a09fe5501fe5400fe5400fe5401fd5401fd5401fa5401f45102dd4a02a638027f2f08905a40bb9f92d8cac4f6f3f2ffff +fffffffffaf8f7dfcec6c5a08eaa6747993503af4009d24d0df45406fd5401fe5400fb5503f65709e85913ce5519bc480eaf4816cc9a81ffffffffffffffffff +fffffffffffffffffffffffffffffffffffffff5efffbd95ff934cff8039fe5a09fe5501fe5400fe5400fe5401fd5401fd5401fd5401fa5301ef4f02c944028a +2e017c28007326007125007225007426007426006f240062200067351dccbfb8fffffffffffffffffffffffffffffffff6f0ffbe98ff8f48ff782ffe5a08fe55 +01fe5400fe5400fb5402e64e04a339048d4320dbcdc6fffffffffffffffffffffffffffffffffffffffffffffffffffffffff5efffbb93ff934bff8039fe5a09 +fe5501fe5400fe5400fd5401fd5401fa5401f75302ec5002cf45029632017f310c996951bb9f92d8cac4f6f3f2fffffffffffff9f5f4d7bfb3c39279ab4e20ba +460ddc5410f65607fd5402fe5400fe5400fc5402f75505e5530cba470fa138059f4e26f2e9e4fffffffffffffffffffffffffffffff9f2eed8ad98d1a28ad2a3 +8bd7a68edfa386e47b48f4570afc5502fe5400fe5400fe5400fe5400fe5400fc5300f35101dd5613ca8c6dc39d8abd9b8ab8998ab3988ab0968ab0988dc5b3ab +fffffffffffffffffffffffffffffffffffffffbf5ffe1b9ffcb7cffc176ffa35bff7124ff5d0cfd5603fd5401fa5300ee4f02cd4502a23e0daa6e51c6a492e1 +cfc6fffffffffffffffffffaf6f4e2c3b4d49c7fc56435d45110ef560bfb5604fe5401fc5502f95808f05b11e05d1ccd5318bb4b13c17853f9f4f2ffffffffff +fffffffffffffffffffffffffffffffffffffffffffffff5efffbc94ff934cff8039fe5a09fe5501fe5400fe5400fe5401fd5401fd5401fd5401fa5301ef4f02 +c944028a2e017c28007326007125007225007426007426006f240061200062331dc8bdb8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc98969aa3c07b2410ab9470fde5009f25304fa5302fd5300fe5400fd5400fa5403f45709 +f05d15ee6927f47030f97331f97331f9712ffb722fff864bff9d6affb891ffc2a2ffd3bcffdccafffefeffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a7ffa75dffa15bff67 +19fe5b0bfc5909fc5908fb5909fa590af95a0df8661ef65a0df75607fa5402f65201d74803903002822b00792800762700792800802a00892e01953202a23a06 +c1460ae95207fb5402fe5400fd5502fa5809f45d13e76221d85b1ec84e12b44008d3a188fefefdffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffcaa8ffa75dffa15bff6719fe5b0bfc5909fc5908fb5909fb590afa5a0cfa651cfa5909fb5504fe5400fb5301ea4f02ca4403a739039734039935 +049c36049b3503872d01752600773d20f3eeecffffffffffffffffffffffffffffffffd0afffa45dff8e47ff6517fe5a0afc5807fc5707fa5707ee5408ac3f09 +862c00d4c2b8fefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffc9a7ffa75dffa15bff6719fe5b0bfc5909fc5808fb5909f9590bf6 +5a0df5651ef3580cf65506fb5401f75201d74803913102842c007b29007927007b2800832b008f30019e3705b1420ce1520bf85505fd5401fe5401fd5503fb57 +06f7590ced5c14d1571bbb470ea43904cc9e88fefefdffffffffffffffffffffffffffffffffffffe08457c95013c34c12c44e14e1540ff35609fa5504fd5401 +fe5400fe5400fe5400fe5400fe5400fe5400fc5300f65201e84e02d04602b03b028c2f01822b00752600672200875a44fdfcfcffffffffffffffffffffffffff +ffffffffffffffffffe7cdffca81ffc478ffb46bffa05aff762cff6012fc5705fd5401fa5301ea4e02c74302943202872d01842c00862d018d2f01973403a23a +06b8440ade500af55506fd5402fd5502fc5807f75d11ed6421e26224d7591bc74c10c87248f8f0ecffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffc9a7ffa75dffa15bff6719fe5b0bfc5909fc5908fb5909fb590afa5a0cfa651cfa5909fb5504fe5400fb5301ea4f02ca4403a7390397 +34039935049c36049b3503872d017225006d3920f1edecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffe2b8a3be5624bd480fc54f14e4520bf55404fc5401fe5400fe5400fd5401f85403ef5409e25612d95b1de1692eed8857f5b190f9c9b1fc +ded0fef9f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdabfffc37fffbb71ffa65fff8d47ff823cff7e39ff7c39ff7b3a +fe7938ffb28dffc2a4ff955dff8644ff752dfd5f11fe5502fc5300f25102e04c04d24905d34a06de4d06ec5105f75403fd5400fe5401fc5605fa5d0ff8651df3 +6d2cec6929e05f21d05315c96230e1b6a1faf4f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdbbfffc37fffbb71ffa6 +5fff8d47ff823cff7e39ff7d39ff7d3bff7d3bffb690ffb892ff8f50ff7931ff671afd5908fe5501fe5400fd5400fd5400fd5400fc5300f15102c041038d2f01 +ab775ef0e7e3ffffffffffffffffffffffffffe4c9ffc381ffb46cff954dff7b33ff7128ff6d24fb6921eb611dc34c12993504c9a795f7f3f1ffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffdabeffc37fffbb71ffa65fff8d47ff823cff7d39ff7b38fe7937f97534fab08afdceb6ff9d6bff8a48ff78 +30fe6214fe5604fe5400f75202e84f04db4c05da4c06e34f06f05205f95403fd5401fd5502fc5706fb5b0df96217f66923ef6c2be36324cf5317b9430ac78260 +f5e9e3ffffffffffffffffffffffffffffffffffffffffffffba90ff9351ff8845fe6b22fc5c0dfc5705fd5402fe5400fe5400fe5400fe5400fe5400fe5400fe +5400fd5400fb5301f95301f85302f85301f75302ee5103bf42048e3001925537e9ded9fffffffffffffffffffffffffffffffffffffffffffffffffffbf6ffdc +b4ffc079ffb76cffaf65ffa35cff904aff7228fd5d0efd5503fd5300f85201ed5002e04c03d74904d84b04e24e05ef5104f95402fd5400fd5603fc5c0efc671e +f9722ff16e2de56324d85819cf6029dfa385f9f0ebffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdabeffc37fff +bb71ffa65fff8d47ff823cff7e39ff7d39ff7d3bff7d3bffb690ffb892ff8f50ff7931ff671afd5908fe5501fe5400fd5400fd5400fd5400fc5300f15102b53e +03822b019d735eede6e3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe19976d0561ad4 +591ce55812f65506fc5401fe5400fe5400fd5400fb5301f25204df5009d77749e9c0adfbf2eeffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffe9d2ffd192ffc476ffb065ff9c53ff9049ff8a44ff8640ff803aff7934ffa275ffe6dafffaf8ffddc7ff +b57effa65fffa65eff9c55ff7e34ff6416fe5b0afd5807fe5909fe5c0eff6215ff691fff722cfe7735fc7635f87230f16b29e4601fda6930e09a78f5e2d9ffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9d2ffd192ffc476ffb065ff9c53ff9049ff8a44ff8640ff833d +ff803bffaa7cffe8dcffeadbffbc89ffa65fffa35cff9d56ff8841ff742bff6b20ff681efb661dec611cd05416b2430c9d3704c58e73f4e9e5ffffffffffffff +fffffff0dbffd699ffc377ffb168ff9f58ff924dff8a46ff833ff57332d75a1dae400ac48e73f1e9e4ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffe9d2ffd192ffc476ffb065ff9c53ff9049ff8a43ff843eff7d38fd7531fc9f72fee5d9ffffffffe5d3ffbc8affaa64ffa75effa15aff8b43ff6f24 +ff6112fe5c0cfe5c0cff5e10ff6417ff6b20ff732bff7a36ff7a38fd7634f7712fee6827de5b1cd46b37e0aa90f6ebe5ffffffffffffffffffffffffffffffff +ffffffffffffffffffddbaffc680ffc377ffb56dff9046ff6c1ffe5b0bfe5503fe5400fe5400fe5400fe5400fe5400fe5400fd5401fa5402f45405ed550be85b +15e66322e26224cf5418af4009a3522cdbc2b6fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f2ffd9b9ffba7cffad63ffaa60 +ffa85effa159ff9752ff7e37fe671bfc5c0dfb5707fc5504fd5503fc5605fc590afd6014fe6d26ff7835ff7a38fe7734f7702de96422de6b32e39b79f6e2d9ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8d1ffd091ffc476ffb065ff9c53ff9049ff8a44ff86 +40ff833dff803bffaa7cffe8dcffeadbffbc89ffa65fffa35cff9d56ff8841ff742bff6b20ff681efb661dec611cce5215aa3e09892d02b18672eee7e4ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf2edf4ac89f06927f36925f65c11fc5503fe5400fe5400fe54 +00fd5400f95302ec5004e8895af8ebe4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffff0dad0c379569d3605913102892e01832b0085350e925030996145955f458f5d45865a45a68c7feae5e3ffffffffffffffffffffffffffffffffffffff +ffffffffffffefdfffc68effa455ff9145ff8137ff7930ff752dff712afc6c26f66721f48750fad5c2ffffffffffffffffffffeee1ffd0abffc089ffaf6affa5 +5cff9e56ff9851ff934dff8f49ff8b45ff8640ff7e39fc7430f56b28ed7032ec9367f1c3adfaebe4ffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffeedeffc58dffa455ff9145ff8137ff7930ff752dff722aff7028fe6d26fe8e57ffd9c6fffffffffcfaff +e8d6ffc494ffab66ffa359ff9d54ff954dff8d46ff833efa7632e96423d05215c55b28d49374f0dacffffffffffffffffffffff4e5ffd7a1ffbf71ffb469ffa6 +5dff9952ff904aff8641f97734e26121bd470dbe7551ecded8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdfffc68effa656ff9346 +ff8238ff7a31ff762dff722afc6c25f3651ff1844ff9d4c2fffffffffffffffffffff7f0ffe1c9ffc99cffb373ffa65cffa35aff9e56ff9851ff934dff8f49ff +8b45ff853fff7d38fc7430f46b28ee753aeb9469efbba2f9ebe4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7cdffc37fffc4 +74ffc97bffc378ffac63ff8137fe5f0ffd5603fe5400fe5400fe5400fe5400fe5400fb5401f35304e0510bce5113d05519db5c1ce15e1dd95717c4490cb35120 +d2a893ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefe5ffd2b2ffbd8cffaa66ffa156ff9f56ff9a51ff +934cff8f49ff8d47ff8c46ff8a45ff8642ff803cff7834fb702cf57232f28650f1a27af4c9b4fcf2eeffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffeedeffc58dffa455ff9145ff8137ff7930ff752dff722aff7028fe6d26fe8e57ffd9c6ffffff +fffcfaffe8d6ffc394ffaa66ffa259ff9d54ff954dff8d46ff833efa7632e76323ca4f12b65323c18a70e5d5ceffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffff6f2ffc6a6ff8842ff823dff6215fd5603fe5400fe5400fe5400fd5400f95301ef5b12e99a72ffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefcfce9ccbead4614a139069a350494 +33038f31028c2f01892e01862d01822b007b28006f2400855037f7f4f3ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdfcfff2eaffdbc5ffcbadffc3a2ffc2a0ffc09f +ffbd9dfdc1a4fbd8c7fbe7ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf6ffe5d4ffd3b8ffc4 +a3ffc1a0ffbe9dfcc1a4fad7c6fae6dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf7ffe7d7ffdac2ffc6a5ffc4a3ffc2a1ffc1a0ffbe9dfdc2a4fbd8c7fbe7ddffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f0ffcda3ff8238 +ff5d0dfd5502fe5400fe5400fe5400fe5400f95302e75005d16733eed8cdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf6ffe6d6ffd8c1ffc5a3ffc3a1ffc2a0ffc2a0ffc1a0ffbe +9dfdc2a4fbd5c3faddcfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf6ffe4d3ff +d2b7ffc4a2ffc19ffebd9cfbc1a3f9d6c6f9e6dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffefff3ecffa559ffa860ff782dfe5908fe5401fe5400fe5400fe5400fc5300f25102dd500bebcdbfffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefef6ede7bb6235b0410bbc4409cb4706cf4705cf4704cf4704d24703d74803d146 +02a63802872f04a6745cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefcffe2beffae66ff7428fe5908fe5401fe5400fe5400fe +5400f85301de4d05a5400ee4cbbfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd7aeff +c47cffb269ff752afe5b0bfe5502fe5400fe5400fd5300f95301eb4f02cb4502bd7959d0b0a1f1e9e5fefdfdffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffedded6d5aa95b45628b4450fd04c0be85007f35203f75302f95301fb5301fb5301f55202d84c07aa3c06923102d1b1a1faf7f5ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c7ffc680ffae67ff7428fe5c0cfd5604fe5401fd5400f85302d64a059c3503d4b1a1faf7 +f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff8a8aff8a8affffffffffffff8a8aff8a8affffffffffffffffffffbbbbff4545ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf8ffdaa6ffca7effb86fff883eff6516fe58 +07fd5502fe5400fd5300fa5201ed4f02d046029e3501852c00883c16965739ac7c66bb9583be9b8abd9b8abe9b8abf9b8aae7e66a4684a994a23973708a33906 +b9440bda4f09f15305fb5402fe5400fe5400fd5401fb5402f35508da5411c14a10ab3d07bf7e5eeee0d8ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffe9d0ffd190ffc77affb56cff8d45ff6e22fe5f10fd5807f85505d54b069f3703c1947ef3ece9ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8affffffff +ffffff8a8aff8a8affffffffffffffffffffbbbbff4545ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f1ffe1b7ffcb82ffbe74ffa65eff8339ff6619fe5b0bfd5604fd5401fd5400 +f95300ec4f01d54802b63d039934028d30028b2f018a2e01892e01892e018b2e018e30019533039e3805b64107d74c08ef5206fa5403fd5401fe5400fc5503fa +5707f65a0ded5e18df5e1ecf5418bc460dc16f46e8cfc2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5cbc7a6694c9f38069031027b290062270b +a48e84fcfcfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4e9ffdaae +ffc880ffc375ffb96effac64ff9b55ff8139fa661cdb5310a93d08b3785bebe1dcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8affffffffffffff8a8aff8a8affffffff2121ffdf +dfffbbbbff4545ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffefcffeedbffcd91ffbf72ffb66cffa860ff944eff7a30ff6619fd5b0bfc5604fd5401fe5400fc5300fa5301f7 +5201f35202f05102ef5103ef5003f05103f25103f55203f95302fd5401fe5400fe5401fd5603fb5808fa5e11f8641cf56a27ef6c2ce66525d8591bca5319ce7c +54efdad0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbd9bdafa03b0ba53a05963403832c016d2400734833c5c5c5ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcf9ffecdaffd0a4ffba77ffb065ff +aa60ff9751f27534c24d14ae5f39e5d6cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8affffffffffffff8a8aff8a8affaaaaff4545ff7676ffbbbbff4545ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffdfaffe5ccffc791ffb265ffae64ffa960ffa25bff9a54ff8f4bff7b34ff6e26ff661cfd6216fc5f12fc5e10fc5d0efc5c0efc5c0efc5c +0efd5d0ffd5f11fe6215ff671bff6c22ff722aff7733ff7b39fe7836f97331f46e2ceb6624de5e1fd87848e8bda7ffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffff4f1ef95715fa93e08b1420aa93d08a138037f2a0065210156301cdadadbffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefdffefe2ffcfaaffad70fd8a43e86423b64d1ae1cc +c2ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffff8a8aff8a8affffffffffffff8a8aff8a8aff4545ffdfdfff5555ffaaaaff4545ffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffff3eaffd3b2ffbf8effa963ffa157ff9d53ff974fff914aff8e47ff8c46ff8c46ff8c46ff8c46ff8d47ff8d47ff8d47ff8d47ff8d47ff8d47ff8d47ff8b45 +ff8741ff813bff7834f96f2bef6724ea7b44eead8df5daccfefcfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0c0c1a944 +12b7430bbf4a12db4f0ae34d03be4002802b00632100441d0ac2bfbefbfbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0e7fabd9fd37141e2c1b1fdfbfaffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8affffffff +ffffff8a8aff6666ff6666ffffffff9a9aff6666ff4545ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeee4 +ffdbc4ffc9a9ffb58bffa26eff9c67ff8747ff7932ff772eff772eff772eff772eff772eff772eff7d38ff945bff9a65ff9e6dfeb490fabfa2f8cebafdf3eeff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbfbfbb9b4b19d4f2aaa3c06bd4910db520ff15306f85302ef5002 +c543028c2f016822004d1a0173645cd0cfcefafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a8aff8a8aff4545ff4545ff8a8aff8a8aff8a8aff0000ffbbbbffffffffff +ffff1111ff4545ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefef4f4f4dfdfdfcdcdcec7c7c8c7c7c8c7c7c8 +c7c7c8c7c7c8c7c8c8c8c8c9c9c9cacccdcdbcbab88a6d5e8035109c3604af420bce4e0eed5409fa5403fe5400fc5301f35102d347029b3401742600601f004c +1d05604a3fa09c9bc4c4c4c5c5c6c5c5c6c6c6c6c6c6c6c6c6c6c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6c7c6c6 +c7c6c6c7c6c6c7c6c6c7c6c7c7c6c7c7c7c7c7c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c8c7c7c7c7c7c7c6c7c7c6c6c7c6c6c7c6c6c6 +c6c6c6c9c9c9dcdcdcf5f5f5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffbbbbffbbbbffbbbbffbbbbffbbbbffbbbbffdfdfffbbbbffffffffffffffffffffcfcfffcfcfffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffbf8f5e8d3c8bc8b738c46257229056b23006a22006922006922006922006b23006d230072250079 +2800832b008e30019b3604ae4009ca4b0dec5308f95403fd5401fe5400fe5400fd5400f75201e54d02ba3f02892e017928006e24006722006621006521006521 +00662100672200672200682200682200682200682200682200682200682200682200682200682200682200682200682200682200682200682200682200682200 +6922006922006922006922006922006922006922006922006922006922006922006922006922006922006822006622006421006022056e3f28ab968cf1eeedff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffcefe8ec986edc6e38c65218c84808c94605c74504c64404c64404c64404c64404c64405c54506c64608c9490ad14d0bde510bec5308f654 +05fb5402fd5401fe5400fe5400fe5400fe5400fe5400fb5300f65201ec4f02de4a02d14602c94402c74302c74303c74403c74404c64404c64404c64404c64404 +c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c64404c6 +4404c64404c64404c64404c64404c64404c64404c64404c64404c64404c54404c04103ac3a02853007864a2dbba49affffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc596ffc5 +83ffb26bff853cff742bff6f26ff6e25ff6e25ff6e25ff6e25ff6e24ff6d21ff6c1fff691cff6618ff6011fe5b0afd5705fd5502fe5400fe5400fe5400fe5400 +fe5400fe5400fd5400fa5402f45305ed5308e8540be8570fed5c14f46119fa671eff6b22ff6d24ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff +6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e25ff6e +25ff6e25ff6e25ff6e25ff6e25ff6d24fc6921ec611cc24c139d3c0da57259fefdfcffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5ecffdfc2ffbb88ff995eff884cfa8146f87f44 +f87f44fa8146fe8448ff8b4fff9558ffa160ffb067ffb76dffb66cffab64ff8439ff6517fd5907fe5502fe5400fe5400fe5400fd5401f85403ed560ad85717d5 +591cd75b1ddf5f20df6629e16d34ea743bf1793ff57c42f77e43f87e43f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f +44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f87f44f67d42 +f1793fe46f36cc5d27b45b2fd2ae9df8f3f1ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefefbfbfbf5f6f6f2f3f3f2f2f2f2f2f2f2f2f2f2f2f2f2f3f3f3f3f4f4f4f5f5 +f5f6e8e9eaf3c1a3ffb572ffbf72ffbe74ffac63ff7f34fe5f0ffe5603fe5400fd5401f95403eb5409d35212c64e14c34b10b04f21b59687d8d8d9eeeeeef1f1 +f1f1f1f2f1f2f2f1f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2 +f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f1f2f2f1f1f2f1f1f1f0f0f0f3f3f3fafafaff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf2edfcd1b8ffc0 +87ffc67bffbb71ff8f46fe6011fd5502fc5401f05306d24d0db5440dae3e08ad6a4ad1cccafcfcfcffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8f5ffdcc1ffca7cffba70ff8b41ff5b0b +fa5403e35008b3430ca239059f522cd0c9c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefefeece2ffc379ffb36aff6c1ffb5604db4f0ba53b0790350ab2b2b3ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffc6a4ffbb75ff8b42fc5d0ec1480d973505723b20e8e1deffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffcd9affa057fb6c1fc34608923203ac8e80eaeaeaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd5b1ffa25a +fb7b30ca470683320aad8e7ffafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1cdff9852fb8138d449058c4523aaa29effffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffef2ebff8e49fd813add4d05893b16d2d2d2ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffefefeff9153ff7c35e1510a7f2a00e5dedbfefefeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa674 +ff7932df540f8a2e01ccb8affafafaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc97ff7933e35915973302b08f80f5f5f6ff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd3bbff7c37eb601aa63903966953f1f1f1ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffeadfff803ef66820b73f037e4427edededffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff8c4bff742bca47066b2400e6e5e4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffab74ff883fd35413822b02d0c1b9fb +fbfbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcd9fffae66db74359d3f12c6a899fafafaffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffead1ffc887f09855cb6b3cd3b09ffdfdfdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffaf6ffdfc2faab72e99367f0ded5ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0400000007010100030000000000}}}{\b\fs36\lang1033 +\par }{\lang1033 +\par +\par +\par +\par +\par +\par +\par }{ +\par }\pard \widctlpar\adjustright { +\par }\pard \qc\widctlpar\adjustright {\b\f17\fs36 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \line \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e9 \'ef\'ee\'e4\'f1\'e8\'f1\'f2\'e5\'ec\'fb}{\b\fs36\lang1033 Estex}{\b\fs36 }{\b\fs36\lang1033 v}{ +\b\fs36 1.54 +\par }{ +\par +\par }{\fs24\lang1033 ( }{\f17\fs24 c \'f2\'e0\'e1\'eb\'e8\'f6\'e5\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e9 }{\fs24\lang1033 Estex DSS v1.}{\fs24 55}{\fs24\lang1033 ) +\par }{ +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }{\lang1033 +\par +\par }{\lang1033 {\field{\*\fldinst SYMBOL 211 \\f "Symbol" \\s 10}{\fldrslt\f3\fs20}}}{\f17\lang1033 2002 \'cf}{\f17 \'e5\'f2\'e5\'f0\'f1}{\f17\lang1033 \'cf\'eb\'fe\'f1 +\par }\pard \widctlpar\adjustright {\page +\par }\pard\plain \s1\qc\sb240\sa60\keepn\widctlpar\outlinelevel0\adjustright \b\f1\fs28\lang1049\kerning28\cgrid {\f23 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e9 }{\lang1033 Estex DSS (DOS)}{ + v1.54 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\lang1033 \u8195\'20}{\f17 \'c2\'e7\'e0\'e8\'ec\'ee\'e4\'e5\'e9\'f1\'f2\'e2\'e8\'e5 \'f1 \'c4\'ce\'d1 \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef\'f0\'e8 \'ef\'ee\'ec\'ee\'f9\'e8 \'e8\'ed\'f1\'f2\'f0\'f3 +\'ea\'f6\'e8\'e8 RST 10h. \'c2 }{\v +\par }{\f17 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ea\'ee\'ed\'ea\'f0\'e5\'f2\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8, \'e2 \'ea\'e0\'f7\'e5\'f1\'f2\'e2\'e5 \'e2\'f5\'ee\'e4\'ed\'fb\'f5 \'e8 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'f5 \'ef\'e0\'f0\'e0 +\'ec\'e5\'f2\'f0\'ee\'e2 }{\v +\par }{\f17 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'fe\'f2\'f1\'ff \'f0\'e0\'e7\'eb\'e8\'f7\'ed\'fb\'e5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ef\'f0\'e8 \'fd\'f2\'ee\'ec \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e7\'e0\'e4\'e0\'e5\'f2\'f1\'ff \'e2 \'f0\'e5 +\'e3\'e8\'f1\'f2\'f0\'e5 C. }{\v +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'ee\'f0\'e3\'e0\'ed\'e8\'e7\'f3\'fe\'f2 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0\'ec\'e8, \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'e8\'e5 \'ef\'e0\'ec\'ff\'f2\'e8, \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 +\'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec \'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'e7\'e0\'e8\'ec\'ee\'e4\'e5\'e9\'f1\'f2\'e2\'e8\'e5 \'f1 \'f0\'e0\'e7\'eb\'e8\'f7\'ed\'fb\'ec\'e8 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0\'ec\'e8. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'d4\'e0\'e9\'eb\'ee\'e2\'e0\'ff \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'d4\'e0\'e9\'eb\'ee\'e2\'e0\'ff \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff - \'fd\'f2\'ee \'f1\'f2\'f0\'ee\'ea\'e0 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2, \'f1\'ee\'e4\'e5\'f0 +\'e6\'e0\'f9\'e0\'ff \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee }{\v +\par }{\f17 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0, \'e8\'ec\'e5\'ed\'e0 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'ee\'e2 \'f0\'e0\'e7\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'ec \ldblquote \\\rdblquote \'e8 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0. \'c8 +\'ec\'e5\'ed\'e0 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'e8 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'ee\'e2 \'ec\'ee\'e3\'f3\'f2 \'e1\'fb\'f2\'fc \'ef\'f0\'ee\'ef\'f3 +\'f9\'e5\'ed\'fb. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0}{\lang1033 : +\par }\pard \s19\sa120\widctlpar\adjustright {\lang1033 C:\\TEXT\\DOC\\text.doc +\par A:file.txt +\par \\TEXT\\info.txt +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c4\'ce\'d1 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2 \'e4\'eb\'ff \'e4\'e8\'f1\'ea\'ee\'e2\'fb\'f5 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2 \'e8\'ec\'e5\'ed\'e0 A:, B:, C: \'e8 +\'f2.\'e4. \'c8\'ec\'ff }{\v +\par }{\f17 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'ec\'ee\'e6\'e5\'f2 \'e1\'fb\'f2\'fc \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ee \'ef\'e5\'f0\'e5\'e4 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0, \'f7\'f2\'ee\'e1\'fb \'f3\'ea\'e0\'e7\'e0\'f2\'fc \'e5\'e3\'ee }{\v + +\par }{\f17 \'ec\'e5\'f1\'f2\'ee\'ed\'e0\'f5\'ee\'e6\'e4\'e5\'ed\'e8\'e5. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ea\'ee\'ec\'e0\'ed\'e4\'e0 DIR C:DATFILE \'e8\'f9\'e5\'f2 DATFILE \'ed\'e0 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e5 C: \'e2 }{\v +\par }{\f17 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5. \'ca\'ee\'e3\'e4\'e0 \'e8\'ec\'ff \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'ff\'e2\'ed\'ee \'ed\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee, \'c4\'ce\'d1 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2 +\'f2\'e5\'ea\'f3\'f9\'e5\'e5 }{\v +\par }{\f17 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee. \'cf\'ee\'f1\'eb\'e5 \'e7\'e0\'ef\'f3\'f1\'ea\'e0 \'f1\'e8\'f1\'f2\'e5\'ec\'fb \'f2\'e5\'ea\'f3\'f9\'e8\'ec \'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'f1\'ff \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee, \'f1 \'ea\'ee +\'f2\'ee\'f0\'ee\'e3\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e7\'e0\'e3\'f0\'f3\'e6\'e5\'ed\'e0 \'c4\'ce\'d1. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c8\'ec\'e5\'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2 \'f1\'ee\'f1\'f2\'ee\'ff\'f2 \'e8\'e7 \'e4\'e2\'f3\'f5 \'f7\'e0\'f1\'f2\'e5\'e9. \'cf\'e5\'f0\'e2\'e0\'ff \'f1\'ee\'e4\'e5\'f0\'e6 +\'e8\'f2 1 \'e4\'ee 8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2. \'c2 }{\v +\par }{\f17 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ea\'ee\'ed\'f2\'e5\'ea\'f1\'f2\'e0 \'ef\'ee\'e4 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 \'e8\'ed\'ee\'e3\'e4\'e0 \'ef\'ee\'e4\'f0\'e0\'e7\'f3\'ec\'e5\'e2\'e0\'e5\'f2\'f1\'ff \'e8\'ec\'e5 +\'ed\'ed\'ee \'fd\'f2\'e0 }{\v +\par }{\f17 \'ef\'e5\'f0\'e2\'e0\'ff \'f7\'e0\'f1\'f2\'fc. \'c2\'f2\'ee\'f0\'e0\'ff \'f7\'e0\'f1\'f2\'fc, \'ea\'ee\'f2\'ee\'f0\'e0\'ff \'ed\'e5 \'ee\'e1\'ff\'e7\'e0\'f2\'e5\'eb\'fc\'ed\'e0 \'e8 \'f1\'eb\'f3\'e6\'e8\'f2 \'e4\'eb\'ff \'ef\'ee\'ff\'f1\'ed\'e5\'ed +\'e8\'ff \'f2\'e8\'ef\'e0 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8 \'ed\'e0\'f5\'ee\'e4\'ff\'f9\'e5\'e9\'f1\'ff \'e2 \'f4\'e0\'e9\'eb\'e5, \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 \'e4\'ee 3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8 \'ed\'e0\'e7\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'f0\'e0\'f1 +\'f8\'e8\'f0\'e5\'ed\'e8\'e5\'ec. }{\v +\par }{\f17 \'cf\'f0\'e8 \'ed\'e0\'ef\'e8\'f1\'e0\'ed\'e8\'e8 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'ee\'e1\'e5 \'f7\'e0\'f1\'f2\'e8 \'f0\'e0\'e7\'e4\'e5\'eb\'ff\'fe\'f2\'f1\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'ec \'f2\'ee\'f7\'ea\'e0. \'d2\'e0\'ea, \'ed\'e0 +\'ef\'f0\'e8\'ec\'e5\'f0, }{\v +\par }{\f17 \'e8\'ec\'e5\'ed\'e0 NAME \'e8 NAME. \'ee\'e4\'e8\'ed\'e0\'ea\'ee\'e2\'fb. \'c2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'fb \'f1 \'ea\'ee\'e4\'ee\'ec }{\v +\par }{\f17 \'ec\'e5\'ed\'fc\'f8\'e5 32, \'e0 \'f2\'e0\'ea\'e6\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb: . \ldblquote / \\ [ ] : | < > + = ; , }{\v +\par }{\f17 \'cf\'ee\'f1\'ea\'ee\'eb\'fc\'ea\'f3 \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e8 \'f2\'ee\'e6\'e5 \'f4\'e0\'e9\'eb\'fb, \'e8\'f5 \'e8\'ec\'e5\'ed\'e0 \'ee\'e1\'f0\'e0\'e7\'f3\'fe\'f2\'f1\'ff \'f2\'e5\'ec \'e6\'e5 \'f1\'ef\'ee\'f1\'ee\'e1\'ee\'ec +. }{\v +\par }{\f17 \'c8\'ec\'ff \'ee\'f1\'ed\'ee\'e2\'ed\'ee\'e3\'ee (\'e8\'eb\'e8 \'ea\'ee\'f0\'ed\'e5\'e2\'ee\'e3\'ee) \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 \'e2\'f1\'e5\'e3\'e4\'e0 \ldblquote \\\rdblquote . \'ca\'f0\'ee\'ec\'e5 \'fd\'f2\'ee\'e3\'ee, \'ef\'f0\'e8 \'f1 +\'ee\'e7\'e4\'e0\'ed\'e8\'e8 }{\v +\par }{\f17 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 \'e2 \'ed\'b8\'ec \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'e4\'e2\'e0 \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'fb\'f5 \'fd\'eb\'e5\'ec\'e5\'ed\'f2\'e0, \'f1 \'e8\'ec\'e5\'ed\'e0\'ec\'e8 \ldblquote . +\rdblquote \'e8 \ldblquote ..\rdblquote . \'c8\'ec\'ff }{\v +\par }{\f17 \ldblquote .\rdblquote \'ee\'e1\'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ea\'e0\'f2\'e0\'eb\'ee\'e3. \'c8\'ec\'ff \ldblquote ..\rdblquote \'ee\'e1\'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'e2\'e5\'f0\'f5 +\'ed\'e5\'e3\'ee \'f3\'f0\'ee\'e2\'ed\'ff. }{\v +\par }{\f17 \'cd\'e5\'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'ea\'ee\'ec\'e0\'ed\'e4\'fb \'e8 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'c4\'ce\'d1 \'e2 \'e8\'ec\'e5\'ed\'e0\'f5 \'f4\'e0\'e9\'eb\'ee\'e2 \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'fe\'f2 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0 +\'f2\'fc }{\v +\par }{\f17 \'e3\'eb\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb \'fd\'f2\'ee \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8 *, \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'ec\'ee\'e6\'ed\'ee \'e2\'f1\'f2\'e0\'e2\'eb\'ff\'f2\'fc \'e2 \'e8\'ec\'ff \'e8 \'e2 }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0. \'d1\'e8\'ec\'e2\'ee\'eb ? \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2, \'f7\'f2\'ee \'e2\'ec\'e5\'f1\'f2\'ee \'ed\'e5\'e3\'ee +\'ec\'ee\'e6\'e5\'f2 \'e1\'fb\'f2\'fc \'eb\'fe\'e1\'ee\'e9 \'e4\'f0\'f3\'e3\'ee\'e9 \'f1\'e8\'ec\'e2\'ee\'eb. \'d1\'e8\'ec\'e2\'ee\'eb }{\v +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 * \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2, \'f7\'f2\'ee \'e2\'ec\'e5\'f1\'f2\'ee \'ed\'e5\'e3\'ee \'ec\'ee\'e6\'e5\'f2 \'e1\'fb\'f2\'fc \'eb\'fe\'e1\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'e8\'ec\'e2 +\'ee\'eb\'ee\'e2. +\par }{\i\f17 \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 *.txt \tab - \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'e2\'f1\'e5 \'f4\'e0\'e9\'eb\'fb \'f1 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5\'ec txt +\par a??.* \tab - \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'f4\'e0\'e9\'eb\'fb \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'e2 \'f2\'f0\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'e8 \'ef\'e5\'f0\'e2\'fb\'ec \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'ec \ldblquote a\rdblquote +\par dc*.exe \tab - \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'fb\'e5 \'f4\'e0\'e9\'eb\'fb \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'eb\'fe\'e1\'ee\'e9 \'e4\'eb\'e8\'ed\'fb \'e8 \'ed\'e0\'f7\'e8\'ed\'e0\'fe\'f9\'e8\'ec\'f1\'ff \'f1 +\ldblquote dc\rdblquote +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b \u8195\'20}{\b\f17 \'c0\'f2\'f0\'e8\'e1\'f3\'f2\'fb \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'ca\'e0\'e6\'e4\'fb\'e9 \'e1\'e8\'f2 \'e1\'e0\'e9\'f2\'e0 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2 \'e7\'e0\'e4\'e0\'b8\'f2 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'e9 \'e0 +\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0. \'c0\'f2\'f0\'e8\'e1\'f3\'f2\'fb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f4\'e0\'e9\'eb\'ee\'e2 \'ec\'ee\'e6\'ed\'ee \'e8\'e7\'ec\'e5\'ed\'ff\'f2\'fc \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 \'c4\'ce\'d1. +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'e1\'e8\'f2 0 - \'d2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par \'e1\'e8\'f2 1 - \'d1\'ea\'f0\'fb\'f2\'fb\'e9 +\par \'e1\'e8\'f2 2 - \'d1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e9 +\par \'e1\'e8\'f2 3 - \'cc\'e5\'f2\'ea\'e0 \'f2\'ee\'ec\'e0 +\par \'e1\'e8\'f2 4 - \'ca\'e0\'f2\'e0\'eb\'ee\'e3 +\par \'e1\'e8\'f2 5 - \'c0\'f0\'f5\'e8\'e2\'ed\'fb\'e9 +\par \'e1\'e8\'f2 6 - \'cd\'e5 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2\'f1\'ff +\par \'e1\'e8\'f2 7 - \'cd\'e5 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2\'f1\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'f2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff\rdblquote . \'cf\'f0\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e8 1 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0 \'ec\'ee\'e6\'ed\'ee \'f7\'e8\'f2\'e0\'f2\'fc, \'ed\'ee + \'e2 }{\v +\par }{\f17 \'ed\'e5\'e3\'ee \'ed\'e5\'eb\'fc\'e7\'ff \'ef\'e8\'f1\'e0\'f2\'fc \'e8 \'e5\'e3\'ee \'ed\'e5\'eb\'fc\'e7\'ff \'f1\'f2\'e5\'f0\'e5\'f2\'fc. +\par \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'f1\'ea\'f0\'fb\'f2\'fb\'e9\rdblquote . \'cf\'f0\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e8 1 \'f4\'e0\'e9\'eb \'ed\'e5\'e2\'e8\'e4\'e5\'ed \'e4\'eb\'ff \'ee\'e1\'fb\'f7\'ed\'fb\'f5 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'e9 \'c4 +\'ce\'d1. +\par \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e9\rdblquote . \'d3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2, \'f7\'f2\'ee \'f4\'e0\'e9\'eb \'ff\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'ec. }{\v +\par }{\f17 \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'ec\'e5\'f2\'ea\'e0 \'f2\'ee\'ec\'e0\rdblquote . \'c2 \'f1\'f2\'e0\'f0\'fb\'f5 \'e2\'e5\'f0\'f1\'e8\'ff\'f5 MSDOS \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'eb\'f1\'ff \'e4\'eb\'ff \'e7\'e0\'e4\'e0\'ed\'e8 +\'ff }{\v +\par }{\f17 \'ec\'e5\'f2\'ea\'e8 \'e4\'e8\'f1\'ea\'e0. +\par \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'ea\'e0\'f2\'e0\'eb\'ee\'e3\rdblquote . \'cf\'f0\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e8 1 \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'f6\'e8\'f0\'f3\'e5\'f2 \'f4\'e0\'e9\'eb \'ea\'e0\'ea \'ea\'e0\'f2\'e0\'eb\'ee\'e3, }{\v + +\par }{\f17 \'ef\'ee\'e4\'f7\'e8\'ed\'b8\'ed\'ed\'fb\'e9 \'e4\'e0\'ed\'ed\'ee\'ec\'f3 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'f3 \'e8\'eb\'e8 \'fd\'eb\'e5\'ec\'e5\'ed\'f2\'fb \ldblquote .\rdblquote \'e8 \ldblquote ..\rdblquote . +\par \'c0\'f2\'f0\'e8\'e1\'f3\'f2 \ldblquote \'e0\'f0\'f5\'e8\'e2\'ed\'fb\'e9\rdblquote . \'dd\'f2\'ee\'f2 \'e1\'e8\'f2 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e8 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff\'f5 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 + \'f4\'e0\'e9\'eb. }{\v +\par }{\f17 \'c5\'e3\'ee \'ec\'ee\'e3\'f3\'f2 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc \'f3\'f2\'e8\'eb\'e8\'f2\'fb \'f1\'ee\'e7\'e4\'e0\'fe\'f9\'e8\'e5 \'e0\'f0\'f5\'e8\'e2\'ed\'fb\'e5 \'ea\'ee\'ef\'e8\'e8 \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed +\'e8\'ff }{\v +\par }{\f17 \'e8\'e7\'ec\'e5\'ed\'b8\'ed\'ed\'fb\'f5 \'f4\'e0\'e9\'eb\'ee\'e2. +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'cf\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9\'eb\'e0, \'c4\'ce\'d1 \'e0\'e2\'f2\'ee\'ec\'e0\'f2\'e8\'f7\'e5\'f1\'ea\'e8 \'f1\'ee\'e7\'e4\'e0\'b8\'f2 \'e1\'eb\'ee +\'ea \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec. \'c1\'eb\'ee\'ea }{\v +\par }{\f17 \'f1\'ee\'e7\'e4\'e0\'b8\'f2\'f1\'ff \'e2 \'f0\'e0\'e1\'ee\'f7\'e8\'f5 \'ee\'e1\'eb\'e0\'f1\'f2\'ff\'f5 \'c4\'ce\'d1 \'e8 \'e5\'e3\'ee \'e0\'e4\'f0\'e5\'f1 \'ed\'e5\'e8\'e7\'e2\'e5\'f1\'f2\'e5\'ed }{\v +\par }{\f17 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'f1\'ea\'ee\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e5. \'c1\'eb\'ee\'ea (\'e8 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'f4\'e0\'e9\'eb) \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'f6\'e8 +\'f0\'f3\'e5\'f2\'f1\'ff }{\v +\par }{\f17 \'ed\'ee\'ec\'e5\'f0\'ee\'ec, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'c4\'ce\'d1 \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'fe \'ef\'ee\'f1\'eb\'e5 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 - \'fd\'f2\'ee\'f2 +\'ed\'ee\'ec\'e5\'f0 }{\v +\par }{\f17 \'ed\'e0\'e7\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'ec \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'ee\'ec. \'c2\'ee \'e2\'f1\'e5\'f5 \'e4\'e0\'eb\'fc\'ed\'e5\'e9\'f8\'e8\'f5 \'ee\'e1\'f0\'e0\'f9\'e5\'ed\'e8\'ff\'f5 \'ea \'f4 +\'f3\'ed\'ea\'f6\'e8\'ff\'ec \'c4\'ce\'d1 }{\v +\par }{\f17 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2\'f1\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0. \'c4\'f0\'f3\'e3\'e8\'ec\'e8 \'f1\'eb\'ee\'e2\'e0\'ec\'e8, \'ef\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9 +\'eb\'e0 }{\v +\par }{\f17 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'f1\'ea\'e0\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'f1\'ee\'ee\'e1\'f9\'e0\'e5\'f2 \'c4\'ce\'d1 \'e5\'e3\'ee \'e8\'ec\'ff \'e8 \'ef\'ee\'eb\'f3\'f7\'e0\'e5\'f2 \'ee\'e1\'f0\'e0\'f2\'ed\'ee \'ed +\'ee\'ec\'e5\'f0, }{\v +\par }{\f17 \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'f1\'eb\'f3\'e6\'e8\'f2 \'eb\'ee\'e3\'e8\'f7\'e5\'f1\'ea\'e8\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 \'ef\'f0\'e8 \'e2\'f1\'e5\'f5 \'e4\'e0\'eb\'fc\'ed\'e5\'e9\'f8\'e8\'f5 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff\'f5 + \'f1 \'f4\'e0\'e9\'eb\'ee\'ec. }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cd\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'e0\'ff \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'f4\'e0\'e9\'eb\'ee\'ec \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'f1\'ee\'f5\'f0\'e0\'ed +\'ff\'e5\'f2\'f1\'ff \'e2 \'f0\'e0\'e1\'ee\'f7\'e8\'f5 \'ee\'e1\'eb\'e0\'f1\'f2\'ff\'f5 \'c4\'ce\'d1. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f1\'e8\'f1\'f2\'e5\'ec\'fb: +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 00h (00) VERSION (}{\b\f17 \'c2\'e5\'f0\'f1\'e8\'ff}{\b\lang1033 DOS) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 00h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'ed\'ee\'ec\'e5\'f0 \'e2\'e5\'f0\'f1\'e8\'e8 +\par E - \'ec\'ee\'e4\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 \'e2\'e5\'f0\'f1\'e8\'e8 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e9 \'f1\'e8\'f1\'f2\'e5\'ec\'fb. + +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'e4\'e8\'f1\'ea\'ee\'ec: +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 01h (01) CHDISK (\'d1\'ec\'e5\'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...) +\par }{C - 01h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par A - \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'fb\'e9 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ec\'e5\'ed\'ff\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e5 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e5 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 02h (02) CURDISK (\'cd\'ee\'ec\'e5\'f0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 02h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...) +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 03h (03) DSKINFO (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'e4\'e8\'f1\'ea\'e5}{\b ) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...0FFh-\'f2\'e5\'ea\'f3\'f9\'e8\'e9) +\par }{C - 03h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par A - \'f0\'e0\'e7\'ec\'e5\'f0 \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'e0 \'e2 \'f1\'e5\'ea\'f2\'ee\'f0\'e0\'f5, \'e5\'f1\'eb\'e8 CF=0 +\par HL - \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb-\'e2\'ee \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'ee\'e2 +\par DE - \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'fb\'f5 \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'ee\'e2 +\par BC - \'f0\'e0\'e7\'ec\'e5\'f0 \'f1\'e5\'ea\'f2\'ee\'f0\'e0 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee\'e1 \'ee\'e1\'f9\'e5\'ec \'e8 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'ec \'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'e5 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0. +\par }{\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,03h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'ff \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8 \'ee \'e4\'e8\'f1\'ea\'e5 +\par \tab LD\tab A,0FFh\tab \tab ;\'d2\'e5\'ea\'f3\'f9\'e8\'e9 \'e4\'e8\'f1\'ea +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab LD\tab A,D\tab \tab ;\'c5\'f1\'f2\'fc \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e5 +\par \tab OR\tab E\tab \tab ;\'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'ee? +\par \tab JR\tab Z,NO_SPACE\tab ;\'c4\'e8\'f1\'ea \'ef\'ee\'eb\'ed\'ee\'f1\'f2\'fc\'fe \'e7\'e0\'ef\'ee\'eb\'ed\'e5\'ed +\par }{ +\par +\par }{\b\f17 09h (09) BOOTDSK (\'cd\'ee\'ec\'e5\'f0 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee \'e4\'e8\'f1\'ea\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 09h +\par B = 0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ed\'ee\'ec\'e5\'f0 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...) +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 c \'ea\'ee\'f2\'ee\'f0\'ee\'e3\'ee \'e7\'e0\'e3\'f0\'f3\'e6\'e5\'ed\'e0 \'f1\'e8\'f1 +\'f2\'e5\'ec\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'f4\'e0\'e9\'eb\'e0\'ec\'e8: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'d4\'e0\'e9\'eb \'ec\'ee\'e6\'ed\'ee \'ee\'f2\'ea\'f0\'fb\'f2\'fc \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 11h (OPEN), \'f2\'ee\'eb\'fc\'ea\'ee +\'e5\'f1\'eb\'e8 \'ee\'ed }{\v +\par }{\f17 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2. \'c5\'f1\'f2\'fc \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'fb\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'e2. \'c5\'f1\'eb\'e8 \'f4\'e0\'e9\'eb \'e1\'fb +\'eb \'f1\'ee\'e7\'e4\'e0\'ed }{\v +\par }{\f17 \'e8 \'f1\'f0\'e0\'e7\'f3 \'e6\'e5 \'e7\'e0\'ea\'f0\'fb\'f2, \'ee\'ed \'e1\'f3\'e4\'e5\'f2 \'ef\'f3\'f1\'f2\'fb\'ec, \'ed\'ee \'e5\'e3\'ee \'ec\'ee\'e6\'ed\'ee \'ee\'f2\'ea\'f0\'fb\'f2\'fc \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 OPEN }{\v +\par }{\f17 \'e4\'eb\'ff \'e7\'e0\'ef\'e8\'f1\'e8 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8. \'c4\'eb\'ff \'f3\'e4\'ee\'e1\'f1\'f2\'e2\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8, \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'f1\'ee\'e7\'e4\'e0\'fe\'f2 \'f4\'e0\'e9\'eb, \'e7\'e0\'f2\'e5 +\'ec }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'f2\'ea\'f0\'fb\'e2\'e0\'fe\'f2 \'e5\'e3\'ee. +\par }\pard \s19\sa120\widctlpar\adjustright {\b\f17 0Ah (10) CREATE (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0 +\par }{C - 0Ah +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'f9\'e5\'f2 \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'f4\'e0\'e9\'eb \'f1 \'e8\'ec\'e5\'ed\'e5\'ec, \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e8\'ec \'f1 \'e8 +\'ec\'e5\'ed\'e5\'ec \'e2 }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. \'c5\'f1\'eb\'e8 \'f2\'e0\'ea\'ee\'e9 \'f4\'e0\'e9\'eb \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2, \'e4\'e5\'eb\'e0\'e5\'f2 \'e5\'e3\'ee \'e4\'eb\'e8\'ed\'f3 \'f0\'e0 +\'e2\'ed\'ee\'e9 0 }{\v +\par }{\f17 \'e8 \'ee\'f2\'ea\'f0\'fb\'e2\'e0\'e5\'f2 \'f4\'e0\'e9\'eb \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff/\'e7\'e0\'ef\'e8\'f1\'e8. \'c5\'f1\'eb\'e8 \'f4\'e0\'e9\'eb \'ed\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed, \'f1\'ee\'e7\'e4\'e0\'e5\'f2\'f1\'ff \'ed +\'ee\'e2\'fb\'e9 \'f4\'e0\'e9\'eb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f1 \'f2\'e0\'ea\'e8\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'e8 \'e4\'eb\'e8\'ed\'ee\'e9 0 \'e8 \'ee\'f2\'ea\'f0\'fb\'e2\'e0\'e5\'f2 \'f4\'e0\'e9\'eb \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +/\'e7\'e0\'ef\'e8\'f1\'e8. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,0Ah\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,00h\tab \tab ;\'c0\'f2\'f0\'e8\'e1\'f3\'f2 \'ee\'e1\'fb\'f7\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab RET\tab C\tab \tab ;\'c2\'ee\'e7\'e2\'f0\'e0\'f2 \'ef\'ee \'ee\'f8\'e8\'e1\'ea\'e5 +\par \tab LD\tab (FILE1),A\tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{\tab +\par }{\lang1033 NAME\tab DB\tab \ldblquote newfile.ext\rdblquote ,0 +\par }{\f17 FILE1\tab DB\tab 00h\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 +\par }{\b\f17 0Bh (11) CREATE NEW FILE (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ed\'ee\'e2\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0 +\par }{C - 0Bh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 0Ah \'e8 \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'e0, \'ea\'ee\'e3\'e4\'e0 \'ed\'f3\'e6\'ed +\'ee \'f1\'ee\'e7\'e4\'e0\'f2\'fc \'f4\'e0\'e9\'eb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f1 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'e8 \'ef\'f0\'ee\'e2\'e5\'f0\'e8\'f2\'fc, \'f7\'f2\'ee \'f4\'e0\'e9\'eb\'e0 \'f1 \'f2\'e0\'ea\'e8 +\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'ed\'e5 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 0Eh (14) DELETE (\'d3\'e4\'e0\'eb\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0 +\par }{C - 0Eh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'f9\'e5\'f2 \'f4\'e0\'e9\'eb \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'e8 \'f3\'e4\'e0\'eb\'ff\'e5\'f2 \'e5\'e3\'ee. \'c3\'eb +\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb * \'e8 ? \'e2 }{\v +\par }{\f17 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff. \'d4\'e0\'e9\'eb\'fb \'f1 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'ec \'f2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff \'ed\'e5\'eb\'fc\'e7\'ff +\'f1\'f2\'e5\'f0\'e5\'f2\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 - \'f1\'ed\'e0\'f7\'e0\'eb\'e0 \'ed\'f3\'e6\'ed\'ee \'e8\'e7\'ec\'e5\'ed\'e8\'f2\'fc \'fd\'f2\'ee\'f2 \'e0\'f2\'f0\'e8 +\'e1\'f3\'f2. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,0Eh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'e4\'e0\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\lang1033 NAME\tab DB\tab \ldblquote newfile.ext\rdblquote ,0 +\par +\par +\par }{\b\lang1033 }{\b\f17 10h (16) RENAME (\'cf\'e5\'f0\'e5\'e8\'ec\'e5\'ed\'ee\'e2\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'f2\'e0\'f0\'ee\'e5 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'ed\'ee\'e2\'ee\'e5 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par }{C - 10h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard \s19\qj\sa120\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'f9\'e5\'f2 \'f4\'e0\'e9\'eb \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'e8 \'e7\'e0\'ec\'e5\'ed\'ff\'e5\'f2 \'e5\'e3\'ee \'e8\'ec\'ff \'ed\'e0 +\'ed\'ee\'e2\'ee\'e5. \'c3\'eb\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb * \'e8 ? \'e2 \'e8\'ec\'e5\'ed\'e0\'f5 \'f4\'e0\'e9\'eb\'ee\'e2 \'ed\'e5 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,OLDNAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1\'ee \'f1\'f2\'e0\'f0\'fb\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 + +\par \tab LD\tab DE,NEWNAME\tab ;DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'ed\'ee\'e2\'fb\'ec \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,10h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'e8\'ec\'e5\'ed\'ee\'e2\'e0\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\lang1033 OLDNAME\tab DB\tab \ldblquote oldfile.doc\rdblquote ,0 +\par NEWNAME\tab DB\tab \ldblquote newfile.txt\rdblquote ,0 +\par +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5/\'e7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'ce\'f2\'ea\'f0\'fb\'f2\'fc \'f4\'e0\'e9\'eb - \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'eb\'ff \'ed\'e5\'e3\'ee \'ee\'e1\'eb\'e0\'f1 +\'f2\'fc \'ef\'e0\'ec\'ff\'f2\'e8 (\'e1\'eb\'ee\'ea }{\v +\par }{\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff), \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e8\'f2\'fc \'f4\'e0\'e9\'eb \'e8 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'f2\'e8 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'b8\'ed\'ed\'f3\'fe \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'e8\'e7 \'ea +\'e0\'f2\'e0\'eb\'ee\'e3\'e0 \'e2 }{\v +\par }{\f17 \'e1\'eb\'ee\'ea \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec. \'cf\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'e2 \'ea\'e0\'f7\'e5\'f1\'f2\'e2\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 \'f4\'f3 +\'ed\'ea\'f6\'e8\'e8 11h }{\v +\par }{\f17 (OPEN) \'e8\'ec\'ff \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb \'f4\'e0\'e9\'eb\'e0. \'c4\'ce\'d1 \'f1\'ee\'e7\'e4\'e0\'b8\'f2 \'e8 \'e7\'e0\'ef\'ee\'eb\'ed\'ff\'e5\'f2 \'e1\'eb\'ee\'ea \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec +\'e2 }{\v +\par }{\f17 \'f1\'e2\'ee\'e8\'f5 \'f0\'e0\'e1\'ee\'f7\'e8\'f5 \'ee\'e1\'eb\'e0\'f1\'f2\'ff\'f5. \'cf\'ee\'f1\'eb\'e5 \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc \'ef\'ee\'eb\'f3\'f7\'e0 +\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 }{\v +\par }{\f17 (\'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0), \'ea\'ee\'f2\'ee\'f0\'fb\'ec \'f4\'e0\'e9\'eb \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'f6\'e8\'f0\'f3\'e5\'f2\'f1\'ff \'e2\'ee \'e2\'f1\'e5\'f5 \'ef\'ee\'f1\'eb\'e5\'e4\'f3 +\'fe\'f9\'e8\'f5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff\'f5, \'e2\'ef\'eb\'ee\'f2\'fc \'e4\'ee \'e5\'e3\'ee \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'cf\'f0\'e8 \'f0\'e0\'e1\'ee\'f2\'e5 \'f1 \'f4\'e0\'e9\'eb\'ee\'ec, \'c4\'ce\'d1 \'e8\'e7\'ec\'e5\'ed\'ff\'e5\'f2 \'ed\'e5\'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'e8\'e7 \'ef\'ee\'eb\'e5 +\'e9 \'e1\'eb\'ee\'ea\'e0 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'ee\'ec: \'f0\'e0\'e7\'ec\'e5\'f0 \'f4\'e0\'e9\'eb\'e0, \'f2\'e5\'ea\'f3\'f9\'e0\'ff \'ef\'ee\'e7\'e8\'f6\'e8\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'e4\'f0. \'cf\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'f1\'ea\'e0\'ff \'ef\'f0\'ee\'e3 +\'f0\'e0\'ec\'ec\'e0 }{\v +\par }{\f17 \'f2\'e0\'ea\'e6\'e5 \'f1\'ef\'ee\'f1\'ee\'e1\'ed\'e0 \'e8\'e7\'ec\'e5\'ed\'ff\'f2\'fc \'ef\'ee\'eb\'ff \'e1\'eb\'ee\'ea\'e0 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f1 \'ef\'ee\'ec\'ee\'f9\'fc\'fe \'f4\'f3\'ed\'ea\'f6\'e8\'e9 \'c4\'ce\'d1. }{ +\v +\par }{\f17 \'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'ef\'f0\'e5\'ea\'f0\'e0\'f9\'e5\'ed\'e8\'e5 \'ee\'e1\'ec\'e5\'ed\'e0 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8 \'f1 \'f4\'e0\'e9\'eb\'ee\'ec. \'cf\'f0\'e8 \'fd +\'f2\'ee\'ec }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 \'e8 \'e1\'eb\'ee\'ea \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'e7\'e0\'ea\'f0\'fb\'e2\'e0\'e5\'ec\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e0 +\'fe\'f2\'f1\'ff, \'e0 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'e7\'e0\'ec\'e5\'ed\'ff\'e5\'f2\'f1\'ff \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e5\'e9 \'e8\'e7 \'e1\'eb\'ee\'ea\'e0 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff, \'ef\'ee +\'fd\'f2\'ee\'ec\'f3 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f1\'e5\'e3\'e4\'e0 \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'e7\'e0\'ea\'f0\'fb\'e2\'e0\'f2\'fc \'f4\'e0\'e9\'eb\'fb. +\par }\pard \s19\sa120\widctlpar\adjustright {\b\lang1033 +\par +\par }{\b\f17 11h (17) OPEN (\'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par A - \'f0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0 +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A=0 \'f7\'f2\'e5\'ed\'e8\'e5/\'e7\'e0\'ef\'e8\'f1\'fc +\par A=1 \'f7\'f2\'e5\'ed\'e8\'e5 +\par A=2 \'e7\'e0\'ef\'e8\'f1\'fc +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 11h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'f9\'e5\'f2 \'f4\'e0\'e9\'eb \'f1 \'e8\'ec\'e5\'ed\'e5\'ec, \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e8\'ec \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'e2 \'f4\'e0\'e9 +\'eb\'ee\'e2\'ee\'e9 \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. }{\v +\par }{\f17 \'c5\'f1\'eb\'e8 \'f2\'e0\'ea\'ee\'e9 \'f4\'e0\'e9\'eb \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2, \'ee\'f2\'ea\'f0\'fb\'e2\'e0\'e5\'f2 \'e5\'e3\'ee. \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 +\'f4\'e0\'e9\'eb\'e5 }{\v +\par }{\f17 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ed\'e0\'f7\'e0\'eb\'ee \'f4\'e0\'e9\'eb\'e0. \'cf\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9\'eb\'e0 \'e2 \'f0\'e5\'e6\'e8\'ec\'e5 \'e4\'ee\'f1\'f2\'f3\'ef\'e0 1 - +\'f2\'ee\'eb\'fc\'ea\'ee }{\v +\par }{\f17 \'f7\'f2\'e5\'ed\'e8\'e5 \'c4\'ce\'d1 \'e1\'f3\'e4\'e5\'f2 \'e1\'eb\'ee\'ea\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'ef\'ee\'ef\'fb\'f2\'ea\'e8 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb, \'ef\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'e2 \'f0\'e5\'e6\'e8 +\'ec\'e5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'ee\'f1\'f2\'f3\'ef\'e0 2 - \'f2\'ee\'eb\'fc\'ea\'ee \'e7\'e0\'ef\'e8\'f1\'fc \'c4\'ce\'d1 \'e1\'f3\'e4\'e5\'f2 \'e1\'eb\'ee\'ea\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'ef\'ee\'ef\'fb +\'f2\'ea\'e8 \'f7\'f2\'e5\'ed\'e8\'ff \'e8\'e7 \'f4\'e0\'e9\'eb\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 12h (18) CLOSE (\'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par }{C - 12h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ea\'f0\'fb\'e2\'e0\'e5\'f2 \'f4\'e0\'e9\'eb, \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e0\'e5\'f2 \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3 +\'eb\'ff\'f2\'ee\'f0 \'e8 \'e1\'eb\'ee\'ea }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec. \'cf\'e5\'f0\'e5\'ed\'ee\'f1\'e8\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'e8\'e7 \'e1\'eb\'ee\'ea\'e0 \'f3 +\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'d7\'f2\'e5\'ed\'e8\'e5 \'e8 \'e7\'e0\'ef\'e8\'f1\'fc \'e2 \'f4\'e0\'e9\'eb: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c2\'f1\'e5 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'e8 \'f7\'f2\'e5\'ed\'e8\'ff \'e8 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'fe\'f2\'f1 +\'ff \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'e2 }{\v +\par }{\f17 \'ef\'ee\'eb\'e5 \'e1\'eb\'ee\'ea\'e0 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'ec, \'ea\'ee\'f2\'ee\'f0\'ee\'e5 \'ed\'e0\'e7\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'e5\'ec \'f2\'e5\'ea\'f3\'f9\'e8\'e5 +\'ef\'ee\'e7\'e8\'f6\'e8\'e8 }{\v +\par }{\f17 \'e2 \'f4\'e0\'e9\'eb\'e5. \'c7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f0\'e0\'f1\'f1\'ec\'e0\'f2\'f0\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ea\'e0\'ea \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5 \'ee\'f2 \'ed +\'e0\'f7\'e0\'eb\'e0 }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'e0. \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ec\'ee\'e6\'ed\'ee \'e8\'e7\'ec\'e5\'ed\'ff\'f2\'fc \'f1 \'ef\'ee\'ec\'ee\'f9\'fc\'fe \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'c4\'ce\'d1 15h (MOVE_FP), \'f7\'f2\'ee\'e1\'fb \'ee\'ed }{\v +\par }{\f17 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'eb\'fc\'ed\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'e2 \'f4\'e0\'e9\'eb\'e5. \'ca\'f0\'ee\'ec\'e5 \'fd\'f2\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8, \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea +\'e0\'e7\'e0\'f2\'e5\'eb\'ff }{\v +\par }{\f17 \'e8\'e7\'ec\'e5\'ed\'ff\'fe\'f2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'f7\'f2\'e5\'ed\'e8\'ff \'e8 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb. \'cf\'f0\'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e8 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'f7\'f2\'e5\'ed\'e8\'ff +\'e8\'eb\'e8 }{\v +\par }{\f17 \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb \'e7\'e0\'e4\'e0\'e5\'f2\'f1\'ff \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e1\'e0\'e9\'f2, \'ea\'ee\'f2\'ee\'f0\'ee\'e5 \'ed\'f3\'e6\'ed\'ee \'ef\'f0\'ee\'f7\'e5\'f1\'f2\'fc \'e8\'eb\'e8 \'e7\'e0\'ef +\'e8\'f1\'e0\'f2\'fc \'e8 }{\v +\par }{\f17 \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8, \'e3\'e4\'e5 \'f0\'e0\'f1\'ef\'ee\'eb\'e0\'e3\'e0\'fe\'f2\'f1\'ff \'fd\'f2\'e8 \'e1\'e0\'e9\'f2\'fb. \'c1\'e0\'e9\'f2\'fb \'f1\'f7\'e8\'f2\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'e8\'eb\'e8 \'e7\'e0\'ef\'e8 +\'f1\'fb\'e2\'e0\'fe\'f2\'f1\'ff }{\v +\par }{\f17 \'e2 \'f4\'e0\'e9\'eb \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'f4\'e0\'e9\'eb\'e5. \'cf\'ee\'f1 +\'eb\'e5 }{\v +\par }{\f17 \'ea\'e0\'e6\'e4\'ee\'e3\'ee \'f7\'f2\'e5\'ed\'e8\'ff \'e8\'eb\'e8 \'e7\'e0\'ef\'e8\'f1\'e8 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'e5\'f0\'e5 +\'ed\'e5\'f1\'b8\'ed\'ed\'fb\'f5 }{\v +\par }{\f17 \'e1\'e0\'e9\'f2. \'cf\'f0\'e8 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9\'eb\'e0, \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed +\'e0 \'ed\'e0\'f7\'e0\'eb\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f4\'e0\'e9\'eb\'e0 (\'ee\'e1\'ed\'f3\'eb\'ff\'e5\'f2\'f1\'ff). +\par }\pard \s19\sa120\widctlpar\adjustright {\b\f17 13h (19) READ (\'d7\'f2\'e5\'ed\'e8\'e5 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par HL - \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 +\par DE - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f7\'e8\'f2\'e0\'e5\'ec\'fb\'f5 \'e1\'e0\'e9\'f2 +\par }{C - 13h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par DE - \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2 +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e5\'f1\'eb\'e8 CF=0: +\par A = 0 \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'fb \'e2\'f1\'e5 \'e1\'e0\'e9\'f2\'fb +\par A = 0FFh \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ee \'ec\'e5\'ed\'fc\'f8\'e5\'e5 \'f7\'e8\'f1\'eb\'ee \'e1\'e0\'e9\'f2 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f7\'e8\'f2\'e0\'e5\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e1\'e0\'e9\'f2 \'f1 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef +\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'f4\'e0\'e9\'eb\'e5. \'cf\'ee\'f1\'eb\'e5 }{\v +\par }{\f17 \'f7\'f2\'e5\'ed\'e8\'ff \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2 +\'e2\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ca\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2 \'ed\'e5 \'e2\'f1\'e5\'e3\'e4\'e0 \'f0\'e0\'e2\'ed\'ee \'e7\'e0\'ff\'e2\'eb\'e5\'ed +\'ed\'ee\'ec\'f3. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ef\'f0\'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'ee\'f1\'f2\'e8\'e6\'e5\'ed\'e8\'e8 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par ; \'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 newfile.doc \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,11h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,1\tab \tab ;\'d0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0: \'f7\'f2\'e5\'ed\'e8\'e5 +\par }{\tab RST\tab 10h\tab }{\f17 \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,OPEN_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab (HANDLE),A\tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'ea\'ee\'ed\'e5\'f6 \'f4\'e0\'e9 +\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,15h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par \tab LD\tab B,2\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0 +\par }{\tab LD\tab HL,0\tab \tab ;3}{\f17 2 \'e1\'e8\'f2\'ed\'ee\'e5 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 HL:IX +\par \tab LD\tab IX,0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ed\'e0 0 \'e1\'e0\'e9\'f2 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,FP_ERROR\tab ;\'ce\'f8\'e8\'e1\'ea\'e0 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par \tab \tab \tab \tab ;\'c2 HL:IX \'f0\'e0\'e7\'ec\'e5\'f0 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab (L_FILELEN),IX\tab ;\'c7\'e0\'ef\'ee\'ec\'e8\'ed\'e0\'e5\'ec \'ec\'eb\'e0\'e4\'f8\'e8\'e5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb +\par }{\tab LD\tab (H_FI}{\f17 LELEN),HL;\'c7\'e0\'ef\'ee\'ec\'e8\'ed\'e0\'e5\'ec \'f1\'f2\'e0\'f0\'f8\'e8\'e5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'ed\'e0\'f7\'e0\'eb\'ee \'f4\'e0 +\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,15h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par \tab LD\tab B,0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ee\'f2 \'ed\'e0\'f7\'e0\'eb\'e0 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab HL,0\tab \tab ;32 \'e1\'e8\'f2\'ed\'ee\'e5 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 HL:IX +\par \tab LD\tab IX,0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ed\'e0 0 \'e1\'e0\'e9\'f2 +\par }{\tab LD\tab A,(HA}{\f17 NDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,FP_ERROR\tab ;\'ce\'f8\'e8\'e1\'ea\'e0 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par }{ +\par }{\f17 \tab LD\tab DE,(H_FILELEN);\'c1\'e5\'f0\'b8\'ec \'f1\'f2\'e0\'f0\'f8\'e8\'e5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,D\tab \tab ;\'cf\'f0\'ee\'e2\'e5\'f0\'ff\'e5\'ec \'f7\'f2\'ee \'e4\'eb\'e8\'ed\'e0 \'f4\'e0\'e9\'eb\'e0 +\par \tab CP\tab E\tab \tab ;\'ec\'e5\'ed\'fc\'f8\'e5 64 \'ea\'e8\'eb\'ee\'e1\'e0\'e9\'f2 +\par \tab JP\tab NZ,BIG_FILE\tab ;\'ee\'f8\'e8\'e1\'ea\'e0 \'f4\'e0\'e9\'eb \'ee\'f7\'e5\'ed\'fc \'e1\'ee\'eb\'fc\'f8\'ee\'e9 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'d7\'f2\'e5\'ed\'e8\'e5 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,13h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f7\'f2\'e5\'ed\'e8\'e5 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab LD\tab DE,(L_FILELEN);\'c1\'e5\'f0\'e5\'ec \'ec\'eb\'e0\'e4\'f8\'e8\'e5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab HL,BUFFER\tab ;\'c1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,READ_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'f7\'f2\'e5\'ed\'e8\'ff +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,12h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,CLOSE_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par }{ +\par }{\f17 NAME\tab \tab DB\tab \ldblquote newfile.doc\rdblquote ,0 \tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'e0\'ff \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff +\par HANDLE\tab DB\tab 0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par L_FILELEN\tab DW\tab 0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'ec\'eb\'e0\'e4\'f8\'e8\'f5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb +\par H_FILELEN\tab DW\tab 0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'ec\'eb\'e0\'e4\'f8\'e8\'f5 16 \'e1\'e8\'f2 \'e4\'eb\'e8\'ed\'fb +\par BUFFER\tab DS\tab 256,0\tab \tab ;\'c1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par }{ +\par +\par }{\b\f17 14h (20) WRITE (\'c7\'e0\'ef\'e8\'f1\'fc \'e2 \'f4\'e0\'e9\'eb) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par HL - \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 +\par DE - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'ec\'fb\'f5 \'e1\'e0\'e9\'f2 +\par }{C - 14h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 DE - \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e1\'e0\'e9\'f2 \'f1 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8 +\'f6\'e8\'e8 \'e2 \'f4\'e0\'e9\'eb\'e5. }{\v +\par }{\f17 \'cf\'ee\'f1\'eb\'e5 \'e7\'e0\'ef\'e8\'f1\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ea\'ee\'eb +\'e8\'f7\'e5\'f1\'f2\'e2\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ca\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2 \'ed\'e5 \'e2\'f1\'e5\'e3\'e4\'e0 \'f0\'e0\'e2\'ed\'ee \'e7\'e0\'ff\'e2\'eb\'e5\'ed\'ed +\'ee\'ec\'f3. \'dd\'f2\'ee \'ec\'ee\'e6\'e5\'f2 }{\v +\par }{\f17 \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc\'f1\'ff, \'ed\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'e5\'f1\'eb\'e8 \'ed\'e0 \'e4\'e8\'f1\'ea\'e5 \'ed\'e5\'f2 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e3\'ee \'ec\'e5\'f1\'f2\'e0. }{\v +\par }{\f17 \'cf\'f0\'e8 \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'e8 \'f4\'e0\'e9\'eb\'e0 \'e5\'e3\'ee \'e4\'eb\'e8\'ed\'e0 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'ff\'e5\'f2\'f1\'ff \'ed\'e5 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5\'ec \'f3\'ea\'e0\'e7\'e0 +\'f2\'e5\'eb\'ff \'e2 }{\v +\par }{\f17 \'f4\'e0\'e9\'eb\'e5, \'e0 \'e5\'e3\'ee \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'fb\'ec \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5\'ec \'e8\'eb\'e8 \'f1\'f2\'e0\'f0\'ee\'e9 \'e4\'eb\'e8\'ed\'ee\'e9 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 \'ee\'ed\'e0 \'e1 +\'ee\'eb\'fc\'f8\'e5. }{\v +\par }{\f17 \'c5\'f1\'eb\'e8, \'ed\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ee\'f2\'ea\'f0\'fb\'f2\'fc \'f4\'e0\'e9\'eb \'e4\'eb\'e8\'ed\'ee\'e9 1000 \'e1\'e0\'e9\'f2 \'ef\'f0\'e8 \'ef\'ee\'ec\'ee\'f9\'e8 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 11h (OPEN), }{\v +\par }{\f17 \'e7\'e0\'ef\'e8\'f1\'e0\'f2\'fc \'e2 \'ed\'e5\'e3\'ee 500 \'e1\'e0\'e9\'f2 \'e8 \'e7\'e0\'f2\'e5\'ec \'e7\'e0\'ea\'f0\'fb\'f2\'fc. \'cf\'e5\'f0\'e2\'fb\'e5 500 \'e1\'e0\'e9\'f2 \'e1\'f3\'e4\'f3\'f2 \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'fb \'ed\'ee\'e2\'ee +\'e9 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e5\'e9, \'e0 \'ee\'f1\'f2\'e0\'e2\'f8\'e8\'e5\'f1\'ff \'e1\'f3\'e4\'f3\'f2 \'e1\'e5\'e7 \'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'ff. \'c5\'f1\'eb\'e8 \'e6\'e5 \'f2\'f0\'e5\'e1\'f3\'e5\'f2\'f1\'ff \'ef\'e5\'f0\'e5\'ea +\'f0\'fb\'f2\'fc }{\v +\par }{\f17 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'f4\'e0\'e9\'eb, \'e5\'e3\'ee \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'ee\'f2\'ea\'f0\'fb\'f2\'fc \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 0Ah (CREATE), \'ea\'ee\'f2\'ee\'f0\'e0\'ff \'f3\'ec\'e5\'ed\'fc\'f8\'e8\'f2 } +{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'eb\'e8\'ed\'f3 \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e4\'ee 0. +\par }\pard \s19\sa120\widctlpar\adjustright { +\par +\par +\par }{\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f17 ; \'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 newfile.doc \'e4\'eb\'ff \'e7\'e0\'ef\'e8\'f1\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,11h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,2\tab \tab ;\'d0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0: \'e7\'e0\'ef\'e8\'f1\'fc +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,OPEN_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'ee\'f2\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab (HANDLE),A\tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'d3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e2 \'ea\'ee\'ed\'e5\'f6 \'f4\'e0\'e9 +\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,15h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par \tab LD\tab B,2\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab HL,0\tab \tab ;32 \'e1\'e8\'f2\'ed\'ee\'e5 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 HL:IX +\par \tab LD\tab IX,0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ed\'e0 0 \'e1\'e0\'e9\'f2 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,FP_ERROR\tab ;\'ce\'f8\'e8\'e1\'ea\'e0 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c7\'e0\'ef\'e8\'f1\'fc \'e2 \'f4\'e0\'e9\'eb (\'e4\'ee\'e1\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'ee\'ea\'e8 \'e2 \'ea\'ee\'ed\'e5\'f6 \'f4\'e0\'e9\'eb\'e0) +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,14h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab LD\tab DE,12 \tab \tab ;\'c1\'e5\'f0\'e5\'ec \'e4\'eb\'e8\'ed\'f3 \'e7\'e0\'ef\'e8\'f1\'e8 12 \'e1\'e0\'e9\'f2 +\par }{\tab }{\lang1033 LD\tab HL,BUFFER\tab ;}{\f17 \'c1\'f3\'f4\'e5\'f0}{\lang1033 }{\f17 \'f1\'ee}{\lang1033 }{\f17 \'f1\'f2\'f0\'ee\'ea\'ee\'e9}{\lang1033 \ldblquote end of file!\rdblquote +\par \tab }{\f17 RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab JR\tab }{\f17 C,READ_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'f7\'f2\'e5\'ed\'e8\'ff +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,12h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,(HANDLE)\tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab C,CLOSE_ERROR;\'ce\'f8\'e8\'e1\'ea\'e0 \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'ee\'f1\'eb\'e5 \'e7\'e0\'ef\'e8\'f1\'e8 \'e4\'eb\'e8\'ed\'e0 \'f4\'e0\'e9\'eb\'e0 \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'f2\'f1\'ff \'ed\'e0 12 \'e1\'e0\'e9\'f2 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {NAME\tab \tab DB\tab \ldblquote newfile.d}{\f17 oc\rdblquote ,0 \tab ;\'d4\'e0\'e9\'eb\'ee\'e2\'e0\'ff \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff +\par HANDLE\tab DB\tab 0\tab \tab ;\'cf\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'e0\'ff \'e4\'eb\'ff \'f1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par }{\lang1033 BUFFER\tab DB\tab \ldblquote end of file!\rdblquote \tab ;}{\f17 \'c1\'f3\'f4\'e5\'f0}{\lang1033 }{\f17 \'e4\'eb\'ff}{\lang1033 }{\f17 \'e7\'e0\'ef\'e8\'f1\'e8}{\lang1033 +\par +\par +\par }{\b\lang1033 }{\b\f17 15h (21) MOVE_FP (\'cf\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'e2 \'f4\'e0\'e9\'eb\'e5) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL:IX - \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'e2 \'f4\'e0\'e9\'eb\'e5 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f1\'ef\'ee\'f1\'ee\'e1 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B=0 \'ee\'f2 \'ed\'e0\'f7\'e0\'eb\'e0 \'f4\'e0\'e9\'eb\'e0 +\par B=1 \'ee\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par B=2 \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {C - 15h +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL:IX - \'ed\'ee\'e2\'ee\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL:IX \'e8\'ed\'f2\'e5\'f0\'ef\'f0\'e5\'f2\'e8\'f0\'f3\'e5\'f2\'f1\'ff \'ea\'e0\'ea 32-\'e1\'e8\'f2\'ed\'ee\'e5 \'f7\'e8\'f1\'eb\'ee. \'c5\'f1\'eb\'e8 \'f7\'e8\'f1\'eb\'ee \'ec\'e5\'ed\'fc +\'f8\'e5 }{65536, }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 HL \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 0. \'c2\'ee\'e7\'ec\'ee\'e6\'ed\'fb \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e5 \'f1\'ef\'ee\'f1\'ee\'e1\'fb \'ef\'e5\'f0 +\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B=0\tab \'d1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f1\'f7\'e8\'f2\'e0\'e5\'f2\'f1\'ff \'ee\'f2 \'ed\'e0\'f7\'e0\'eb\'e0 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 HL:IX=0, \'f3\'ea\'e0\'e7\'e0\'f2\'e5 +\'eb\'fc }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'ed\'e0\'f7\'e0\'eb\'ee \'f4\'e0\'e9\'eb\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B=1 \tab \'d1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f1\'f7\'e8\'f2\'e0\'e5\'f2\'f1\'ff \'ee\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb +\'ff. +\par }{ +\par B=2 \tab }{\f17 \'d1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f1\'f7\'e8\'f2\'e0\'e5\'f2\'f1\'ff \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 HL:IX=0, \'ef\'ee\'f1\'eb\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff +\par HL:IX\tab \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'f1\'ff \'e4\'eb\'e8\'ed\'e0 \'f4\'e0\'e9\'eb\'e0 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5. +\par }{ +\par +\par }{\b\f17 16h (22) ATTRIB (\'cf\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'e5/\'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'e0 \'f4\'e0\'e9\'eb\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par B - \'f0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0 +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B=0 \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'e0\'f2\'f0\'e8\'e1\'f3\'f2 +\par B=1 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e0\'f2\'f0\'e8\'e1\'f3\'f2 +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0 +\par }{C - 16h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2/\'e8\'e7\'ec\'e5\'ed\'ff\'e5\'f2 \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 17h (23) GET_D_T (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par }{C - 17h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'e4\'e5\'ed\'fc +\par E - \'ec\'e5\'f1\'ff\'f6 +\par IX - \'e3\'ee\'e4 +\par H - \'f7\'e0\'f1 +\par L - \'ec\'e8\'ed\'f3\'f2\'fb +\par B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'ff \'e8\'eb\'e8 +\'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'e9 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ec\'ee\'e4\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f4\'e0\'e9\'eb\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 18h (24) PUT_D_T (\'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e4\'e0\'f2\'fb \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par D - \'e4\'e5\'ed\'fc +\par E - \'ec\'e5\'f1\'ff\'f6 +\par IX - \'e3\'ee\'e4 +\par H - \'f7\'e0\'f1 +\par L - \'ec\'e8\'ed\'f3\'f2\'fb +\par B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb +\par }{C - 18h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'e7\'ec\'e5\'ed\'ff\'e5\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f1\'ee\'e7\'e4\'e0\'ed\'e8 +\'ff \'e8\'eb\'e8 \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'e9 }{\v +\par }{\f17 \'ec\'ee\'e4\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f4\'e0\'e9\'eb\'e0. \'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8 \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f0\'e5\'e0\'eb\'fc\'ed\'ee \'ef\'f0\'ee\'e8 +\'e7\'ee\'e9\'e4\'e5\'f2 }{\v +\par }{\f17 \'f2\'ee\'eb\'fc\'ea\'ee \'ef\'ee\'f1\'eb\'e5 \'e7\'e0\'ea\'f0\'fb\'f2\'e8\'ff \'f4\'e0\'e9\'eb\'e0. \'c0 \'eb\'fe\'e1\'e0\'ff \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff \'e7\'e0\'ef\'e8\'f1\'e8 \'e2 \'f4\'e0\'e9\'eb \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2 \'f2 +\'e5\'ea\'f3\'f9\'f3\'fe }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e0\'f2\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 19h (25) F_FIRST (\'cf\'ee\'e8\'f1\'ea \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par DE - \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 44 \'e1\'e0\'e9\'f2\'e0, \'e5\'f1\'eb\'e8 B=0, \'e8\'ed\'e0\'f7\'e5 256 \'e1\'e0\'e9\'f2 +\par A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb, \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'ec\'fb\'e5 \'ef\'f0\'e8 \'ef\'ee\'e8\'f1\'ea\'e5 +\par }\pard\plain \s21\li720\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B = 0 - \'e8\'ec\'ff \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 11 \'e1\'e0\'e9\'f2 \ldblquote FilenameExt\rdblquote +\par B = 1 - \'e8\'ec\'ff \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 DOS \ldblquote filename.ext\rdblquote ,0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {C - 19h +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'ef\'ee\'e8\'f1\'ea \'ea\'ee\'ed\'ea\'f0\'e5\'f2\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e8\'eb\'e8 \'ef\'e5 +\'f0\'e2\'ee\'e3\'ee (\'ef\'ee \'e5\'e3\'ee \'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'fe }{\v +\par }{\f17 \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5) \'e8\'e7 \'e3\'f0\'f3\'ef\'ef\'fb \'f4\'e0\'e9\'eb\'ee\'e2. \'cc\'ee\'e6\'ed\'ee \'f3\'ea\'e0\'e7\'e0\'f2\'fc \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'eb\'fc\'ed\'ee\'e5 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee \'e8 \'ea +\'e0\'f2\'e0\'eb\'ee\'e3 }{\v +\par }{\f17 \'e4\'eb\'ff \'ef\'ee\'e8\'f1\'ea\'e0. \'c2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff \'e3\'eb\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8 *. }{\v +\par }{\f17 \'c5\'f1\'eb\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2 \'e4\'eb\'ff \'ef\'ee\'e8\'f1\'ea\'e0 \'f0\'e0\'e2\'ed\'ee 00h, \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef\'ee\'e8\'f1\'ea \'f2\'ee\'eb\'fc +\'ea\'ee }{\v +\par }{\f17 \'ee\'e1\'fb\'f7\'ed\'fb\'f5 \'f4\'e0\'e9\'eb\'ee\'e2. \'c5\'f1\'eb\'e8 \'e2 \'e1\'e0\'e9\'f2\'e5 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2 \'e1\'e8\'f2\'fb \'e4\'eb\'ff \'f1\'ea\'f0\'fb\'f2\'ee\'e3\'ee, \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee, \'f2 +\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff }{\v +\par }{\f17 \'f7\'f2\'e5\'ed\'e8\'ff \'e8\'eb\'e8 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 (\'e8\'eb\'e8 \'e8\'f5 \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'eb\'fc\'ed\'e0\'ff \'ea\'ee\'ec\'e1\'e8\'ed\'e0\'f6\'e8\'ff) \'f0\'e0\'e2\'ed\'fb 1, \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb +\'ff\'e5\'f2\'f1\'ff }{\v +\par }{\f17 \'ef\'ee\'e8\'f1\'ea \'e2\'f1\'e5\'f5 \'f4\'e0\'e9\'eb\'ee\'e2, \'f7\'fc\'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'fb\'ec, \'e0 \'f2\'e0\'ea\'e6\'e5 \'e2\'f1\'e5\'f5 \'ee +\'e1\'fb\'f7\'ed\'fb\'f5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f4\'e0\'e9\'eb\'ee\'e2. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'c5\'f1\'eb\'e8 \'f4\'e0\'e9\'eb \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed, \'ef\'ee \'e0\'e4\'f0\'e5\'f1\'f3, \'ed\'e0 \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'f0 +\'e5\'e3\'e8\'f1\'f2\'f0 DE \'e1\'f3\'e4\'e5\'f2 }{\v +\par }{\f17 \'e7\'e0\'ef\'ee\'eb\'ed\'e5\'ed \'e1\'f3\'f4\'e5\'f0 \'f1 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e5\'e9 \'ee \'f4\'e0\'e9\'eb\'e5. \'c8\'ed\'e0\'f7\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e2\'e5\'f0\'f8\'e8\'f2\'f1\'ff \'f1 \'ee\'f8\'e8\'e1\'ea +\'ee\'e9 \ldblquote \'f4\'e0\'e9\'eb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ed\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\rdblquote . +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'f4\'ee\'f0\'ec\'e0\'f2 \'e1\'f3\'f4\'e5\'f0\'e0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +00 8\tab db\tab \ldblquote FILE????\rdblquote \tab \tab ;}{\f17 \'f8\'e0\'e1\'eb\'ee\'ed \'e8\'ec\'e5\'ed\'e8 +\par +08 3\tab db\tab \ldblquote ???\rdblquote \tab \tab \tab ; \'f8\'e0\'e1\'eb\'ee\'ed \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff +\par +11 1\tab db\tab #20\tab \tab \tab ; \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb \'e4\'eb\'ff \'ef\'ee\'e8\'f1\'ea\'e0 +\par +12 10\tab ds\tab 10\tab \tab \tab ; \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'ee +\par +22 2\tab dw\tab #0000\tab \tab \tab ; \'e2\'f0\'e5\'ec\'ff \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par +24 2\tab dw\tab #0000\tab \tab \tab ; \'e4\'e0\'f2\'e0 \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par }{ +26 2\tab dw}{\f17 \tab #0000\tab \tab \tab ; \'ed\'ee\'ec\'e5\'f0 \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'e0 +\par +28 4\tab dw\tab #0000,#0000\tab \tab ; \'f0\'e0\'e7\'ec\'e5\'f0 \'f4\'e0\'e9\'eb\'e0 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5 +\par +32 1\tab db\tab #20\tab \tab \tab ; \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par +33 11\tab db\tab \ldblquote FILENAMEEXT\rdblquote \tab ; \'e8\'ec\'ff \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'ea\'ee\'ef\'e8\'ff \'e8\'e7 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par }{ +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8\'eb\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +33 n\tab db\tab \ldblquote filename.ext\rdblquote ,0\tab }{\f17 \tab ; \'e8\'ec\'ff \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 +\'e5 \'c4\'ce\'d1 +\par }{ +\par }{\b\f17 1Ah (26) F_NEXT (\'cf\'ee\'e8\'f1\'ea \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 +\par }{C - 1Ah +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cf\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb \'e1\'e5\'f0\'f3\'f2\'f1\'ff \'e8\'e7 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 F_FIRST, \'e5\'f1\'eb\'e8 \'ee\'ed\'e0 \'ed\'e5 \'e2\'fb\'ef\'ee\'eb\'ed\'ff\'eb\'e0 +\'f1\'fc, \'f2\'ee }{\v +\par }{\f17 F_NEXT \'e2\'e5\'f0\'ed\'e5\'f2\'f1\'ff \'f1 \'ee\'f8\'e8\'e1\'ea\'ee\'e9 \ldblquote \'ed\'e5\'e2\'ee\'e7\'ec\'ee\'e6\'ed\'e0\'ff \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff\rdblquote , \'ed\'e5 \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'e2\'fb\'ef\'ee\'eb\'ed\'ff\'f2 +\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'e8, \'ea\'ee\'f2\'ee\'f0\'fb\'e5 \'ec\'ee\'e3\'f3\'f2 \'f0\'e0\'e7\'f0\'f3\'f8\'e8\'f2\'fc \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0. +\par }\pard \s19\sa120\widctlpar\adjustright {\i +\par +\par +\par }{\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f17 ; \'cf\'ee\'e8\'f1\'ea \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'f4\'e0\'e9\'eb\'e0 +\par }{\tab LD\tab DE,BUFFER\tab ;DE}{\f17 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,19h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'e8\'f1\'ea\'e0 \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab A,30h\tab \tab ;\'cf\'ee\'e8\'f1\'ea \'ee\'e1\'fb\'f7\'ed\'fb\'f5 \'f4\'e0\'e9\'eb\'ee\'e2 \'e8 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'ee\'e2 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JP\tab C,FIND_ERROR\tab ;\'ce\'f8\'e8\'e1\'ea\'e0 \'ef\'ee\'e8\'f1\'ea\'e0 (\'f4\'e0\'e9\'eb \'ed\'e5 \'ed\'e0\'e9\'e4\'e5\'ed) +\par }{ +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c2\'fb\'e2\'ee\'e4 \'e8\'ec\'e5\'ed\'e8 \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {NEXTN\tab LD\tab HL,BUFFER}{\f17 \tab ;\'d0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab DE,33\tab \tab ;\'c8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'ed\'e0\'f5\'ee\'e4\'e8\'f2\'f1\'ff \'f1\'ee \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5\'ec 33 +\par }{\tab ADD\tab HL,DE +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c2\'fb\'e2\'ee\'e4 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,5Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab B,8\tab \tab ;\'d0\'e0\'e7\'ec\'e5\'f0 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par NEXTS\tab LD\tab A,(HL)\tab \tab ;\'c1\'e5\'f0\'e5\'ec \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'e9 \'f1\'e8\'ec\'e2\'ee\'eb \'e8\'ec\'e5\'ed\'e8 +\par }{\tab PUSH\tab BC +\par }{\f17 \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8}{ +\par \tab }{\lang1033 POP\tab BC +\par \tab INC\tab HL +\par \tab DJNZ\tab NEXTS +\par \tab LD\tab A,\'94 \'94\tab \tab ;}{\f17 \'c2\'fb\'e2\'ee\'e4}{\lang1033 }{\f17 \'ef\'f0\'ee\'e1\'e5\'eb\'e0}{\lang1033 +\par \tab }{RST\tab 10h +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'c2\'fb\'e2\'ee\'e4 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,5Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab B,3\tab \tab ;\'d0\'e0\'e7\'ec\'e5\'f0 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 3 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par NEXTE\tab LD\tab A,(HL)\tab \tab ;\'c1\'e5\'f0\'e5\'ec \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'e9 \'f1\'e8\'ec\'e2\'ee\'eb \'e8\'ec\'e5\'ed\'e8 +\par }{\tab PUSH\tab BC +\par }{\f17 \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab }{\lang1033 POP\tab BC +\par \tab INC\tab HL +\par \tab }{DJNZ\tab NEXTE +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'e5\'f0\'e5\'e2\'ee\'e4 \'f1\'f2\'f0\'ee\'ea\'e8 \'ef\'ee\'f1\'eb\'e5 \'ea\'e0\'e6\'e4\'ee\'e3\'ee \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,5Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab A,13\tab \tab ;CR - \'ef\'e5\'f0\'e5\'f5\'ee\'e4 \'e2 \'ed\'e0\'f7\'e0\'eb\'ee \'f1\'f2\'f0\'ee\'ea\'e8 +\par }{\tab RST\tab 10h +\par }{\f17 \tab LD\tab C,5Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab A,10\tab \tab ;LF - \'ef\'e5\'f0\'e5\'e2\'ee\'e4 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }{\tab RST\tab 10h +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ; \'cf\'ee\'e8\'f1\'ea \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab DE,BUFFER\tab ;DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,1Ah\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'e8\'f1\'ea\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JP\tab NC,NEXTN\tab ;\'cf\'e5\'f0\'e5\'f5\'ee\'e4 \'ed\'e0 \'ef\'e5\'f7\'e0\'f2\'fc \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }{\lang1033 FIND_ERROR +\par NAME\tab DB\tab \ldblquote A:\\TEXT\\*.*\rdblquote ,0 +\par }{BUFFER\tab DS\tab 44 +\par +\par +\par +\par +\par +\par }{\b 1Bh (27) MKDI}{\b\f17 R (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par }{C - 1Bh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'ee\'e7\'e4\'e0\'b8\'f2 \'ed\'e0 \'e4\'e8\'f1\'ea\'e5 \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3, \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'fb\'e9 \'e2 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. + +\par }{\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,DIRNAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab LD\tab C,1Bh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\f17 DIRNAME\tab DB\tab \ldblquote TEXT\rdblquote ,0\tab ;\'d1\'ee\'e7\'e4\'e0\'f2\'fc \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3 TEXT \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 +\par }{ +\par }{\f17 DIRNAME\tab DB\tab \ldblquote \\TEXT\rdblquote ,0\tab ;\'d1\'ee\'e7\'e4\'e0\'f2\'fc \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3 TEXT \'e2 \'ea\'ee\'f0\'ed\'e5\'e2\'ee\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 +\par }{ +\par DIRNAME\tab DB\tab \ldblquote C:\\DOC\\TEXT}{\f17 \rdblquote ,0;\'d1\'ee\'e7\'e4\'e0\'f2\'fc \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3 TEXT \'e2 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 DOC \'ed\'e0 +\par }\pard\plain \s19\fi720\li2880\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ;\'e4\'e8\'f1\'ea\'e5 C: \'ea\'e0\'f2\'e0\'eb\'ee\'e3 DOC \'e4\'ee\'eb\'e6\'e5\'ed \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'ee\'e2\'e0\'f2\'fc +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 1Ch (28) RMDIR (\'d3\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par }{C - 1Ch +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'f0\'e0\'ed\'ff\'e5\'f2 \'ef\'f3\'f1\'f2\'ee\'e9 \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3, \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'fb\'e9 \'e2 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 \'f1\'ef +\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. }{\v +\par }{\f17 \'cd\'e5\'eb\'fc\'e7\'ff \'f3\'f1\'f2\'f0\'e0\'ed\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'e8 \'ea\'e0\'f2\'e0\'eb\'ee\'e3, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 \'f4\'e0\'e9\'eb\'fb \'e8\'eb +\'e8 \'e4\'f0\'f3\'e3\'e8\'e5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e8. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,DIRNAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab LD\tab C,1Ch\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'ff \'ef\'ee\'e4\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\lang1033 DIRNAME\tab DB\tab \ldblquote TEXT\rdblquote ,0 +\par +\par +\par }{\b\lang1033 }{\b\f17 1Dh (29) CHDIR (\'d1\'ec\'e5\'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0) +\par }{ +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par }{C - 1Dh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ec\'e5\'ed\'ff\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'e8 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'e4\'e8\'f1\'ea, \'e5\'f1\'eb\'e8 \'ee\'ed \'f3\'ea\'e0\'e7\'e0\'ed +\'e2 \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e9 }{\v +\par }{\f17 \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8. \'c5\'f1\'eb\'e8 \'ef\'f3\'f2\'fc \'ed\'e0\'f7\'e8\'ed\'e0\'e5\'f2\'f1\'ff \'f1 \ldblquote \\\rdblquote - \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'ef\'f3\'f2\'fc \'ee\'f2 \'ea\'ee\'f0\'ed +\'e5\'e2\'ee\'e3\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0, \'e8\'ed\'e0\'f7\'e5 \'ee\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,DIRNAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'ef\'f3\'f2\'e8 \'ea \'ed\'ee\'e2\'ee\'ec\'f3 +\par \tab \tab \tab \tab ;\'f2\'e5\'ea\'f3\'f9\'e5\'ec\'f3 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'f3 +\par \tab LD\tab C,1Dh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'ec\'e5\'ed\'fb \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab +\par }{\lang1033 DIRNAME\tab DB\tab \ldblquote \\DOC\\TEXT\rdblquote ,0 +\par +\par +\par }\pard\plain \s22\widctlpar\adjustright \b\fs20\lang1049\cgrid {\lang1033 }{\f17 1Eh (30) CURDIR (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5) +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'e1\'f3\'f4\'e5\'f0 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 256 \'e1\'e0\'e9\'f2 +\par }{C - 1Eh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ed\'ee\'f1\'e8\'f2 \'f1\'f2\'f0\'ee\'ea\'f3 \'ef\'f3\'f2\'e8 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0 \'e8\'e7 \'ee\'e1\'eb\'e0\'f1\'f2\'e5\'e9 +\'c4\'ce\'d1 \'e2 }{\v +\par }{\f17 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'f1\'ea\'f3\'fe \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3 \'ef\'ee \'e0\'e4\'f0\'e5\'f1\'f3 \'e7\'e0\'e4\'e0\'ed\'ed\'ee\'ec \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 HL. \'cd\'e0 \'ea\'ee\'ed\'f6\'e5 \'ef +\'f3\'f2\'e8 \'ea\'ee\'e4 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ed\'ee\'eb\'fc. \'c8\'ec\'ff \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e3\'ee \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 \'e2 \'ef\'f3\'f2\'fc \'ed\'e5 \'e2\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1 +\'ff. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,BUFFER\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,1Eh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'ff \'ef\'f3\'f2\'e8 \'ea \'f2\'e5\'ea\'f3\'f9\'e5\'ec\'f3 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'f3 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{ +\par BUFFER\tab DS\tab 256 +\par +\par +\par }{\b\f17 21h (33) SYSTIME (\'d2\'e5\'ea\'f3\'f9\'e0\'ff \'e4\'e0\'f2\'e0 \'e8 \'e2\'f0\'e5\'ec\'ff) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 21h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'e4\'e5\'ed\'fc +\par E - \'ec\'e5\'f1\'ff\'f6 +\par IX - \'e3\'ee\'e4 +\par H - \'f7\'e0\'f1 +\par L - \'ec\'e8\'ed\'f3\'f2\'fb +\par B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb +\par C - \'e4\'e5\'ed\'fc \'ed\'e5\'e4\'e5\'eb\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'e4\'e0\'f2\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 22h (34) SETTIME (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'e4\'e0\'f2\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'e4\'e5\'ed\'fc +\par E - \'ec\'e5\'f1\'ff\'f6 +\par IX - \'e3\'ee\'e4 +\par H - \'f7\'e0\'f1 +\par L - \'ec\'e8\'ed\'f3\'f2\'fb +\par B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb +\par }{C - 22h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'f3\'fe \'e4\'e0\'f2\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'ef\'e0\'ec\'ff\'f2\'fc\'fe: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 38h (56) SETWIN (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...) +\par H - \'e1\'e8\'f2\'fb 6 \'e8 7 \'e7\'e0\'e4\'e0\'fe\'f2 \'ed\'ee\'ec\'e5\'f0 \'ee\'ea\'ed\'e0, \'e2 \'ea\'ee\'f2\'ee\'f0\'ee\'e5 \'e1\'f3\'e4\'e5\'f2 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 +\par }{C - 38h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'f7\'e8\'f1\'eb\'ff\'e5\'f2 \'f4\'e8\'e7\'e8\'f7\'e5\'f1\'ea\'e8\'e9 \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 \'ef\'e0\'ec\'ff\'f2\'e8 \'e8 + \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2 \'e5\'b8 }{\v +\par }{\f17 \'e2 \'ee\'ea\'ed\'ee \'e0\'e4\'f0\'e5\'f1\'ed\'ee\'e3\'ee \'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'e0 \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 HL. \'d2\'ee +\'e5\'f1\'f2\'fc, }{\v +\par }{\f17 \'e5\'f1\'eb\'e8 HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'f0\'e5\'e4\'e5\'eb\'e0\'f5 \'ee\'f2 04000h \'e4\'ee 07FFFh, \'f2\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 }{\v +\par }{\f17 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1\'ff \'e2 \'ef\'e5\'f0\'e2\'ee\'e5 \'ee\'ea\'ed\'ee, \'ee\'f2 08000h \'e4\'ee 0BFFFh - \'e2\'f2\'ee\'f0\'ee\'e5 \'ee\'ea\'ed\'ee, \'ee\'f2 0C000h \'e4\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 0FFFFh - \'f2\'f0\'e5\'f2\'fc\'e5. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cd\'e0 \'e2\'fb\'f5\'ee\'e4\'e5 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2\'f1\'ff \'f4\'e8\'e7\'e8\'f7\'e5\'f1\'ea\'e8\'e9 \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0 +\'e0\'ed\'e8\'f6\'fb, \'ea\'ee\'f2\'ee\'f0\'e0\'ff }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e1\'fb\'eb\'e0 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e0 \'e4\'ee \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'f4\'f3\'ed\'ea\'f6\'e8\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 39h (57) SETWIN1 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'ef\'e5\'f0\'e2\'ee\'e5 \'ee\'ea\'ed\'ee) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {A - }{\f17 \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...) +\par }{C - 39h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 038h (SETWIN), \'ed\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1\'ff \'e2 }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f0\'e2\'ee\'e5 \'ee\'ea\'ed\'ee \'ed\'e5\'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee \'ee\'f2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 HL.}{ +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Ah (58) SETWIN2 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2\'ee \'e2\'f2\'ee\'f0\'ee\'e5 \'ee\'ea\'ed\'ee) + +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...) +\par }{C - 3Ah +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 038h (SETWIN), \'ed\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1\'ff \'e2\'ee }{ +\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f2\'ee\'f0\'ee\'e5 \'ee\'ea\'ed\'ee \'ed\'e5\'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee \'ee\'f2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 HL. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Bh (59) SETWIN3 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'f2\'f0\'e5\'f2\'fc\'e5 \'ee\'ea\'ed\'ee) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...) +\par }{C - 3Bh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 038h (SETWIN), \'ed\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2\'f1\'ff \'e2 }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f2\'f0\'e5\'f2\'fc\'e5 \'ee\'ea\'ed\'ee \'ed\'e5\'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee \'ee\'f2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 HL. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Ch (60) FREEMEM (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 3Ch +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6 +\par BC - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'fb\'f5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 HL \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'f1\'f2\'f0 +\'e0\'ed\'e8\'f6\'e0\'f5 \'ef\'ee }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 16 \'ea\'e8\'eb\'ee\'e1\'e0\'e9\'f2 \'e8 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2 +\'f0\'e5 BC. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Dh (61) GETMEM (\'c2\'fb\'e4\'e5\'eb\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f0\'e0\'e7\'ec\'e5\'f0 \'e1\'eb\'ee\'ea\'e0 \'e2 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0\'f5 \'ef\'ee 16 \'ea\'e8\'eb\'ee\'e1\'e0\'e9\'f2 +\par }{C - 3Dh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8, \'e5\'f1\'eb\'e8 CF=0 +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'f2 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8 \'e8 \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e5\'e3\'ee \'e8\'e4\'e5\'ed +\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'fe. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Eh (62) RETMEM (\'ce\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par }{C - 3Eh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e0\'e5\'f2 \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'e9 \'f0\'e0\'ed\'e5\'e5 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8. \'cd\'e5\'eb\'fc\'e7\'ff \'ee\'f1\'e2 +\'ee\'e1\'ee\'e4\'e8\'f2\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8, \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'e9 \'e4\'f0\'f3\'e3\'e8\'ec \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5\'ec. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 3Fh (63) SETMEM (\'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par B - \'ed\'ee\'e2\'fb\'e9 \'f0\'e0\'e7\'ec\'e5\'f0 \'e1\'eb\'ee\'ea\'e0 +\par }{C - 3Fh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'e5\'f2 \'f3\'ec\'e5\'ed\'fc\'f8\'e8\'f2\'fc \'e8\'eb\'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e8\'f2\'fc \'e2\'fb\'e4\'e5\'eb\'e5\'ed +\'ed\'fb\'e9 \'f0\'e0\'ed\'e5\'e5 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8. +\par \'cd\'e5\'eb\'fc\'e7\'ff \'e8\'e7\'ec\'e5\'ed\'e8\'f2\'fc \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8, \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'ed\'fb\'e9 \'e4\'f0\'f3\'e3\'e8\'ec \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5\'ec. +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'ee\'e9: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'cf\'f0\'e8 \'ed\'e0\'e1\'ee\'f0\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'e5 \'ea\'e0\'e6\'e4\'ee\'e5 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 +\'ea\'eb\'e0\'e2\'e8\'f8 \'e2\'ee\'f1\'ef\'f0\'e8\'ed\'e8\'ec\'e0\'e5\'f2 }{\v +\par }{\f17 \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'e0\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'ca\'e0\'e6\'e4\'e0\'ff \'ea\'eb\'e0\'e2\'e8\'f8\'e0 \'e8\'ec\'e5\'e5\'f2 \'ed\'ee\'ec\'e5\'f0 + (\'ee\'f2 0 \'e4\'ee }{\v +\par }{\f17 90), \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'ff\'e5\'f2 \'e5\'b8 \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'e5. \'d2\'e0\'e1\'eb\'e8\'f6\'e0 \'e2\'f1\'e5\'f5 \'ea\'ee\'e4\'ee\'e2 \'ea\'eb\'e0\'e2 +\'e8\'f8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'f0\'e8\'e2\'e5\'e4\'e5\'ed\'e0 \'e2 \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e8. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'ca\'e0\'e6\'e4\'ee\'e5 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 \'e8\'eb\'e8 \'ee\'f2\'ef\'f3\'f1\'ea\'e0\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 \'e2\'fb\'e7\'fb\'e2\'e0\'e5\'f2 \'ef +\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'e5. \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0, }{\v +\par }{\f17 \'ee\'e1\'f1\'eb\'f3\'e6\'e8\'e2\'e0\'fe\'f9\'e0\'ff \'fd\'f2\'ee \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'e5, \'f7\'e8\'f2\'e0\'e5\'f2 scan-\'ea\'ee\'e4 \'e8 \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'f3\'e5\'f2 \'e5\'e3\'ee \'e2 \'e4\'e2\'e0 \'e1\'e0\'e9\'f2 +\'e0. }{\v +\par }{\f17 \'cf\'e5\'f0\'e2\'fb\'e9 \'e1\'e0\'e9\'f2 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 ASCII \'ea\'ee\'e4, \'e0 \'e2\'f2\'ee\'f0\'ee\'e9 - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4. \'cf\'e5\'f0\'e2\'fb +\'e9 }{\v +\par }{\f17 \'e1\'e0\'e9\'f2 \'ef\'ee\'eb\'f3\'f7\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'ed\'e8\'e5\'ec \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'ee\'e3\'ee \'ea\'ee\'e4\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 \'ef\'ee \'ee\'ef\'f0\'e5\'e4\'e5 +\'eb\'b8\'ed\'ed\'ee\'e9 }{\v +\par }{\f17 \'ef\'f0\'ee\'f6\'e5\'e4\'f3\'f0\'e5 \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'ff \'ea\'eb\'e0\'e2\'e8\'f8 Shift, Alt, Ctrl, Caps Lock \'e8 Num }{\v +\par }{\f17 Lock, \'ee\'f2 \'f0\'e5\'e6\'e8\'ec\'e0 \'eb\'e0\'f2\'e8\'ed\'e8\'f6\'e0 \'e8\'eb\'e8 \'ea\'e8\'f0\'e8\'eb\'eb\'e8\'f6\'e0 \'e8 \'ee\'f2 \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'e8 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e2 \'f1\'e8\'ec\'e2\'ee\'eb\'fc +\'ed\'fb\'e9 }{\v +\par }{(AS}{\f17 CII) \'ea\'ee\'e4. \'c4\'eb\'ff \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'fb\'f5 \'ea\'eb\'e0\'e2\'e8\'f8, \'ed\'e0\'ef\'f0\'e8\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'ee\'ed\'e0\'eb\'fc\'ed\'fb\'e9 \'e8\'eb\'e8 \'ea\'eb\'e0\'e2\'e8\'f8 }{\v +\par }{\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'ee\'ec, \'ea\'ee\'e4 ASCII \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe. \'dd\'f2\'ee \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'e5\'f2 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e5 \'f0\'e0\'e7\'eb\'e8\'f7\'e0 +\'f2\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'e1\'fb\'f7\'ed\'fb\'e5 \'ef\'e5\'f7\'e0\'f2\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb \'e8 \'ed\'e0\'e6\'e0\'f2\'e8\'ff \'e4\'f0\'f3\'e3\'e8\'f5 \'ea\'eb\'e0\'e2\'e8\'f8. + +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c4\'f0\'e0\'e9\'e2\'e5\'f0 \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2 \'fd\'f2\'e8 \'e4\'e2\'e0 \'e1\'e0\'e9\'f2\'e0 \'e2 \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3 +\'f0\'fb, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 \'ec\'ee\'e6\'e5\'f2 }{\v +\par }{\f17 \'f5\'f0\'e0\'ed\'e8\'f2\'fc \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee 15 \'ed\'e0\'e6\'e0\'f2\'e8\'e9 \'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e8. \'ca\'f0\'ee\'ec\'e5 \'fd\'f2\'ee\'e3\'ee, \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ee\'f2\'f1\'eb\'e5\'e6\'e8 +\'e2\'e0\'e5\'f2 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e8 \'ed\'e5\'ea\'ee\'f2\'ee\'f0\'fb\'f5 \'ea\'eb\'e0\'e2\'e8\'f8, \'f2\'e0\'ea\'e8\'f5 \'ea\'e0\'ea Shift, Alt, Ctrl, Caps Lock, }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 Num Lock, Scroll Lock }{\f17 \'e8}{\lang1033 }{\f17 \'e4\'f0}{\lang1033 . +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'d7\'f2\'ee\'e1\'fb \'f1\'f7\'e8\'f2\'e0\'f2\'fc \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'f3\'fe \'ea\'eb\'e0\'e2\'e8\'f8\'f3 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0 +\'f2\'f3\'f0\'fb, \'ed\'f3\'e6\'ed\'ee \'e2\'ee\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\'f1\'ff }{\v +\par }{\f17 \'ee\'e4\'ed\'ee\'e9 \'e8\'e7 \'f4\'f3\'ed\'ea\'f6\'e8\'e9 \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'fe\'f2 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 E ASCII +\'ea\'ee\'e4 }{\v +\par }{\f17 \'ea\'eb\'e0\'e2\'e8\'f8\'e8, \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 D \'e5\'b8 \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4. \'c5\'f1\'eb\'e8 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed \'f1\'e5\'e4\'fc\'ec\'ee\'e9 \'e1\'e8\'f2 \'f0\'e5 +\'e3\'e8\'f1\'f2\'f0\'e0 }{\v +\par }{\f17 D, \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2 \'f7\'f2\'ee \'ed\'e0\'e6\'e0\'f2\'e0 \'ed\'e5 \'ee\'e4\'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e0, \'e0 \'ee\'e4\'ed\'ee\'e2\'f0\'e5\'ec\'e5\'ed\'ed\'ee \'f1 \'ed\'e5\'e9 \'ed\'e0\'e6\'e0\'f2\'fb , }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8\'eb\'e8 . +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'ea\'e0\'ea\'e8\'e5 \'e8\'ec\'e5\'ed\'ed\'ee \'ea\'eb\'e0\'e2\'e8\'f8\'e8 \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'fe\'f2\'f1\'ff: + +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D7 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'eb\'e5\'e2\'fb\'e9 +\par D6 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e0\'e2\'fb\'e9 +\par D5 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff +\par D4 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff +\par D3 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'eb\'e5\'e2\'fb\'e9 +\par }{D2 = 1}{\f17 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'eb\'e5\'e2\'fb\'e9 +\par D1 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e0\'e2\'fb\'e9 +\par D0 = 1 - \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ef\'f0\'e0\'e2\'fb\'e9 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'c1\'e8\'f2\'fb 5 \'e8 4 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2, \'f7\'f2\'ee \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'fe\'f2\'f1\'ff \'eb\'fe\'e1\'ee\'e9 , \'ef\'f0\'e0\'e2\'fb +\'e9 \'e8\'eb\'e8 \'eb\'e5\'e2\'fb\'e9. +\par \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 C \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'f0\'e5\'e6\'e8\'ec\'fb \'e2\'e2\'ee\'e4\'e0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {D7 = 1 - RUS, 0 - LAT +\par }{\f17 D6 - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par D5 - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par D4 - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 = 1 - }{\f17 \'f0\'e5\'e6\'e8\'ec}{\lang1033 Num Lock +\par D2 = 1 - }{\f17 \'f0\'e5\'e6\'e8\'ec}{\lang1033 Scroll Lock +\par D1 = 1 - }{\f17 \'f0\'e5\'e6\'e8\'ec}{\lang1033 Insert +\par D0 = 1 - }{\f17 \'f0\'e5\'e6\'e8\'ec}{\lang1033 Caps Lock +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 30h (48) WAITKEY (\'ce\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 30h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 +\par \'c5 - ASCII \'ea\'ee\'e4 +\par }{\lang1033 C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f7\'e8\'f2\'e0\'e5\'f2 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee\'e1 \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'ec \'ed\'e0\'e6\'e0\'f2\'e8\'e8 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0 +\'e2\'e8\'e0\'f2\'f3\'f0\'fb. }{\v +\par }{\f17 \'c5\'f1\'eb\'e8 \'e1\'f3\'f4\'e5\'f0 \'ef\'f3\'f1\'f2, \'ee\'e6\'e8\'e4\'e0\'e5\'f2 \'ef\'ee\'ff\'e2\'eb\'e5\'ed\'e8\'ff \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'e8. \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 E \'e2\'fb\'e4\'e0\'e5\'f2\'f1\'ff ASCII \'ea +\'ee\'e4 }{\v +\par }{\f17 \'f1\'e8\'ec\'e2\'ee\'eb\'e0, \'e0 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 (0..127). \'c5\'f1\'eb\'e8 \'e1\'e8\'f2 7 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 }{\v + +\par }{\f17 D \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed - \'fd\'f2\'ee \'ee\'e7\'ed\'e0\'f7\'e0\'e5\'f2, \'f7\'f2\'ee \'e2\'ec\'e5\'f1\'f2\'e5 \'f1 \'ea\'eb\'e0\'e2\'e8\'f8\'e5\'e9 \'f3\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2\'f1\'ff Ctrl/Alt/Shift. }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d0\'e5\'e3\'e8\'f1\'f2\'f0 A \'e4\'f3\'e1\'eb\'e8\'f0\'f3\'e5\'f2 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'ec\'ee\'e5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 E \'e4\'eb\'ff \'f3\'e4\'ee\'e1\'f1 +\'f2\'e2\'e0 \'e2 \'ed\'e0\'ef\'e8\'f1\'e0\'ed\'e8\'e8 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 LOOP\tab LD\tab C,30h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff \'ed\'e0\'e6\'e0\'f2\'e8\'ff \'ea\'eb\'e0\'e2\'e8\'f8\'e8 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab }{\lang1033 CP\tab 0Dh\tab \tab ;}{\f17 \'cd\'e0\'e6\'e0\'f2\'e0}{\lang1033 ? +\par \tab }{\f17 JP\tab Z,ENTER\tab ;\'e5\'f1\'eb\'e8 \'e4\'e0, \'f2\'ee \'e2\'e2\'ee\'e4 +\par \tab LD\tab HL,011Bh\tab ;\'cf\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'e8 ASCII \'ea\'ee\'e4 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 <\'c5sc> +\par }{\tab }{\lang1033 AND\tab A\tab \tab ; +\par \tab SBC\tab HL,DE\tab \tab ;}{\f17 \'cd\'e0\'e6\'e0\'f2\'e0}{\lang1033 ? +\par \tab }{\f17 JP\tab Z,EXIT\tab \tab ;\'e5\'f1\'eb\'e8 \'e4\'e0, \'f2\'ee \'e2\'fb\'f5\'ee\'e4 +\par \tab JP\tab LOOP\tab \tab ;\'e8\'ed\'e0\'f7\'e5, \'ef\'ee\'e2\'f2\'ee\'f0\'e8\'f2\'fc \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 +\par }{ +\par }{\b\f17 31h (49) SCANKEY (\'ce\'ef\'f0\'ee\'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 31h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ZF - \'ed\'e5\'f2 \'ea\'eb\'e0\'e2\'e8\'f8 +\par A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 +\par \'c5}{\lang1033 - ASCII }{\f17 \'ea\'ee\'e4}{\lang1033 +\par C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f4\'eb\'e0\'e3 Z, \'e5\'f1\'eb\'e8 \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ef\'f3\'f1\'f2. \'c8\'ed\'e0\'f7\'e5 \'f7\'e8 +\'f2\'e0\'e5\'f2 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee\'e1 \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'ec \'ed\'e0\'e6\'e0\'f2\'e8\'e8 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'c2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'ec\'fb\'e5 \'f0 +\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ea\'e0\'ea }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'e2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h (WAITKEY). +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {NO_KEYS +\par }{\f17 \tab LD\tab C,31h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'ef\'f0\'ee\'f1\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff +\par }{\tab RS}{\f17 T\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab Z,NO_KEYS\tab ;\'c5\'f1\'eb\'e8 \'ea\'eb\'e0\'e2\'e8\'f8\'e0 \'ed\'e5 \'ed\'e0\'e6\'e0\'f2\'e0 \'ef\'ee\'e2\'f2\'ee\'f0\'e8\'f2\'fc \'ee\'ef\'f0\'ee\'f1 +\par \tab BIT\tab 7,D\tab \tab ;\'cd\'e0\'e6\'e0\'f2\'e0 \'ee\'e4\'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e0? +\par \tab JP\tab Z,ONEKEY\tab ;\'c5\'f1\'eb\'e8 \'e4\'e0, \'ef\'e5\'f0\'e5\'f5\'ee\'e4 +\par }{\tab LD\tab A,B +\par }{\f17 \tab AND\tab 0C0h\tab \tab ;\'c1\'e8\'f2\'fb 7 \'e8 6 \'f0\'e0\'e2\'ed\'fb 0 +\par \tab JP\tab NZ,SHIFT\tab ;\'c5\'f1\'eb\'e8 \'ed\'e5\'f2, \'f2\'ee \'ed\'e0\'e6\'e0\'f2\'fb +<\'ea\'eb\'e0\'e2\'e8\'f8\'e0> +\par \tab BIT\tab 5,B\tab \tab ;\'c1\'e8\'f2 Ctrl \'e2 \'ed\'f3\'eb\'e5? +\par \tab JP\tab NZ,CTRL\tab ;\'c5\'f1\'eb\'e8 \'ed\'e5\'f2, \'f2\'ee \'ed\'e0\'e6\'e0\'f2\'fb +<\'ea\'eb\'e0\'e2\'e8\'f8\'e0> +\par \tab BIT\tab 4,B\tab \tab ;\'c1\'e8\'f2 Alt \'e2 \'ed\'f3\'eb\'e5? +\par \tab JP\tab NZ,CTRL\tab ;\'c5\'f1\'eb\'e8 \'ed\'e5\'f2, \'f2\'ee \'ed\'e0\'e6\'e0\'f2\'fb +<\'ea\'eb\'e0\'e2\'e8\'f8\'e0> +\par }{\lang1033 ONEKEY +\par \tab CP\tab 0Dh\tab \tab ;}{\f17 \'cd\'e0\'e6\'e0\'f2\'e0}{\lang1033 ? +\par \tab }{\f17 JP\tab Z,ENTER\tab ;\'e5\'f1\'eb\'e8 \'e4\'e0, \'f2\'ee \'e2\'e2\'ee\'e4 +\par \tab LD\tab HL,011Bh\tab ;\'cf\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'e8 ASCII \'ea\'ee\'e4 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 <\'c5sc> +\par }{\tab }{\lang1033 AND\tab A\tab \tab ; +\par \tab SBC\tab HL,DE\tab \tab ;}{\f17 \'cd\'e0\'e6\'e0\'f2\'e0}{\lang1033 ? +\par \tab }{\f17 JP\tab Z,EXIT\tab \tab ;\'e5\'f1\'eb\'e8 \'e4\'e0, \'f2\'ee \'e2\'fb\'f5\'ee\'e4 +\par }{ +\par +\par }{\b\f17 32h (50) ECHOKEY (\'ce\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'f1 \'ef\'e5\'f7\'e0\'f2\'fc\'fe) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 32h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 +\par \'c5 - ASCII \'ea\'ee\'e4 +\par }{\lang1033 C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e0\'ed\'e0\'eb\'ee\'e3\'e8\'f7\'ed\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h, \'ed\'ee \'ef\'ee\'f1\'eb\'e5 \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'ff \'ea\'ee\'e4\'e0 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'ee\'ed }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'f2\'f1\'ff \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5. \'c2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'ec\'fb\'e5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ea\'e0\'ea \'e8 +\'e2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h (WAITKEY). +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 33h (51) CTRLKEY (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 33h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A = 0 - \'ed\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 +\par }{\lang1033 C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ed\'e0 \'e4\'e0\'ed\'ed\'fb\'e9 \'ec\'ee\'ec\'e5\'ed\'f2. \'d2\'ee + \'e5\'f1\'f2\'fc, \'e4\'e0\'ed\'ed\'fb\'e5 }{\v +\par }{\f17 \'e1\'e5\'f0\'f3\'f2\'f1\'ff \'ed\'e5 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb (\'ea\'e0\'ea \'e2 \'ee\'f1\'f2\'e0\'eb\'fc\'ed\'fb\'f5 \'f4\'f3\'ed\'ea\'f6\'e8\'ff\'f5), \'e0 \'ed\'e5\'ef\'ee\'f1\'f0\'e5\'e4\'f1 +\'f2\'e2\'e5\'ed\'ed\'ee \'e8\'e7 }{\v +\par }{\f17 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2\'ee\'e2 \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'e3\'ee \'f1\'ea\'e0\'ed\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'ff \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'d0\'e5\'e3\'e8\'f1\'f2\'f0 A \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe, +\'e5\'f1\'eb\'e8 \'e1\'f3\'f4\'e5\'f0 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ef\'f3\'f1\'f2. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 35h (53) K_CLEAR (\'ce\'f7\'e8\'f1\'f2\'e8\'f2\'fc \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'f4\'f3\'ed\'ea\'f6 +\'e8\'fe) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h, 31h, 32h, 33h \'e8\'eb\'e8 34h +\par }{C - 35h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f7\'e8\'f9\'e0\'e5\'f2 \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb, \'ef\'ee\'f1\'eb\'e5 \'f7\'e5\'e3\'ee \'e2\'fb\'ef\'ee\'eb\'ed\'ff +\'e5\'f2 \'f4\'f3\'ed\'ea\'f6\'e8\'fe \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'f3\'fe }{\v +\par }{\f17 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B. \'ce\'ed\'e0 \'ef\'ee\'e7\'e2\'ee\'eb\'ff\'e5\'f2 \'ef\'f0\'e5\'e4\'ee\'f2\'e2\'f0\'e0\'f2\'e8\'f2\'fc \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'ed\'e8\'e5 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ee\'e9 }{\v + +\par }{\f17 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2, \'e2\'e2\'e5\'e4\'e5\'ed\'ed\'fb\'f5 \'f1 \'ee\'ef\'e5\'f0\'e5\'e6\'e5\'ed\'e8\'e5\'ec. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ea\'ee\'ec\'e0\'ed\'e4\'e0 FORMAT \'ee\'f7\'e8\'f9\'e0\'e5\'f2 \'e1\'f3\'f4\'e5\'f0 }{\v + +\par }{\f17 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ef\'e5\'f0\'e5\'e4 \'e7\'e0\'ef\'f0\'ee\'f1\'ee\'ec \'ee \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee\'f1\'f2\'e8 \'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'f2\'fc \'e4\'e8\'f1\'ea. \'cf\'ee\'fd\'f2\'ee\'ec +\'f3 \'f1\'eb\'f3\'f7\'e0\'e9\'ed\'ee\'e5 }{\v +\par }{\f17 \'ed\'e0\'eb\'e8\'f7\'e8\'e5 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'e0, \'f0\'e0\'e7\'f0\'e5\'f8\'e0\'fe\'f9\'e5\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5, \'ed\'e5 \'e2\'fb\'e7\'ee\'e2\'e5\'f2 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e5\'e9\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 36h (54) K_SETUP (\'d3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'ed\'e0\'f1\'f2\'f0\'ee\'e9\'ea\'e0\'ec\'e8 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'ed\'ee\'ec\'e5\'f0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{C - 36h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B. +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'ff \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'ee\'e9. +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B = 0, \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'f3 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb +\par A - \'ed\'ee\'ec\'e5\'f0 \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'e8 +\par }\pard\plain \fi283\widctlpar\adjustright \fs20\lang1049\cgrid {0 - normal +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 1 -\tab shift +\par 2 -\tab caps lock +\par 3 -\tab caps lock + shift +\par }{\f17 4 -\tab normal (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par 5 -\tab shift (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par 6 -\tab caps lock (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par 7 -\tab caps lock + shift (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B = 1, \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'e7\'e2\'f3\'ea\'ee\'e2\'fb\'f5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'fb\'f5 +\par B = 2, \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e7\'e2\'f3\'ea\'ee\'e2\'fb\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'fb\'e5 +\par A - \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'ee\'e9 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {D0 - }{\f17 \'f1\'e8\'e3\'ed\'e0\'eb \'ef\'e5\'f0\'e5\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb +\par D1 - \'f1\'e8\'e3\'ed\'e0\'eb \'ef\'e5\'f0\'e5\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'ff \'ed\'e0 \'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'f3\'fe \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'f3 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 37h (55) TESTKEY (\'ce\'ef\'f0\'ee\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 37h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ZF - \'ed\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 +\par A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4 +\par \'c5}{\lang1033 - ASCII }{\f17 \'ea\'ee\'e4}{\lang1033 +\par C - D7 - RUS/LAT +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D3 - Num Lock +\par D2 - Scroll Lock +\par D1 - Insert +\par D0 - Caps Lock +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 B - D7 - Left Shift +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 D6 - Right Shift +\par D5 - Ctrl +\par D4 - Alt +\par D3 - Left Ctrl +\par D2 - Left Alt +\par D1 - Right Ctrl +\par }{D0 - Right Alt +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f4\'eb\'e0\'e3 Z, \'e5\'f1\'eb\'e8 \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'ef\'f3\'f1\'f2. \'c8\'ed\'e0\'f7\'e5 \'f7\'e8 +\'f2\'e0\'e5\'f2 }{\v +\par }{\f17 \'e8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'fe \'ee\'e1 \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'ec \'ed\'e0\'e6\'e0\'f2\'e8\'e8 \'e8\'e7 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb. \'c2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'ec\'fb\'e5 \'f0 +\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ea\'e0\'ea }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'e2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 30h (WAITKEY). \'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'ed\'e0\'e6\'e0\'f2\'e8\'e8 \'ee\'f1\'f2\'e0\'e5\'f2\'f1\'ff \'e2 \'e1\'f3\'f4 +\'e5\'f0\'e5. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'c7\'e0\'ef\'f3\'f1\'ea \'ef\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e9: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'f5\'f0\'e0\'ed\'ff\'f2\'f1\'ff \'ed\'e0 \'e4\'e8\'f1\'ea\'e5, \'ea\'e0\'ea \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'fb\'e5 (\'e2\'fb\'ef\'ee +\'eb\'ed\'ff\'e5\'ec\'fb\'e5) \'f4\'e0\'e9\'eb\'fb. \'ce\'e4\'ed\'e0 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8\'e7 \'ee\'f1\'ed\'ee\'e2\'ed\'fb\'f5 \'e7\'e0\'e4\'e0\'f7 \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ee\'ed\'ed\'ee\'e9 \'f1\'e8\'f1\'f2\'e5\'ec\'fb - \'ee\'f0\'e3\'e0\'ed\'e8\'e7\'ee\'e2 +\'e0\'f2\'fc \'e8\'f5 \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5. +\par }\pard \s19\sa120\widctlpar\adjustright {\f17 \'ca\'ee\'ec\'e0\'ed\'e4\'ed\'e0\'ff \'f1\'f2\'f0\'ee\'ea\'e0 \'e4\'eb\'ff \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec \'e8\'ec\'e5\'e5\'f2 \'f4\'ee\'f0\'ec\'e0\'f2: +\par }{\i\f17 [\'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee:][\\\'ef\'f3\'f2\'fc\\]\'e8\'ec\'ff [\'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb] +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'d3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'ee \'e8 \'ef\'f3\'f2\'fc \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2 \'ec\'e5\'f1\'f2\'ee \'ed\'e0\'f5\'ee\'e6\'e4\'e5\'ed\'e8\'ff \'ef\'f0\'e8 +\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'ed\'e0 \'e4\'e8\'f1\'ea\'e5. \'c5\'f1\'eb\'e8 }{\v +\par }{\f17 \'ee\'ed\'e8 \'ef\'f0\'ee\'ef\'f3\'f9\'e5\'ed\'fb, \'ef\'ee\'e8\'f1\'ea \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea +\'e0. \'c5\'f1\'eb\'e8 }{\v +\par }{\f17 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0, \'ee\'ed\'ee \'e8\'e3\'ed\'ee\'f0\'e8\'f0\'f3\'e5\'f2\'f1\'ff, \'f2\'e0\'ea \'ea\'e0\'ea, \'f3 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'ed\'fb\'f5 \'f4\'e0\'e9\'eb +\'ee\'e2 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'ec\'ee\'e6\'e5\'f2 \'e1\'fb\'f2\'fc \'f2\'ee\'eb\'fc\'ea\'ee EXE. +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 EXE \'f4\'e0\'e9\'eb\'fb \'f1\'ee\'f1\'f2\'ee\'ff\'f2 \'e8\'e7 \'e4\'e2\'f3\'f5 \'f7\'e0\'f1\'f2\'e5\'e9, \'ef\'f0\'e5\'f4\'e8\'ea\'f1\'e0 \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'ec +\'ee\'e3\'ee \'ec\'ee\'e4\'f3\'eb\'ff. \'cf\'f0\'e5\'f4\'e8\'ea\'f1 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f1\'ee\'e4\'e5\'f0\'e6\'e8\'f2 \'e2 \'f1\'e5\'e1\'e5 \'f0\'e0\'e7\'eb\'e8\'f7\'ed\'f3\'fe \'e2\'f1\'ef\'ee\'ec\'ee\'e3\'e0\'f2\'e5\'eb\'fc\'ed\'f3\'fe \'e8\'ed\'f4\'ee\'f0\'ec +\'e0\'f6\'e8\'fe: +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e5\'f4\'e8\'ea\'f1 EXE \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 +00 2 dw \tab 5845h\tab \tab ; \'c8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 EXE \'f4\'e0\'e9\'eb\'e0 +\par +02 1 db \tab 45h\tab \tab ; \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par +03 1 db \tab 00h\tab \tab ; \'c2\'e5\'f0\'f1\'e8\'ff EXE \'f4\'e0\'e9\'eb\'e0 +\par +04 4 dd \tab 00000200h\tab ; \'cd\'e0\'f7\'e0\'eb\'ee \'e8\'f1\'ef\'ee\'eb\'ed\'ff\'e5\'ec\'ee\'e3\'ee \'ea\'ee\'e4\'e0 (\'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5) +\par +08 2 dw \tab 0000h\tab \tab ; \'d0\'e0\'e7\'ec\'e5\'f0 \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'ee\'e3\'ee \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'e0 \'e8\'eb\'e8 0 +\par +10 4 dd \tab 00000000h\tab ; \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'fb +\par +14 2 dw \tab 0000h\tab \tab ; \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'fb +\par +16 2 dw \tab ????\tab \tab ; \'c0\'e4\'f0\'e5\'f1 \'f0\'e0\'f1\'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'ea\'ee\'e4\'e0 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 +\par +18 2 dw \tab ????\tab \tab ; \'c0\'e4\'f0\'e5\'f1 \'e7\'e0\'ef\'f3\'f1\'ea\'e0 (\'f0\'e5\'e3\'e8\'f1\'f2\'f0 PC) +\par }{ +20 }{\f17 2 dw \tab ????\tab \tab ; \'c0\'e4\'f0\'e5\'f1 \'f0\'e0\'f1\'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'f1\'f2\'e5\'ea\'e0 (\'f0\'e5\'e3\'e8\'f1\'f2\'f0 SP) +\par +22 490 ds \tab 0\tab \tab ; \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'fb +\par }{ +\par }{\f17 +512\tab \tab \tab \tab ; \'ca\'ee\'e4 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb +\par }{ +\par +\par }{\b\f17 40h (64) EXEC (\'c2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'f4\'e0\'e9\'eb) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe +\par B = 0 - \'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3 +\par }{C - 40h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 EXE-\'f4\'e0\'e9\'eb\'e0 \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef\'ee \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'ec \'ef\'f3\'ed +\'ea\'f2\'e0\'ec: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 1)\tab \'ce\'f2\'ea\'f0\'fb\'e2\'e0\'e5\'f2 exe-\'f4\'e0\'e9\'eb \'ed\'e0 \'f7\'f2\'e5\'ed\'e8\'e5; +\par 2)\tab \'d1\'f7\'e8\'f2\'fb\'e2\'e0\'e5\'f2 \'e2 \'f0\'e0\'e1\'ee\'f7\'f3\'fe \'ee\'e1\'eb\'e0\'f1\'f2\'fc \'ef\'f0\'e5\'f4\'e8\'ea\'f1 exe-\'f4\'e0\'e9\'eb\'e0; +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 3) \'c2\'fb\'e4\'e5\'eb\'ff\'e5\'f2 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8, \'f2\'f0\'e5\'e1\'f3\'e5\'ec\'fb\'e9 \'e4\'eb\'ff \'e7\'e0\'e3\'f0\'f3\'e7\'ea\'e8 \'e2\'f1\'e5\'e3\'ee \'f4\'e0 +\'e9\'eb\'e0 \'e8\'eb\'e8 \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'ee\'e3\'ee }{\v +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'e0, \'e5\'f1\'eb\'e8 \'e5\'e3\'ee \'f0\'e0\'e7\'ec\'e5\'f0 \'ed\'e5 \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe; +\par 4)\tab \'d1\'ee\'f5\'f0\'e0\'ed\'ff\'e5\'f2 \'f1\'f2\'e5\'ea; +\par 5)\tab \'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e0\'e5\'f2 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e8\'e7 \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'ed\'ee\'e3\'ee \'e1\'eb\'ee\'ea\'e0; +\par 6)\tab \'d1\'f2\'f0\'ee\'e8\'f2 \'ef\'f0\'e5\'f4\'e8\'ea\'f1 \'e7\'e0\'ef\'f3\'f1\'ea\'e0 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'e8 \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'ed\'e0 \'ed\'e5\'e3\'ee \'f0\'e5\'e3\'e8\'f1\'f2\'f0 IX; +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 7) \'d1\'f7\'e8\'f2\'fb\'e2\'e0\'e5\'f2 \'f4\'e0\'e9\'eb \'ef\'ee \'e0\'e4\'f0\'e5\'f1\'f3 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'ec\'f3 \'e2 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e8 16 (\'c0\'e4\'f0\'e5 +\'f1 \'f0\'e0\'f1\'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'ea\'ee\'e4\'e0 \'e2 }{\v +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e0\'ec\'ff\'f2\'e8); +\par 8)\tab \'c7\'e0\'ea\'f0\'fb\'e2\'e0\'e5\'f2 exe-\'f4\'e0\'e9\'eb, \'e5\'f1\'eb\'e8 \'fd\'f2\'ee \'ed\'e5 \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'fb\'e9 \'e7\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea; +\par 9)\tab \'d3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'f1\'f2\'e5\'ea \'f0\'e0\'e2\'ed\'fb\'ec \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'fe \'e8\'e7 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'ff 20 (\'c0\'e4\'f0\'e5\'f1 \'f0\'e0\'f1\'ef\'ee\'eb\'ee\'e6\'e5\'ed\'e8\'ff \'f1 +\'f2\'e5\'ea\'e0); +\par 10)\tab \'cf\'e5\'f0\'e5\'e4\'e0\'e5\'f2 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 \'ef\'ee \'e0\'e4\'f0\'e5\'f1\'f3 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'ec\'f3 \'e2 \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e8 18 (\'c0\'e4\'f0\'e5\'f1 \'e7\'e0\'ef\'f3\'f1\'ea\'e0); + +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'cf\'f0\'e5\'f4\'e8\'ea\'f1 \'e7\'e0\'ef\'f3\'f1\'ea\'e0 \'f4\'e0\'e9\'eb\'e0: +\par }\pard\plain \s17\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 -03 1\tab db ? \tab ; \'d4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 exe-\'f4\'e0\'e9\'eb \'f1 \'ef\'e5\'f0\'e2\'e8\'f7\'ed\'fb\'ec \'e7 +\'e0\'e3\'f0\'f3\'e7\'f7\'e8\'ea\'ee\'ec +\par -02 1\tab db ? \tab ; \'c8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par -01 1\tab db ? \tab ; \'d3\'f0\'ee\'e2\'e5\'ed\'fc \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 +00 1\tab db ? \tab ; \'c4\'eb\'e8\'ed\'ed\'e0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 +01 127\tab ds ? \tab ; \'cf\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8, \'e7\'e0\'ea\'e0\'ed\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff \'ed +\'f3\'eb\'e5\'ec +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,NAME\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 ASCIIZ \'f1\'f2\'f0\'ee\'ea\'f3 \'f1 \'e8\'ec\'e5\'ed\'e5\'ec \'e5xe-\'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab C,40h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab LD\tab B,00h\tab \tab ;\'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab RET\tab C\tab \tab ;\'c2\'ee\'e7\'e2\'f0\'e0\'f2 \'ef\'ee \'ee\'f8\'e8\'e1\'ea\'e5 +\par }{\tab L}{\f17 D\tab (ENDCODE),A\tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'ea\'ee\'e4\'e0 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff +\par }{\tab +\par }{\lang1033 NAME\tab \tab DB\tab \ldblquote \\PROG\\UTILITY\\prog.exe\rdblquote ,0 +\par }{ENDCODE \tab DB\tab 00h +\par +\par +\par }{\b\f17 41h (65) EXIT (\'c7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e5 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb) +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff +\par }{C - 41h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e2\'e5\'f0\'f8\'e0\'e5\'f2 \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb, \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e0\'e5 +\'f2 \'e7\'e0\'ed\'e8\'ec\'e0\'e5\'ec\'f3\'fe }{\v +\par }{\f17 \'ef\'e0\'ec\'ff\'f2\'fc \'e8 \'ef\'e5\'f0\'e5\'e4\'e0\'b8\'f2 \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff \'e2 \'f0\'ee\'e4\'e8\'f2\'e5\'eb\'fc\'ed\'f3\'fe \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3. \'ca\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5 +\'ed\'e8\'ff }{\v +\par }{\f17 \'f2\'e0\'ea\'e6\'e5 \'f1\'ee\'f5\'f0\'e0\'ed\'ff\'e5\'f2\'f1\'ff \'e2 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e9 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'ee\'e9 \'c4\'ce\'d1 \'e8 \'e5\'e3\'ee \'ec\'ee\'e6\'ed\'ee \'ef\'ee\'e7\'e4\'ed\'e5\'e5 \'ef\'ee\'eb\'f3 +\'f7\'e8\'f2\'fc \'ef\'f0\'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'ee\'ec\'ee\'f9\'e8 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 42h (WAIT). +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 +\par }{\b\f17 42h (66) WAIT (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 42h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff, \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e5\'e9 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'ed\'ee\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par +\par }\pard \qc\widctlpar\adjustright {\b\f23\fs24 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'e0 \'f1 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'ee\'e9: +\par }\pard \widctlpar\adjustright { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 43h (67) GSWITCH (\'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'ec\'ee\'e3\'ee \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 +\par }{C - 43h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 CF=0 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 \'ed\'e5 \'e4\'ee\'f1\'f2\'e8\'e3\'ed\'f3\'f2 (\'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'e8\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 +\'fb) +\par CF=1 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 (\'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'b8\'ed \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e8\'eb\'e8 \'ed\'ee\'eb\'fc) +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'f2 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8. \'cf\'e0\'f0\'e0\'ec\'e5\'f2 +\'f0\'e0\'ec\'e8 \'f1\'f7\'e8\'f2\'e0\'fe\'f2\'f1\'ff }{\v +\par }{\f17 \'eb\'fe\'e1\'fb\'e5 \'ef\'ee\'f1\'eb\'e5\'e4\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'f0\'e0\'e7\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'e5 \'ef\'f0\'ee\'e1\'e5\'eb\'e0\'ec\'e8. \'c2\'e5\'e4\'f3\'f9\'e8\'e5 \'ef\'f0 +\'ee\'e1\'e5\'eb\'fb }{\v +\par }{\f17 \'e8\'e3\'ed\'ee\'f0\'e8\'f0\'f3\'fe\'f2\'f1\'ff. \'cf\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 \'e7\'e0\'e2\'e5\'f0\'f8\'e0\'e5\'f2\'f1\'ff \'ea\'ee\'e4\'ee\'ec \'ed\'ee\'eb\'fc, \'e5\'f1\'eb\'e8 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 +\'fb }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'f2\'f1\'f3\'f2\'f1\'f2\'e2\'f3\'fe\'f2, \'e2 \'e1\'f3\'f4\'e5\'f0 \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'ee\'eb\'fc. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab HL,COMLINE\tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'f3\'fe \'f1\'f2\'f0\'ee\'ea\'f3 +\par NEXTP\tab LD\tab DE,BUFFER\tab ;DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'ee\'e2 +\par \tab LD\tab C,43h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e5\'ed\'e8\'ff \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{\tab }{\lang1033 PUSH\tab AF +\par \tab PUSH\tab HL +\par \tab }{. +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 . \'ce\'e1\'f0\'e0\'e1\'ee\'f2\'ea\'e0 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\tab }{\lang1033 . +\par \tab POP\tab HL +\par \tab POP\tab AF +\par \tab JP\tab NC,NEXTP +\par +\par \tab +\par COMLINE\tab DB\tab \ldblquote file1.txt file2.txt -x\rdblquote ,0 +\par BUFFER\tab DS\tab 127,0 +\par +\par +\par }{\b\lang1033 44h (68) DOSNAME (}{\b\f17 \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc}{\b\lang1033 }{\b\f17 \'e8\'ec\'ff}{\b\lang1033 }{\b\f17 \'f4\'e0\'e9\'eb\'e0}{\b\lang1033 ) +\par }{\lang1033 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f2 C - 44h +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f29 B = 0, \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0 +\'f2 \'c4\'ce\'d1 +\par }{\f2 HL }{\f29 - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par B = 1, \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par HL - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par DE - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \tab db\tab \ldblquote name.ext\rdblquote ,0 \tab ; \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\par \tab db\tab \ldblquote name ext\rdblquote \tab ; 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par }{ +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\'e8 \'ee\'e1\'f0\'e0\'f2\'ed\'ee. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }\pard\plain \s22\widctlpar\adjustright \b\fs20\lang1049\cgrid {\f17 45h (69) EXCMDLN (\'d0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8) +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff +\par }{\f2 C - 45h +\par }{\f29 B - \'ed\'ee\'ec\'e5\'f0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8: +\par }{\i\f29 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3; +\par 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe; +\par 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5\line \'f4\'e0\'e9\'eb\'e0; +\par 6 - \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'e0; +\par 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8; +\par 8 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1; +\par 9 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e2 \'e7\'e0\'e2 +\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ed\'ee\'ec\'e5\'f0\'e0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }{\f2 C - 45h +\par }{\f29 B = 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'e2\'ee\'e7 +\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,0\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb D0, D2, D3. +\par }{ +\par }{\lang1033 STRING\tab db\tab "c:\\dir1\\name",0 +\par +\par +\par }{\b\i\lang1033 }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0: +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }{\f29 B = 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f2 }{\f29 A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0 - A, 1 - B, 2 - C \'e8 \'f2.\'e4.) +\par \'e1\'f3\'f4\'e5\'f0 - \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 "A:",0 +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0 \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'e5\'f1\'eb\'e8 \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'ee\'f1\'fc \'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff + 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab DE,BUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,1\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'e5\'f2 2 (drive C:) +\par \tab ; \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 "C:",0 +\par }{\f2 +\par }{\f2\lang1033 STRING\tab db\tab "c:\\dir1\\name",0 +\par +\par }{\f2 BUFFER\tab ds\tab 13 +\par }{ +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }{\f29 B = 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 \'e1\'f3\'f4\'e5\'f0 - \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'ff "DIR1\\DIR2\\DIR3\\",0 +\par A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e5\'f1\'eb\'e8 \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'ff \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'e0\'f1\'fc \'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0 +\'e5\'f2\'f1\'ff 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab DE,BUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,2\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb D0, D1, D2, D3. +\par \tab ; \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 "\\DIR1\\DIR2\\",0 +\par }{\f2 +\par }{\f2\lang1033 STRING\tab db\tab "c:\\dir1\\dir2\\name.ext",0 +\par +\par }{\f2 BUFFER\tab ds\tab 256 +\par }{ +\par +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid {\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f29 DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }{\f29 B = 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0}{ +\par +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 \'e1\'f3\'f4\'e5\'f0 - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 "FILE.EXT",0 +\par A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'e0\'f1\'fc +\'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab DE,BUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,3\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb}{\f2 D0, D1, D2, D3. +\par }{\f29 \tab ; \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 "name.ext",0 +\par }{ +\par }{\f2\lang1033 STRING\tab db\tab "c:\\dir1\\dir2\\name.ext",0 +\par +\par }{\f2 BUFFER\tab ds\tab 13 +\par }{ +\par +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 4 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }{\f29 B = 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 \'e1\'f3\'f4\'e5\'f0 - \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 "TXT",0 \'e8\'eb\'e8 "C ",0 +\par A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'ee\'f1\'fc \'e2 \'e1 +\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par }{\f2 \tab LD\tab D}{\f29 E,BUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par \tab LD\tab C,45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,4\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb D0, D1, D2, D3. +\par \tab ; \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 "ext",0 +\par }{\f2 +\par }{\f2\lang1033 STRING\tab db\tab "c:\\dir1\\dir2\\name.ext",0 +\par }{\lang1033 +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid {\f2 BUFFER\tab ds\tab 4 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4 +\'e0\'e9\'eb\'e0: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 8 \'e1\'e0\'e9\'f2) +\par \tab +0 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e4\'e8\'f1\'ea\'e0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\par }{\f2 +2 }{\f29 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'e8 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2) +\par +3 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\par +4 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 (\'ec\'e0\'ea\'f1. 4 \'e1\'e0\'e9\'f2\'e0) +\par }{\f2 C - 45h +\par }{\f29 B = 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 A - D7 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 * +\par D3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0; +\par D2 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3; +\par D1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0; +\par D0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2 \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 \'e8 \'ea\'ee\'ef +\'e8\'f0\'f3\'e5\'f2 \'e2 \'e1\'f3\'f4\'e5\'f0\'fb \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'ed\'fb\'e5 \'fd\'eb\'e5\'ec\'e5\'ed\'f2\'fb \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8, \'e5\'f1\'eb\'e8 \'ea\'e0\'ea\'ee\'e9-\'eb\'e8\'e1\'ee \'fd +\'eb\'e5\'ec\'e5\'ed\'f2 \'ed\'e5 \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'eb\'f1\'ff \'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff 0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }{\f29 \tab LD\tab HL,STRING\tab ; HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'e4\'eb\'ff \'f0\'e0\'e7\'e1\'ee\'f0\'e0 +\par \tab LD\tab DE,PBUFFER\tab ; DE \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 +\par }{\f2 \tab LD\tab C,}{\f29 45h\tab \tab ; \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f0\'e0\'e7\'e1\'ee\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab LD\tab B,5\tab \tab ; \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ; \'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab ; \'c2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 A \'e1\'f3\'e4\'f3\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed\'fb \'f0\'e0\'e7\'f0\'ff\'e4\'fb D0, D1, D2, D3. +\par }{\f2 \tab }{\f2\lang1033 ; }{\f29 \'c2}{\f2\lang1033 }{\f29 \'e1\'f3\'f4\'e5\'f0\'e5}{\f2\lang1033 DRIVE_A "C:",0 +\par \tab ; }{\f29 \'c2}{\f2\lang1033 }{\f29 \'e1\'f3\'f4\'e5\'f0\'e5}{\f2\lang1033 DIR_A "\\DIR1\\DIR2\\",0 +\par \tab ; }{\f29 \'c2}{\f2\lang1033 }{\f29 \'e1\'f3\'f4\'e5\'f0\'e5}{\f2\lang1033 NAME_A "NAME.EXT",0 +\par \tab ; }{\f29 \'c2}{\f2\lang1033 }{\f29 \'e1\'f3\'f4\'e5\'f0\'e5}{\f2\lang1033 TYPE_A "EXT",0 +\par +\par STRING\tab db\tab "c:\\dir1\\dir2\\name.ext",0 +\par +\par PBUFFER\tab dw\tab DRIVE_A +\par \tab dw\tab DIR_A +\par \tab dw\tab NAME_A +\par \tab dw\tab TYPE_A +\par +\par DRIVE_A\tab ds\tab 13 +\par DIR_A\tab ds\tab 256 +\par NAME_A\tab ds\tab 13 +\par TYPE_A\tab ds\tab 4 +\par }{ +\par +\par +\par }{\lang1033 +\par }{\b\i\lang1033 }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'ec\'ee\'e3\'ee \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2) +\par }{\f2 C - 45h +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid {\f29 B = 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par CF=0 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 \'ed\'e5 \'e4\'ee\'f1\'f2\'e8\'e3\'ed\'f3\'f2 (\'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'e8\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb) +\par CF=1 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 (\'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'b8\'ed \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e8\'eb\'e8 \line \'ed\'ee\'eb\'fc) +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'f2 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8. \'cf\'e0\'f0\'e0\'ec\'e5 +\'f2\'f0\'e0\'ec\'e8 \'f1\'f7\'e8\'f2\'e0\'fe\'f2\'f1\'ff \'eb\'fe\'e1\'fb\'e5 \'ef\'ee\'f1\'eb\'e5\'e4\'ee\'e2\'e0\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'f0\'e0\'e7\'e4\'e5\'eb\'b8\'ed\'ed\'fb\'e5 \'ef\'f0\'ee\'e1\'e5\'eb +\'e0\'ec\'e8. \'c2\'e5\'e4\'f3\'f9\'e8\'e5 \'ef\'f0\'ee\'e1\'e5\'eb\'fb \'e8\'e3\'ed\'ee\'f0\'e8\'f0\'f3\'fe\'f2\'f1\'ff. \'cf\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e2 \'e1\'f3\'f4\'e5\'f0\'e5 \'e7\'e0\'e2\'e5\'f0\'f8\'e0\'e5\'f2\'f1\'ff \'ea\'ee\'e4\'ee\'ec \'ed +\'ee\'eb\'fc, \'e5\'f1\'eb\'e8 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb \'ee\'f2\'f1\'f3\'f2\'f1\'f2\'e2\'f3\'fe\'f2, \'e2 \'e1\'f3\'f4\'e5\'f0 \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'ed\'ee\'eb\'fc. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 8 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par }{\f2 C - 45h +\par }{\f29 B = 8 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\par }{\f2 +\par }{\f29 \tab db\tab "name.ext",0 \tab ; \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\par \tab db\tab "name ext"\tab ; 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }\pard\plain \s25\widctlpar\adjustright \fs20\lang1049\cgrid {\f29 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee +\'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\b\i\f17 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 9 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2: +\par }{ +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f29 HL - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par }{\f2 C - 45h +\par }{\f29 B = 9 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par }{\f2 +\par }{\f29 \tab db\tab "name.ext",0 \tab ; \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1 +\par \tab db\tab "name ext"\tab ; 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par }{ +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{ +\par }{\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 +\'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2. \'c2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 \'e4\'ee\'ef\'f3\'f1\'ea\'e0\'fe\'f2\'f1\'ff \'e3\'eb\'ee\'e1\'e0\'eb\'fc\'ed\'fb\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8 *. \'c2 \'fd\'f2 +\'ee\'ec \'f1\'eb\'f3\'f7\'e0\'e5 \'f1\'e8\'ec\'e2\'ee\'eb * \'e1\'f3\'e4\'e5\'f2 \'e7\'e0\'ec\'e5\'ed\'e5\'ed \'ed\'e0 \'ed\'e5\'f1\'ea\'ee\'eb\'fc\'ea\'ee \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 ? . \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0 "name*.c*", \'e1\'f3\'e4\'e5 +\'f2 \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'ed \'e2 "name????c??". +\par }{ +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'d0\'e0\'e1\'ee\'f2\'e0 \'f1 \'fd\'ea\'f0\'e0\'ed\'ee\'ec: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'d1\'e5\'e9\'f7\'e0\'f1 DOS \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'f2 \'f7\'e5\'f2\'fb\'f0\'e5 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0. +\par \'c4\'e2\'e0 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'f5: +\par 40x32 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 c 16 \'f6\'e2\'e5\'f2\'e0\'ec\'e8 (\'f0\'e5\'e6\'e8\'ec 02h); +\par 80x32 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 c 16 \'f6\'e2\'e5\'f2\'e0\'ec\'e8 (\'f0\'e5\'e6\'e8\'ec 03h); +\par \'e8 \'e4\'e2\'e0 \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'f5: +\par 320x256 \'f2\'ee\'f7\'e5\'ea \'f1 256 \'f6\'e2\'e5\'f2\'e0\'ec\'e8 (\'f0\'e5\'e6\'e8\'ec 81h); +\par 640x256 \'f2\'ee\'f7\'e5\'ea \'f1 16 \'f6\'e2\'e5\'f2\'e0\'ec\'e8 (\'f0\'e5\'e6\'e8\'ec 82h); +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ce\'f1\'ed\'ee\'e2\'ed\'fb\'ec \'f0\'e5\'e6\'e8\'ec\'ee\'ec \'ff\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 \'f0\'e5\'e6\'e8\'ec 80x32 (03h), \'e5\'f1\'eb\'e8 +\'e2\'e0\'f8\'e0 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'f0\'e0\'e1\'ee\'f2\'e0\'e5\'f2 \'e2 \'e4\'f0\'f3\'e3\'ee\'ec \'f0\'e5\'e6\'e8\'ec\'e5, \'f2\'ee \'e2\'e0\'ec \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'ef\'e5\'f0\'e5\'e4 \'ef\'e5\'f0\'e5\'ea\'eb\'fe\'f7\'e5\'ed +\'e8\'e5\'ec \'f0\'e5\'e6\'e8\'ec\'e0 \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'ed\'ee\'ec\'e5\'f0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'f0\'e5\'e6\'e8\'ec\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e5\'e9 51h GETVMOD \'e8 \'f1\'ee\'f5\'f0\'e0\'ed\'e8\'f2\'fc \'e5\'e3\'ee, \'e0 + \'ef\'e5\'f0\'e5\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e5\'ec \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'e2\'ee\'f1\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e5\'e3\'ee. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0: +\par }{ +\par }{\f17 \tab LD\tab C,51h\tab ;\'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par }{\tab RST\tab 10h +\par }{\f17 \tab LD\tab C,A\tab ;\'ef\'ee\'ec\'e5\'f1\'f2\'e8\'f2\'fc \'ed\'ee\'ec\'e5\'f0 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 C +\par \tab PUSH\tab BC\tab ;\'e8 \'f1\'ee\'f5\'f0\'e0\'ed\'e8\'f2\'fc \'ed\'e0 \'f1\'f2\'e5\'ea\'e5 (B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0, C - \'f0\'e5\'e6\'e8\'ec) +\par }{\tab . +\par }{\f17 \tab . \tab \tab ;\'e2\'e0\'f8\'e0 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 +\par }{\tab . +\par +\par }{\f17 \tab POP\tab BC\tab ;\'e2\'e7\'ff\'f2\'fc \'f1\'ee \'f1\'f2\'e5\'ea\'e0 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par \tab LD\tab A,C\tab ;\'ef\'ee\'ec\'e5\'f1\'f2\'e8\'f2\'fc \'ed\'ee\'ec\'e5\'f0 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 A +\par \tab LD\tab C,50h\tab ;\'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par }{\tab RST\tab 10h +\par }{\f17 \tab LD\tab C,41h\tab ;\'e7\'e0\'e2\'e5\'f0\'f8\'e8\'f2\'fc \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3. +\par }{\tab RST\tab 10h +\par +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 DOS \'e8\'ec\'e5\'e5\'f2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2\'fb\'e2\'ee\'e4\'e0 \'ed\'e0 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 \'fd\'ea\'f0\'e0\'ed \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8 + \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'f5 \'f1\'f2\'f0\'ee\'ea. \'c4\'eb\'ff \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'f5 \'f0\'e5\'e6\'e8\'ec\'ee\'e2 \'f2\'f0\'e5\'e1\'f3\'fe\'f2\'f1\'ff \'f1\'ee\'e1\'f1\'f2\'e2\'e5\'ed\'ed\'fb\'e5 \'ef\'f0\'ee\'f6\'e5 +\'e4\'f3\'f0\'fb \'e2\'fb\'e2\'ee\'e4\'e0 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed. \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'ef\'f0\'e8 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e8 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'e2\'fb \'ec\'ee\'e6\'e5\'f2\'e5 \'e2\'fb\'e4\'e0\'f2 +\'fc \'f1\'f2\'f0\'ee\'ea\'f3 \'ed\'e0 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 \'fd\'ea\'f0\'e0\'ed: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par \tab LD\tab }{\f17 HL,STRING\tab ;\'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'f2\'f0\'ee\'ea\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par \tab LD\tab C,5Ch\tab \tab ;\'e2\'fb\'e2\'ee\'e4 \'f1\'f2\'f0\'ee\'ea\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par }{\tab }{\lang1033 RST\tab 10h +\par +\par STRING\tab DB\tab "Thank you for using my program..."\tab ;}{\f17 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'e0\'ff}{\lang1033 }{\f17 \'f1\'f2\'f0\'ee\'ea\'e0}{\lang1033 +\par \tab }{\f17 DB\tab 13,10\tab \tab ;\'f1\'e8\'ec\'e2\'ee\'eb\'fb \'e2\'ee\'e7\'e2\'f0\'e0\'f2\'e0 \'ea\'e0\'f0\'e5\'f2\'ea\'e8 \'e8 \'ef\'e5\'f0\'e5\'e2\'ee\'e4\'e0 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \tab DB\tab 0\tab \tab ;\'f1\'e8\'ec\'e2\'ee\'eb \'ea\'ee\'ed\'f6\'e0 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'c4\'eb\'ff \'e2\'fb\'e2\'ee\'e4\'e0 \'ed\'e0 \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'e9 \'fd\'ea\'f0\'e0\'ed, \'e2\'e0\'ec \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e8\'f2\'fc \'e2 +\'e8\'e4\'e5\'ee \'ef\'e0\'ec\'ff\'f2\'fc \'e2 \'ee\'e4\'ed\'ee \'e8\'e7 \'f2\'f0\'e5\'f5 \'ee\'ea\'ee\'ed \'ef\'e0\'ec\'ff\'f2\'e8 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. \'dd\'f2\'ee \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'e2\'fb +\'e2\'ee\'e4\'ee\'ec \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff 50h \'e2 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'ef\'ee\'f0\'f2 0A2h, 0C2h \'e8\'eb\'e8 0E2h \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ee\'ea\'ed\'e0 \'ef\'e0 +\'ec\'ff\'f2\'e8. \'cf\'f0\'e8 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e8 \'ee\'e1\'f0\'e0\'f2\'e8\'f2\'e5 \'e2\'ed\'e8\'ec\'e0\'ed\'e8\'e5 \'ed\'e0 \'f2\'ee, \'f7\'f2\'ee\'e1\'fb \'f1\'f2\'e5\'ea \'e2\'e0\'f8\'e5\'e9 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec +\'fb \'ed\'e5 \'ef\'ee\'ef\'e0\'e4\'e0\'eb \'e2 \'fd\'f2\'ee \'e0\'e4\'f0\'e5\'f1\'ed\'ee\'e5 \'ef\'f0\'ee\'f1\'f2\'f0\'e0\'ed\'f1\'f2\'e2\'ee. +\par }\pard \widctlpar\adjustright { +\par }{\f17 \'cd\'e0\'ef\'f0\'e8\'ec\'e5\'f0, \'e5\'f1\'eb\'e8 \'e2\'e0\'ec \'ed\'f3\'e6\'ed\'ee \'ef\'ee\'f1\'f2\'e0\'e2\'e8\'f2\'fc \'f2\'ee\'f7\'ea\'f3 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5, \'f2\'ee \'ef\'ee\'e4\'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'e4\'eb\'ff + \'f0\'e5\'e6\'e8\'ec\'e0 81h \'e1\'f3\'e4\'e5\'f2 \'e2\'fb\'e3\'eb\'ff\'e4\'e5\'f2\'fc \'f2\'e0\'ea: +\par }{ +\par }{\f17 ; HL - \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'fc\'ed\'e0\'ff \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par ; DE - \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'fc\'ed\'e0\'ff \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0}{ +\par +\par }{\f17 \tab IN\tab A,(0E2h)\tab ;\'f1\'f7\'e8\'f2\'e0\'f2\'fc \'e8\'e7 \'ef\'ee\'f0\'f2\'e0 \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'ee\'e9 \'e2 +\par \tab \tab \tab \tab ;\'f2\'f0\'e5\'f2\'fc\'e5 \'ee\'ea\'ed\'ee \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab LD\tab C,A\tab \tab ;\'e7\'e0\'ef\'ee\'ec\'ed\'e8\'f2\'fc \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 C +\par \tab LD\tab A,50h\tab \tab ;\'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e2\'e8\'e4\'e5\'ee \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab OUT\tab (0E2h),A\tab ;\'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'e2\'e8\'e4\'e5\'ee \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab LD\tab A,E\tab \tab ;\'ef\'ee\'ec\'e5\'f1\'f2\'e8\'f2\'fc \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'fc\'ed\'f3\'fe \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'f3 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 A. +\par }{\tab OUT\tab }{\f17 (89h),A\tab \tab ;\'e2\'fb\'e4\'e0\'f2\'fc \'e2 \'ef\'ee\'f0\'f2 +\par \tab LD\tab DE,0C000h\tab ;\'e0\'e4\'f0\'e5\'f1 \'ed\'e0\'f7\'e0\'eb\'e0 \'f2\'f0\'e5\'f2\'fc\'e5\'e3\'ee \'ee\'ea\'ed\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab ADD\tab HL,DE\tab \tab ;\'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'e0\'e4\'f0\'e5\'f1 \'f2\'ee\'f7\'ea\'e8 (\'e0\'e4\'f0\'e5\'f1 \'ed\'e0\'f7\'e0\'eb\'e0 \'ee\'ea\'ed\'e0 + +\par \tab \tab \tab \tab ;\'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'fc\'ed\'e0\'ff \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0) +\par \tab LD\tab A,255\tab \tab ;\'f6\'e2\'e5\'f2 \'e2\'fb\'e2\'ee\'e4\'e8\'ec\'ee\'e9 \'f2\'ee\'f7\'ea\'e8 (\'ee\'f2 0 \'e4\'ee 255) +\par \tab LD\tab (HL),A\tab \tab ;\'e2\'fb\'e2\'ee\'e4 \'f2\'ee\'f7\'ea\'e8 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed +\par \tab LD\tab A,C\tab \tab ;\'e2\'f1\'ef\'ee\'ec\'ed\'e8\'f2\'fc \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 +\par \tab OUT\tab (0E2h)\tab \tab ;\'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e8\'f2\'fc \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'ef\'e0\'ec\'ff\'f2\'e8 \'e2\'ec\'e5\'f1\'f2\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2\'e8\'e4\'e5\'ee +\par \tab \tab \tab \tab ;\'ef\'e0\'ec\'ff\'f2\'e8 +\par }{ +\par }\pard\plain \s28\qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cf\'e5\'f0\'e5\'e4 \'e2\'fb\'e2\'ee\'e4\'ee\'ec \'f2\'ee\'f7\'e5\'ea \'f1\'eb\'e5\'e4\'f3\'e5\'f2 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'fb +\'e5 \'f6\'e2\'e5\'f2\'e0 \'e2 \'ef\'e0\'eb\'e8\'f2\'f0\'e5. \'d0\'e0\'e7\'eb\'e8\'f7\'ed\'fb\'e5 \'f0\'e5\'e6\'e8\'ec\'fb \'e2\'fb\'e2\'ee\'e4\'e0 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed \'e7\'e0\'e4\'e0\'fe\'f2\'f1\'ff \'ed\'ee\'ec\'e5\'f0\'ee\'ec \'e2\'e8\'e4 +\'e5\'ee \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ee\'f2 50h \'e4\'ee 5Fh. \'cf\'ee\'e4\'f0\'ee\'e1\'ed\'e5\'e5 \'ee \'f0\'e5\'e6\'e8\'ec\'e0\'f5 \'e2\'fb\'e2\'ee\'e4\'e0 \'e2\'fb \'ec\'ee\'e6\'e5\'f2\'e5 \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'f2\'fc \'e2 \'ee\'ef\'e8 +\'f1\'e0\'ed\'e8\'e8 \'e0\'f0\'f5\'e8\'f2\'e5\'ea\'f2\'f3\'f0\'fb \'ea\'ee\'ec\'ef\'fc\'fe\'f2\'e5\'f0\'e0. +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\b\f17 50h (80) SETVMOD (\'c2\'fb\'e1\'ee\'f0 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 02h - \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 40x32x16 \'f6\'e2\'e5\'f2\'ee\'e2 +\par 03h - \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 80x32x16 \'f6\'e2\'e5\'f2\'ee\'e2 +\par 81h - \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'e9 320x256x256 \'f6\'e2\'e5\'f2\'ee\'e2}{ +\par }{\f17 82h - \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'e9 640x256x16 \'f6\'e2\'e5\'f2\'ee\'e2 +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1 +\par }{C - 50h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0. \'d1\'e5\'e4\'fc\'ec\'ee\'e9 \'e1\'e8\'f2 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb +\'e5\'ed }{\v +\par }{\f17 \'e4\'eb\'ff \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'f5 \'f0\'e5\'e6\'e8\'ec\'ee\'e2 \'e8 \'f1\'e1\'f0\'ee\'f8\'e5\'ed \'e4\'eb\'ff \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'f5. \'d1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f2 \'e4\'e2\'e0 \'f2\'e5\'ea\'f1\'f2 +\'ee\'e2\'fb\'f5 \'f0\'e5\'e6\'e8\'ec\'e0 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'e4\'e2\'e0 \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'f5. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 51h (81) GETVMOD (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 51h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 52h (82) LOCATE (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par }{C - 52h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'ed\'ee\'e2\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0. \'c2\'fb\'e2\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\'e1\'f3\'e4\'e5\'f2 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2\'fc\'f1\'ff \'e2 \'fd\'f2\'f3 \'ef\'ee\'e7\'e8\'f6\'e8\'fe. \'c2\'e5\'f0\'f5\'ed\'e8\'e9 \'eb\'e5\'e2\'fb\'e9 \'f3\'e3\'ee\'eb \'e8\'ec +\'e5\'e5\'f2 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb (0,0). +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 +\par }{\b\f17 53h (83) CURSOR (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 53h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 54h (84) SELPAGE (\'c2\'fb\'e1\'f0\'e0\'f2\'fc \'e0\'ea\'f2\'e8\'e2\'ed\'f3\'fe \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1 +\par }{C - 54h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'e0\'ea\'f2\'e8\'e2\'ed\'f3\'fe \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3, \'ea\'ee\'f2\'ee\'f0\'e0\'ff \'e1\'f3\'e4\'e5\'f2 \'e2\'fb\'e2\'ee\'e4\'e8\'f2\'fc\'f1\'ff \'ed\'e0 \'fd +\'ea\'f0\'e0\'ed. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 55h (85) SCROLL (\'cf\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'ee\'ea\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0 +\par }{B = 1 -}{\f17 \'ef\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'e2\'e2\'e5\'f0\'f5 +\par B = 2 - \'ef\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'e2\'ed\'e8\'e7 +\par A = 0 - \'ee\'f7\'e8\'f9\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3 +\par }{C - 55h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'ef\'f0\'e5\'e4\'e5\'eb\'ff\'e5\'f2 \'ee\'ea\'ed\'ee \'e0\'ea\'f2\'e8\'e2\'ed\'ee\'e9 \'e2\'e8\'e4\'e5\'ee\'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e8 \'e5\'e3\'ee \'f1\'ee\'e4\'e5\'f0\'e6 +\'e8\'ec\'ee\'e5 }{\v +\par }{\f17 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'e5\'f2\'f1\'ff \'e2\'e2\'e5\'f0\'f5 \'e8\'eb\'e8 \'e2 \'ed\'e8\'e7 \'ed\'e0 \'ee\'e4\'ed\'f3 \'f1\'f2\'f0\'ee\'ea\'f3. \'c5\'f1\'eb\'e8 \'f0\'e5\'e3\'e8\'f1\'f2\'f0 A \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe, }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'b8\'ed\'ed\'e0\'ff \'f1\'f2\'f0\'ee\'ea\'e0 \'ee\'f7\'e8\'f9\'e0\'e5\'f2\'f1\'ff (\'e7\'e0\'ef\'ee\'eb\'ed\'ff\'e5\'f2\'f1\'ff \'ef\'f0\'ee\'e1 +\'e5\'eb\'e0\'ec\'e8). +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 56h (86) CLEAR (\'ce\'f7\'e8\'f1\'f2\'ea\'e0 \'ee\'ea\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0 +\par B - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'e7\'e0\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc +\par A - \'f1\'e8\'ec\'e2\'ee\'eb \'e7\'e0\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc +\par }{C - 56h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'f7\'e8\'f9\'e0\'e5\'f2 \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0, \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0\'ff \'e2\'ee \'e2\'f1\'e5 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ee\'ea\'ed\'e0 \'f1\'e8 +\'ec\'e2\'ee\'eb \'f1 \'ea\'ee\'e4\'ee\'ec }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8\'e7 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 A \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'ec \'e8\'e7 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0 B. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 57h (87) RDCHAR (\'d1\'f7\'e8\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'f1 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 +\par }{C - 57h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f1\'e8\'ec\'e2\'ee\'eb +\par B - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'f7\'e8\'f2\'fb\'e2\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'e8 \'e5\'e3\'ee \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'e8\'e7 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e7 +\'e0\'e4\'e0\'ed\'ed\'ee\'e9 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0\'ec\'e8 D \'e8 E. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 58h (88) WRCHAR (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 +\par A - \'f1\'e8\'ec\'e2\'ee\'eb +\par B - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 +\par }{C - 58h +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 \'e2 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'e7\'e0\'e4\'e0\'ed\'ed +\'ee\'e9 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0\'ec\'e8 D }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 E. \'d3\'ef\'f0\'e0\'e2\'eb\'ff\'fe\'f9\'e8\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb \'e2\'fb\'e2\'ee\'e4\'ff\'f2\'f1\'ff \'ea\'e0\'ea \'ee\'e1\'fb\'f7\'ed\'fb\'e5 \'f1\'e8\'ec\'e2 +\'ee\'eb\'fb. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 59h (89) WINCOPY (\'c7\'e0\'ef\'ee\'ec\'ed\'e8\'f2\'fc \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0 +\par B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e1\'f3\'f4\'e5\'f0\'e0 +\par IX - \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 +\par }{C - 59h +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ea\'ee\'ef\'e8\'f0\'f3\'e5\'f2 \'ee\'ea\'ed\'ee \'e2 \'ef\'e0\'ec\'ff\'f2\'fc \'ed\'e0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'e7\'e0\'e4\'e0\'ed\'ed\'f3\'fe \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B \'e8 \'ef\'ee }{\v + +\par }{\f17 \'e0\'e4\'f0\'e5\'f1\'f3 \'e7\'e0\'e4\'e0\'ed\'ed\'ee\'ec\'f3 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 IX. \'c5\'f1\'eb\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 IX \'ec\'e5\'ed\'fc\'f8\'e5 0C000h, \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 }{\v +\par }{\f17 \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2\'f1\'ff \'e2 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'ef\'e0\'ec\'ff\'f2\'e8 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'f3\'fe \'ef\'ee \'fd\'f2\'ee\'ec\'f3 \'e0\'e4\'f0\'e5\'f1\'f3. \'c2 \'e1\'f3\'f4\'e5\'f0\'e5 +\'ef\'ee\'eb\'f3\'f7\'e0\'e5\'f2\'f1\'ff }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ec\'e0\'f1\'f1\'e8\'e2 \'e8\'e7 \'e8\'e4\'f3\'f9\'e8\'f5 \'ef\'ee\'e4\'f0\'ff\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 5}{\b\f17 Ah (90) WINREST (\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D - \'f1\'f2\'f0\'ee\'ea\'e0 +\par E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0 +\par B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e1\'f3\'f4\'e5\'f0\'e0 +\par IX - \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 +\par }{C - 5Ah +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'ef\'ee\'eb\'ed\'ff\'e5\'f2 \'ee\'e1\'f0\'e0\'f2\'ed\'ee\'e5 \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ee\'ea\'ed\'e0 \'e8\'e7 \'ef\'e0\'ec\'ff\'f2\'e8 \'ed\'e0 \'f1\'f2\'f0 +\'e0\'ed\'e8\'f6\'e5 \'e7\'e0\'e4\'e0\'ed\'ed\'ee\'e9 }{\v +\par }{\f17 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B \'e8 \'f1 \'e0\'e4\'f0\'e5\'f1\'e0 \'e7\'e0\'e4\'e0\'ed\'ed\'ee\'e3\'ee \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 IX. \'c5\'f1\'eb\'e8 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 IX \'ec\'e5\'ed\'fc\'f8\'e5 }{\v +\par }{\f17 0C000h, \'ea\'ee\'ef\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2\'f1\'ff \'e8\'e7 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'ed\'ee\'e9 \'ef\'ee \'fd\'f2\'ee\'ec\'f3 +}{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e0\'e4\'f0\'e5\'f1\'f3. +\par }\pard \s19\sa120\widctlpar\adjustright {\b\f17 5Bh (91) PUTCHAR (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f1\'e8\'ec\'e2\'ee\'eb +\par }{C - 5Bh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0. +\'cf\'ee\'f1\'eb\'e5 }{\v +\par }{\f17 \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'f2\'e5\'ea\'f3\'f9\'e0\'ff \'ef\'ee\'e7\'e8\'f6\'e8\'ff \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff. \'cf\'e5\'f7\'e0\'f2\'fc \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff +\'f1 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'ff\'fe\'f9\'e8\'ec\'e8 \'ea\'ee\'e4\'e0\'ec\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 5Ch (92) PCHARS (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8 +\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'ed\'e0\'f7\'e0\'eb\'ee \'f1\'f2\'f0\'ee\'ea\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par }{C - 5Ch +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'f2 \'f1\'f2\'f0\'ee\'ea\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 + \'ea\'f3\'f0\'f1\'ee\'f0\'e0. }{\v +\par }{\f17 \'cf\'f0\'e8 \'ef\'e5\'f7\'e0\'f2\'e8 \'f2\'e5\'ea\'f3\'f9\'e0\'ff \'ef\'ee\'e7\'e8\'f6\'e8\'ff \'f3\'e2\'e5\'eb\'e8\'f7\'e8\'e2\'e0\'e5\'f2\'f1\'ff. \'cf\'e5\'f7\'e0\'f2\'fc \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'f1 }{\v + +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f3\'ef\'f0\'e0\'e2\'eb\'ff\'fe\'f9\'e8\'ec\'e8 \'ea\'ee\'e4\'e0\'ec\'e8. \'d1\'f2\'f0\'ee\'ea\'e0 \'e4\'ee\'eb\'e6\'ed\'e0 \'e7\'e0\'ea\'e0\'ed\'f7\'e8\'e2\'e0\'f2\'fc\'f1\'ff +\'ea\'ee\'e4\'ee\'ec \'ed\'ee\'eb\'fc. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 5Fh (95) PRINT (\'c2\'fb\'e2\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'f1\'e8\'ec\'e2\'ee\'eb +\par }{C - 5Fh +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 B - \'f1\'e8\'ec\'e2\'ee\'eb +\par CF = 1 - \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'ed\'e5 \'e3\'ee\'f2\'ee\'e2 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'ee\'f1\'fb\'eb\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0. \'c5\'f1\'eb\'e8 \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'ed\'e5 \'e3\'ee\'f2\'ee\'e2 \'ef\'f0\'e8 +\'ed\'e8\'ec\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb, }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f2\'ee \'e2\'fb\'f1\'f2\'e0\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'f4\'eb\'e0\'e3 \'ef\'e5\'f0\'e5\'ed\'ee\'f1\'e0 (CF). +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'cf\'f0\'e8\'ec\'e5\'f0: +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 LD\tab HL,TEXT\tab \tab ;HL \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'e5\'f2 \'ed\'e0 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 \'ec\'e0\'f1\'f1\'e8\'e2, \'ea\'ee\'f2\'ee\'f0\'fb\'e9 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {NPRINT +\par }\pard\plain \s20\li283\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 PUSH\tab BC\tab \tab ;\'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee \'f0\'e0\'f1\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0\'e5 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {APRINT +\par }{\f17 \tab PUSH\tab HL\tab \tab ;\'d1\'ee\'f5\'f0\'e0\'ed\'ff\'e5\'ec \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab LD\tab A,(HL)\tab \tab ;\'c1\'e5\'f0\'b8\'ec \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'e9 \'f1\'e8\'ec\'e2\'ee\'eb \'e8 \'ef\'e5\'f7\'e0\'f2\'e0\'e5\'ec +\par \tab LD\tab C,5Fh\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f7\'e0\'f2\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab JR\tab NC,PRNOK\tab ;\'cf\'e5\'f0\'e5\'f5\'ee\'e4 \'ed\'e0 \'ef\'e5\'f7\'e0\'f2\'fc \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ;\'cf\'f0\'e8\'ed\'f2\'e5\'f0 \'ed\'e5 \'e3\'ee\'f2\'ee\'e2, \'ee\'e6\'e8\'e4\'e0\'e5\'ec \'ef\'ee\'ea\'e0 \'ed\'e5 \'ed\'e0\'e6\'e0\'f2\'e0 [Esc] +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \tab LD\tab C,31h\tab \tab ;\'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ee\'ef\'f0\'ee\'f1\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff +\par \tab RST\tab 10h\tab \tab ;\'c2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par \tab POP\tab HL\tab \tab ;\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'ec \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f1\'e8\'ec\'e2\'ee\'eb +\par \tab JR\tab Z,APRINT\tab ;\'ca\'eb\'e0\'e2\'e8\'f8\'e8 \'ed\'e5 \'ed\'e0\'e6\'e8\'ec\'e0\'eb\'e8\'f1\'fc +\par \tab CP\tab 1Bh\tab \tab ;\'cd\'e0\'e6\'e0\'f2\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e0 [Esc]? +\par \tab JR\tab NZ,APRINT\tab ;\'e5\'f1\'eb\'e8 \'ed\'e5\'f2, \'ef\'ee\'e2\'f2\'ee\'f0\'ff\'e5\'ec \'ef\'e5\'f7\'e0\'f2\'fc +\par \tab POP\tab BC\tab \tab ;\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'ec \'f1\'f7\'e5\'f2\'f7\'e8\'ea \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ;\'cf\'e5\'f7\'e0\'f2\'fc \'ef\'f0\'e5\'f0\'e2\'e0\'ed\'e0 (\'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'fc \'ed\'e0\'e6\'e0\'eb [Esc]) +\par }\pard\plain \fi720\widctlpar\adjustright \fs20\lang1049\cgrid {SCF +\par RET +\par }\pard \widctlpar\adjustright {\f17 PRNOK\tab POP\tab HL\tab \tab ;\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'ec \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f1\'e8\'ec\'e2\'ee\'eb +\par \tab POP\tab BC\tab \tab ;\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'ec \'f1\'f7\'e5\'f2\'f7\'e8\'ea \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par \tab INC\tab HL\tab \tab ;\'cf\'e5\'f0\'e5\'f5\'ee\'e4\'e8\'ec \'ea \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'ec\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'f3 +\par \tab DEC\tab BC\tab \tab ;\'d3\'ec\'e5\'ed\'fc\'f8\'e0\'e5\'ec \'f1\'f7\'e5\'f2\'f7\'e8\'ea \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 +\par \tab LD\tab A,B\tab \tab ;\'d1\'f7\'e5\'f2\'f7\'e8\'ea \'f0\'e0\'e2\'e5\'ed \'ed\'f3\'eb\'fe? +\par }{\tab OR\tab C +\par }{\f17 \tab JP\tab NZ,NPRINT\tab ;\'e5\'f1\'eb\'e8 \'ed\'e5\'f2, \'ef\'f0\'ee\'e4\'ee\'eb\'e6\'e0\'e5\'ec \'ef\'e5\'f7\'e0\'f2\'fc +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 ;\'d3\'f1\'ef\'e5\'f8\'ed\'ee \'ed\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'ed\'fb \'e2\'f1\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'fb +\par }\pard\plain \fi720\widctlpar\adjustright \fs20\lang1049\cgrid {XOR\tab A +\par RET +\par }\pard \widctlpar\adjustright { +\par +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'c8\'ed\'f2\'e5\'f0\'f4\'e5\'e9\'f1 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'ec\'fb\'f8\'fc\'fe: +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\u8195\'20}{\f17 \'c2\'e7\'e0\'e8\'ec\'ee\'e4\'e5\'e9\'f1\'f2\'e2\'e8\'e5 \'f1 \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'ee\'ec \'ec\'fb\'f8\'e8 \'ee\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'eb\'ff\'e5\'f2\'f1\'ff \'ef +\'f0\'e8 \'ef\'ee\'ec\'ee\'f9\'e8 \'e8\'ed\'f1\'f2\'f0\'f3\'ea\'f6\'e8\'e8 RST 30h. }{\v +\par }{\f17 \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ea\'ee\'ed\'ea\'f0\'e5\'f2\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8, \'e2 \'ea\'e0\'f7\'e5\'f1\'f2\'e2\'e5 \'e2\'f5\'ee\'e4\'ed\'fb\'f5 \'e8 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'f5 \'ef\'e0\'f0 +\'e0\'ec\'e5\'f2\'f0\'ee\'e2 }{\v +\par }{\f17 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'fe\'f2\'f1\'ff \'f0\'e0\'e7\'eb\'e8\'f7\'ed\'fb\'e5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'fb, \'ef\'f0\'e8 \'fd\'f2\'ee\'ec \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e7\'e0\'e4\'e0\'e5\'f2\'f1\'ff \'e2 \'f0\'e5 +\'e3\'e8\'f1\'f2\'f0\'e5 C. }{\v +\par }{\f17 \'cb\'fe\'e1\'fb\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'ec\'fb\'f8\'e8 \'e8 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 \'ed\'e0 \'ea\'eb\'e0\'e2\'e8\'f8\'e8 \'e2\'ee\'f1\'ef\'f0\'e8\'ed\'e8\'ec\'e0\'e5\'f2 \'f1\'ef\'e5\'f6\'e8\'e0\'eb\'fc\'ed\'e0\'ff + \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 }{\v +\par }{\f17 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ec\'fb\'f8\'e8. \'ca\'e0\'e6\'e4\'ee\'e5 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 \'e8 \'ee\'f2\'ef\'f3\'f1\'ea\'e0\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'f8 \'e8\'eb\'e8 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'ec\'fb\'f8\'e8 +\'e2\'fb\'e7\'fb\'e2\'e0\'e5\'f2 }{\v +\par }{\f17 \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'e5. \'cf\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0, \'ee\'e1\'f1\'eb\'f3\'e6\'e8\'e2\'e0\'fe\'f9\'e0\'ff \'fd\'f2\'ee \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'e5, \'f7\'e8\'f2\'e0\'e5\'f2 \'ef\'e0\'ea\'e5\'f2 \'e4\'e0\'ed +\'ed\'fb\'f5 \'ee\'f2 \'ec\'fb\'f8\'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'e5\'f2 \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'e2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'ed +\'fb\'f5 \'e4\'e0\'ed\'ed\'fb\'f5. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 00h (00) INITIALIZATION (\'c8\'ed\'e8\'f6\'e8\'e0\'eb\'e8\'e7\'e0\'f6\'e8\'ff \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'e0 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 00h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ed\'e5 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed, \'e5\'f1\'eb\'e8 CF=1 +\par A - \'f3\'f1\'ef\'e5\'f8\'ed\'e0\'ff \'e8\'ed\'e8\'f6\'e8\'e0\'eb\'e8\'e7\'e0\'f6\'e8\'ff, \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed, \'e5\'f1\'eb\'e8 CF=0 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'f0\'ee\'e8\'e7\'e2\'ee\'e4\'e8\'f2 \'ed\'e0\'f7\'e0\'eb\'fc\'ed\'f3\'fe \'e8\'ed\'e8\'f6\'e8\'e0\'eb\'e8\'e7\'e0\'f6\'e8\'fe \'e4\'f0\'e0\'e9\'e2\'e5\'f0 +\'e0 \'ec\'fb\'f8\'e8. \'cf\'f0\'e8 \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e5\'ed\'e8\'e8 \'f4\'eb\'e0\'e3\'e0 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f0\'e5\'ed\'ee\'f1\'e0 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ed\'e5 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'eb\'e5\'ed. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 01h (01) SHOW MOUSE CURSOR (\'c2\'fb\'e2\'e5\'f1\'f2\'e8 \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 01h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 }{CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'fb\'e2\'ee\'e4\'e8\'f2 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'e8 \'ee\'f2\'f1\'eb\'e5\'e6\'e8\'e2\'e0\'e5\'f2 \'e2\'f1 +\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f0\'e5\'f0\'e8\'f1\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e5\'e3\'ee. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 02h (02) HIDE MOUSE CURSOR (\'d3\'e1\'f0\'e0\'f2\'fc \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'f1 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 02h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f1\'f2\'e8\'f0\'e0\'e5\'f2 \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'f1 \'fd\'ea\'f0\'e0\'ed\'e0, \'ed\'ee \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ef\'f0\'ee\'e4\'ee +\'eb\'e6\'e0\'e5\'f2 \'ee\'f2\'f1\'eb\'e5\'e6\'e8\'e2\'e0\'ed\'e8\'e5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'ec\'fb\'f8\'e8 \'e8 \'ed\'e0\'e6\'e0\'f2\'e8\'e5 \'ed\'e0 \'ea\'ed\'ee\'ef\'ea\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 03h (03) READ MOUSE STATE (\'d7\'f2\'e5\'ed\'e8\'e5 \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'ff \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 03h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par A - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'ea\'ed\'ee\'ef\'ee\'ea +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 D0 - \'eb\'e5\'e2\'e0\'ff +\par D1 - \'ef\'f0\'e0\'e2\'e0\'ff +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {HL}{\f17 - x-\'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par DE - y-\'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'f2\'e5\'ea\'f3\'f9\'e8\'e5 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e8 \'f1\'ee\'f1\'f2\'ee\'ff +\'ed\'e8\'e5 \'e5\'e5 \'ea\'ed\'ee\'ef\'ee\'ea. }{\v +\par }{\f17 \'ca\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'fe\'f2\'f1\'ff \'e2 \'f2\'ee\'f7\'ea\'e0\'f5 \'e8 \'e4\'eb\'ff \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'f5 \'f0\'e5\'e6\'e8\'ec\'ee\'e2 \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee +\'e8\'f5 \'e4\'e5\'eb\'e8\'f2\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ed\'e0 \'e2\'ee\'f1\'e5\'ec\'fc \'e4\'eb\'ff \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'ff \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2 \'e2 \'e7\'ed\'e0\'ea\'ee\'ec\'e5\'f1\'f2\'e0\'f5. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 04h (04) GOTO MO}{\b\f17 USE CURSOR (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 04h +\par }{\f17 HL - x-\'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par DE - y-\'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8. \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'e5\'f2 \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'e2 \'e7\'e0\'e4\'e0 +\'ed\'ed\'fb\'e5 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 07h (07) VER}{\b\f17 T. BOUNDS (\'c7\'e0\'e4\'e0\'ed\'e8\'e5 \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'fc\'ed\'fb\'f5 \'e3\'f0\'e0\'ed\'e8\'f6 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff +\'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 07h +\par }{\f17 HL - y-\'ec\'e8\'ed\'e8\'ec\'e0\'eb\'fc\'ed\'e0\'ff +\par DE - y-\'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'e0\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e4\'e0\'e5\'f2 \'e2\'e5\'f0\'f5\'ed\'fe\'fe \'ec\'e8\'ed\'e8\'ec\'e0\'eb\'fc\'ed\'f3\'fe \'e8 \'ed\'e8\'e6\'ed\'fe\'fe \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'f3\'fe \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb \'e2 +\'ea\'ee\'f2\'ee\'f0\'fb\'f5 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ec\'ee\'e6\'e5\'f2 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'f2\'fc\'f1\'ff \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'ef\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 08h (08) HORZ. BOUNDS (\'c7\'e0\'e4\'e0\'ed\'e8\'e5 \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'fc\'ed\'fb\'f5 \'e3\'f0\'e0\'ed\'e8\'f6 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8 +\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 08h +\par }{\f17 HL - x-\'ec\'e8\'ed\'e8\'ec\'e0\'eb\'fc\'ed\'e0\'ff +\par DE - x-\'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'e0\'ff +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e4\'e0\'e5\'f2 \'eb\'e5\'e2\'f3\'fe \'ec\'e8\'ed\'e8\'ec\'e0\'eb\'fc\'ed\'f3\'fe \'e8 \'ef\'f0\'e0\'e2\'f3\'fe \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'f3\'fe \'ea\'ee\'ee\'f0\'e4\'e8\'ed\'e0\'f2\'fb \'e2 \'ea\'ee +\'f2\'ee\'f0\'fb\'f5 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ec\'ee\'e6\'e5\'f2 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e0\'f2\'fc\'f1\'ff \'ea\'f3\'f0\'f1\'ee\'f0 \'ec\'fb\'f8\'e8 \'ef\'ee \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 09h (09) LOAD CURSOR (\'c7\'e0\'e3\'f0\'f3\'e7\'ea\'e0 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 09h +\par B = 0 +\par }{\f17 IX - \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par D - Y \'e0\'ea\'f2\'e8\'e2\'ed\'e0\'ff \'f2\'ee\'f7\'ea\'e0 +\par E - X \'e0\'ea\'f2\'e8\'e2\'ed\'e0\'ff \'f2\'ee\'f7\'ea\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e7\'e0\'e3\'f0\'f3\'e6\'e0\'e5\'f2 \'ed\'ee\'e2\'ee\'e5 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e2 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'e8 + \'e7\'e0\'e4\'e0\'f2\'fc \'e0\'ea\'f2\'e8\'e2\'ed\'f3\'fe }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f2\'ee\'f7\'ea\'f3 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'ff. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\lang1033 +\par +\par }{\b\f17 0Ah (10) CURSOR TEXT MODES (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e2 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'ee\'ec \'f0\'e5\'e6\'e8\'ec\'e5) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 0Ah +\par }{\lang1033 B = 0 +\par H - AND SIMBOL MASK +\par L - XOR SIMBOL MASK +\par D - AND ATTRIBUT MASK +\par E - XOR ATTRIBUT MASK +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb \'e8 \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e4\'eb\'ff \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'ee\'e3\'ee \'f0\'e5\'e6 +\'e8\'ec\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 0Bh (11) RETURN CURSOR }{\b\f17 (\'cf\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'e5 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 0Bh +\par }{\f17 IX - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'ff \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\par D - Y \'e0\'ea\'f2\'e8\'e2\'ed\'e0\'ff \'f2\'ee\'f7\'ea\'e0 +\par E - X \'e0\'ea\'f2\'e8\'e2\'ed\'e0\'ff \'f2\'ee\'f7\'ea\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'e8\'e7 \'e4\'f0\'e0 +\'e9\'e2\'e5\'f0\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 0Eh (14) GET SENSETIVE (\'d7\'f2\'e5\'ed\'e8\'e5 \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 0Eh +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par H - \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'ef\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8 +\par L - \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'ef\'ee \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e2\'ee\'e7\'e2\'f0\'e0\'f9\'e0\'e5\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff +\'ec\'fb\'f8\'e8 \'ef\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8 \'e8 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 0Fh (15) SET SENSETIVE (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'ec\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 0Fh +\par }{\f17 H - \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'ef\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8 +\par L - \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'fc \'ef\'ee \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=}{1 +\par }{\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'f3\'f1\'f2\'e0\'ed\'e0\'e2\'eb\'e8\'e2\'e0\'e5\'f2 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f7\'f3\'e2\'f1\'f2\'e2\'e8\'f2\'e5\'eb\'fc\'ed\'ee\'f1\'f2\'e8 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff \'ec\'fb\'f8\'e8 \'ef +\'ee \'e2\'e5\'f0\'f2\'e8\'ea\'e0\'eb\'e8 }{\v +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e8 \'e3\'ee\'f0\'e8\'e7\'ee\'ed\'f2\'e0\'eb\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 80h (128) MOUSE HARDWARE INTERRUPT (\'ce\'e1\'f0\'e0\'e1\'ee\'f2\'f7\'e8\'ea \'e0\'ef\'ef\'e0\'f0\'e0\'f2\'ed\'ee\'e3\'ee \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'ff \'ee\'f2 \'ec +\'fb\'f8\'e8) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 80h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'cf\'ee \'ef\'f0\'e8\'f5\'ee\'e4\'f3 \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'ff \'ee\'f2 \'ec\'fb\'f8\'e8 \'e2\'fb\'e7\'fb\'e2\'e0\'e5\'f2\'f1\'ff \'e4\'e0\'ed\'ed\'e0\'ff \'f4\'f3\'ed\'ea +\'f6\'e8\'ff \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'e0. \'c2 \'f1\'eb\'f3\'f7\'e0\'e5 }{\v +\par }{\f17 \'ea\'ee\'e3\'e4\'e0 \'f2\'f0\'e5\'e1\'f3\'e5\'f2\'f1\'ff \'f0\'e0\'e1\'ee\'f2\'e0 \'ef\'ee\'e4\'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb \'ef\'f0\'e8 \'e7\'e0\'ef\'f0\'e5\'f9\'e5\'ed\'ed\'fb\'f5 \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'ff\'f5, \'e8\'f1\'ef +\'ee\'eb\'fc\'e7\'f3\'e9\'f2\'e5 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e4\'e0\'ed\'ed\'f3\'fe \'f4\'f3\'ed\'ea\'f6\'e8\'fe, \'e4\'eb\'ff \'e8\'e7\'e1\'e5\'e6\'e0\'ed\'e8\'ff \'ef\'ee\'f2\'e5\'f0\'fc \'ef\'e0\'ea\'e5\'f2\'ee\'e2 \'e4\'e0\'ed\'ed\'fb +\'f5 \'ee\'f2 \'ec\'fb\'f8\'e8. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b\f17 81h (129) CHANGE VIDEO MODE (\'c8\'ed\'f4\'ee\'f0\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ee \'f1\'ec\'e5\'ed\'e5 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {C - 81h +\par }{\f17 A - \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }\pard \qj\widctlpar\adjustright {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'e8\'ed\'f4\'ee\'f0\'ec\'e8\'f0\'f3\'e5\'f2 \'e4\'f0\'e0\'e9\'e2\'e5\'f0 \'ec\'fb\'f8\'e8 \'ee\'e1 \'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e8 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 +. \'cd\'ee\'ec\'e5\'f0\'e0 \'f0\'e5\'e6\'e8\'ec\'ee\'e2 }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'f1\'ee\'ee\'f2\'e2\'e5\'f2\'f1\'f2\'e2\'f3\'fe\'f2 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'ea\'e0 \'f0\'e5\'e6\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0. +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\b 83h (131) MOUSE REFRESH}{\b\f17 (\'cf\'f0\'e8\'ed\'f3\'e4\'e8\'f2\'e5\'eb\'fc\'ed\'e0\'ff \'ef\'e5\'f0\'e5\'f0\'e8\'f1\'ee\'e2\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0) +\par }{\f17 \'e2\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par }{C - 83h +\par }{\f17 \'e2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e4\'e0\'ed\'ed\'fb\'e5: +\par A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }\pard\plain \qj\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'d4\'f3\'ed\'ea\'f6\'e8\'ff \'ef\'e5\'f0\'e5\'f0\'e8\'f1\'ee\'e2\'fb\'e2\'e0\'e5\'f2 \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'ec\'fb\'f8\'e8 \'ed\'e0 +\'fd\'ea\'f0\'e0\'ed\'e5 \'ed\'e5 \'e4\'ee\'e6\'e8\'e4\'e0\'ff\'f1\'fc }{\v +\par }\pard\plain \s19\qj\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 \'ee\'f7\'e5\'f0\'e5\'e4\'ed\'ee\'e3\'ee \'ef\'f0\'e5\'f0\'fb\'e2\'e0\'ed\'e8\'ff. +\par }\pard \s19\sa120\widctlpar\adjustright {\i\f17 \'ea\'ee\'e4\'fb \'ee\'f8\'e8\'e1\'ee\'ea \'ee\'f2 \'e4\'f0\'e0\'e9\'e2\'e5\'f0\'e0 \'ec\'fb\'f8\'e8: +\par }\pard\plain \fi283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 0 - \'ed\'e5\'f2 \'ee\'f8\'e8\'e1\'ee\'ea +\par }\pard\plain \s16\fi-283\li566\widctlpar\adjustright \fs20\lang1049\cgrid {1 -}{\f17 \tab \'ed\'e5\'e8\'e7\'e2\'e5\'f1\'f2\'ed\'e0\'ff \'f4\'f3\'ed\'ea\'f6\'e8\'ff +\par 2 -\tab \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed\'e0 +\par 3 -\tab \'ea\'f3\'f0\'f1\'ee\'f0 \'f3\'e6\'e5 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 +\par 4 -\tab \'ea\'f3\'f0\'f1\'ee\'f0 \'ee\'f2\'f1\'f3\'f2\'f1\'f2\'e2\'f3\'e5\'f2 \'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5 +\par 5 -\tab \'e8\'e7\'ee\'e1\'f0\'e0\'e6\'e5\'ed\'e8\'e5 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 \'f1\'eb\'e8\'f8\'ea\'ee\'ec \'e2\'e5\'eb\'e8\'ea\'ee +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid { +\par }{\lang1033 +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\lang1033 +\par +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'cf\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5 \'c0. \'ca\'ee\'e4\'fb \'ee\'f8\'e8\'e1\'ee\'ea DOS +\par }\pard\plain \s15\fi-283\li283\widctlpar\adjustright \fs20\lang1049\cgrid {\f17 00h (00) - \'ed\'e5\'f2 \'ee\'f8\'e8\'e1\'ee\'ea +\par 01h (01) - \'ed\'e5\'e2\'e5\'f0\'ed\'fb\'e9 \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 +\par }{02h (02}{\f17 ) - \'ed\'e5\'ef\'f0\'e0\'e2\'e8\'eb\'fc\'ed\'fb\'e9 \'ed\'ee\'ec\'e5\'f0 \'f3\'f1\'f2\'f0\'ee\'e9\'f1\'f2\'e2\'e0 +\par 03h (03) - \'f4\'e0\'e9\'eb \'ed\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed +\par 04h (04) - \'ed\'e5\'e2\'e5\'f0\'ed\'fb\'e9 \'ef\'f3\'f2\'fc +\par 05h (05) - \'ed\'e5\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\par 06h (06) - \'ed\'e5\'f2 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'ee\'e2\'ee\'e3\'ee \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\'e0 +\par 07h (07) - \'f4\'e0\'e9\'eb \'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'e5\'f2 +\par 08h (08) - \'f4\'e0\'e9\'eb \'f2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f7\'f2\'e5\'ed\'e8\'ff +\par }{09h (09) - }{\f17 \'ef\'e5\'f0\'e5\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 ROOT (\'ea\'ee\'f0\'ed\'e5\'e2\'ee\'e3\'ee \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0) +\par 0Ah (10) - \'ed\'e5\'f2 \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'ee\'e3\'ee \'ec\'e5\'f1\'f2\'e0 \'ed\'e0 \'e4\'e8\'f1\'ea\'e5 +\par 0Bh (11) - \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'ed\'e5 \'ef\'f3\'f1\'f2 +\par 0Ch (12) - \'ef\'ee\'ef\'fb\'f2\'ea\'e0 \'f3\'e4\'e0\'eb\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ea\'e0\'f2\'e0\'eb\'ee\'e3 +\par 0Dh (13) - \'ed\'e5\'e8\'e7\'e2\'e5\'f1\'f2\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2 +\par 0Eh (14) - \'ed\'e5\'e2\'ee\'e7\'ec\'ee\'e6\'ed\'e0\'ff \'ee\'ef\'e5\'f0\'e0\'f6\'e8\'ff +\par 0Fh (15) - \'ea\'e0\'f2\'e0\'eb\'ee\'e3 \'f3\'e6\'e5 \'e5\'f1\'f2\'fc +\par 10h (16) - \'ed\'e5\'e2\'e5\'f0\'ed\'ee\'e5 \'e8\'ec\'ff +\par 11h (17) - \'ed\'e5\'ef\'f0\'e0\'e2\'e8\'eb\'fc\'ed\'fb\'e9 EXE-\'f4\'e0\'e9\'eb +\par 12h (18) - \'ed\'e5 \'ef\'ee\'e4\'e4\'e5\'f0\'e6\'e8\'e2\'e0\'e5\'ec\'e0\'ff \'e2\'e5\'f0\'f1\'e8\'ff EXE-\'f4\'e0\'e9\'eb\'e0 +\par 13h (19) - \'f0\'e5\'f1\'f3\'f0\'f1 \'ed\'e5 \'e4\'ee\'f1\'f2\'f3\'ef\'e5\'ed +\par 14h (20) - \'ed\'e5\'f2 \'e3\'ee\'f2\'ee\'e2\'ed\'ee\'f1\'f2\'e8 +\par 15h (21) - \'ee\'f8\'e8\'e1\'ea\'e0 \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'ff +\par 16h (22) - \'f1\'e5\'ea\'f2\'ee\'f0 \'ed\'e5 \'ed\'e0\'e9\'e4\'e5\'ed +\par 17h (23) - \'ee\'f8\'e8\'e1\'ea\'e0 CRC +\par 18h (24) - \'e7\'e0\'f9\'e8\'f2\'e0 \'e7\'e0\'ef\'e8\'f1\'e8 +\par }{19h}{\f17 (25) - \'ee\'f8\'e8\'e1\'ea\'e0 \'f7\'f2\'e5\'ed\'e8\'ff +\par 1Ah (26) - \'ee\'f8\'e8\'e1\'ea\'e0 \'e7\'e0\'ef\'e8\'f1\'e8 +\par 1Bh (27) - \'ee\'e1\'f9\'e0\'ff \'ee\'f8\'e8\'e1\'ea\'e0 +\par 1Ch (28) - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par 1Dh (29) - \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed +\par 1Eh (30) - \'ed\'e5\'e4\'ee\'f1\'f2\'e0\'f2\'ee\'f7\'ed\'ee \'ef\'e0\'ec\'ff\'f2\'e8 +\par 1Fh (31) - \'ed\'e5\'f1\'f3\'f9\'e5\'f1\'f2\'e2\'f3\'fe\'f9\'e8\'e9 \'e1\'eb\'ee\'ea \'ef\'e0\'ec\'ff\'f2\'e8 +\par 20h (32) \endash \'e7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2\'e0\'ed}{\lang1033 +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\cs23\f23 \'cf\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5 \'c1. \'d2\'e0\'e1\'eb\'e8\'f6\'e0 \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'f5 \'ea\'ee\'e4\'ee\'e2\line + +\par }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb \cellx1445\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx2999\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb \cellx4553\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx6106\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb \cellx7660\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx9214\pard\plain \qc\widctlpar\intbl\adjustright \fs20\lang1049\cgrid {\lang1033 Key}{\cs23\b\lang1033 +\cell }{\lang1033 ASCII}{\cs23\b\lang1033 \cell }{\lang1033 SCAN}{\cs23\b\lang1033 \cell }{\lang1033 key}{\cs23\b\lang1033 \cell }{\lang1033 ASCII}{\cs23\b\lang1033 \cell }{\lang1033 SCAN}{\cs23\b\lang1033 \cell }\pard \widctlpar\intbl\adjustright { +\cs23\b\lang1033 \row }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx1445\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx2999\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx4553\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx6106\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx7660\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx9214\pard \qc\widctlpar\intbl\adjustright {\lang1033 `\cell 000h\cell 000h +\cell V\cell 056h\cell 02Dh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\lang1033 Esc\cell 01Bh\cell 001h\cell B\cell 042h\cell 02Eh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 +\row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 1\cell 031h\cell 002h\cell N\cell 04Eh\cell 02Fh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 2\cell 032h\cell 003h\cell +M\cell 04Dh\cell 030h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 3\cell 033h\cell 004h\cell ,\cell 02Ch\cell 031h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row +}\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 4\cell 034h\cell 005h\cell .\cell 02Eh\cell 032h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 5\cell 035h\cell 006h\cell / +\cell 02Fh\cell 033h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 6\cell 036h\cell 007h\cell RShift\cell ---\cell 034h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 +\row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 7\cell 037h\cell 008h\cell \\\cell 05Ch\cell 035h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 8\cell 038h\cell 009h +\cell LCtrl\cell ---\cell 036h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 9\cell 039h\cell 00Ah\cell LAlt\cell ---\cell 037h\cell }\pard \widctlpar\intbl\adjustright { +\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 0\cell 030h\cell 00Bh\cell Space\cell 020h\cell 038h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 - +\cell 02Dh\cell 00Ch\cell RAlt\cell ---\cell 039h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 =\cell 03Dh\cell 00Dh\cell RCtrl\cell ---\cell 03Ah\cell }\pard +\widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\lang1033 BackSpace}{\cs23\lang1033 \cell 008h\cell 00Eh\cell F1\cell 000h\cell 03Bh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 Tab\cell 009h\cell 00Fh\cell F2\cell 000h\cell 03Ch\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 Q\cell 051h\cell 010h\cell F3\cell +000h\cell 03Dh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 W\cell 057h\cell 011h\cell F4\cell 000h\cell 03Eh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 E\cell 045h\cell 012h\cell F5\cell 000h\cell 03Fh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 R\cell 052h\cell 013h\cell F6\cell +000h\cell 040h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 T\cell 054h\cell 014h\cell F7\cell 000h\cell 041h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 Y\cell 059h\cell 015h\cell F8\cell 000h\cell 042h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 U\cell 055h\cell 016h\cell F9\cell +000h\cell 043h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 I\cell 049h\cell 017h\cell F10\cell 000h\cell 044h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row +}\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 O\cell 04Fh\cell 018h\cell F11\cell 000h\cell 045h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 P\cell 050h\cell 019h\cell F12 +\cell 000h\cell 046h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 [\cell 05Bh\cell 01Ah\cell }{\lang1033 PrScrn}{\cs23\lang1033 \cell ---\cell 047h\cell }\pard +\widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 ]\cell 05Dh\cell 01Bh\cell }{\lang1033 ScrlLock}{\cs23\lang1033 \cell 000h\cell 048h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 +\row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 CapsLock\cell 000h\cell 01Ch\cell }{\lang1033 NumLock}{\cs23\lang1033 \cell 000h\cell 049h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright { +\cs23\lang1033 A\cell 041h\cell 01Dh\cell /\cell 02Fh\cell 04Ah\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 S\cell 053h\cell 01Eh\cell *\cell 02Ah\cell 04Bh\cell }\pard +\widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 D\cell 044h\cell 01Fh\cell -\cell 02Dh\cell 04Ch\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 F\cell 046h\cell 020h\cell +\cell 02Bh\cell 04Dh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 G\cell 047h\cell 021h\cell Enter\cell +00Dh\cell 04Eh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 H\cell 048h\cell 022h\cell Del .\cell 000h\cell 04Fh\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row +}\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 J\cell 04Ah\cell 023h\cell Ins 0\cell 000h\cell 050h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 K\cell 04Bh\cell 024h\cell +End 1\cell 000h\cell 051h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 L\cell 04Ch\cell 025h\cell Down 2\cell 000h\cell 052h\cell }\pard \widctlpar\intbl\adjustright { +\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 ;\cell 03Bh\cell 026h\cell PgDn 3\cell 000h\cell 053h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\lang1033 '}{ +\cs23\lang1033 \cell 027h\cell 027h\cell Left 4\cell 000h\cell 054h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 Enter\cell 00Dh\cell 028h\cell 5\cell 000h\cell 055h\cell }\pard +\widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 LShift\cell ---\cell 029h\cell Right 6\cell 000h\cell 056h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 Z\cell 05Ah\cell 02Ah\cell Home 7\cell 000h\cell 057h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\pard \qc\widctlpar\intbl\adjustright {\cs23\lang1033 X\cell 058h\cell 02Bh\cell Up 8 +\cell 000h\cell 058h\cell }\pard \widctlpar\intbl\adjustright {\cs23\b\lang1033 \row }\trowd \trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx1445\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx2999\clvertalt +\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx4553\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx6106\clvertalt\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx7660\clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb \cellx9214\pard +\qc\widctlpar\intbl\adjustright {\cs23\lang1033 C\cell 043h\cell 02Ch\cell PgUp 9\cell 000h\cell }{\cs23 059}{\cs23\lang1033 h}{\cs23 \cell }\pard \widctlpar\intbl\adjustright {\cs23\b \row }\pard \widctlpar\adjustright {\cs23\b +\par }{ +\par +\par +\par +\par }{\lang1033 +\par +\par +\par +\par +\par }{ +\par +\par }\pard\plain \s4\qc\sb240\sa60\keepn\widctlpar\outlinelevel3\adjustright \b\f1\lang1049\cgrid {\f23 \'cf\'f0\'e8\'eb\'ee\'e6\'e5\'ed\'e8\'e5 \'c2. \'c1\'e0\'e9\'f2 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'ee\'e2 \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'ee\'e3\'ee \'fd\'ea\'f0 +\'e0\'ed\'e0 +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\lang1033 +\par +\par }{\f17 \'e1\'e8\'f2 7\tab \tab - \'cf\'f0\'e8\'e7\'ed\'e0\'ea \'ec\'e5\'f0\'f6\'e0\'ed\'e8\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'e0 +\par \'e1\'e8\'f2\'fb 6,5,4\tab - \'d6\'e2\'e5\'f2 \'f4\'ee\'ed\'e0 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 8 \'f6\'e2\'e5\'f2\'ee\'e2 (0...7) RGB +\par \'e1\'e8\'f2\'fb 3,2,1,0\tab - \'d6\'e2\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 16 \'f6\'e2\'e5\'f2\'ee\'e2 (0...15) IRGB +\par }{ +\par +\par }\pard\plain \s19\sa120\widctlpar\adjustright \fs20\lang1049\cgrid {\i\f17 \'d6\'e2\'e5\'f2\'e0 \'e4\'eb\'ff \'f4\'ee\'ed\'e0 \'e8 \'e4\'eb\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'e0: +\par }\pard\plain \widctlpar\adjustright \fs20\lang1049\cgrid {\f17 0 0h 0000b - \'d7\'b8\'f0\'ed\'fb\'e9 +\par 1 1h 0001b - \'d1\'e8\'ed\'e8\'e9 +\par 2 2h 0010b - \'c7\'e5\'eb\'b8\'ed\'fb\'e9 +\par 3 3h 0011b - \'c3\'ee\'eb\'f3\'e1\'ee\'e9 (\'f6\'e8\'e0\'ed) +\par 4 4h 0100b - \'ca\'f0\'e0\'f1\'ed\'fb\'e9 +\par 5 5h 0101b - \'d4\'e8\'ee\'eb\'e5\'f2\'ee\'e2\'fb\'e9 +\par 6 6h 0110b - \'ca\'ee\'f0\'e8\'f7\'ed\'e5\'e2\'fb\'e9 +\par 7 7h 0111b - \'c1\'e5\'eb\'fb\'e9 +\par }{ +\par }{\i\lang1033 +\par }{\i\f17 \'d2\'ee\'eb\'fc\'ea\'ee \'e4\'eb\'ff \'f1\'e8\'ec\'e2\'ee\'eb\'e0: +\par }{ +\par 8 8h }{\f17 1000b - \'d1\'e5\'f0\'fb\'e9 +\par 9 9h 1001b - \'df\'f0\'ea\'ee-\'f1\'e8\'ed\'e8\'e9 +\par 10 Ah 1010b - \'df\'f0\'ea\'ee-\'e7\'e5\'eb\'b8\'ed\'fb\'e9 +\par 11 Bh 1011b - \'df\'f0\'ea\'ee-\'e3\'ee\'eb\'f3\'e1\'ee\'e9 +\par 12 Ch 1100b - \'df\'f0\'ea\'ee-\'ea\'f0\'e0\'f1\'ed\'fb\'e9 +\par 13 Dh 1101b - \'df\'f0\'ea\'ee-\'f4\'e8\'ee\'eb\'e5\'f2\'ee\'e2\'fb\'e9 +\par 14 Eh 1110b - \'c6\'b8\'eb\'f2\'fb\'e9 +\par 15 Fh 1111b - \'df\'f0\'ea\'ee-\'e1\'e5\'eb\'fb\'e9\line }{\lang1033 +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par +\par }\pard\plain \s2\sb240\sa60\keepn\widctlpar\outlinelevel1\adjustright \b\i\f1\lang1049\cgrid {\f23 \'d1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e5 \'e2\'fb\'e7\'ee\'e2\'fb \'e4\'e8\'f1\'ea\'ee\'e2\'ee\'e9 \'ef\'ee\'e4\'f1\'e8\'f1\'f2\'e5\'ec\'fb (DSS) v1.55 +\par }\pard\plain \s3\sb240\sa60\keepn\widctlpar\outlinelevel2\adjustright \f1\lang1049\cgrid {\f23 \'d1\'e8\'f1\'f2\'e5\'ec\'ed\'fb\'e5 \'e2\'fb\'e7\'ee\'e2\'fb +\par }\pard\plain \s29\sb100\sa100\widctlpar\adjustright \f1\fs16\lang1049\cgrid {\f23 \~\~ \'c5\'f1\'eb\'e8 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'e2\'fb\'ef\'ee\'eb\'ed\'ff\'e5\'f2 \'ed\'e5 \'f2\'ee\'eb\'fc\'ea\'ee \'ed\'e5\'ea\'f3\'fe \'ec\'e0\'f2\'e5\'ec +\'e0\'f2\'e8\'f7\'e5\'f1\'ea\'f3\'fe \'e7\'e0\'e4\'e0\'f7\'f3 \'ed\'e0 \'e0\'f1\'f1\'e5\'ec\'e1\'eb\'e5\'f0\'e5, \'f2\'ee \'e2 \'ed\'e5\'e9 \'ef\'f0\'e8\'e4\'e5\'f2\'f1\'ff \'f1\'f2\'ee\'eb\'ea\'ed\'f3\'f2\'fc\'f1\'ff \'f1 \'f2\'e0\'ea\'e8\'ec\'e8 \'e2 +\'e5\'f9\'e0\'ec\'e8, \'ea\'e0\'ea \'ef\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'e5 \'e2\'e2\'ee\'e4\'e0 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff, \'e2\'fb\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'e5 \'e2\'fb\'e2\'ee\'e4\'e0 \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2\'ee\'e2 +\'e8 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e5 \'f1\'e2\'ee\'e5\'e9 \'f0\'e0\'e1\'ee\'f2\'fb. \'c4\'eb\'ff \'fd\'f2\'ee\'e3\'ee, \'ed\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'ee \'ee\'e1\'f0\'e0\'f2\'e8\'f2\'fc\'f1\'ff \'ea \'f1\'e5\'f0\'e2\'e8\'f1\'e0\'ec DSS. +\'d4\'e0\'ea\'f2\'e8\'f7\'e5\'f1\'ea\'e8, \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e8\'f0\'ee\'e2\'e0\'ed\'e8\'e5 \'ed\'e0 \'ff\'e7\'fb\'ea\'e5 \'e0\'f1\'f1\'e5\'ec\'e1\'eb\'e5\'f0\'e0 \'ee\'e4\'e8\'ed\'e0\'ea\'ee\'e2\'ee \'e4\'eb\'ff \'eb\'fe\'e1\'fb\'f5 \'f1 +\'e8\'f1\'f2\'e5\'ec, \'e5\'f1\'eb\'e8 \'ed\'e5 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'fc\'f1\'ff \'e8\'f5 \'f1\'e5\'f0\'e2\'e8\'f1\'e0\'ec\'e8.\line \~\~ \'c2\'fb\'e7\'ee\'e2 \'f4\'f3\'ed\'ea\'f6\'e8\'e9 DSS \'e2 \'f1\'e8\'f1\'f2\'e5\'ec\'e5 Estex \'e2 +\'fb\'ef\'ee\'eb\'ed\'ff\'e5\'f2\'f1\'ff \'e8\'e7 \'e0\'f1\'f1\'e5\'ec\'e1\'eb\'e5\'f0\'e0. \'cd\'e5\'ee\'e1\'f5\'ee\'e4\'e8\'ec\'fb\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb \'f3\'ea\'e0\'e7\'fb\'e2\'e0\'fe\'f2\'f1\'ff \'e2 \'f0\'e0\'e7\'eb\'e8\'f7\'ed +\'fb\'f5 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e0\'f5, \'f0\'e5\'e3\'e8\'f1\'f2\'f0 }{\b C}{\f23 \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'f2\'f1\'ff \'e4\'eb\'ff \'f3\'ea\'e0\'e7\'e0\'ed\'e8\'ff \'ed\'ee\'ec\'e5\'f0\'e0 \'f4\'f3\'ed\'ea\'f6\'e8\'e8.\line \line \'d2 +\'e0\'ea, \'ed\'e0\'f8\'e0 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'e0 \'e4\'eb\'ff Estex \'e1\'f3\'e4\'e5\'f2 \'e2\'fb\'e3\'eb\'ff\'e4\'e5\'f2\'fc \'ed\'e0\'ef\'ee\'e4\'ee\'e1\'e8\'e5: +\par }\pard\plain \s30\widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\adjustright \fs20\lang1049\cgrid { +\par \tab \hich\af2\dbch\af2\loch\f2 org\tab #8100 ;}{\loch\af29\dbch\af2\hich\f29 \'e0\'e4\'f0\'e5\'f1\loch\f29 \hich\f29 \'f2\'ee\'f7\'ea\'e8\loch\f29 \hich\f29 \'e2\'f5\'ee\'e4\'e0 +\par }{ +\par \hich\af2\dbch\af2\loch\f2 LD HL,MSG ;}{\loch\af29\dbch\af2\hich\f29 \'f1\'ee\'ee\'e1\'f9\'e5\'ed\'e8\'e5\loch\f29 \hich\f29 \'e4\'eb\'ff\loch\f29 \hich\f29 \'e2\'fb\'e2\'ee\'e4\'e0 +\par }{\hich\af2\dbch\af2\loch\f2 LD \hich\af2\dbch\af2\loch\f2 C,5Ch ;}{\loch\af29\dbch\af2\hich\f29 \'ed\'ee\'ec\'e5\'f0\loch\f29 \hich\f29 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee\loch\f29 \hich\f29 \'e2\'fb\'e7\'ee\'e2\'e0\loch\f29 + (PCHARS) +\par }{\hich\af2\dbch\af2\loch\f2 RST 10h ;}{\loch\af29\dbch\af2\hich\f29 \'e2\'fb\'e7\'ee\'e2\loch\f29 \hich\f29 \'ef\'ee\'e4\'f1\'e8\'f1\'f2\'e5\'ec\'fb +\par }{ +\par \hich\af2\dbch\af2\loch\f2 LD C,41h ;}{\loch\af29\dbch\af2\hich\f29 \'ed\'ee\'ec\'e5\'f0\loch\f29 \hich\f29 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee\loch\f29 \hich\f29 \'e2\'fb\'e7\'ee\'e2\'e0\loch\f29 (EXIT) +\par }{\hich\af2\dbch\af2\loch\f2 RST 10h ;}{\loch\af29\dbch\af2\hich\f29 \'e2\'fb\'e7\'ee\'e2\loch\f29 \hich\f29 \'ef\'ee\'e4\'f1\'e8\'f1\'f2\'e5\'ec\'fb +\par }{ +\par }{\lang1033 \hich\af2\dbch\af2\loch\f2 MSG db "Hello, world!",0Dh,0Ah ;}{\loch\af29\dbch\af2\hich\f29 \'ed\'e0\'f8\'e0}{\lang1033 \hich\af2\dbch\af2\loch\f2 }{\loch\af29\dbch\af2\hich\f29 \'f1\'f2\'ee\'ea\'e0}{\lang1033 +\par \hich\af2\dbch\af2\loch\f2 }{\hich\af2\dbch\af2\loch\f2 db \hich\af2\dbch\af2\loch\f2 0 ;}{\loch\af29\dbch\af2\hich\f29 \'ea\'ee\'ed\'e5\'f6\loch\f29 \hich\f29 \'f1\'f2\'f0\'ee\'ea\'e8 +\par }\pard\plain \s3\sb240\sa60\keepn\widctlpar\outlinelevel2\adjustright \f1\lang1049\cgrid {\f23 \'c4\'e0\'eb\'e5\'e5 \'e8\'e4\'e5\'f2 \'f1\'ef\'e8\'f1\'ee\'ea \'ea\'e0\'f2\'e5\'e3\'ee\'f0\'e8\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e9 DSS \'e4\'eb\'ff \'f1\'e8\'f1 +\'f2\'e5\'ec\'fb Estex +\par {\*\bkmkstart tocversion}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \fi-360\li720\sb100\sa100\widctlpar\jclisttab\tx720\ls3\adjustright \fs20\lang1049\cgrid {\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\ +l "version" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f1\'e8\'f1\'f2\'e5\'ec\'fb}}}{\f1 {\*\bkmkend tocversion} +\par {\*\bkmkstart tocdisk_io}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "disk_io" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2 +\'fb \'f1 \'e4\'e8\'f1\'ea\'ee\'ec}}}{\f1 {\*\bkmkend tocdisk_io} +\par {\*\bkmkstart tocfile_io}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "file_io" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2 +\'fb \'f1 \'f4\'e0\'e9\'eb\'e0\'ec\'e8}}}{\f1 {\*\bkmkend tocfile_io} +\par {\*\bkmkstart tocdate_time}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "date_time" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee +\'f2\'fb \'f1 \'e4\'e0\'f2\'ee\'e9 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e5\'ec}}}{\f1 {\*\bkmkend tocdate_time} +\par {\*\bkmkstart tocmemory}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "memory" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8 +\'ff \'ef\'e0\'ec\'ff\'f2\'fc\'fe}}}{\f1 {\*\bkmkend tocmemory} +\par {\*\bkmkstart tockeyboard}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "keyboard" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2\'e2\'ee\'e4\'e0 \'f1 \'ea +\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb}}}{\f1 {\*\bkmkend tockeyboard} +\par {\*\bkmkstart tocexecute}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "execute" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'e8\'f1\'ef\'ee\'eb +\'ed\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec}}}{\f1 {\*\bkmkend tocexecute} +\par {\*\bkmkstart toccmdline}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "cmdline" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2 +\'fb \'f1\'ee \'f1\'f2\'f0\'ee\'ea\'e0\'ec\'e8 \'e8 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'ee\'e9}}}{\f1 {\*\bkmkend toccmdline} +\par {\*\bkmkstart tocscreen}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "screen" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'fd +\'ea\'f0\'e0\'ed\'ee\'ec}}}{\f1 {\*\bkmkend tocscreen} +\par {\*\bkmkstart tocprinter}{\listtext\pard\plain\f3\fs20\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field\fldedit{\*\fldinst {\f1 HYPERLINK "" \\l "printer" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'ef\'e5\'f7\'e0\'f2 +\'e8 \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0\'e5}}}{\f1 {\*\bkmkend tocprinter} +\par }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart version}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocversion" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e8\'e4\'e5\'ed\'f2\'e8 +\'f4\'e8\'ea\'e0\'f6\'e8\'e8 \'f1\'e8\'f1\'f2\'e5\'ec\'fb}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend version}\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright { +\b\f1\fs16\lang1033 00h (00) VERSION (}{\b\f23\fs16 \'c2\'e5\'f0\'f1\'e8\'ff}{\b\f1\fs16\lang1033 DSS)}{\f1\fs16\lang1033 \cell }\pard \widctlpar\intbl\adjustright {\lang1033 \row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 00h\cell \'c2\'fb\'f5\'ee\'e4\'ed +\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'ed\'ee\'ec\'e5\'f0 \'e2\'e5\'f0\'f1\'e8\'e8\line E - \'ec\'ee\'e4\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'ff\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\*\bkmkstart disk_io}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocdisk_io" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'e4\'e8\'f1\'ea\'ee\'ec}{ +\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend disk_io}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 01h (01) CHDISK (\'d1\'ec\'e5\'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'e0)}{\f1\fs16 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright { +\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...)\line C - 01h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8 +\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ec\'e0\'ea\'f1\'e8\'ec\'e0\'eb\'fc\'ed\'fb\'e9 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511 +\pard \widctlpar\intbl\adjustright {\b\f23\fs16 02h (02) CURDISK (\'cd\'ee\'ec\'e5\'f0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e4\'e8\'f1\'ea\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 02h\cell \'c2\'fb\'f5\'ee\'e4\'ed +\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...), \'e5\'f1\'eb\'e8 CF=0\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 03h (03) DSKINFO (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'e4\'e8\'f1\'ea\'e5)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0-A,1-B...0FFh-\'f2\'e5\'ea\'f3\'f9\'e8\'e9)\line C - 03h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea +\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e0\'e7\'ec\'e5\'f0 \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'e0 \'e2 \'f1\'e5\'ea\'f2\'ee\'f0\'e0\'f5, \'e5\'f1\'eb\'e8 CF=0\line HL - \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb-\'e2\'ee \'ea\'eb\'e0\'f1 +\'f2\'e5\'f0\'ee\'e2\line DE - \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'fb\'f5 \'ea\'eb\'e0\'f1\'f2\'e5\'f0\'ee\'e2\line BC - \'f0\'e0\'e7\'ec\'e5\'f0 \'f1\'e5\'ea\'f2\'ee\'f0\'e0 \'e2 \'e1\'e0\'e9\'f2\'e0\'f5\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 09h (09) BOOTDSK (\'cd\'ee\'ec\'e5\'f0 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee \'e4\'e8\'f1\'ea\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line C - 09h\line B = 0\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5\'f0 \'f1\'e8\'f1\'f2\'e5\'ec\'ed\'ee\'e3\'ee \'e4 +\'e8\'f1\'ea\'e0 (0-A,1-B...), \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart file_io}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\ +l "tocfile_io" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'f4\'e0\'e9\'eb\'e0\'ec\'e8}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend file_io}\cell }\pard \widctlpar\intbl\adjustright {\row +}\pard \widctlpar\intbl\adjustright {\b\f23\fs16 0Ah (10) CREATE (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb +\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0\line C - 0Ah\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea +\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511 +\pard \widctlpar\intbl\adjustright {\b\f23\fs16 0Bh (11) CREATE NEW FILE (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ed\'ee\'e2\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0 +\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0\line C - 0Bh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8 +\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 0Eh (14) DELETE (\'d3\'e4\'e0\'eb\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0 +\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line C - 0Eh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5 +\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 10h (16) RENAME (\'cf\'e5\'f0\'e5\'e8\'ec\'e5\'ed\'ee\'e2\'e0\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{ +\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'f2\'e0\'f0\'ee\'e5 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0\line DE - \'f3\'ea\'e0\'e7\'e0\'f2 +\'e5\'eb\'fc \'ed\'e0 \'ed\'ee\'e2\'ee\'e5 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0\line C - 10h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f1\fs16 11}{\b\f23\fs16 h (17) OPEN (\'ce\'f2\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line A - \'f0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0 +\line A=0 \'f7\'f2\'e5\'ed\'e8\'e5/\'e7\'e0\'ef\'e8\'f1\'fc\line A=1 \'f7\'f2\'e5\'ed\'e8\'e5\line A=2 \'e7\'e0\'ef\'e8\'f1\'fc\line C - 11h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea +\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\b\f23\fs16 12h (18) CLOSE (\'c7\'e0\'ea\'f0\'fb\'f2\'e8\'e5 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef +\'f3\'eb\'ff\'f2\'ee\'f0\line C - 12h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 13h (19) READ (\'d7\'f2\'e5\'ed\'e8\'e5 \'e8\'e7 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9 +\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\line HL - \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8\line DE - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f7\'e8\'f2\'e0\'e5\'ec\'fb\'f5 \'e1\'e0\'e9\'f2\line C - 13h\cell \'c2\'fb +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line DE - \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ed\'fb +\'f5 \'e1\'e0\'e9\'f2\line \'e5\'f1\'eb\'e8 CF=0:\line A = 0 \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'fb \'e2\'f1\'e5 \'e1\'e0\'e9\'f2\'fb\line A = 0FFh \'ef\'f0\'ee\'f7\'e8\'f2\'e0\'ed\'ee \'ec\'e5\'ed\'fc\'f8\'e5\'e5 \'f7\'e8\'f1\'eb\'ee \'e1\'e0\'e9\'f2\cell +}\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 14h (20) WRITE (\'c7\'e0\'ef\'e8\'f1\'fc \'e2 \'f4\'e0\'e9\'eb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row +}\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0 +\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\line HL - \'e0\'e4\'f0\'e5\'f1 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8\line DE - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'fb\'e2\'e0 +\'e5\'ec\'fb\'f5 \'e1\'e0\'e9\'f2\line C - 14h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line DE - \'f0\'e5\'e0\'eb\'fc\'ed\'ee\'e5 \'ea\'ee\'eb\'e8\'f7 +\'e5\'f1\'f2\'e2\'ee \'e7\'e0\'ef\'e8\'f1\'e0\'ed\'ed\'fb\'f5 \'e1\'e0\'e9\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 +\trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 15h (21) MOVE_FP (\'cf\'e5\'f0\'e5\'ec +\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'e2 \'f4\'e0\'e9\'eb\'e5)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0 +\line HL:IX - \'f1\'ec\'e5\'f9\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff \'e2 \'f4\'e0\'e9\'eb\'e5\line B - \'f1\'ef\'ee\'f1\'ee\'e1 \'ef\'e5\'f0\'e5\'ec\'e5\'f9\'e5\'ed\'e8\'ff:\line B=0 \'ee\'f2 \'ed\'e0\'f7\'e0\'eb\'e0 \'f4\'e0\'e9\'eb\'e0 +\line B=1 \'ee\'f2 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff\line B=2 \'ee\'f2 \'ea\'ee\'ed\'f6\'e0 \'f4\'e0\'e9\'eb\'e0\line C - 15h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line HL:IX - \'ed\'ee\'e2\'ee\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'ff\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 16h (22) ATTRIB (\'cf\'ee\'eb\'f3\'f7\'e5\'ed\'e8\'e5/\'e8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'e0 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line B - \'f0\'e5\'e6\'e8\'ec \'e4\'ee\'f1\'f2\'f3\'ef\'e0 +\line B = 0 \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'e0\'f2\'f0\'e8\'e1\'f3\'f2\line B = 1 \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e0\'f2\'f0\'e8\'e1\'f3\'f2\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0\line C - 16h\cell \'c2\'fb\'f5\'ee\'e4 +\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2 \'f4\'e0\'e9\'eb\'e0, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 17h (23) GET_D_T (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'e4\'e0\'f2\'e5 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\line C - 17h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 +\'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line D - \'e4\'e5\'ed\'fc\line E - \'ec\'e5\'f1\'ff\'f6\line IX - \'e3\'ee\'e4\line H - \'f7\'e0\'f1\line L - \'ec\'e8\'ed\'f3\'f2\'fb\line B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 18h (24) PUT_D_T (\'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e4\'e0\'f2\'fb \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f4\'e0\'e9\'eb\'ee\'e2\'fb\'e9 \'ec\'e0\'ed\'e8\'ef\'f3\'eb\'ff\'f2\'ee\'f0\line D - \'e4\'e5\'ed\'fc\line E - \'ec\'e5\'f1\'ff\'f6\line +IX - \'e3\'ee\'e4\line H - \'f7\'e0\'f1\line L - \'ec\'e8\'ed\'f3\'f2\'fb\line B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb\line C - 18h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1 +\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 19h (25) F_FIRST (\'cf\'ee\'e8\'f1\'ea \'ef\'e5\'f0\'e2\'ee\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe +\'f9\'e5\'e3\'ee \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8 +\'fe\line DE - \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0 44 \'e1\'e0\'e9\'f2\'e0, \'e5\'f1\'eb\'e8 B=0, \'e8\'ed\'e0\'f7\'e5 256 \'e1\'e0\'e9\'f2\line A - \'e0\'f2\'f0\'e8\'e1\'f3\'f2\'fb, \'e8\'f1\'ef\'ee\'eb\'fc\'e7\'f3\'e5\'ec\'fb\'e5 \'ef\'f0 +\'e8 \'ef\'ee\'e8\'f1\'ea\'e5\line B = 0 - \'e8\'ec\'ff \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 11 \'e1\'e0\'e9\'f2 "FilenameExt"\line B = 1 - \'e8\'ec\'ff \'ed\'e0\'e9\'e4\'e5\'ed\'ed\'ee\'e3\'ee +\'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 DOS "filename.ext",0\line C - 19h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 1Ah (26) F_NEXT (\'cf\'ee\'e8\'f1\'ea \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e5\'e3\'ee \'f1\'ee\'e2\'ef\'e0\'e4\'e0\'fe\'f9\'e5\'e3 +\'ee \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f0\'e0\'e1\'ee\'f7\'e8\'e9 \'e1\'f3\'f4\'e5\'f0\line C - 1Ah\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb +\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +1Bh (27) MKDIR (\'d1\'ee\'e7\'e4\'e0\'ed\'e8\'e5 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe + \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line C - 1Bh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row +}\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 1Ch (28) RMDIR (\'d3\'f1\'f2\'f0\'e0\'ed\'e5\'ed\'e8\'e5 \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line C - 1Ch\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee +\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 1Dh (29) CHDIR (\'d1\'ec\'e5\'ed\'e0 \'f2\'e5\'ea\'f3\'f9\'e5\'e3\'ee +\'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8 +\'fe\line C - 1Dh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt +\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511 +\pard \widctlpar\intbl\adjustright {\b\f23\fs16 1Eh (30) CURDIR (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'f2\'e5\'ea\'f3\'f9\'e5\'ec \'ea\'e0\'f2\'e0\'eb\'ee\'e3\'e5)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line HL - \'e1\'f3\'f4\'e5\'f0 \'e2 \'ef\'e0\'ec\'ff\'f2\'e8 256 \'e1\'e0\'e9\'f2\line C - 1Eh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart date_time}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocdate_time" }}{\fldrslt {\cs31\b\f23\fs16\cf2 +\'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1 \'e4\'e0\'f2\'ee\'e9 \'e8 \'e2\'f0\'e5\'ec\'e5\'ed\'e5\'ec}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend date_time}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard +\widctlpar\intbl\adjustright {\b\f23\fs16 21h (33) SYSTIME (\'d2\'e5\'ea\'f3\'f9\'e0\'ff \'e4\'e0\'f2\'e0 \'e8 \'e2\'f0\'e5\'ec\'ff)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 21h\cell \'c2\'fb\'f5\'ee\'e4\'ed +\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'e4\'e5\'ed\'fc\line E - \'ec\'e5\'f1\'ff\'f6\line IX - \'e3\'ee\'e4\line H - \'f7\'e0\'f1\line L - \'ec\'e8\'ed\'f3\'f2\'fb\line B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb\line C - \'e4\'e5\'ed\'fc \'ed\'e5\'e4 +\'e5\'eb\'e8\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 22h (34) SETTIME (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'e4\'e0\'f2 +\'f3 \'e8 \'e2\'f0\'e5\'ec\'ff)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'e4\'e5\'ed\'fc\line E - \'ec\'e5\'f1\'ff\'f6\line IX - \'e3\'ee\'e4\line H - \'f7\'e0\'f1\line L - \'ec\'e8\'ed\'f3\'f2\'fb +\line B - \'f1\'e5\'ea\'f3\'ed\'e4\'fb\line C - 22h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart memory}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocmemory" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'f3\'ef\'f0\'e0\'e2\'eb\'e5\'ed +\'e8\'ff \'ef\'e0\'ec\'ff\'f2\'fc\'fe}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend memory}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 38h (56) SETWIN (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1 +\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\line B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...)\line H - \'e1\'e8\'f2\'fb 6 \'e8 7 \'e7\'e0\'e4\'e0\'fe\'f2 \'ed\'ee\'ec\'e5\'f0 \'ee\'ea\'ed\'e0, \'e2 \'ea\'ee\'f2\'ee\'f0\'ee\'e5 \'e1\'f3\'e4\'e5\'f2 +\'ef\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0\line C - 38h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5 +\'f0 \'e7\'e0\'ec\'e5\'f9\'e5\'ed\'ed\'ee\'e9 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +39h (57) SETWIN1 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'ef\'e5\'f0\'e2\'ee\'e5 \'ee\'ea\'ed\'ee)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8\line B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...)\line C - 39h\cell \'c2\'fb\'f5 +\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5\'f0 \'e7\'e0\'ec\'e5\'f9\'e5\'ed\'ed\'ee\'e9 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 3Ah (58) SETWIN2 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2 +\'e8 \'e2\'ee \'e2\'f2\'ee\'f0\'ee\'e5 \'ee\'ea\'ed\'ee)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8 +\line B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...)\line C - 39h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\line A - \'ed\'ee\'ec\'e5\'f0 \'e7\'e0\'ec\'e5\'f9\'e5\'ed\'ed\'ee\'e9 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright { +\b\f23\fs16 3Bh (59) SETWIN3 (\'cf\'ee\'e4\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'e5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'ef\'e0\'ec\'ff\'f2\'e8 \'e2 \'f2\'f0\'e5\'f2\'fc\'e5 \'ee\'ea\'ed\'ee)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8\line B - \'ed\'ee\'ec\'e5\'f0 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb \'e2 \'e1\'eb\'ee\'ea\'e5 (0,1,2...)\line C - 3Bh\cell \'c2\'fb\'f5 +\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5\'f0 \'e7\'e0\'ec\'e5\'f9\'e5\'ed\'ed\'ee\'e9 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'fb, \'e5\'f1\'eb\'e8 CF=0 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 3Ch (60) INFOMEM (\'c8\'ed\'f4\'ee\'f0\'ec\'e0\'f6\'e8\'ff \'ee \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C }{\f1\fs16 - 3Ch\cell }{\f23\fs16 \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'ee\'e1\'f9\'e5\'e5 \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'f2\'f0\'e0 +\'ed\'e8\'f6\line BC - \'ea\'ee\'eb\'e8\'f7\'e5\'f1\'f2\'e2\'ee \'f1\'e2\'ee\'e1\'ee\'e4\'ed\'fb\'f5 \'f1\'f2\'f0\'e0\'ed\'e8\'f6\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright { +\b\f23\fs16 3Dh (61) GETMEM (\'c2\'fb\'e4\'e5\'eb\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'f0\'e0\'e7\'ec\'e5\'f0 \'e1\'eb\'ee\'ea\'e0 \'e2 \'f1 +\'f2\'f0\'e0\'ed\'e8\'f6\'e0\'f5 \'ef\'ee 16 \'ea\'e8\'eb\'ee\'e1\'e0\'e9\'f2\line C - 3Dh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'e8\'e4\'e5 +\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +3Eh (62) FREEMEM (\'ce\'f1\'e2\'ee\'e1\'ee\'e6\'e4\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 +\'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8\line C - 3Eh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row +}\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 3Fh (63) SETMEM (\'c8\'e7\'ec\'e5\'ed\'e5\'ed\'e8\'e5 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row +}\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0 +\'f7\'e5\'ed\'e8\'ff:\line A - \'e8\'e4\'e5\'ed\'f2\'e8\'f4\'e8\'ea\'e0\'f2\'ee\'f0 \'e1\'eb\'ee\'ea\'e0 \'ef\'e0\'ec\'ff\'f2\'e8\line B - \'ed\'ee\'e2\'fb\'e9 \'f0\'e0\'e7\'ec\'e5\'f0 \'e1\'eb\'ee\'ea\'e0\line C - 3Fh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb +\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright +{\*\bkmkstart keyboard}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tockeyboard" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2\'e2\'ee\'e4\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb}{\b\f1\fs16\cf1 \line }}}{ +\f1\fs16 {\*\bkmkend keyboard}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 30h (48) WAITKEY (\'ce\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'f1\'e8\'ec\'e2\'ee\'eb\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb)}{ +\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 30h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0\line D - \'ef +\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4\line \'c5 - ASCII \'ea\'ee\'e4\line C - \'f0\'e5\'e6\'e8\'ec \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb:\line bit7 - RUS/LAT\line bit3 - Num Lock\line bit2 - Scroll Lock\line bit1 - Insert\line +bit0 - Caps Lock\line B - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 shift'\'ee\'e2:\line bit7 - Left Shift\line bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line bit3 - Left Ctrl\line bit2}{\f1\fs16 - Left Alt\line bit1 - Right Ctrl\line +bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 31h (49) SCANKEY (\'ce\'ef\'f0\'ee\'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e1\'e5\'e7 \'ee\'e6 +\'e8\'e4\'e0\'ed\'e8\'ff)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 31h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line ZF = 1 - \'ed\'e5\'f2 \'ea\'eb\'e0\'e2\'e8\'f8\line A - \'ea +\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0\line D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4\line \'c5 - ASCII \'ea\'ee\'e4\line C - \'f0\'e5\'e6\'e8\'ec \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb:\line bit7 - RUS/LAT\line bit3 - Num Lock\line +bit2 - Scroll Lock\line bit1 - Insert\line bit0 - Caps Lock\line B - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 shift'\'ee\'e2:\line bit7 - Left Shift\line bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line bit3 - Left Ctrl\line bit2 - Left Alt\line +bit1 - Right Ctrl\line bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 32h (50) ECHOKEY (\'ce\'e6\'e8\'e4\'e0\'ed\'e8\'e5 \'f1\'e8\'ec\'e2 +\'ee\'eb\'e0 \'f1 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'f1 \'ef\'e5\'f7\'e0\'f2\'fc\'fe)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 32h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff: +\line A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0\line D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4\line \'c5 - ASCII \'ea\'ee\'e4\line C - \'f0\'e5\'e6\'e8\'ec \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb:\line bit7 - RUS/LAT\line +bit3 - Num Lock\line bit2 - Scroll Lock\line bit1 - Insert\line bit0 - Caps Lock\line B - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 shift'\'ee\'e2:\line bit7 - Left Shift\line }{\f1\fs16 bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line bit3 - Left Ctrl +\line bit2 - Left Alt\line bit1 - Right Ctrl\line bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 33h (51) CTRLKEY (\'cf\'ee\'eb\'f3\'f7\'e8\'f2 +\'fc \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 33h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5}{\f1\fs16\lang1033 }{\f23\fs16 \'e7 +\'ed\'e0\'f7\'e5\'ed\'e8\'ff}{\f1\fs16\lang1033 :\line A = 0 - }{\f23\fs16 \'ed\'e5\'f2}{\f1\fs16\lang1033 }{\f23\fs16 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2}{\f1\fs16\lang1033 }{\f23\fs16 \'e2}{\f1\fs16\lang1033 }{\f23\fs16 \'e1\'f3\'f4\'e5\'f0\'e5}{ +\f1\fs16\lang1033 \line C - }{\f23\fs16 \'f0\'e5\'e6\'e8\'ec}{\f1\fs16\lang1033 }{\f23\fs16 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb}{\f1\fs16\lang1033 :\line bit7 - RUS/LAT\line bit3 - Num Lock\line bit2 - Scroll Lock\line bit1 - Insert\line +bit0 - Caps Lock\line B - }{\f23\fs16 \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5}{\f1\fs16\lang1033 shift'}{\f23\fs16 \'ee\'e2}{\f1\fs16\lang1033 :\line bit7 - Left Shift\line bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line bit3 - Left Ctrl\line +bit2 - Left Alt\line bit1 - Right Ctrl\line bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\lang1033 \row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 35h (53) K_CLEAR (\'ce\'f7\'e8\'f1\'f2\'e8\'f2 +\'fc \'e1\'f3\'f4\'e5\'f0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'f4\'f3\'ed\'ea\'f6\'e8\'fe)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'ed\'ee\'ec\'e5\'f0 \'f4\'f3\'ed +\'ea\'f6\'e8\'e8 30h, 31h, 32h, 33h \'e8\'eb\'e8 34h\line C - 35h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea +\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1\'f2\'f0\'e5 B.\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 +\trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 36h (54) K_SETUP (\'d3\'ef\'f0\'e0\'e2\'eb\'e5\'ed\'e8\'e5 +\'ed\'e0\'f1\'f2\'f0\'ee\'e9\'ea\'e0\'ec\'e8 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'ed\'ee\'ec\'e5\'f0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8\line C - 36h +\line \line B = 0, \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'f3 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb\line A - \'ed\'ee\'ec\'e5\'f0 \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'e8 +\par }\pard \li720\ri720\sb100\sa100\widctlpar\intbl\adjustright {\f23\fs16 0 - normal\line 1 - shift\line 2 - caps lock\line 3 - caps lock + shift\line 4 - normal (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.)\line 5 - shift (\'e0\'eb +\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.)\line 6 - caps lock (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.)\line 7 - caps lock + shift (\'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'e0\'ff \'ea\'eb.) +\par }\pard \widctlpar\intbl\adjustright {\f23\fs16 B = 1, \'ef\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 \'e7\'e2\'f3\'ea\'ee\'e2\'fb\'f5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'fb\'f5\line B = 2, \'f3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'e7 +\'e2\'f3\'ea\'ee\'e2\'fb\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'fb\'e5\line A - \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'e5 \'ef\'e5\'f0\'e5\'ec\'e5\'ed\'ed\'ee\'e9\line bit0 - \'f1\'e8\'e3\'ed\'e0\'eb \'ef\'e5\'f0\'e5\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'e1\'f3\'f4\'e5 +\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb\line bit1 - \'f1\'e8\'e3\'ed\'e0\'eb \'ef\'e5\'f0\'e5\'ea\'eb\'fe\'f7\'e5\'ed\'e8\'ff \'ed\'e0 \'e0\'eb\'fc\'f2\'e5\'f0\'ed\'e0\'f2\'e8\'e2\'ed\'f3\'fe \'f0\'e0\'f1\'ea\'eb\'e0\'e4\'ea\'f3 \'ea\'eb\'e0\'e2 +\'e8\'e0\'f2\'f3\'f0\'fb\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'c2 \'e7\'e0\'e2\'e8\'f1\'e8\'ec\'ee\'f1\'f2\'e8 \'ee\'f2 \'f3\'ea\'e0\'e7\'e0\'ed\'ed\'ee\'e9 \'f4\'f3\'ed\'ea\'f6\'e8\'e8 \'e2 \'f0\'e5\'e3\'e8\'f1 +\'f2\'f0\'e5 B.\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 37h (55) TESTKEY (\'ce\'ef\'f0\'ee\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0 +\'fb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 37h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line ZF = 1 - \'ed\'e5\'f2 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 +\'e1\'f3\'f4\'e5\'f0\'e5\line A - \'ea\'ee\'e4 \'f1\'e8\'ec\'e2\'ee\'eb\'e0\line D - \'ef\'ee\'e7\'e8\'f6\'e8\'ee\'ed\'ed\'fb\'e9 \'ea\'ee\'e4\line \'c5 - ASCII \'ea\'ee\'e4\line C - \'f0\'e5\'e6\'e8\'ec \'ea\'eb\'e0\'e2\'e8\'e0\'f2\'f3\'f0\'fb:\line +bit7 - RUS/LAT\line bit3 - Num Lock\line bit2 - Scroll Lock\line bit1 - Insert\line bit0 - Caps Lock\line B - \'f1\'ee\'f1\'f2\'ee\'ff\'ed\'e8\'e5 shift'\'ee\'e2:\line bit7 - Left Shift\line bit6 - Right Shift\line bit5 - Ctrl\line bit4 - Alt\line +bit3 - Left Ctrl\line bit2 - Left Alt\line bit1 - Right Ctrl\line bit0 - Right Alt\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 +\trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart execute}{\field\fldedit{\*\fldinst { +\f1\fs16 HYPERLINK "" \\l "tocexecute" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'e8\'f1\'ef\'ee\'eb\'ed\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend execute}\cell +}\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 40h (64) EXEC (\'c2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'f4\'e0\'e9\'eb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45 +\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3 +\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f4\'e0\'e9\'eb\'ee\'e2\'f3\'fe \'f1\'ef\'e5\'f6\'e8\'f4\'e8\'ea\'e0\'f6\'e8\'fe\line B = 0 - \'e7\'e0\'e3\'f0\'f3\'e7\'e8\'f2\'fc \'e8 \'e2\'fb\'ef\'ee\'eb\'ed\'e8\'f2\'fc \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'f3 +\line C - 40h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff, \'e5\'f1\'eb\'e8 C}{\f1\fs16 F=0 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 41h (65) EXIT (\'c7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'e5 \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff\line C - 41h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, +\'e5\'f1\'eb\'e8 CF=1\line A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff, \'e5\'f1\'eb\'e8 CF=0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +42h (66) WAIT (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff \'ef\'f0\'ee\'e3\'f0\'e0\'ec\'ec\'fb)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 42h\cell \'c2\'fb\'f5\'ee\'e4\'ed +\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'e7\'e0\'e2\'e5\'f0\'f8\'e5\'ed\'e8\'ff\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart cmdline} +{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "toccmdline" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'f0\'e0\'e1\'ee\'f2\'fb \'f1\'ee \'f1\'f2\'f0\'ee\'ea\'e0\'ec\'e8 \'e8 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 +\'f1\'f2\'f0\'ee\'ea\'ee\'e9}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend cmdline}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 43h (67) GSWITCH (\'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec +\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1 +\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e2\'fb\'e4\'e5\'eb\'ff\'e5\'ec\'ee\'e3\'ee \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0\line C - }{\f1\fs16 43h \cell }{\f23\fs16 \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff: +\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line CF = 0 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 \'ed +\'e5 \'e4\'ee\'f1\'f2\'e8\'e3\'ed\'f3\'f2 (\'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'e8\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb)\line CF = 1 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 (\'e2 \'e1\'f3\'f4\'e5\'f0 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'b8\'ed \'ef\'ee +\'f1\'eb\'e5\'e4\'ed\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e8\'eb\'e8 \'ed\'ee\'eb\'fc)\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 44h (68) DOSNAME (\'cf +\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 44h\line B = 0, \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 + 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1\line HL - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff +\'e8\'ec\'e5\'ed\'e8 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1\line B = 1, \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0 +\'f2\line HL - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1\line DE - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff: +\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 45h (69) EXCMDLN (\'d0\'e0\'e7\'e1\'ee\'f0 \'ea +\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'e1\'f3\'f4\'e5\'f0 \'ef\'ee\'eb\'fc\'e7\'ee\'e2\'e0\'f2\'e5\'eb\'ff\line +C - 45h\line B - \'ed\'ee\'ec\'e5\'f0 \'ef\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'e8: +\par }\pard \li720\ri720\sb100\sa100\widctlpar\intbl\adjustright {\f23\fs16 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3;\line 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2 +\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe;\line 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0;\line 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line 5 - \'c2\'fb\'e4\'e5 +\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line 6 - \'c7\'e0\'f0\'e5\'e7\'e5\'f0\'e2\'e8\'f0\'ee\'e2 +\'e0\'ed\'e0;\line 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8;\line 8 - \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc +\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1;\line 9 - \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 +\'f4\'ee\'f0\'ec\'e0\'f2;\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc +\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2\'f0 +\'ee\'ea\'f3:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line C - 45h\line B = 0 - \'d0\'e0\'e7\'ee\'e1\'f0\'e0\'f2\'fc \'f1\'f2 +\'f0\'ee\'ea\'f3 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\line C - 45h\line B = 1 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'ed\'ee\'ec\'e5\'f0 \'e4\'e8\'f1\'ea\'e0 (0 - A, 1 - B, 2 - C \'e8 \'f2.\'e4.), \'e5\'f1\'eb\'e8 CF=0\line +\'e1\'f3\'f4\'e5\'f0 - \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0 "A:",0 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2) +\line C - 45h\line B = 2 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'fe +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0;\line \'e1\'f3\'f4\'e5\'f0 - \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0\'e8\'ff "DIR1\\DIR2\\DIR3\\",0 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2) +\line C - 45h\line B = 3 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0;\line \'e1\'f3\'f4\'e5\'f0 - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 "FILE.EXT",0 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 4 \'e1\'e0\'e9\'f2) +\line C - 45h\line B = 4 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0;\line \'e1\'f3\'f4\'e5\'f0 - \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 "TXT",0 \'e8\'eb\'e8 "C ",0 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4 +\'e0\'e9\'eb\'e0:}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 (\'ec\'e0\'ea\'f1. 8 \'e1\'e0\'e9\'f2) +\line DE+0 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e4\'e8\'f1\'ea\'e0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2)\line DE+2 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e4\'e8\'f0\'e5\'ea\'f2\'ee\'f0 +\'e8\'e8 (\'ec\'e0\'ea\'f1. 256 \'e1\'e0\'e9\'f2)\line DE+3 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 (\'ec\'e0\'ea\'f1. 13 \'e1\'e0\'e9\'f2)\line DE+4 \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0 +\'e0 \'e4\'eb\'ff \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'ff \'f4\'e0\'e9\'eb\'e0 (\'ec\'e0\'ea\'f1. 4 \'e1\'e0\'e9\'f2\'e0)\line C - 45h\line B = 5 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0, \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb +\'f3, \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e8 \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\line A - \'f0\'e5\'e7\'f3\'eb\'fc\'f2\'e0\'f2 \'f0\'e0\'e7\'e1\'ee\'f0\'e0, \'e5\'f1\'eb\'e8 CF=0\line bit7 - \'c2 +\'f1\'f2\'f0\'ee\'ea\'e5 \'ee\'e1\'ed\'e0\'f0\'f3\'e6\'e5\'ed\'fb \'f1\'e8\'ec\'e2\'ee\'eb\'fb ? \'e8\'eb\'e8 *\line bit3 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'e8\'ec\'ff \'e4\'e8\'f1\'ea\'e0;\line bit2 - \'c2 \'f1\'f2\'f0\'ee\'ea +\'e5 \'f3\'ea\'e0\'e7\'e0\'ed \'ef\'f3\'f2\'fc \'ea \'f4\'e0\'e9\'eb\'f3;\line bit1 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3\'ea\'e0\'e7\'e0\'ed\'ee \'f0\'e0\'f1\'f8\'e8\'f0\'e5\'ed\'e8\'e5 \'f4\'e0\'e9\'eb\'e0;\line bit0 - \'c2 \'f1\'f2\'f0\'ee\'ea\'e5 \'f3 +\'ea\'e0\'e7\'e0\'ed\'ee}{\f1\fs16 }{\f23\fs16 \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0; +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e2\'fb\'e4\'e5\'eb\'ff +\'e5\'ec\'ee\'e3\'ee \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'e0\line C - 45h\line B = 7 - \'c2\'fb\'e4\'e5\'eb\'e8\'f2\'fc \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb\'fc \'ed\'e0 \'f1\'eb\'e5\'e4\'f3\'fe\'f9\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'ea\'ee\'ec\'e0\'ed\'e4\'ed\'ee\'e9 \'f1\'f2\'f0\'ee\'ea\'e8 +\line CF = 0 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 \'ed\'e5 \'e4\'ee\'f1\'f2\'e8\'e3\'ed\'f3\'f2 (\'e5\'f1\'f2\'fc \'e4\'f0\'f3\'e3\'e8\'e5 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0\'fb)\line CF = 1 - \'ea\'ee\'ed\'e5\'f6 \'f1\'f2\'f0\'ee\'ea\'e8 (\'e2 +\'e1\'f3\'f4\'e5\'f0 \'ef\'e5\'f0\'e5\'ed\'e5\'f1\'b8\'ed \'ef\'ee\'f1\'eb\'e5\'e4\'ed\'e8\'e9 \'ef\'e0\'f0\'e0\'ec\'e5\'f2\'f0 \'e8\'eb\'e8 \'ed\'ee\'eb\'fc) +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 8 - \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2 \'c4\'ce\'d1}{\f1\fs16 + +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 45h\line B = 8 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'ee\'e3\'ee \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'e2 \'f4\'ee +\'f0\'ec\'e0\'f2 \'c4\'ce\'d1\line HL - 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff \'e8\'ec\'e5\'ed\'e8 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }{\b\f23\fs16 \'cf\'ee\'e4\'f4\'f3\'ed\'ea\'f6\'e8\'ff 9 - \'cf\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 \'f4\'ee\'f0\'ec\'e0\'f2}{\f1\fs16 +\par }{ +\par }{\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 45h\line B = 9 - \'ef\'f0\'e5\'ee\'e1\'f0\'e0\'e7\'ee\'e2\'e0\'f2\'fc \'e8\'e7 \'f4\'ee\'f0\'ec\'e0\'f2\'e0 \'c4\'ce\'d1 \'e2 11 \'f1\'e8\'ec\'e2\'ee\'eb\'fc\'ed\'fb\'e9 +\'f4\'ee\'f0\'ec\'e0\'f2\line HL - \'e8\'ec\'ff \'f4\'e0\'e9\'eb\'e0 \'e2 \'f4\'ee\'f0\'ec\'e0\'f2\'e5 \'c4\'ce\'d1\line DE - \'e1\'f3\'f4\'e5\'f0 \'e4\'eb\'ff 11 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e8\'ec\'e5\'ed\'e8 \'f4\'e0\'e9\'eb\'e0 +\par \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1 +\par }{ +\par }{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\*\bkmkstart screen}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocscreen" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'f0\'e0 +\'e1\'ee\'f2\'fb \'f1 \'fd\'ea\'f0\'e0\'ed\'ee\'ec}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend screen}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 50h (80) SETVMOD (\'c2\'fb\'e1\'ee\'f0 \'f0\'e5\'e6 +\'e8\'ec\'e0 \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0\line \~\~\~02h - \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 40x32x16 \'f6\'e2\'e5\'f2 +\'ee\'e2\line \~\~\~03h - \'f2\'e5\'ea\'f1\'f2\'ee\'e2\'fb\'e9 80x32x16 \'f6\'e2\'e5\'f2\'ee\'e2\line \~\~\~81h - \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8\'e9 320x256x256 \'f6\'e2\'e5\'f2\'ee\'e2\line \~\~\~82h - \'e3\'f0\'e0\'f4\'e8\'f7\'e5\'f1\'ea\'e8 +\'e9 640x256x16 \'f6\'e2\'e5\'f2\'ee\'e2\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1\line C - 50h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1 +\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 51h (81) GETVMOD (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec +\'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 51h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 + CF=1\line A - \'f2\'e5\'ea\'f3\'f9\'e8\'e9 \'f0\'e5\'e6\'e8\'ec \'fd\'ea\'f0\'e0\'ed\'e0, \'e5\'f1\'eb\'e8 CF=0\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 52h (82) LOCATE (\'d3\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3\'f0\'f1\'ee\'f0\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright { +\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 +\clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0 +\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'ea\'f3\'f0\'f1\'ee\'f0\'e0\line C - 52h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2 +\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 +\clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 53h (83) CURSOR (\'cf\'ee\'eb\'f3\'f7\'e8\'f2\'fc \'f2\'e5\'ea\'f3\'f9\'f3\'fe \'ef\'ee\'e7\'e8\'f6\'e8\'fe \'ea\'f3 +\'f0\'f1\'ee\'f0\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line C - 53h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0 \'ea\'f3\'f0\'f1\'ee\'f0\'e0 +\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'ea\'f3\'f0\'f1\'ee\'f0\'e0\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh +\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 54h (84) SELPAGE (\'c2\'fb\'e1\'f0\'e0\'f2\'fc +\'e0\'ea\'f2\'e8\'e2\'ed\'f3\'fe \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'f3 \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 +\trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'fd\'ea\'f0\'e0\'ed\'e0 0/1\line C - 54h +\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'ea\'ee\'e4 \'ee\'f8\'e8\'e1\'ea\'e8, \'e5\'f1\'eb\'e8 CF=1\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl +\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard +\widctlpar\intbl\adjustright {\b\f23\fs16 55h (85) SCROLL (\'cf\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'ee\'ea\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 +\trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0 \'eb\'e5\'e2\'ee\'e3\'ee \'e2 +\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0\line L - +\'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0\line B = 1 - \'ef\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'e2\'e2\'e5\'f0\'f5\line B = 2 - \'ef\'f0\'ee\'ea\'f0\'f3\'f2\'ea\'e0 \'e2\'ed\'e8\'e7\line A = 0 - \'ee\'f7\'e8\'f9\'e0\'f2\'fc \'f1\'f2\'f0\'ee\'ea\'f3\line +C - 55h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 56h (86) CLEAR (\'ce\'f7 +\'e8\'f1\'f2\'ea\'e0 \'ee\'ea\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line E - +\'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0\line L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0\line B - \'e0\'f2\'f0\'e8\'e1 +\'f3\'f2 \'e7\'e0\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc\line A - \'f1\'e8\'ec\'e2\'ee\'eb \'e7\'e0\'ef\'ee\'eb\'ed\'e8\'f2\'e5\'eb\'fc\line C - 56h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 57h (87) RDCHAR (\'d1\'f7\'e8\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'f1 \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard +\widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2 +\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6\line C - 57h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f1\'e8\'ec\'e2\'ee\'eb\line +B - \'e0\'f2\'f0\'e8\'e1\'f3\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 +\clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 58h (88) WRCHAR (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb +\'ed\'e0 \'fd\'ea\'f0\'e0\'ed\'e5)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6\line A - \'f1\'e8\'ec\'e2\'ee\'eb\line B - \'e0\'f2\'f0\'e8\'e1 +\'f3\'f2\line C - 58h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 +59h (89) WINCOPY (\'c7\'e0\'ef\'ee\'ec\'ed\'e8\'f2\'fc \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0\line E - \'f1\'f2\'ee\'eb\'e1 +\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0\line L - \'f8\'e8\'f0\'e8\'ed\'e0 \'ee\'ea\'ed\'e0\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e1\'f3 +\'f4\'e5\'f0\'e0\line IX - \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0\line C - 59h\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45 +\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb +\cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 5Ah (90) WINREST (\'c2\'ee\'f1\'f1\'f2\'e0\'ed\'ee\'e2\'e8\'f2\'fc \'ee\'ea\'ed\'ee \'fd\'ea\'f0\'e0\'ed\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5 +\'ed\'e8\'ff:\line D - \'f1\'f2\'f0\'ee\'ea\'e0\line E - \'f1\'f2\'ee\'eb\'e1\'e5\'f6 \'eb\'e5\'e2\'ee\'e3\'ee \'e2\'e5\'f0\'f5\'ed\'e5\'e3\'ee \'f3\'e3\'eb\'e0 \'ee\'ea\'ed\'e0\line H - \'e2\'fb\'f1\'ee\'f2\'e0 \'ee\'ea\'ed\'e0\line L - \'f8\'e8\'f0\'e8 +\'ed\'e0 \'ee\'ea\'ed\'e0\line B - \'f1\'f2\'f0\'e0\'ed\'e8\'f6\'e0 \'e1\'f3\'f4\'e5\'f0\'e0\line IX - \'e0\'e4\'f0\'e5\'f1 \'e1\'f3\'f4\'e5\'f0\'e0\line C}{\f1\fs16 - 5Ah\cell }{\f23\fs16 \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff +:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 5Bh (91) PUTCHAR (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'e8\'ec\'e2\'ee\'eb \'e2 \'f2\'e5\'ea +\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr +\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb +\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f1\'e8\'ec\'e2\'ee\'eb\line C - 5Bh\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 +\'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv +\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\b\f23\fs16 5Ch (92) PCHARS (\'cd\'e0\'ef\'e5\'f7\'e0\'f2\'e0\'f2\'fc \'f1\'f2\'f0 +\'ee\'ea\'f3 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2 \'e2 \'f2\'e5\'ea\'f3\'f9\'e5\'e9 \'ef\'ee\'e7\'e8\'f6\'e8\'e8 \'ea\'f3\'f0\'f1\'ee\'f0\'e0)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 +\trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt +\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line HL - \'f3\'ea\'e0\'e7\'e0\'f2\'e5\'eb +\'fc \'ed\'e0 \'ed\'e0\'f7\'e0\'eb\'ee \'f1\'f2\'f0\'ee\'ea\'e8 \'f1\'e8\'ec\'e2\'ee\'eb\'ee\'e2\line C - 5Ch\cell \'c2\'fb\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line \'ed\'e5\'f2\cell }\pard \widctlpar\intbl\adjustright {\row }\trowd +\trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalc\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr +\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\*\bkmkstart printer}{\field\fldedit{\*\fldinst {\f1\fs16 HYPERLINK "" \\l "tocprinter" }}{\fldrslt {\cs31\b\f23\fs16\cf2 \'d4\'f3\'ed\'ea\'f6\'e8\'e8 \'e4\'eb\'ff \'ef\'e5\'f7\'e0 +\'f2\'e8 \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0\'e5}{\b\f1\fs16\cf1 \line }}}{\f1\fs16 {\*\bkmkend printer}\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\intbl\adjustright {\b\f23\fs16 5Fh (95) PRINT (\'c2\'fb\'e2\'ee\'e4 \'f1\'e8\'ec +\'e2\'ee\'eb\'e0 \'ed\'e0 \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'e1\'e5\'e7 \'ee\'e6\'e8\'e4\'e0\'ed\'e8\'ff)}{\f1\fs16 \cell }\pard \widctlpar\intbl\adjustright {\row }\trowd \trqc\trgaph45\trleft-45\trbrdrt\brdrs\brdrw15 \trbrdrl\brdrs\brdrw15 \trbrdrb +\brdrs\brdrw15 \trbrdrr\brdrs\brdrw15 \trbrdrh\brdrs\brdrw15 \trbrdrv\brdrs\brdrw15 \clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx3733\clvertalt\clbrdrt\brdrs\brdrw15 \clbrdrl +\brdrs\brdrw15 \clbrdrb\brdrs\brdrw15 \clbrdrr\brdrs\brdrw15 \cltxlrtb \cellx7511\pard \widctlpar\intbl\adjustright {\f23\fs16 \'c2\'f5\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line A - \'f1\'e8\'ec\'e2\'ee\'eb\line C - 5Fh\cell \'c2\'fb\'f5 +\'ee\'e4\'ed\'fb\'e5 \'e7\'ed\'e0\'f7\'e5\'ed\'e8\'ff:\line B - \'f1\'e8\'ec\'e2\'ee\'eb\line CF = 1 - \'ef\'f0\'e8\'ed\'f2\'e5\'f0 \'ed\'e5 \'e3\'ee\'f2\'ee\'e2\cell }\pard \widctlpar\intbl\adjustright {\row }\pard \widctlpar\adjustright { +\par }{\lang1033 +\par }} \ No newline at end of file diff --git a/docs/Original/Estex DSS/Programmer manual.txt b/docs/Original/Estex DSS/Programmer manual.txt new file mode 100644 index 0000000..810eb4e --- /dev/null +++ b/docs/Original/Estex DSS/Programmer manual.txt @@ -0,0 +1,2652 @@ +Программирование 
дисковой подсистемы Estex v1.54 + +(c таблицей функций Estex DSS v1.55) + +(C) 2002 Петерс Плюс + +Программирование приложений Estex DSS (DOS) v1.54 + + Взаимодействие с ДОС осуществляется при помощи инструкции RST 10h. +В зависимости от конкретной функции, в качестве входных и выходных +параметров используются различные регистры, при этом номер функции +задается в регистре C. Функции организуют управление файлами, +выделение памяти, выполнение программ и взаимодействие с различными +устройствами. + + +Файловая спецификация: + +  Файловая спецификация - это строка символов, содержащая имя +дискового устройства, имена каталогов разделённые символом “\” и +имя файла. Имена дискового устройства и каталогов могут быть +пропущены. +Например: + +C:\TEXT\DOC\text.doc +A:file.txt +\TEXT\info.txt + +  ДОС использует для дисковых устройств имена A:, B:, C: и т.д. +Имя устройства может быть записано перед именем файла, чтобы +указать его местонахождение. Например, команда DIR C:DATFILE ищет +DATFILE на устройстве C: в текущем каталоге. Когда имя устройства +явно не указано, ДОС использует текущее устройство. После запуска +системы текущим становится устройство, с которого загружена ДОС. +  Имена файлов состоят из двух частей. Первая содержит 1 до 8 +символов. В зависимости от контекста под именем файла иногда +подразумевается именно эта первая часть. Вторая часть, которая +не обязательна и служит для пояснения типа информации находящейся +в файле, содержит до 3 символов и называется расширением. При +написании имени файла обе части разделяются символом точка. Так, +например, имена 'NAME' и 'NAME.' одинаковы. В имени файла не +допускаются символы с кодом меньше 32, а также символы: +. “ / \ [ ] : | < > + = ; , +Поскольку подкаталоги тоже файлы, их имена образуются тем же +способом. Имя основного (или корневого) каталога всегда “\”. +Кроме этого, при создании каталога в нём записываются два +специальных элемента, с именами “.” и “..”. Имя “.” обозначает +текущий каталог. Имя “..” обозначает каталог верхнего уровня. +Некоторые команды и функции ДОС в именах файлов позволяют +использовать глобальные символы это символы ? и *, которые +можно вставлять в имя и в расширение файла. Символ ? означает, +что вместо него может быть любой другой символ. Символ * +означает, что вместо него может быть любое количество символов. + +Например: +*.txt - означает все файлы с расширением txt +a??.* - означает файлы с именем в три символа и первым + символом “a” +dc*.exe - означает программные файлы с именем любой длины и + начинающимся с “dc” + + +Атрибуты файла: + +  Каждый бит байта атрибутов задаёт определённый атрибут файла. +Атрибуты файлов можно изменять специальной функцией ДОС. +бит 0 - Только для чтения +бит 1 - Скрытый +бит 2 - Системный +бит 3 - Метка тома +бит 4 - Каталог +бит 5 - Архивный +бит 6 - Не используется +бит 7 - Не используется + +Атрибут “только для чтения”. При значении 1 из файла можно +читать, но в него нельзя писать и его нельзя стереть. +Атрибут “скрытый”. При значении 1 файл невиден для обычных +операций ДОС. +Атрибут “системный”. Указывает, что файл является системным. +Атрибут “метка тома”. В старых версиях MSDOS использовался +для задания метки диска. +Атрибут “каталог”. При значении 1 идентифицирует файл как +каталог, подчинённый данному каталогу или элементы “.” +и “..”. +Атрибут “архивный”. Этот бит устанавливается при операциях +записи в файл. Его могут использовать утилиты создающие +архивные копии для сохранения изменённых файлов. + + +Файловый манипулятор: + +  При открытии файла, ДОС автоматически создаёт блок управления +файлом. Блок создаётся в рабочих областях ДОС и его адрес +неизвестен пользовательской программе. Блок (и соответствующий +файл) идентифицируется номером, который ДОС возвращает приложению +после открытия файла - этот номер называется файловым манипулятором. +Во всех дальнейших обращениях к функциям ДОС используется файловый +манипулятор. Другими словами, при открытии файла пользовательская +программа сообщает ДОС его имя и получает обратно номер, который +служит логическим именем файла при всех дальнейших операциях с +файлом. Необходимая для работы с файлом информация сохраняется в +рабочих областях ДОС. + + +** Функции для идентификации системы: + +00h (00) VERSION (Версия DOS) +входные данные: +C - 00h +выходные данные: +D - номер версии +E - модификация + Функция возвращает номер версии дисковой системы. + + +** Функции для работы с диском: + +01h (01) CHDISK (Смена текущего диска) +входные данные: +A - номер диска (0-A,1-B...) +C - 01h +выходные данные: +A - код ошибки, если CF=1 +A - максимальный номер диска, если CF=0 + Функция меняет текущее дисковое устройство. + + +02h (02) CURDISK (Номер текущего диска) +входные данные: +C - 02h +выходные данные: +A - текущий номер диска (0-A,1-B...) + Функция возвращает номер текущего дискового устройства. + + +03h (03) DSKINFO (Информация о диске) +входные данные: +A - номер диска (0-A,1-B...0FFh-текущий) +C - 03h +выходные данные: +A - код ошибки, если CF=1 +A - размер кластера в секторах, если CF=0 +HL - общее кол-во кластеров +DE - свободных кластеров +BC - размер сектора в байтах + Функция возвращает информацию об общем и свободном +пространстве дискового устройства. + Пример: + LD C,03h ;Функция получения информации о диске + LD A,0FFh ;Текущий диск + RST 10h ;Выполнение функции + LD A,D ;Есть свободное + OR E ;пространство? + JR Z,NO_SPACE ;Диск полностью заполнен + + +09h (09) BOOTDSK (Номер системного диска) +входные данные: +C - 09h +B = 0 +выходные данные: +A - номер системного диска (0-A,1-B...) + Функция возвращает номер дискового устройства c которого +загружена система. + + +** Функции для работы с файлами: + +Создание файла: + Файл можно открыть системной функцией 11h (OPEN), только если он +существует. Есть специальные функции для создания файлов. Если файл был создан +и сразу же закрыт, он будет пустым, но его можно открыть функцией OPEN +для записи информации. Для удобства функции, которые создают файл, затем +открывают его. +0Ah (10) CREATE (Создание файла) +входные данные: +HL - указатель на файловую спецификацию +A - атрибут файла +C - 0Ah + +выходные данные: +A - файловый манипулятор, если CF=0 +код ошибки, если CF=1 +Функция ищет в каталоге файл с именем, совпадающим с именем в +файловой спецификации. Если такой файл существует, делает его длину равной 0 +и открывает файл для чтения/записи. Если файл не обнаружен, создается новый файл +с таким именем и длиной 0 и открывает файл для чтения/записи. +Пример: + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,0Ah ;Функция создание файла + LD A,00h ;Атрибут обычного файла + RST 10h ;Выполнение функции + RET C ;Возврат по ошибке + LD (FILE1),A ;Сохранение файлового манипулятора + +NAME DB “newfile.ext”,0 +FILE1 DB 00h ;Переменная для сохранения файлового манипулятора + + +0Bh (11) CREATE NEW FILE (Создание нового файла) +входные данные: +HL - указатель на файловую спецификацию +A - атрибут файла +C - 0Bh + +выходные данные: +A - файловый манипулятор, если CF=0 +код ошибки, если CF=1 +Функция аналогична функции 0Ah и необходима, когда нужно создать файл +с определённым именем и проверить, что файла с таким именем не существует. + +0Eh (14) DELETE (Удаление файла) +входные данные: +HL - указатель на имя файла +A - атрибут файла +C - 0Eh + +выходные данные: +A - код ошибки, если CF=1 +Функция ищет файл в текущем каталоге и удаляет его. Глобальные символы * и ? в +имени файла не допускаются. Файлы с атрибутом только для чтения нельзя стереть +данной функцией - сначала нужно изменить этот атрибут. +Пример: + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,0Eh ;Функция удаления файла + RST 10h ;Выполнение функции + +NAME DB “newfile.ext”,0 + + + 10h (16) RENAME (Переименование файла) + +входные данные: +HL - указатель на старое имя файла +DE - указатель на новое имя файла +C - 10h + +выходные данные: +A - код ошибки, если CF=1 +Функция ищет файл в текущем каталоге и заменяет его имя на новое. Глобальные символы * и ? в именах файлов не допускаются. +Пример: + LD HL,OLDNAME ;HL указывает на ASCIIZ строку со старым именем файла + LD DE,NEWNAME ;DE указывает на ASCIIZ строку с новым именем файла + LD C,10h ;Функция переименования файла + RST 10h ;Выполнение функции + +OLDNAME DB “oldfile.doc”,0 +NEWNAME DB “newfile.txt”,0 + + +Открытие/закрытие файла: + Открыть файл - это означает выделить для него область памяти (блок +управления), обнаружить файл и перенести определённую информацию из каталога в +блок управления файлом. Приложение указывает в качестве параметра функции 11h +(OPEN) имя и атрибуты файла. ДОС создаёт и заполняет блок управления файлом в +своих рабочих областях. После выполнения функции пользователь получает номер +(файловый манипулятор), которым файл идентифицируется во всех последующих +операциях, вплоть до его закрытия. + При работе с файлом, ДОС изменяет некоторые из полей блока управления +файлом: размер файла, текущая позиция файла и др. Пользовательская программа +также способна изменять поля блока управления с помощью функций ДОС. +Закрытие файла означает прекращение обмена информации с файлом. При этом +файловый манипулятор и блок управления закрываемого файла освобождаются, а +информация в каталоге заменяется информацией из блока управления, по этому +всегда следует закрывать файлы. + + +11h (17) OPEN (Открытие файла) +входные данные: +HL - указатель на файловую спецификацию +A - режим доступа +A=0 чтение/запись +A=1 чтение +A=2 запись +C - 11h + +выходные данные: +A - файловый манипулятор, если CF=0 +код ошибки, если CF=1 +Функция ищет файл с именем, совпадающим с именем в файловой спецификации. +Если такой файл существует, открывает его. Указатель текущей позиции в файле +устанавливается на начало файла. При открытии файла в режиме доступа 1 - только +чтение ДОС будет блокировать попытки записи в файл, при открытии в режиме +доступа 2 - только запись ДОС будет блокировать попытки чтения из файла. + +12h (18) CLOSE (Закрытие файла) +входные данные: +A - файловый манипулятор +C - 12h + +выходные данные: +A - код ошибки, если CF=1 +Функция закрывает файл, освобождает файловый манипулятор и блок +управления файлом. Переносит информацию из блока управления файлом в каталог. +Чтение и запись в файл: + Все операции чтения и записи в файл осуществляются в зависимости от значения в +поле блока управления файлом, которое называется указателем текущие позиции +в файле. Значение указателя рассматривается как смещение в байтах от начала +файла. Указатель можно изменять с помощью функции ДОС 15h (MOVE_FP), чтобы он +указывал произвольную позицию в файле. Кроме этой функции, значение указателя +изменяют функции чтения и записи в файл. При выполнении функции чтения или +записи в файл задается количество байт, которое нужно прочесть или записать и +адрес в памяти, где располагаются эти байты. Байты считываются или записываются +в файл в зависимости от значения указателя текущей позиции в файле. После +каждого чтения или записи указатель увеличивается на количество перенесённых +байт. При открытии файла, указатель текущей позиции устанавливается на начало +файла (обнуляется). +13h (19) READ (Чтение из файла) +входные данные: +A - файловый манипулятор +HL - адрес в памяти +DE - количество читаемых байт +C - 13h + +выходные данные: +DE - реальное количество прочитанных байт +если CF=0: +A = 0 прочитаны все байты +A = 0FFh прочитано меньшее число байт +A - код ошибки, если CF=1 +Функция читает указанное количество байт с текущей позиции в файле. После +чтения значение указателя текущей позиции увеличивается на количество +прочитанных байт. +Количество прочитанных байт не всегда равно заявленному. Например, при +достижении конца файла. +Пример: +; Открытие файла newfile.doc для чтения + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,11h ;Функция открытия файла + LD A,1 ;Режим доступа: чтение + RST 10h ;Выполнение функции + JR C,OPEN_ERROR;Ошибка открытия файла + LD (HANDLE),A ;Сохранение файлового манипулятора + +; Перемещение Указателя текущий позиции в конец файла + LD C,15h ;Функция перемещение указателя + LD B,2 ;Перемещение от конца файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + ;В HL:IX размер файла + LD (L_FILELEN),IX ;Запоминаем младшие 16 бит длины + LD (H_FILELEN),HL;Запоминаем старшие 16 бит длины + +; Перемещение Указателя текущей позиции в начало файла + LD C,15h ;Функция перемещение указателя + LD B,0 ;Перемещение от начала файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + + LD DE,(H_FILELEN);Берём старшие 16 бит длины файла + LD A,D ;Проверяем что длина файла + CP E ;меньше 64 килобайт + JP NZ,BIG_FILE ;ошибка файл очень большой + +; Чтение из файла + LD C,13h ;Функция чтение из файла + LD A,(HANDLE) ;Файловый манипулятор + LD DE,(L_FILELEN);Берем младшие 16 бит длины файла + LD HL,BUFFER ;Буфер для чтения + RST 10h ;Выполнение функции + JR C,READ_ERROR;Ошибка чтения + +; Закрытие файла + LD C,12h ;Функция закрытия файла + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,CLOSE_ERROR;Ошибка закрытия файла + +NAME DB “newfile.doc”,0 ;Файловая спецификация +HANDLE DB 0 ;Переменная для сохранения файлового манипулятора +L_FILELEN DW 0 ;Переменная для сохранения младших 16 бит длины +H_FILELEN DW 0 ;Переменная для сохранения младших 16 бит длины +BUFFER DS 256,0 ;Буфер для чтения + + + 14h (20) WRITE (Запись в файл) + +входные данные: +A - файловый манипулятор +HL - адрес в памяти +DE - количество записываемых байт +C - 14h + +выходные данные: +DE - реальное количество записанных байт +A - код ошибки, если CF=1 + +Функция записывает указанное количество байт с текущей позиции в файле. +После записи значение указателя текущей позиции увеличивается на количество +записанных байт. +Количество записанных байт не всегда равно заявленному. Это может +получиться, например, если на диске нет свободного места. +При закрытии файла его длина определяется не текущем значением указателя в +файле, а его максимальным значением или старой длиной файла, если она больше. +Если, например, открыть файл длиной 1000 байт при помощи функции 11h (OPEN), +записать в него 500 байт и затем закрыть. Первые 500 байт будут записаны новой +информацией, а оставшиеся будут без изменения. Если же требуется перекрыть +существующий файл, его следует открыть функцией 0Ah (CREATE), которая уменьшит +длину существующего файла до 0. + + + +Пример: +; Открытие файла newfile.doc для записи + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD C,11h ;Функция открытия файла + LD A,2 ;Режим доступа: запись + RST 10h ;Выполнение функции + JR C,OPEN_ERROR;Ошибка открытия файла + LD (HANDLE),A ;Сохранение файлового манипулятора + +; Перемещение Указателя текущий позиции в конец файла + LD C,15h ;Функция перемещение указателя + LD B,2 ;Перемещение от конца файла + LD HL,0 ;32 битное смещение HL:IX + LD IX,0 ;Перемещение на 0 байт + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,FP_ERROR ;Ошибка перемещения указателя + +; Запись в файл (добавление строки в конец файла) + LD C,14h ;Функция записи в файл + LD A,(HANDLE) ;Файловый манипулятор + LD DE,12 ;Берем длину записи 12 байт + LD HL,BUFFER ;Буфер со строкой “end of file!” + RST 10h ;Выполнение функции + JR C,READ_ERROR;Ошибка чтения + +; Закрытие файла + LD C,12h ;Функция закрытия файла + LD A,(HANDLE) ;Файловый манипулятор + RST 10h ;Выполнение функции + JR C,CLOSE_ERROR;Ошибка закрытия файла + +; После записи длина файла увеличится на 12 байт +NAME DB “newfile.doc”,0 ;Файловая спецификация +HANDLE DB 0 ;Переменная для сохранения файлового манипулятора +BUFFER DB “end of file!” ;Буфер для записи + + + 15h (21) MOVE_FP (Перемещение указателя в файле) + +входные данные: +A - файловый манипулятор +HL:IX - смещение указателя в файле +B - способ перемещения +B=0 от начала файла +B=1 от текущего значения указателя +B=2 от конца файла +C - 15h +выходные данные: +A - код ошибки, если CF=1 +HL:IX - новое значение указателя +HL:IX интерпретируется как 32-битное число. Если число меньше 65536, +регистр HL содержит 0. Возможны следующие способы перемещения указателя: + B=0 Смещение считается от начала файла, если HL:IX=0, указатель +устанавливается на начало файла. + B=1 Смещение считается от текущего значения указателя. + + B=2 Смещение считается от конца файла, если HL:IX=0, после перемещения + HL:IX получится длина файла в байтах. + + + 16h (22) ATTRIB (Получение/изменение атрибута файла) + +входные данные: +HL - указатель на файловую спецификацию +B - режим доступа +B=0 получить атрибут +B=1 установить атрибут +A - атрибут файла +C - 16h + +выходные данные: +A - атрибут файла, если CF=0 +код ошибки, если CF=1 +Функция возвращает/изменяет атрибут файла. + +17h (23) GET_D_T (Информация о дате и времени файла) +входные данные: +A - файловый манипулятор +C - 17h + +выходные данные: +D - день +E - месяц +IX - год +H - час +L - минуты +B - секунды +A - код ошибки, если CF=1 + +Функция возвращает информацию о дате и времени создания или последней +модификации файла. + +18h (24) PUT_D_T (Изменение даты и времени файла) +входные данные: +A - файловый манипулятор +D - день +E - месяц +IX - год +H - час +L - минуты +B - секунды +C - 18h + +выходные данные: +A - код ошибки, если CF=1 +Функция изменяет информацию о дате и времени создания или последней +модификации файла. Изменение информации о дате и времени реально произойдет +только после закрытия файла. А любая операция записи в файл установит текущую +дату и время. + +19h (25) F_FIRST (Поиск первого совпадающего файла) +входные данные: +HL - указатель на файловую спецификацию +DE - рабочий буфер 44 байта, если B=0, иначе 256 байт +A - атрибуты, используемые при поиске +B = 0 - имя найденного файла в формате 11 байт “FilenameExt” +B = 1 - имя найденного файла в формате DOS “filename.ext”,0 +C - 19h +выходные данные: +A - код ошибки, если CF=1 +Функция осуществляет поиск конкретного файла или первого (по его положению +в каталоге) из группы файлов. Можно указать произвольное устройство и каталог +для поиска. В имени файла допускаются глобальные символы ? и *. +Если значение атрибутов для поиска равно 00h, осуществляется поиск только +обычных файлов. Если в байте атрибутов биты для скрытого, системного, только для +чтения или каталога (или их произвольная комбинация) равны 1, осуществляется +поиск всех файлов, чьи атрибуты соответствуют указанным, а также всех обычных +файлов. +Если файл обнаружен, по адресу, на который указывает регистр DE будет +заполнен буфер с информацией о файле. Иначе функция завершится с ошибкой “файл +не обнаружен”. +формат буфера: + +00 8 db “FILE????” ; шаблон имени + +08 3 db “???” ; шаблон расширения + +11 1 db #20 ; атрибуты для поиска + +12 10 ds 10 ; зарезервировано + +22 2 dw #0000 ; время создания файла + +24 2 dw #0000 ; дата создания файла + +26 2 dw #0000 ; номер первого кластера + +28 4 dw #0000,#0000 ; размер файла в байтах + +32 1 db #20 ; атрибут обнаруженного файла + +33 11 db “FILENAMEEXT” ; имя обнаруженного файла копия из каталога + +или + +33 n db “filename.ext”,0 ; имя обнаруженного файла в формате ДОС + + 1Ah (26) F_NEXT (Поиск следующего совпадающего файла) + +входные данные: +DE - указатель на рабочий буфер +C - 1Ah + +выходные данные: +A - код ошибки, если CF=1 +Параметры берутся из функции F_FIRST, если она не выполнялась, то +F_NEXT вернется с ошибкой “невозможная операция”, не следует выполнять +операции, которые могут разрушить рабочий буфер. + + + +Пример: +; Поиск первого совпадающего файла + LD HL,NAME ;HL указывает на ASCIIZ строку с именем файла + LD DE,BUFFER ;DE указывает на рабочий буфер + LD C,19h ;Функция поиска первого совпадающего файла + LD A,30h ;Поиск обычных файлов и каталогов + RST 10h ;Выполнение функции + JP C,FIND_ERROR ;Ошибка поиска (файл не найден) + +; Вывод имени найденного файла +NEXTN LD HL,BUFFER ;Рабочий буфер + LD DE,33 ;Имя файла находится со смещением 33 + ADD HL,DE + +; Вывод имени файла + LD C,5Bh ;Функция печати символа + LD B,8 ;Размер имени файла 8 символов +NEXTS LD A,(HL) ;Берем очередной символ имени + PUSH BC + RST 10h ;Выполнение функции + POP BC + INC HL + DJNZ NEXTS + LD A,” ” ;Вывод пробела + RST 10h + +; Вывод расширения файла + LD C,5Bh ;Функция печати символа + LD B,3 ;Размер расширения файла 3 символа +NEXTE LD A,(HL) ;Берем очередной символ имени + PUSH BC + RST 10h ;Выполнение функции + POP BC + INC HL + DJNZ NEXTE + +; Перевод строки после каждого имени файла + LD C,5Bh ;Функция печати символа + LD A,13 ;CR - переход в начало строки + RST 10h + LD C,5Bh ;Функция печати символа + LD A,10 ;LF - перевод строки + RST 10h + +; Поиск следующего совпадающего файла + LD DE,BUFFER ;DE указывает на рабочий буфер + LD C,1Ah ;Функция поиска следующего совпадающего файла + RST 10h ;Выполнение функции + JP NC,NEXTN ;Переход на печать имени файла +FIND_ERROR +NAME DB “A:\TEXT\*.*”,0 +BUFFER DS 44 + + + + + + 1Bh (27) MKDIR (Создание каталога) + +входные данные: +HL - указатель на файловую спецификацию +C - 1Bh + +выходные данные: +A - код ошибки, если CF=1 +Функция создаёт на диске подкаталог, указанный в файловой спецификации. +Пример: + LD HL,DIRNAME ;HL указывает на ASCIIZ строку с именем подкаталога + LD C,1Bh ;Функция создание подкаталога + RST 10h ;Выполнение функции + +DIRNAME DB “TEXT”,0 ;Создать подкаталог TEXT в текущем каталоге + +DIRNAME DB “\TEXT”,0 ;Создать подкаталог TEXT в корневом каталоге + +DIRNAME DB “C:\DOC\TEXT”,0;Создать подкаталог TEXT в каталоге DOC на +;диске C: каталог DOC должен существовать + +1Ch (28) RMDIR (Устранение каталога) +входные данные: +HL - указатель на файловую спецификацию +C - 1Ch + +выходные данные: +A - код ошибки, если CF=1 + +Функция устраняет пустой подкаталог, указанный в файловой спецификации. +Нельзя устранить текущий каталог и каталог, который содержит файлы или другие +каталоги. +Пример: + LD HL,DIRNAME ;HL указывает на ASCIIZ строку с именем подкаталога + LD C,1Ch ;Функция устранения подкаталога + RST 10h ;Выполнение функции + +DIRNAME DB “TEXT”,0 + + + 1Dh (29) CHDIR (Смена текущего каталога) + +HL - указатель на файловую спецификацию +C - 1Dh + +Функция меняет текущий каталог и текущий диск, если он указан в файловой +спецификации. Если путь начинается с “\” - это означает путь от корневого +каталога, иначе от текущего. +Пример: + LD HL,DIRNAME ;HL указывает на ASCIIZ строку пути к новому + ;текущему каталогу + LD C,1Dh ;Функция смены текущего каталога + RST 10h ;Выполнение функции + +DIRNAME DB “\DOC\TEXT”,0 + + + 1Eh (30) CURDIR (Информация о текущем каталоге) + +входные данные: +HL - буфер в памяти 256 байт +C - 1Eh + +выходные данные: +A - код ошибки, если CF=1 + +Функция переносит строку пути текущего каталога из областей ДОС в +пользовательскую программу по адресу заданном в регистре HL. На конце пути код +ноль. Имя дискового устройства в путь не включается. +Пример: + LD HL,BUFFER ;HL указывает на буфер + LD C,1Eh ;Функция получения пути к текущему каталогу + RST 10h ;Выполнение функции + +BUFFER DS 256 + + + 21h (33) SYSTIME (Текущая дата и время) + +входные данные: +C - 21h +выходные данные: +D - день +E - месяц +IX - год +H - час +L - минуты +B - секунды +C - день недели + +Функция возвращает текущую дату и время. + +22h (34) SETTIME (Установить текущую дату и время) +входные данные: +D - день +E - месяц +IX - год +H - час +L - минуты +B - секунды +C - 22h + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает системную дату и время. + +Функции для работы с памятью: + +38h (56) SETWIN (Подключение страницы памяти) +входные данные: +A - идентификатор блока памяти +B - номер страницы в блоке (0,1,2...) +H - биты 6 и 7 задают номер окна, в которое будет подключена страница +C - 38h + +выходные данные: +A - номер страницы, если CF=0 +A - код ошибки, если CF=1 + +Функция вычисляет физический номер страницы в блоке памяти и подключает её +в окно адресного пространства в зависимости от значения регистра HL. То есть, +если HL указывает на адрес в пределах от 04000h до 07FFFh, то страница +подключается в первое окно, от 08000h до 0BFFFh - второе окно, от 0C000h до +0FFFFh - третье. +На выходе в регистре A содержится физический номер страницы, которая +была подключена до выполнения функции. + +39h (57) SETWIN1 (Подключение страницы памяти в первое окно) +входные данные: +A - идентификатор блока памяти +B - номер страницы в блоке (0,1,2...) +C - 39h + +выходные данные: +A - номер страницы, если CF=0 +A - код ошибки, если CF=1 + +Функция аналогична функции 038h (SETWIN), но страница подключается в +первое окно независимо от регистра HL. + +3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно) +входные данные: +A - идентификатор блока памяти +B - номер страницы в блоке (0,1,2...) +C - 3Ah + +выходные данные: +A - номер страницы, если CF=0 +A - код ошибки, если CF=1 + +Функция аналогична функции 038h (SETWIN), но страница подключается во +второе окно независимо от регистра HL. + +3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно) +входные данные: +A - идентификатор блока памяти +B - номер страницы в блоке (0,1,2...) +C - 3Bh + +выходные данные: +A - номер страницы, если CF=0 +A - код ошибки, если CF=1 + +Функция аналогична функции 038h (SETWIN), но страница подключается в +третье окно независимо от регистра HL. + +3Ch (60) FREEMEM (Информация о памяти) +входные данные: +C - 3Ch +выходные данные: +HL - общее количество страниц +BC - количество свободных страниц + +Функция возвращает в регистре HL общее количество памяти в страницах по +16 килобайт и свободное количество страниц в регистре BC. + +3Dh (61) GETMEM (Выделение блока памяти) +входные данные: +B - размер блока в страницах по 16 килобайт +C - 3Dh + +выходные данные: +A - идентификатор блока памяти, если CF=0 +A - код ошибки, если CF=1 + +Функция выделяет блок памяти и возвращает его идентификатор приложению. + +3Eh (62) RETMEM (Освобождение блока памяти) +входные данные: +A - идентификатор блока памяти +C - 3Eh + +выходные данные: +A - код ошибки, если CF=1 + +Функция освобождает выделенный ранее блок памяти. Нельзя освободить +блок памяти, выделенный другим приложением. + +3Fh (63) SETMEM (Изменение блока памяти) +входные данные: +A - идентификатор блока памяти +B - новый размер блока +C - 3Fh + +выходные данные: +A - код ошибки, если CF=1 + +Функция позволяет уменьшить или расширить выделенный ранее блок памяти. +Нельзя изменить блок памяти, выделенный другим приложением. +Функции для работы с клавиатурой: + При наборе символов на клавиатуре каждое нажатие клавиш воспринимает +специальная программа драйвер клавиатуры. Каждая клавиша имеет номер (от 0 до +90), который определяет её позицию на клавиатуре. Таблица всех кодов клавиш +приведена в приложении. + Каждое нажатие или отпускание клавиши вызывает прерывание. Программа, +обслуживающая это прерывание, читает scan-код и преобразует его в два байта. +Первый байт содержит символьный ASCII код, а второй - позиционный код. Первый +байт получается преобразованием позиционного кода клавиши по определённой +процедуре в зависимости от состояния клавиш Shift, Alt, Ctrl, Caps Lock и Num +Lock, от режима латиница или кириллица и от раскладки клавиатуры в символьный +(ASCII) код. Для специальных клавиш, например функциональный или клавиш +управления курсором, код ASCII равен нулю. Это позволяет программе различать +обычные печатные символы и нажатия других клавиш. + Драйвер записывает эти два байта в буфер клавиатуры, который может +хранить информацию о 15 нажатий на клавиши. Кроме этого, драйвер отслеживает +информацию о состоянии некоторых клавиш, таких как Shift, Alt, Ctrl, Caps Lock, +Num Lock, Scroll Lock и др. + Чтобы считать очередную клавишу из буфера клавиатуры, нужно воспользоваться +одной из функций работы с клавиатуры. Функции возвращают в регистре E ASCII код +клавиши, в регистре D её позиционный код. Если установлен седьмой бит регистра +D, это означает что нажата не одна клавиша, а одновременно с ней нажаты , + или . +В регистре B указываются какие именно клавиши удерживаются: +D7 = 1 - удерживается левый +D6 = 1 - удерживается правый +D5 = 1 - удерживается +D4 = 1 - удерживается +D3 = 1 - удерживается левый +D2 = 1 - удерживается левый +D1 = 1 - удерживается правый +D0 = 1 - удерживается правый + +Биты 5 и 4 указывают, что удерживаются любой , правый или левый. +В регистре C указываются режимы ввода: +D7 = 1 - RUS, 0 - LAT +D6 - зарезервирован +D5 - зарезервирован +D4 - зарезервирован +D3 = 1 - режим Num Lock +D2 = 1 - режим Scroll Lock +D1 = 1 - режим Insert +D0 = 1 - режим Caps Lock + + +30h (48) WAITKEY (Ожидание символа с клавиатуры) +входные данные: +C - 30h +выходные данные: +A - код символа +D - позиционный код +Е - ASCII код +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция читает информацию об очередном нажатии из буфера клавиатуры. +Если буфер пуст, ожидает появления информации. В регистре E выдается ASCII код +символа, а в регистре D - позиционный код клавиши (0..127). Если бит 7 регистра +D установлен - это означает, что вместе с клавишей удерживается Ctrl/Alt/Shift. +Регистр A дублирует содержимое регистра E для удобства в написании программ. +Пример: +LOOP LD C,30h ;Функция ожидания нажатия клавиши + RST 10h ;Выполнение функции + CP 0Dh ;Нажата ? + JP Z,ENTER ;если да, то ввод + LD HL,011Bh ;Позиционный и ASCII код клавиши <Еsc> + AND A ; + SBC HL,DE ;Нажата ? + JP Z,EXIT ;если да, то выход + JP LOOP ;иначе, повторить ожидание клавиши + + 31h (49) SCANKEY (Опрос клавиатуры без ожидания) + +входные данные: +C - 31h +выходные данные: +ZF - нет клавиш +A - код символа +D - позиционный код +Е - ASCII код +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция возвращает флаг Z, если буфер клавиатуры пуст. Иначе читает +информацию об очередном нажатии из буфера клавиатуры. Возвращаемые регистры, как +и в функции 30h (WAITKEY). +Пример: +NO_KEYS + LD C,31h ;Функция опроса клавиатуры без ожидания + RST 10h ;Выполнение функции + JR Z,NO_KEYS ;Если клавиша не нажата повторить опрос + BIT 7,D ;Нажата одна клавиша? + JP Z,ONEKEY ;Если да, переход + LD A,B + AND 0C0h ;Биты 7 и 6 равны 0 + JP NZ,SHIFT ;Если нет, то нажаты +<клавиша> + BIT 5,B ;Бит Ctrl в нуле? + JP NZ,CTRL ;Если нет, то нажаты +<клавиша> + BIT 4,B ;Бит Alt в нуле? + JP NZ,CTRL ;Если нет, то нажаты +<клавиша> +ONEKEY + CP 0Dh ;Нажата ? + JP Z,ENTER ;если да, то ввод + LD HL,011Bh ;Позиционный и ASCII код клавиши <Еsc> + AND A ; + SBC HL,DE ;Нажата ? + JP Z,EXIT ;если да, то выход + + + 32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью) + +входные данные: +C - 32h +выходные данные: +A - код символа +D - позиционный код +Е - ASCII код +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция аналогична функции 30h, но после получения кода символа он +печатается на экране. Возвращаемые регистры, как и в функции 30h (WAITKEY). + +33h (51) CTRLKEY (Получить состояние клавиатуры) +входные данные: +C - 33h +выходные данные: +A = 0 - нет символов в буфере +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция возвращает состояние клавиатуры на данный момент. То есть, данные +берутся не из буфера клавиатуры (как в остальных функциях), а непосредственно из +результатов последнего сканирования клавиатуры. Регистр A равен нулю, если буфер +клавиатуры пуст. + +35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию) +входные данные: +B - номер функции 30h, 31h, 32h, 33h или 34h +C - 35h + +выходные данные: +В зависимости от указанной функции в регистре B. +Функция очищает буфер клавиатуры, после чего выполняет функцию указанную +в регистре B. Она позволяет предотвратить использование программой +символов, введенных с опережением. Например, команда FORMAT очищает буфер +клавиатуры перед запросом о необходимости форматировать диск. Поэтому случайное +наличие в буфере символа, разрешающего форматирование, не вызовет +действительного форматирования. + +36h (54) K_SETUP (Управление настройками клавиатуры) +входные данные: +B - номер подфункции +C - 36h + +выходные данные: +В зависимости от указанной функции в регистре B. +Функция управления клавиатурой. +B = 0, установить раскладку клавиатуры +A - номер раскладки +0 - normal +1 - shift +2 - caps lock +3 - caps lock + shift +4 - normal (альтернативная кл.) +5 - shift (альтернативная кл.) +6 - caps lock (альтернативная кл.) +7 - caps lock + shift (альтернативная кл.) + +B = 1, получить состояние звуковых переменных +B = 2, установить звуковые переменные +A - значение переменной +D0 - сигнал переполнения буфера клавиатуры +D1 - сигнал переключения на альтернативную раскладку клавиатуры + + +37h (55) TESTKEY (Опрос буфера клавиатуры) +входные данные: +C - 37h +выходные данные: +ZF - нет символов в буфере +A - код символа +D - позиционный код +Е - ASCII код +C - D7 - RUS/LAT +D3 - Num Lock +D2 - Scroll Lock +D1 - Insert +D0 - Caps Lock +B - D7 - Left Shift +D6 - Right Shift +D5 - Ctrl +D4 - Alt +D3 - Left Ctrl +D2 - Left Alt +D1 - Right Ctrl +D0 - Right Alt + +Функция возвращает флаг Z, если буфер клавиатуры пуст. Иначе читает +информацию об очередном нажатии из буфера клавиатуры. Возвращаемые регистры, как +и в функции 30h (WAITKEY). Информация о нажатии остается в буфере. + +Запуск приложений: + Программы хранятся на диске, как программные (выполняемые) файлы. Одна +из основных задач операционной системы - организовать их выполнение. +Командная строка для выполнения программ имеет формат: +[устройство:][\путь\]имя [параметры] + Устройство и путь указывают место нахождения приложения на диске. Если +они пропущены, поиск осуществляется в текущем каталоге текущего диска. Если +указано расширение файла, оно игнорируется, так как, у программных файлов +расширение может быть только EXE. + EXE файлы состоят из двух частей, префикса и выполнимого модуля. Префикс +содержит в себе различную вспомогательную информацию: +Префикс EXE файла: + +00 2 dw 5845h ; Идентификатор EXE файла + +02 1 db 45h ; Зарезервирован + +03 1 db 00h ; Версия EXE файла + +04 4 dd 00000200h ; Начало исполняемого кода (смещение в байтах) + +08 2 dw 0000h ; Размер первичного загрузчика или 0 + +10 4 dd 00000000h ; Зарезервированы + +14 2 dw 0000h ; Зарезервированы + +16 2 dw ???? ; Адрес расположения кода в памяти + +18 2 dw ???? ; Адрес запуска (регистр PC) + +20 2 dw ???? ; Адрес расположения стека (регистр SP) + +22 490 ds 0 ; Зарезервированы + + +512 ; Код программы + + + 40h (64) EXEC (Выполнить файл) + +входные данные: +HL - указатель на файловую спецификацию +B = 0 - загрузить и выполнить программу +C - 40h + +выходные данные: +A - код завершения, если CF=0 +код ошибки, если CF=1 +Выполнение EXE-файла осуществляется по следующим пунктам: +1) Открывает exe-файл на чтение; +2) Считывает в рабочую область префикс exe-файла; +3) Выделяет блок памяти, требуемый для загрузки всего файла или первичного +загрузчика, если его размер не равен нулю; +4) Сохраняет стек; +5) Подключает страницы из выделенного блока; +6) Строит префикс запуска программы и устанавливает на него регистр IX; +7) Считывает файл по адресу указанному в смещении 16 (Адрес расположения кода в +памяти); +8) Закрывает exe-файл, если это не первичный загрузчик; +9) Устанавливает стек равным значению из смещения 20 (Адрес расположения стека); +10) Передает управление по адресу указанному в смещении 18 (Адрес запуска); + +Префикс запуска файла: +-03 1 db ? ; Файловый манипулятор, если exe-файл с первичным загрузчиком +-02 1 db ? ; Идентификатор блока памяти +-01 1 db ? ; Уровень текущей программы ++00 1 db ? ; Длинна командной строки ++01 127 ds ? ; Параметры командной строки, заканчивается нулем + +Пример: + LD HL,NAME ;HL указывает на ASCIIZ строку с именем еxe-файла + LD C,40h ;Функция выполнения файла + LD B,00h ;Подфункция загрузить и выполнить + RST 10h ;Выполнение функции + RET C ;Возврат по ошибке + LD (ENDCODE),A ;Сохранение кода завершения + +NAME DB “\PROG\UTILITY\prog.exe”,0 +ENDCODE DB 00h + + + 41h (65) EXIT (Завершение программы) + +входные данные: +B - код завершения +C - 41h + +выходные данные: +A - код ошибки, если CF=1 + +Функция завершает выполнение текущей программы, освобождает занимаемую +память и передаёт код завершения в родительную программу. Код завершения +также сохраняется в системной переменной ДОС и его можно позднее получить при +помощи функции 42h (WAIT). + + +42h (66) WAIT (Получить код завершения программы) +входные данные: +C - 42h +выходные данные: +A - код завершения +Функция возвращает код завершения, последней завершенной программы. + + + +Функции для работа с командной строкой: + +43h (67) GSWITCH (Выделить параметр командной строки) +входные данные: +HL - указатель командной строки +DE - буфер для выделяемого параметра +C - 43h + +выходные данные: +HL - указатель на следующий параметр командной строки +CF=0 - конец строки не достигнут (есть другие параметры) +CF=1 - конец строки (в буфер перенесён последний параметр или ноль) +Функция выделяет параметр командной строки. Параметрами считаются +любые последовательности символов разделённые пробелами. Ведущие пробелы +игнорируются. Параметр в буфере завершается кодом ноль, если параметры +отсутствуют, в буфер записывается ноль. +Пример: + LD HL,COMLINE ;HL указывает на командную строку +NEXTP LD DE,BUFFER ;DE указывает на буфер для параметров + LD C,43h ;Функция выделения параметра + RST 10h ;Выполнение функции + PUSH AF + PUSH HL + . +. Обработка параметра командной строки + . + POP HL + POP AF + JP NC,NEXTP + + +COMLINE DB “file1.txt file2.txt -x”,0 +BUFFER DS 127,0 + + + 44h (68) DOSNAME (Преобразовать имя файла) + +входные данные: + C - 44h + B = 0, преобразовать из 11 символьного формата в формат ДОС +HL - 11 символов имени файла +DE - буфер для имени в формате ДОС + B = 1, преобразовать из формата ДОС в 11 символьный формат +HL - имя файла в формате ДОС +DE - 11 символов имени файла + + db “name.ext”,0 ; формат ДОС + db “name ext” ; 11 символьный формат + +выходные данные: +A - код ошибки, если CF=1 +Функция преобразовывает имя файла из 11 символьного формата в формат ДОС и обратно. + + + 45h (69) EXCMDLN (Разбор командной строки) + +входные данные: + + HL - указатель командной строки + DE - указатель на буфер пользователя + C - 45h + B - номер подфункции: + 0 - Разобрать строку; + 1 - Выделить имя диска; + 2 - Выделить директорию; + 3 - Выделить имя файла; + 4 - Выделить расширение файла; + 5 - Выделить имя диска, путь к файлу, имя файла и расширение
 файла; + 6 - Зарезервирована; + 7 - Выделить параметр командной строки; + 8 - преобразовать из 11 символьного формата в формат ДОС; + 9 - преобразовать из формата ДОС в 11 символьный формат; + +Функция осуществляет разбор командной строки в зависимости от номера подфункции в регистре B. + + + Подфункция 0 - Разобрать строку: + +входные данные: + + HL - указатель командной строки + C - 45h + B = 0 - Разобрать строку + +выходные данные: + + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + + Функция осуществляет разбор командной строки и возвращает результат в регистре A. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD C,45h ; Функция разбор командной строки + LD B,0 ; Подфункция разобрать строку + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D2, D3. + +STRING db "c:\dir1\name",0 + + + Подфункция 1 - Выделить имя диска: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 13 байт) + C - 45h + B = 1 - Выделить имя диска + +выходные данные: + + A - номер диска (0 - A, 1 - B, 2 - C и т.д.) + буфер - имя диска "A:",0 + +Функция осуществляет разбор командной строки и копирует в буфер имя диска, если имя диска не указывалось в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,1 ; Подфункция выделить имя диска + RST 10h ; Выполнение функции + ; В регистре A будет 2 (drive C:) + ; В буфере "C:",0 + +STRING db "c:\dir1\name",0 + +BUFFER ds 13 + + Подфункция 2 - Выделить директорию: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 256 байт) + C - 45h + B = 2 - Выделить директорию + +выходные данные: + + буфер - директория "DIR1\DIR2\DIR3\",0 + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буфер путь к файлу, если директория не указывалась в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,2 ; Подфункция выделить директорию + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере "\DIR1\DIR2\",0 + +STRING db "c:\dir1\dir2\name.ext",0 + +BUFFER ds 256 + + + Подфункция 3 - Выделить имя файла: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 13 байт) + C - 45h + B = 3 - Выделить имя файла + +выходные данные: + + буфер - имя файла "FILE.EXT",0 + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буфер имя файла и расширение файла, если имя файла не указывалась в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,3 ; Подфункция выделить имя файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере "name.ext",0 + +STRING db "c:\dir1\dir2\name.ext",0 + +BUFFER ds 13 + + + Подфункция 4 - Выделить расширение файла: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 4 байт) + C - 45h + B = 4 - Выделить расширение файла + +выходные данные: + + буфер - расширение "TXT",0 или "C ",0 + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буфер расширение файла, если расширение файла не указывалось в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,BUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,4 ; Подфункция выделить расширение файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере "ext",0 + +STRING db "c:\dir1\dir2\name.ext",0 + +BUFFER ds 4 + + + Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла: + +входные данные: + + HL - указатель командной строки + DE - буфер (макс. 8 байт) + +0 адрес буфера для имени диска (макс. 13 байт) + +2 адрес буфера для директории (макс. 256 байт) + +3 адрес буфера для имени файла (макс. 13 байт) + +4 адрес буфера для расширения файла (макс. 4 байта) + C - 45h + B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла + +выходные данные: + + A - D7 - В строке обнаружены символы ? или * + D3 - В строке указано имя диска; + D2 - В строке указан путь к файлу; + D1 - В строке указано расширение файла; + D0 - В строке указано имя файла; + +Функция осуществляет разбор командной строки и копирует в буферы обнаруженные элементы командной строки, если какой-либо элемент не указывался в буфер помещается 0. + +Пример: + LD HL,STRING ; HL указывает на строку для разбора + LD DE,PBUFFER ; DE указывает на буфер + LD C,45h ; Функция разбор командной строки + LD B,5 ; Подфункция выделить расширение файла + RST 10h ; Выполнение функции + ; В регистре A будут установлены разряды D0, D1, D2, D3. + ; В буфере DRIVE_A "C:",0 + ; В буфере DIR_A "\DIR1\DIR2\",0 + ; В буфере NAME_A "NAME.EXT",0 + ; В буфере TYPE_A "EXT",0 + +STRING db "c:\dir1\dir2\name.ext",0 + +PBUFFER dw DRIVE_A + dw DIR_A + dw NAME_A + dw TYPE_A + +DRIVE_A ds 13 +DIR_A ds 256 +NAME_A ds 13 +TYPE_A ds 4 + + + + + Подфункция 7 - Выделить параметр командной строки: + +входные данные: + + HL - указатель командной строки + DE - буфер для выделяемого параметра (макс. 256 байт) + C - 45h + B = 7 - Выделить параметр командной строки + +выходные данные: + + HL - указатель на следующий параметр командной строки + CF=0 - конец строки не достигнут (есть другие параметры) + CF=1 - конец строки (в буфер перенесён последний параметр или 
 ноль) + +Функция выделяет параметр командной строки. Параметрами считаются любые последовательности символов разделённые пробелами. Ведущие пробелы игнорируются. Параметр в буфере завершается кодом ноль, если параметры отсутствуют, в буфер записывается ноль. + + Подфункция 8 - преобразовать из 11 символьного формата в формат ДОС: + +входные данные: + + HL - 11 символов имени файла + DE - буфер для имени в формате ДОС + C - 45h + B = 8 - преобразовать из 11 символьного формата в формат ДОС + + db "name.ext",0 ; формат ДОС + db "name ext" ; 11 символьный формат + +выходные данные: + + A - код ошибки, если CF=1 + + Функция преобразовывает имя файла из 11 символьного формата в формат ДОС. + + Подфункция 9 - преобразовать из формата ДОС в 11 символьный формат: + +входные данные: + + HL - имя файла в формате ДОС + DE - буфер для 11 символов имени файла + C - 45h + B = 9 - преобразовать из формата ДОС в 11 символьный формат + + db "name.ext",0 ; формат ДОС + db "name ext" ; 11 символьный формат + +выходные данные: + + A - код ошибки, если CF=1 + +Функция преобразовывает имя файла из формата ДОС в 11 символьный формат. В имени файла допускаются глобальные символы ? и *. В этом случае символ * будет заменен на несколько символов ? . Например "name*.c*", будет преобразован в "name????c??". + +Работа с экраном: + + Сейчас DOS поддерживает четыре режима экрана. + Два текстовых: + 40x32 символов c 16 цветами (режим 02h); + 80x32 символов c 16 цветами (режим 03h); + и два графических: + 320x256 точек с 256 цветами (режим 81h); + 640x256 точек с 16 цветами (режим 82h); + Основным режимом является текстовый режим 80x32 (03h), если ваша программа работает в другом режиме, то вам следует перед переключением режима получить номер текущего режима функцией 51h GETVMOD и сохранить его, а перед завершением программы восстановить его. + + Например: + + LD C,51h ;получить режим экрана + RST 10h + LD C,A ;поместить номер режима экрана в регистр C + PUSH BC ;и сохранить на стеке (B - страница, C - режим) + . + . ;ваша программа + . + + POP BC ;взять со стека режим экрана + LD A,C ;поместить номер режима экрана в регистр A + LD C,50h ;установить режим экрана + RST 10h + LD C,41h ;завершить программу. + RST 10h + + DOS имеет функции вывода на текстовый экран символов и символьных строк. Для графических режимов требуются собственные процедуры вывода на экран. Например, при завершении программы вы можете выдать строку на текстовый экран: + + LD HL,STRING ;указатель на строку символов + LD C,5Ch ;вывод строки символов + RST 10h + +STRING DB "Thank you for using my program..." ;текстовая строка + DB 13,10 ;символы возврата каретки и перевода строки + DB 0 ;символ конца строки + + Для вывода на графический экран, вам необходимо подключить видео память в одно из трех окон памяти 04000h-07FFFh, 08000h-0BFFFh, 0C000h-0FFFFh. Это осуществляется выводом значения 50h в соответствующий порт 0A2h, 0C2h или 0E2h в зависимости от окна памяти. При подключении обратите внимание на то, чтобы стек вашей программы не попадал в это адресное пространство. + +Например, если вам нужно поставить точку на экране, то подпрограмма для режима 81h будет выглядеть так: + +; HL - горизонтальная координата +; DE - вертикальная координата + + IN A,(0E2h) ;считать из порта номер страницы подключенной в + ;третье окно памяти + LD C,A ;запомнить в регистре C + LD A,50h ;страница видео памяти + OUT (0E2h),A ;подключение видео памяти + LD A,E ;поместить вертикальную координату в регистр A. + OUT (89h),A ;выдать в порт + LD DE,0C000h ;адрес начала третьего окна памяти + ADD HL,DE ;получить адрес точки (адрес начала окна + + ;горизонтальная координата) + LD A,255 ;цвет выводимой точки (от 0 до 255) + LD (HL),A ;вывод точки на экран + LD A,C ;вспомнить номер страницы памяти + OUT (0E2h) ;подключить страницу памяти вместо страницы видео + ;памяти + + Перед выводом точек следует установить необходимые цвета в палитре. Различные режимы вывода на экран задаются номером видео страницы от 50h до 5Fh. Подробнее о режимах вывода вы можете прочитать в описании архитектуры компьютера. + +50h (80) SETVMOD (Выбор режима экрана) +входные данные: +A - режим экрана +02h - текстовый 40x32x16 цветов +03h - текстовый 80x32x16 цветов +81h - графический 320x256x256 цветов +82h - графический 640x256x16 цветов +B - страница экрана 0/1 +C - 50h + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает режим экрана. Седьмой бит режима экрана установлен +для графических режимов и сброшен для текстовых. Существуют два текстовых режима +и два графических. + +51h (81) GETVMOD (Получить текущий режим экрана) +входные данные: +C - 51h +выходные данные: +A - текущий режим экрана +Функция возвращает текущий режим экрана. + +52h (82) LOCATE (Установить позицию курсора) +входные данные: +D - строка курсора +E - столбец курсора +C - 52h + +Функция устанавливает новую позицию курсора. Вывод символов будет +производиться в эту позицию. Верхний левый угол имеет координаты (0,0). + + +53h (83) CURSOR (Получить текущую позицию курсора) +входные данные: +C - 53h +выходные данные: +D - строка курсора +E - столбец курсора + +Функция возвращает текущую позицию курсора. + +54h (84) SELPAGE (Выбрать активную страницу экрана) +входные данные: +B - страница экрана 0/1 +C - 54h + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает активную страницу, которая будет выводиться на экран. + +55h (85) SCROLL (Прокрутка окна) +входные данные: +D - строка левого верхнего угла окна +E - столбец левого верхнего угла окна +H - высота окна +L - ширина окна +B = 1 - прокрутка вверх +B = 2 - прокрутка вниз +A = 0 - очищать строку +C - 55h + +Функция определяет окно активной видеостраницы и его содержимое +перемещается вверх или в низ на одну строку. Если регистр A равен нулю, +освобождённая строка очищается (заполняется пробелами). + +56h (86) CLEAR (Очистка окна) +входные данные: +D - строка левого верхнего угла окна +E - столбец левого верхнего угла окна +H - высота окна +L - ширина окна +B - атрибут заполнитель +A - символ заполнитель +C - 56h + +Функция очищает окно экрана, записывая во все позиции окна символ с кодом +из регистра A и атрибутом из регистра B. + +57h (87) RDCHAR (Считать символ с экрана) +входные данные: +D - строка +E - столбец +C - 57h + +выходные данные: +A - символ +B - атрибут + +Функция считывает символ и его атрибут из позиции заданной регистрами D и E. + +58h (88) WRCHAR (Напечатать символ на экране) +входные данные: +D - строка +E - столбец +A - символ +B - атрибут +C - 58h + +Функция печатает символ и атрибут на экране в позиции заданной регистрами D +и E. Управляющие символы выводятся как обычные символы. + +59h (89) WINCOPY (Запомнить окно экрана) +входные данные: +D - строка +E - столбец левого верхнего угла окна +H - высота окна +L - ширина окна +B - страница буфера +IX - адрес буфера +C - 59h + +Функция копирует окно в память на страницу заданную в регистре B и по +адресу заданному в регистре IX. Если значение IX меньше 0C000h, копирование +производится в страницу памяти подключенную по этому адресу. В буфере получается +массив из идущих подряд символов и атрибутов. + +5Ah (90) WINREST (Восстановить окно экрана) +входные данные: +D - строка +E - столбец левого верхнего угла окна +H - высота окна +L - ширина окна +B - страница буфера +IX - адрес буфера +C - 5Ah + +Функция выполняет обратное копирование окна из памяти на странице заданной +в регистре B и с адреса заданного в регистре IX. Если значение IX меньше +0C000h, копирование производится из страницы памяти подключенной по этому +адресу. +5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора) +входные данные: +A - символ +C - 5Bh + +Функция печатает символ на экране в текущей позиции курсора. После +печати символа текущая позиция увеличивается. Печать осуществляется с +управляющими кодами. + +5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора) +входные данные: +HL - указатель на начало строки символов +C - 5Ch + +Функция печатает строку символов на экране в текущей позиции курсора. +При печати текущая позиция увеличивается. Печать осуществляется с +управляющими кодами. Строка должна заканчиваться кодом ноль. + +5Fh (95) PRINT (Вывод символа на принтер без ожидания) +входные данные: +A - символ +C - 5Fh + +выходные данные: +B - символ +CF = 1 - принтер не готов + +Функция посылает символ на принтер. Если принтер не готов принимать символ, +то выставляется флаг переноса (CF). +Пример: +LD HL,TEXT ;HL указывает на текстовый массив, который +NPRINT +PUSH BC ;необходимо распечатать на принтере +APRINT + PUSH HL ;Сохраняем указатель текущего символа + LD A,(HL) ;Берём очередной символ и печатаем + LD C,5Fh ;Функция печати символа + RST 10h ;Выполнение функции + JR NC,PRNOK ;Переход на печать следующего символа +;Принтер не готов, ожидаем пока не нажата [Esc] + LD C,31h ;Функция опроса клавиатуры без ожидания + RST 10h ;Выполнение функции + POP HL ;Восстанавливаем указатель на текущий символ + JR Z,APRINT ;Клавиши не нажимались + CP 1Bh ;Нажата клавиша [Esc]? + JR NZ,APRINT ;если нет, повторяем печать + POP BC ;Восстанавливаем счетчик символов +;Печать прервана (пользователь нажал [Esc]) +SCF +RET +PRNOK POP HL ;Восстанавливаем указатель на текущий символ + POP BC ;Восстанавливаем счетчик символов + INC HL ;Переходим к следующему символу + DEC BC ;Уменьшаем счетчик символов + LD A,B ;Счетчик равен нулю? + OR C + JP NZ,NPRINT ;если нет, продолжаем печать +;Успешно напечатаны все символы +XOR A +RET + + +Интерфейс для работы с мышью: + Взаимодействие с драйвером мыши осуществляется при помощи инструкции RST 30h. +В зависимости от конкретной функции, в качестве входных и выходных параметров +используются различные регистры, при этом номер функции задается в регистре C. +Любые перемещения мыши и нажатие на клавиши воспринимает специальная программа +драйвер мыши. Каждое нажатие и отпускание клавиш или перемещение мыши вызывает +прерывание. Программа, обслуживающая это прерывание, читает пакет данных от мыши +и перемещает курсор мыши в зависимости от полученных данных. + +00h (00) INITIALIZATION (Инициализация драйвера мыши) +входные данные: +C - 00h +выходные данные: +A - драйвер не установлен, если CF=1 +A - успешная инициализация, драйвер установлен, если CF=0 +Функция производит начальную инициализацию драйвера мыши. При возвращении флага +переноса драйвер не установлен. + +01h (01) SHOW MOUSE CURSOR (Вывести курсор мыши на экран) +входные данные: +C - 01h +выходные данные: +A - код ошибки, если CF=1 +Функция выводит на экран курсор мыши и отслеживает все перемещения курсора и +перерисовывает его. + +02h (02) HIDE MOUSE CURSOR (Убрать курсор мыши с экрана) +входные данные: +C - 02h +выходные данные: +A - код ошибки, если CF=1 +Функция стирает курсор мыши с экрана, но драйвер продолжает отслеживание +перемещения мыши и нажатие на кнопки. + +03h (03) READ MOUSE STATE (Чтение состояния мыши) +входные данные: +C - 03h +выходные данные: +A - код ошибки, если CF=1 +A - состояние кнопок +D0 - левая +D1 - правая +HL - x-координата +DE - y-координата + +Функция возвращает текущие координаты курсора мыши и состояние ее кнопок. +Координаты возвращаются в точках и для текстовых режимов необходимо их делить +на восемь для получения координат в знакоместах. + +04h (04) GOTO MOUSE CURSOR (Установка координат курсора мыши) +входные данные: +C - 04h +HL - x-координата +DE - y-координата + +выходные данные: +A - код ошибки, если CF=1 +Установка координат курсора мыши. Функция перемещает курсор мыши в заданные +координаты. + +07h (07) VERT. BOUNDS (Задание вертикальных границ перемещения курсора) +входные данные: +C - 07h +HL - y-минимальная +DE - y-максимальная + +выходные данные: +A - код ошибки, если CF=1 +Функция задает верхнюю минимальную и нижнюю максимальную координаты в которых +может перемещаться курсор мыши по вертикали. + +08h (08) HORZ. BOUNDS (Задание горизонтальных границ перемещения курсора) +входные данные: +C - 08h +HL - x-минимальная +DE - x-максимальная + +выходные данные: +A - код ошибки, если CF=1 +Функция задает левую минимальную и правую максимальную координаты в которых +может перемещаться курсор мыши по горизонтали. + +09h (09) LOAD CURSOR (Загрузка изображения курсора мыши) +входные данные: +C - 09h +B = 0 +IX - изображение курсора +H - высота курсора +L - ширина курсора +D - Y активная точка +E - X активная точка + + +выходные данные: +A - код ошибки, если CF=1 + +Функция загружает новое изображение курсора мыши в драйвер и задать активную +точку изображения. + + + +0Ah (10) CURSOR TEXT MODES (Установка курсора мыши в текстовом режиме) +входные данные: +C - 0Ah +B = 0 +H - AND SIMBOL MASK +L - XOR SIMBOL MASK +D - AND ATTRIBUT MASK +E - XOR ATTRIBUT MASK + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает символ и атрибут курсора мыши для текстового режима. + +0Bh (11) RETURN CURSOR (Получение изображения курсора мыши) +входные данные: +C - 0Bh +IX - буфер для изображения курсора + +выходные данные: +A - код ошибки, если CF=1 +H - высота курсора +L - ширина курсора +D - Y активная точка +E - X активная точка + +Функция возвращает изображение курсора мыши из драйвера. + +0Eh (14) GET SENSETIVE (Чтение чувствительности мыши) +входные данные: +C - 0Eh +выходные данные: +A - код ошибки, если CF=1 +H - чувствительность по вертикали +L - чувствительность по горизонтали + +Функция возвращает значения чувствительности перемещения мыши по вертикали и +горизонтали. + +0Fh (15) SET SENSETIVE (Установка чувствительности мыши) +входные данные: +C - 0Fh +H - чувствительность по вертикали +L - чувствительность по горизонтали + +выходные данные: +A - код ошибки, если CF=1 +Функция устанавливает значения чувствительности перемещения мыши по вертикали +и горизонтали. + +80h (128) MOUSE HARDWARE INTERRUPT (Обработчик аппаратного прерывания от мыши) +входные данные: +C - 80h +выходные данные: +A - код ошибки, если CF=1 +По приходу прерывания от мыши вызывается данная функция драйвера. В случае +когда требуется работа подпрограммы при запрещенных прерываниях, используйте +данную функцию, для избежания потерь пакетов данных от мыши. + +81h (129) CHANGE VIDEO MODE (Информирование о смене режима экрана) +входные данные: +C - 81h +A - режим экрана + +выходные данные: +A - код ошибки, если CF=1 + +Функция информирует драйвер мыши об изменении режима экрана. Номера режимов +соответствуют функции установка режима экрана. + +83h (131) MOUSE REFRESH (Принудительная перерисовка курсора) +входные данные: +C - 83h +выходные данные: +A - код ошибки, если CF=1 +Функция перерисовывает изображение курсора мыши на экране не дожидаясь +очередного прерывания. +коды ошибок от драйвера мыши: +0 - нет ошибок +1 - неизвестная функция +2 - зарезервирована +3 - курсор уже на экране +4 - курсор отсутствует на экране +5 - изображение курсора слишком велико + + + + + + + + + + + + + + + + + + + + + + + + + +Приложение А. Коды ошибок DOS +00h (00) - нет ошибок +01h (01) - неверный номер функции +02h (02) - неправильный номер устройства +03h (03) - файл не обнаружен +04h (04) - неверный путь +05h (05) - несуществующий файловый манипулятор +06h (06) - нет свободного файлового манипулятора +07h (07) - файл существует +08h (08) - файл только для чтения +09h (09) - переполнение ROOT (корневого каталога) +0Ah (10) - нет свободного места на диске +0Bh (11) - каталог не пуст +0Ch (12) - попытка удалить текущий каталог +0Dh (13) - неизвестный формат +0Eh (14) - невозможная операция +0Fh (15) - каталог уже есть +10h (16) - неверное имя +11h (17) - неправильный EXE-файл +12h (18) - не поддерживаемая версия EXE-файла +13h (19) - ресурс не доступен +14h (20) - нет готовности +15h (21) - ошибка позиционирования +16h (22) - сектор не найден +17h (23) - ошибка CRC +18h (24) - защита записи +19h (25) - ошибка чтения +1Ah (26) - ошибка записи +1Bh (27) - общая ошибка +1Ch (28) - зарезервирован +1Dh (29) - зарезервирован +1Eh (30) - недостаточно памяти +1Fh (31) - несуществующий блок памяти +20h (32) – зарезервирован + + + + + + + + + + + + + + + + + + + + + + + + + + +Приложение Б. Таблица позиционных кодов
 +Key +ASCII +SCAN +key +ASCII +SCAN +` +000h +000h +V +056h +02Dh +Esc +01Bh +001h +B +042h +02Eh +1 +031h +002h +N +04Eh +02Fh +2 +032h +003h +M +04Dh +030h +3 +033h +004h +, +02Ch +031h +4 +034h +005h +. +02Eh +032h +5 +035h +006h +/ +02Fh +033h +6 +036h +007h +RShift +--- +034h +7 +037h +008h +\ +05Ch +035h +8 +038h +009h +LCtrl +--- +036h +9 +039h +00Ah +LAlt +--- +037h +0 +030h +00Bh +Space +020h +038h +- +02Dh +00Ch +RAlt +--- +039h += +03Dh +00Dh +RCtrl +--- +03Ah +BackSpace +008h +00Eh +F1 +000h +03Bh +Tab +009h +00Fh +F2 +000h +03Ch +Q +051h +010h +F3 +000h +03Dh +W +057h +011h +F4 +000h +03Eh +E +045h +012h +F5 +000h +03Fh +R +052h +013h +F6 +000h +040h +T +054h +014h +F7 +000h +041h +Y +059h +015h +F8 +000h +042h +U +055h +016h +F9 +000h +043h +I +049h +017h +F10 +000h +044h +O +04Fh +018h +F11 +000h +045h +P +050h +019h +F12 +000h +046h +[ +05Bh +01Ah +PrScrn +--- +047h +] +05Dh +01Bh +ScrlLock +000h +048h +CapsLock +000h +01Ch +NumLock +000h +049h +A +041h +01Dh +/ +02Fh +04Ah +S +053h +01Eh +* +02Ah +04Bh +D +044h +01Fh +- +02Dh +04Ch +F +046h +020h ++ +02Bh +04Dh +G +047h +021h +Enter +00Dh +04Eh +H +048h +022h +Del . +000h +04Fh +J +04Ah +023h +Ins 0 +000h +050h +K +04Bh +024h +End 1 +000h +051h +L +04Ch +025h +Down 2 +000h +052h +; +03Bh +026h +PgDn 3 +000h +053h +' +027h +027h +Left 4 +000h +054h +Enter +00Dh +028h +5 +000h +055h +LShift +--- +029h +Right 6 +000h +056h +Z +05Ah +02Ah +Home 7 +000h +057h +X +058h +02Bh +Up 8 +000h +058h +C +043h +02Ch +PgUp 9 +000h +059h + + + + + + + + + + + + +Приложение В. Байт атрибутов текстового экрана + + +бит 7 - Признак мерцания символа +биты 6,5,4 - Цвет фона символа 8 цветов (0...7) RGB +биты 3,2,1,0 - Цвет символа 16 цветов (0...15) IRGB + + +Цвета для фона и для символа: + 0 0h 0000b - Чёрный + 1 1h 0001b - Синий + 2 2h 0010b - Зелёный + 3 3h 0011b - Голубой (циан) + 4 4h 0100b - Красный + 5 5h 0101b - Фиолетовый + 6 6h 0110b - Коричневый + 7 7h 0111b - Белый + + +Только для символа: + + 8 8h 1000b - Серый + 9 9h 1001b - Ярко-синий +10 Ah 1010b - Ярко-зелёный +11 Bh 1011b - Ярко-голубой +12 Ch 1100b - Ярко-красный +13 Dh 1101b - Ярко-фиолетовый +14 Eh 1110b - Жёлтый +15 Fh 1111b - Ярко-белый
 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Системные вызовы дисковой подсистемы (DSS) v1.55 +Системные вызовы +   Если программа выполняет не только некую математическую задачу на ассемблере, то в ней придется столкнуться с такими вещами, как получение ввода пользователя, выполнение вывода результатов и завершение своей работы. Для этого, необходимо обратиться к сервисам DSS. Фактически, программирование на языке ассемблера одинаково для любых систем, если не пользоваться их сервисами.
   Вызов функций DSS в системе Estex выполняется из ассемблера. Необходимые параметры указываются в различных регистрах, регистр C используется для указания номера функции.

Так, наша программа для Estex будет выглядеть наподобие: + + org #8100 ;адрес точки входа + + LD HL,MSG ;сообщение для вывода + LD C,5Ch ;номер системного вызова (PCHARS) + RST 10h ;вызов подсистемы + + LD C,41h ;номер системного вызова (EXIT) + RST 10h ;вызов подсистемы + +MSG db "Hello, world!",0Dh,0Ah ;наша стока + db 0 ;конец строки +Далее идет список категорий функций DSS для системы Estex +• Функции идентификации системы +• Функции для работы с диском +• Функции для работы с файлами +• Функции для работы с датой и временем +• Функции управления памятью +• Функции ввода с клавиатуры +• Функции для исполнения программ +• Функции для работы со строками и командной строкой +• Функции работы с экраном +• Функции для печати на принтере +Функции идентификации системы
 +00h (00) VERSION (Версия DSS) +Входные значения:
C - 00h +Выходные значения:
D - номер версии
E - модификация +Функции для работы с диском
 +01h (01) CHDISK (Смена текущего диска) +Входные значения:
A - номер диска (0-A,1-B...)
C - 01h +Выходные значения:
A - код ошибки, если CF=1
A - максимальный номер диска, если CF=0 +02h (02) CURDISK (Номер текущего диска) +Входные значения:
C - 02h +Выходные значения:
A - код ошибки, если CF=1
A - текущий номер диска (0-A,1-B...), если CF=0 +03h (03) DSKINFO (Информация о диске) +Входные значения:
A - номер диска (0-A,1-B...0FFh-текущий)
C - 03h +Выходные значения:
A - код ошибки, если CF=1
A - размер кластера в секторах, если CF=0
HL - общее кол-во кластеров
DE - свободных кластеров
BC - размер сектора в байтах +09h (09) BOOTDSK (Номер системного диска) +Входные значения:
C - 09h
B = 0 +Выходные значения:
A - код ошибки, если CF=1
A - номер системного диска (0-A,1-B...), если CF=0 +Функции для работы с файлами
 +0Ah (10) CREATE (Создание файла) +Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Ah +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 +0Bh (11) CREATE NEW FILE (Создание нового файла) +Входные значения:
HL - указатель на файловую спецификацию
A - атрибут файла
C - 0Bh +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 +0Eh (14) DELETE (Удаление файла) +Входные значения:
HL - указатель на файловую спецификацию
C - 0Eh +Выходные значения:
A - код ошибки, если CF=1 +10h (16) RENAME (Переименование файла) +Входные значения:
HL - указатель на старое имя файла
DE - указатель на новое имя файла
C - 10h +Выходные значения:
A - код ошибки, если CF=1 +11h (17) OPEN (Открытие файла) +Входные значения:
HL - указатель на файловую спецификацию
A - режим доступа
A=0 чтение/запись
A=1 чтение
A=2 запись
C - 11h +Выходные значения:
A - код ошибки, если CF=1
A - файловый манипулятор, если CF=0 +12h (18) CLOSE (Закрытие файла) +Входные значения:
A - файловый манипулятор
C - 12h +Выходные значения:
A - код ошибки, если CF=1 +13h (19) READ (Чтение из файла) +Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество читаемых байт
C - 13h +Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество прочитанных байт
если CF=0:
A = 0 прочитаны все байты
A = 0FFh прочитано меньшее число байт +14h (20) WRITE (Запись в файл) +Входные значения:
A - файловый манипулятор
HL - адрес в памяти
DE - количество записываемых байт
C - 14h +Выходные значения:
A - код ошибки, если CF=1
DE - реальное количество записанных байт +15h (21) MOVE_FP (Перемещение указателя в файле) +Входные значения:
A - файловый манипулятор
HL:IX - смещение указателя в файле
B - способ перемещения:
B=0 от начала файла
B=1 от текущего значения указателя
B=2 от конца файла
C - 15h +Выходные значения:
A - код ошибки, если CF=1
HL:IX - новое значение указателя +16h (22) ATTRIB (Получение/изменение атрибута файла) +Входные значения:
HL - указатель на файловую спецификацию
B - режим доступа
B = 0 получить атрибут
B = 1 установить атрибут
A - атрибут файла
C - 16h +Выходные значения:
A - код ошибки, если CF=1
A - атрибут файла, если CF=0 +17h (23) GET_D_T (Информация о дате и времени файла) +Входные значения:
A - файловый манипулятор
C - 17h +Выходные значения:
A - код ошибки, если CF=1
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды +18h (24) PUT_D_T (Изменение даты и времени файла) +Входные значения:
A - файловый манипулятор
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - 18h +Выходные значения:
A - код ошибки, если CF=1 +19h (25) F_FIRST (Поиск первого совпадающего файла) +Входные значения:
HL - указатель на файловую спецификацию
DE - рабочий буфер 44 байта, если B=0, иначе 256 байт
A - атрибуты, используемые при поиске
B = 0 - имя найденного файла в формате 11 байт "FilenameExt"
B = 1 - имя найденного файла в формате DOS "filename.ext",0
C - 19h +Выходные значения:
A - код ошибки, если CF=1 +1Ah (26) F_NEXT (Поиск следующего совпадающего файла) +Входные значения:
DE - указатель на рабочий буфер
C - 1Ah +Выходные значения:
A - код ошибки, если CF=1 +1Bh (27) MKDIR (Создание каталога) +Входные значения:
HL - указатель на файловую спецификацию
C - 1Bh +Выходные значения:
A - код ошибки, если CF=1 +1Ch (28) RMDIR (Устранение каталога) +Входные значения:
HL - указатель на файловую спецификацию
C - 1Ch +Выходные значения:
A - код ошибки, если CF=1 +1Dh (29) CHDIR (Смена текущего каталога) +Входные значения:
HL - указатель на файловую спецификацию
C - 1Dh +Выходные значения:
A - код ошибки, если CF=1 +1Eh (30) CURDIR (Информация о текущем каталоге) +Входные значения:
HL - буфер в памяти 256 байт
C - 1Eh +Выходные значения:
A - код ошибки, если CF=1 +Функции для работы с датой и временем
 +21h (33) SYSTIME (Текущая дата и время) +Входные значения:
C - 21h +Выходные значения:
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - день недели +22h (34) SETTIME (Установить текущую дату и время) +Входные значения:
D - день
E - месяц
IX - год
H - час
L - минуты
B - секунды
C - 22h +Выходные значения:
A - код ошибки, если CF=1 +Функции управления памятью
 +38h (56) SETWIN (Подключение страницы памяти) +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
H - биты 6 и 7 задают номер окна, в которое будет подключена страница
C - 38h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 +39h (57) SETWIN1 (Подключение страницы памяти в первое окно) +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 +3Ah (58) SETWIN2 (Подключение страницы памяти во второе окно) +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 39h +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 +3Bh (59) SETWIN3 (Подключение страницы памяти в третье окно) +Входные значения:
A - идентификатор блока памяти
B - номер страницы в блоке (0,1,2...)
C - 3Bh +Выходные значения:
A - код ошибки, если CF=1
A - номер замещенной страницы, если CF=0 +3Ch (60) INFOMEM (Информация о памяти) +Входные значения:
C - 3Ch +Выходные значения:
HL - общее количество страниц
BC - количество свободных страниц +3Dh (61) GETMEM (Выделение блока памяти) +Входные значения:
B - размер блока в страницах по 16 килобайт
C - 3Dh +Выходные значения:
A - код ошибки, если CF=1
A - идентификатор блока памяти, если CF=0 +3Eh (62) FREEMEM (Освобождение блока памяти) +Входные значения:
A - идентификатор блока памяти
C - 3Eh +Выходные значения:
A - код ошибки, если CF=1 +3Fh (63) SETMEM (Изменение блока памяти) +Входные значения:
A - идентификатор блока памяти
B - новый размер блока
C - 3Fh +Выходные значения:
A - код ошибки, если CF=1 +Функции ввода с клавиатуры
 +30h (48) WAITKEY (Ожидание символа с клавиатуры) +Входные значения:
C - 30h +Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +31h (49) SCANKEY (Опрос клавиатуры без ожидания) +Входные значения:
C - 31h +Выходные значения:
ZF = 1 - нет клавиш
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +32h (50) ECHOKEY (Ожидание символа с клавиатуры с печатью) +Входные значения:
C - 32h +Выходные значения:
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +33h (51) CTRLKEY (Получить состояние клавиатуры) +Входные значения:
C - 33h +Выходные значения:
A = 0 - нет символов в буфере
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +35h (53) K_CLEAR (Очистить буфер клавиатуры и выполнить функцию) +Входные значения:
B - номер функции 30h, 31h, 32h, 33h или 34h
C - 35h +Выходные значения:
В зависимости от указанной функции в регистре B. +36h (54) K_SETUP (Управление настройками клавиатуры) +Входные значения:
B - номер подфункции
C - 36h

B = 0, установить раскладку клавиатуры
A - номер раскладки +0 - normal
1 - shift
2 - caps lock
3 - caps lock + shift
4 - normal (альтернативная кл.)
5 - shift (альтернативная кл.)
6 - caps lock (альтернативная кл.)
7 - caps lock + shift (альтернативная кл.) +B = 1, получить состояние звуковых переменных
B = 2, установить звуковые переменные
A - значение переменной
bit0 - сигнал переполнения буфера клавиатуры
bit1 - сигнал переключения на альтернативную раскладку клавиатуры +Выходные значения:
В зависимости от указанной функции в регистре B. +37h (55) TESTKEY (Опрос буфера клавиатуры) +Входные значения:
C - 37h +Выходные значения:
ZF = 1 - нет символов в буфере
A - код символа
D - позиционный код
Е - ASCII код
C - режим клавиатуры:
bit7 - RUS/LAT
bit3 - Num Lock
bit2 - Scroll Lock
bit1 - Insert
bit0 - Caps Lock
B - состояние shift'ов:
bit7 - Left Shift
bit6 - Right Shift
bit5 - Ctrl
bit4 - Alt
bit3 - Left Ctrl
bit2 - Left Alt
bit1 - Right Ctrl
bit0 - Right Alt +Функции для исполнения программ
 +40h (64) EXEC (Выполнить файл) +Входные значения:
HL - указатель на файловую спецификацию
B = 0 - загрузить и выполнить программу
C - 40h +Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0 +41h (65) EXIT (Завершение программы) +Входные значения:
B - код завершения
C - 41h +Выходные значения:
A - код ошибки, если CF=1
A - код завершения, если CF=0 +42h (66) WAIT (Получить код завершения программы) +Входные значения:
C - 42h +Выходные значения:
A - код завершения +Функции для работы со строками и командной строкой
 +43h (67) GSWITCH (Выделить параметр командной строки) +Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 43h +Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль) +44h (68) DOSNAME (Преобразовать имя файла) +Входные значения:
C - 44h
B = 0, преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС
B = 1, преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - 11 символов имени файла +Выходные значения:
A - код ошибки, если CF=1 +45h (69) EXCMDLN (Разбор командной строки) +Входные значения:
HL - указатель командной строки
DE - указатель на буфер пользователя
C - 45h
B - номер подфункции: +0 - Разобрать строку;
1 - Выделить имя диска;
2 - Выделить директорию;
3 - Выделить имя файла;
4 - Выделить расширение файла;
5 - Выделить имя диска, путь к файлу, имя файла и расширение файла;
6 - Зарезервирована;
7 - Выделить параметр командной строки;
8 - Преобразовать из 11 символьного формата в формат ДОС;
9 - Преобразовать из формата ДОС в 11 символьный формат; +Подфункция 0 - Разобрать строку: + +Входные значения:
HL - указатель командной строки
C - 45h
B = 0 - Разобрать строку +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла; + +Подфункция 1 - Выделить имя диска: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 1 - Выделить имя диска +Выходные значения:
A - код ошибки, если CF=1
A - номер диска (0 - A, 1 - B, 2 - C и т.д.), если CF=0
буфер - имя диска "A:",0 + +Подфункция 2 - Выделить директорию: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 256 байт)
C - 45h
B = 2 - Выделить директорию +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - директория "DIR1\DIR2\DIR3\",0 + +Подфункция 3 - Выделить имя файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 13 байт)
C - 45h
B = 3 - Выделить имя файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - имя файла "FILE.EXT",0 + +Подфункция 4 - Выделить расширение файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 4 байт)
C - 45h
B = 4 - Выделить расширение файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла;
буфер - расширение "TXT",0 или "C ",0 + +Подфункция 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла: + +Входные значения:
HL - указатель командной строки
DE - буфер (макс. 8 байт)
DE+0 адрес буфера для имени диска (макс. 13 байт)
DE+2 адрес буфера для директории (макс. 256 байт)
DE+3 адрес буфера для имени файла (макс. 13 байт)
DE+4 адрес буфера для расширения файла (макс. 4 байта)
C - 45h
B = 5 - Выделить имя диска, путь к файлу, имя файла и расширение файла +Выходные значения:
A - код ошибки, если CF=1
A - результат разбора, если CF=0
bit7 - В строке обнаружены символы ? или *
bit3 - В строке указано имя диска;
bit2 - В строке указан путь к файлу;
bit1 - В строке указано расширение файла;
bit0 - В строке указано имя файла; + +Подфункция 7 - Выделить параметр командной строки + +Входные значения:
HL - указатель командной строки
DE - буфер для выделяемого параметра
C - 45h
B = 7 - Выделить параметр командной строки +Выходные значения:
HL - указатель на следующий параметр командной строки
CF = 0 - конец строки не достигнут (есть другие параметры)
CF = 1 - конец строки (в буфер перенесён последний параметр или ноль) + +Подфункция 8 - Преобразовать из 11 символьного формата в формат ДОС + +Входные значения:
C - 45h
B = 8 - преобразовать из 11 символьного формата в формат ДОС
HL - 11 символов имени файла
DE - буфер для имени в формате ДОС +Выходные значения:
A - код ошибки, если CF=1 + +Подфункция 9 - Преобразовать из формата ДОС в 11 символьный формат + +Входные значения:
C - 45h
B = 9 - преобразовать из формата ДОС в 11 символьный формат
HL - имя файла в формате ДОС
DE - буфер для 11 символов имени файла +Выходные значения:
A - код ошибки, если CF=1 + + +Функции работы с экраном
 +50h (80) SETVMOD (Выбор режима экрана) +Входные значения:
A - режим экрана
   02h - текстовый 40x32x16 цветов
   03h - текстовый 80x32x16 цветов
   81h - графический 320x256x256 цветов
   82h - графический 640x256x16 цветов
B - страница экрана 0/1
C - 50h +Выходные значения:
A - код ошибки, если CF=1 +51h (81) GETVMOD (Получить текущий режим экрана) +Входные значения:
C - 51h +Выходные значения:
A - код ошибки, если CF=1
A - текущий режим экрана, если CF=0
B - страница экрана 0/1 +52h (82) LOCATE (Установить позицию курсора) +Входные значения:
D - строка курсора
E - столбец курсора
C - 52h +Выходные значения:
нет +53h (83) CURSOR (Получить текущую позицию курсора) +Входные значения:
C - 53h +Выходные значения:
D - строка курсора
E - столбец курсора +54h (84) SELPAGE (Выбрать активную страницу экрана) +Входные значения:
B - страница экрана 0/1
C - 54h +Выходные значения:
A - код ошибки, если CF=1 +55h (85) SCROLL (Прокрутка окна) +Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B = 1 - прокрутка вверх
B = 2 - прокрутка вниз
A = 0 - очищать строку
C - 55h +Выходные значения:
нет +56h (86) CLEAR (Очистка окна) +Входные значения:
D - строка левого верхнего угла окна
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - атрибут заполнитель
A - символ заполнитель
C - 56h +Выходные значения:
нет +57h (87) RDCHAR (Считать символ с экрана) +Входные значения:
D - строка
E - столбец
C - 57h +Выходные значения:
A - символ
B - атрибут +58h (88) WRCHAR (Напечатать символ на экране) +Входные значения:
D - строка
E - столбец
A - символ
B - атрибут
C - 58h +Выходные значения:
нет +59h (89) WINCOPY (Запомнить окно экрана) +Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 59h +Выходные значения:
нет +5Ah (90) WINREST (Восстановить окно экрана) +Входные значения:
D - строка
E - столбец левого верхнего угла окна
H - высота окна
L - ширина окна
B - страница буфера
IX - адрес буфера
C - 5Ah +Выходные значения:
нет +5Bh (91) PUTCHAR (Напечатать символ в текущей позиции курсора) +Входные значения:
A - символ
C - 5Bh +Выходные значения:
нет +5Ch (92) PCHARS (Напечатать строку символов в текущей позиции курсора) +Входные значения:
HL - указатель на начало строки символов
C - 5Ch +Выходные значения:
нет +Функции для печати на принтере
 +5Fh (95) PRINT (Вывод символа на принтер без ожидания) +Входные значения:
A - символ
C - 5Fh +Выходные значения:
B - символ
CF = 1 - принтер не готов + + diff --git a/docs/Original/Manuals/Руководство_по_программированию_Иван_Мак.md b/docs/Original/Manuals/Руководство_по_программированию_Иван_Мак.md new file mode 100644 index 0000000..d95c8eb --- /dev/null +++ b/docs/Original/Manuals/Руководство_по_программированию_Иван_Мак.md @@ -0,0 +1,2611 @@ +## **Sprinter** + +по Руководство программированию Sp2000 + +#### Ivan Mak + +15 августа 2003 г. + +### **Содержание** + +**I. Введение** + +1. Архитектура компьютера +1.1 Краткие данные платы Sp2000 +1.2 Техническая реализация +1.3 Возможности машины +1.4 Загрузка конфигураций +2. Краткое описание конфигураций +2.1 Конфигурация Sprinter-1 +2.2 Конфигурация Sprinter-2 +2.3 Конфигурация ZX-Spectrum+AY +2.4 Конфигурация Game-1 +2.5 Kонфигурация DooM +2.6 Конфигурация Video +2.7 Особенности платы Sp2000 + +**II. Блоки конфигураций компьютера** + +3. Основная Память +3.1 Страницы, распределение памяти +3.2 Видео-область, спектрумовский и графический режим адресации +4. Видео-память +4.1 Спектрумовский режим адресации +4.2 Графический режим адресации +4.3 Подрежимы вывода графической адресации +4.4 Распределение Video-RAM +4.5 Структура экрана, режимы экрана +4.6 Спектрумовский режим, он же текстовый +4.7 Графический режим +4.8 Палитра +4.9 Процесс вывода на экран +5. Звуковой выход +5.1 AY-3-8910 +5.2 Бипер/Covox +5.3 COVOX-Blaster (CBL) +5.4 Sprinter-Sound-Card (SSC) +6. Акселератор операций с ОЗУ +7. КЭШ-ОЗУ +7.1 Загрузка новых прошивок в ПЛМ +8. ISA, порт A20 +9. Внутренние порты Z84C15 +9.1 Мышь +9.2 Принтер +9.3 Прерывания от ISA +9.4 AT-Клавиатура +9.5 Таймеры +10. Контроллер FDD +10.1 720/1.44 +11. Контроллер HDD +12. CMOS +12.1 Описание регистров CMOS +13. Дешифрация ПЗУ/КЭШ/Контроллеры/и т.п. +13.1 Схема распределения портов +13.2 Конкретные адреса портов, используемые в Sprinter-е +14. Сброс. +14.1 Старт машины +14.2 Доступ к HDD через память + +**III. Прошивки ПЛМ** +15. Sprinter-1 +15.1 Режимы Spectrum-128/Scorpion-256/Pentagon-512 +15.2 Доступ к функциям биоса и портам. +16. Sprinter-2 +16.1 Акселератор, блочные операции AND, OR, XOR +17. Game-1 +17.1 Акселератор + Covox-Blaster +18. Doom +18.1 Акселератор с растяжением линий +19. Video +19.1 Режим экрана 160x128 + +**IV. Программирование с использованием функций БИОС-а.** + +20. Функции биоса +20.1 Работа с памятью +20.2 Работа с блоками как с RAM-Disk-ами +20.3 Управление назначением на дисководы +20.4 Функции управления железом и определение версии +20.5 Функции печати и управления режимом экрана +20.6 Графические функции +20.7 Работа с винчестером и дисками MS-DOS +21. Дополнительные сведения по программированию +21.1 Вывод на графический экран +21.2 Особые режимы +21.3 Вывод палитр + +**V. Программирование в TR-DOS (дополнительные команды)** +22. Работа с HDD и RAM-Disk через TR-DOS +22.1 /HDT +22.2 /HDD +22.3 /CAT, /DIR +22.4 /LOAD, /SAVE +22.5 /FDD +22.6 /RMD +22.7 /CLEAR +22.8 Команды переключения конфигураций +22.9 Дополнительные сервисные команды +23. Дополнения TR-DOS 5.04Em +24. Копирование файлов с TR-DOS дискет в RAM-Disk +25. Сохранение содержимого RAM-Disk на винчестере + +**VI. Программирование в Sprinter-DOS** +... + + + + +## **Часть I Введение** + +Данное описание предполагает наличие определенных знаний читателя, а именно знание архитектуры компьютера ZX-Spectrum и их разновидностей, в частности Pentagon-128 и Scorpion-256, а так же знание языка BASIC и некоторое знакомство с языком ассемблера Z80. В описании почти не приводятся сведения, относящиеся к программированию на стандартном ZX-Spectrum. Подразумевается, что эти описания уже имеются или читатель достаточно хорошо знаком с компьютером ZX-Spectrum, что бы знать основные данные, необходимые для понимания излагаемой информации. + +Большая часть описания относится к стандартной конфигурации компьютера Sprinter. Там же, где разговор пойдет об иных конфигурациях, я буду это указывать. + +### **1 Архитектура компьютера** + +Я буду называть конфигурацией машины – конкретную реализацию конкретной схемы в перепрограммируемой логической микросхеме (ППЛМ). Это означает, что машина имеет множество конфигураций, каждая из которых имеет свою схему. + +Я так же использую понятие КЭШ-ОЗУ. Это не КЭШ в формальном смысле, а быстрое ОЗУ, в котором процессор может работать на высокой частоте без тактов ожидания. КЭШ-ем это ОЗУ называется только по традиции, подобно КЭШ-у на КР537РУ10 в компьютерах Pentagon-128. + +#### **1.1 Краткие данные платы Sp2000** + +| | | +|---|---| +|Пpоцессоp | Z84C15| +|Тактовая частота | 21MHz/3.5MHz| +|ОЗУ | от 4Mb до 64Mb| +|КЭШ ОЗУ | 64Kb| +|ПЗУ | 256Kb| +|Видео-ОЗУ | 256Kb(512Kb)| +|Контpоллеp дисков | Кp1818ВГ93| +|Поддеpжка 1.44Mb фоpмата | 3.5"диска| +|CMOS-часы | DALLAS| +|Контpоллеp винчестеpа | IDE/AT| +|Контpоллеp клавиатуpы | 101key/AT| +|Контpоллеp мыши | MS-Mouse| +|Два слота | стандаpт ISA-8| +|Аналог AY-3-8910 в ПЛМ | stereo-OUT| +|COVOX | stereo-16bit| +|Выход видео: | на TV или CGA монитоp, RGB| +|Видео-pежимы: | Spectrum standart, GRAF 320x256x256,640x256x16, TXT 80x32,40x32| + + +#### **1.2 Техническая реализация** + +Ядром машины являются процессор Z84C15 и ППЛМ фирмы ALTERA - EP1K30QC208-3. Кроме них на плате присутствуют микросхемa ПЗУ, слот под 72х-пиновый SIMM на 4-64Mb, 256Kb видео-ОЗУ, 64Kb КЭШ-ОЗУ, схема контроллера дисковода на БИС КР1818ВГ93, буферы для подключения джойстика, магнитофона, принтера, клавиатуры, дисководов, винчестера, мыши, буферные микросхемы шины ISA-8 и еще одна ППЛМ фирмы ALTERA – EPM7064SLC100. Эта ППЛМ не меняет своей конфигурации и предназначена для обеспечения синхронизации и начального запуска компьютера. На плате так же предусмотрена возможность подключения CMOS часов – микросхемы DALLAS. Кроме периферии и буферов имеются микросхемы дешифрации, входы которых подключаются к процессору через ППЛМ. Это позволяет легко менять адресацию устройств без какого либо изменения разводки печатной платы. + +#### **1.3 Возможности машины** + +Схема компьютеpа основана на большой пеpепpогpаммиpуемой логической микpосхеме. Подключение периферийных устройств через ППЛМ позволяет получить высокую гибкость машины по конфигурациям. + +Пpогpаммиpование ППЛМ осуществляется непосpедственно в момент включения, а так же пpи пеpезагpузке, что позволяет каpдинально менять схему в ППЛМ непосpедственно во вpемя pаботы. Это сильно выделяет архитектуру Sprinter-а из ряда существующих компьютеров, и многие понятия, присущие обычным машинам, меняют свой смысл. Фактически компьютер имеет гибкую архитектуру, в которой возможны изменения во многих частях схемы. Например, нельзя говорить о конкретных адресах портов подключения периферии, так как они могут быть изменены в одну секунду путем перепрограммирования ППЛМ и данных в ОЗУ, отвечающих за конфигурацию портов. Конкретные адреса появляются только в конкретных конфигурациях, например, в конфигурации ZX-Spectrum. + +Перепрограммируемость схемы дает большую свободу фантазии программиста по конфигурации машины. Задумывая конкретную работу программист может определить в какой конфигурации ее можно сделать лучше, а, возможно, и придумать свою конфигурацию, которую затем можно реализовать в ППЛМ и включить перед запуском этой программы. + +Блок-схема компьютера Sprinter: +``` + ┌───────┐ ┌──────────────────────────────┐ ┌────────────>Sinc + │Принтер│ │ 2 ISA SLOTS │ │ ┌───────>R + ├───────┤ └───┬─┬─┬─┬─┬───────┬─┬─┬─┬─┬──┘ │ │ ┌─────>G + │ Мышь │ ┌───┴─┴─┴─┴─┴───────┴─┴─┴─┴─┴──┐ │ │ │ ┌───>B + └─┬─┬─┬─┘ │ Буферы и дешифраторы │ │ ┌─┴─┴─┴─┐ + │ │ │ └───┬──────────┬─┬──┬─┬────┬─┬─┘ │ │ ЦАП │ + │ │ │ │INT │ │ │ │ │ │ │ │ буфер │ + ┌──┴─┴─┴┬─┐ │ │ │ │ │ ┌┴─┴──────┴─┐└──┬─┬──┘ ┌────────┐ + │ Внутр │ ├────│──────────┘ └──│ │───┤ EPF10K10 ├───┘ └──────┤ видео │ + │ порты │ ├────│──────────DATA─│ │───┤ ├──V_DATA────┤ │ + ├───────┘ ├────│───┐ ┌─────────│ │───┤ ├────────────┤ ОЗУ │ + │ ├<───┘ │ │ │ │ │ │ │ │ + │ ├────────────────────┘ └───┤ ├────────────┤ │ + │ Z84C15 ├───────────────ADRESS─────┤ ├─V_ADRESS───┤ │ + │ ├────┐ ┌───────────────────┤ ├────────────┤ │ + │ │ │ │ │ │ │ │ │ │ + │ ├<───│ │─│ │──────────────>┤ ├──WE,CSi───>┤ │ + │ ├<───│ │─│ │────DIR───────>┤ │ └────────┘ + │ ├<───│ │─│ │──────────────>┤ ├───────> Audio OUTs + │ │ │ │ │ │ │ │ ┌────────┐ + │ │ ┌─┴─┴─┴─┴───────┐ │ ├────────────┤ MAIN │ + │ │ │ ПЗУ и КЭШ-ОЗУ ├<─ADR'─┤ ├──DATA──────┤ RAM │ + └─┬─┬─┬──┬┘ │ CS ├<─CS───┤ ├────────────┤ │ + │ │ │ │ └───────────────┘ │ │ │ SIMM │ + │ D │ │ ┌──────────────┐ │ ├────────────┤ │ + │ A │ │ │ EPM7032 ├───────>┤ ├──ADRESS────┤ │ + │ T │ └──>┤ Sinchro │ │ ├────────────┤ │ + │ A │ │ HDD_DIR ├<───────┤ │ │ │ + │ │ │ │ ФАПЧ ├<───────┤ ├─RAS,CAS,WE─┤ │ + │ │ │ └─┬─┬─┬─┬─┬────┘ │ │ └────────┘ + │ │ │ │ │ │ │ │ │ │ + ┌─┴─┴─┴────────┴─┴─┴─┴─┴───────┐ │ │ + │ Периферийные устройства ├<────┤ │ + │ FDD,HDD,KEMPSTON ├┤ │ + ┌────────┐ │ ┌────────┐ │ │ + │ TAPE ├<──┘ │Keyboard├─────────>┤ │ + │ in/out │ ├┬┬┬┬┬┬┬┬┤ │ │ + └────────┘ └┴┴┴┴┴┴┴┴┘ └───────────┘ +``` + +Для простоты некоторые буферы и дешифраторы на схеме не указаны. Количество проводов в шинах так же условны. + +Дальнейшее описание архитектуры является описанием конкретных конфигураций и их частей. Но перед этим следует сказать несколько слов о переключении конфигураций. + +#### **1.4 Загрузка конфигураций** + +В момент включения компьютера, а так же после нажатия на RESET вся информация, находившаяся в ППЛМ отвечающая за конкретную конфигурацию, стирается. ППЛМ переходит в режим ожидания загрузки блока данных схемы. + +В этот момент процессор полностью отключен от какой либо периферии. В его адресное пространство памяти оказывается включено только ПЗУ и возможно подключение КЭШ ОЗУ. Любая запись в адресное пространство памяти процессора в этот момент приводит к записи данных в ППЛМ и программа в подключенной странице ПЗУ имеет только одну единственную цель – загрузить в ППЛМ данные конфигурации. В этой же странице ПЗУ находятся данные начальной конфигурации. Программа загрузки конфигурации проверяет флаг в КЭШ-памяти и, если он установлен, загружает в ППЛМ данные из КЭШ, если сброшен, то данные из ПЗУ. На этом основано переконфигурирование схемы компьютера. + +Для изменения схемы используется функция BIOS, которая загружает в КЭШ-память блок данных конфигурации выставляет флаг, которым является текстовая строка «ACEX_30K_LOADING», после чего производится полный сброс, который осуществляется программно записью в специальную страницу памяти RESET_PAGE. Программа в ПЗУ, запускаемая по сбросу находит флаг «ACEX_30K_LOADING» и начинает загрузку данных в ППЛМ. Oдновременно она затирает флаг, что предотвращает повторную загрузку новой конфигурации при нажатии на кнопку RESET и позволяет вернуться после «ручного» сброса в начальную конфигурацию. Затирание флага так же избавляет от мучений в случае подключения неправильной конфигурации во время экспериментов с программами. Нажатие на RESET всегда вернет схему в начальную конфигурацию. + +Примечание: Внутренняя информация блока данных ППЛМ является закрытой информацией фирмы ALTERA. Кроме самих микросхем ППЛМ ALTERA поставляет и программное обеспечение для разводки схем внутри ППЛМ. К сожалению, эта программа не может работать на компьютере типа ZX-Spectrum и в ближайшем обозримом будущем не предвидится ее версия для Sprinter-а. Поэтому разработка новых конфигураций может производится только при наличии достаточно мощной машины (все делалось на Pentium-166) и программы разводки схем в ППЛМ – MAX-Plus II. + +В связи с этим, в данный момент Sprinter имеет несколько конкретных конфигураций, три из которых (Sprinter-2, Sprinter-1, ZX-Spectrum+AY) записаны в ПЗУ, а остальные могут быть подгружены с дискеты или винчестера. Постоянно ведется совершенствование конкретных конфигураций и разработка новых. В плате Sp2000 эти конфигурации объединены в одной прошивке ППЛМ. + +### **2 описание Краткое конфигураций** + +В этом параграфе дано краткое описание конфигураций компьютера Sprinter-97. Более полное описание с примерами программирования будет дано в части III. Для платы Sp2000 так же имеются эти конфигурации, поэтому описание приводится без изменений. + +#### **2.1 Конфигурация Sprinter-1** + +Включает в себя конфигурацию Spectrum-128/256, распределение памяти до 4Mb, расширенный экран с режимами Spectrum, Text-80x32, Graf-320x256x256, контроллер дисковода, контроллер IDE винчестера, контроллер клавиатуры AT, подключенной как ZX-Keyboard, 8-bit COVOX. + +Эта конфигурация приближена к конфигурации ZX-Spectrum и позволяет работать на обычных спектрумовских программах и постепенно менять их под расширенные режимы экрана и памяти, а так же для работы с новыми устройствами. + +#### **2.2 Конфигурация Sprinter-2** + +Включает в себя конфигурацию Spectrum-128/256, распределение памяти до 4Mb, расширенный экран с режимами Spectrum, Text-80x32, Graf-320x256x256, контроллер дисковода, контроллер IDE винчестера, контроллер клавиатуры AT (построенный на внутреннем последовательном порте процессора), Accelerator, COVOX. + +Конфигурация, как и Sprinter-1 приближена к спектрумовской, но имеет более жесткие требования к программам по совместимости. Позволяет использовать акселератор операций с основным и видео-ОЗУ. Акселератор ускоряет операции пересылки блоков данных и заполнения ОЗУ одним байтом до физического предела скорости основного ОЗУ. В последней версии он так же позволяет ускорить логическую обработку блоков данных по функциям AND, OR, XOR. + +#### **2.3 Конфигурация ZX-Spectrum+AY** + +Эта конфигурация максимально приближена к ZX-Spectrum-128/256 и включает в себя схему музыкального сопроцессора AY-3-8910. В этой конфигурации отсутствуют расширенные режимы экрана. + +Третья версия схемы AY в соответствии с реальным сопроцессором включает в себя три генератора голосов, генератор шума и регуляторы амплитуды, генератор огибающей. + +На данный момент в схеме формирователя огибающей обнаружена небольшая ошибка. В следующей версии AY предполагается данный недостаток исключить. + +#### **2.4 Конфигурация Game-1** + +Похожа на конфигурацию Sprinter-2. Акселератор не имеет логических функций. Для вывода звука имеет COVOX-Blaster (15KHz), позволяющим выводить звук поблочно и освобождать процессорное время для другой работы. Конфигурация ориентирована на использование в играх для Sprinter-а. + +#### **2.5 Kонфигурация DooM** + +Является дальнейшим развитием конфигурации Game-1. Акселератор имеет дополнительную функцию по аппаратному растяжению/сжатию вертикальных и горизонтальных линий. + +#### **2.6 Конфигурация Video** + +Конфигурация Video похожа на Game-1, но имеет дополнительную возможность по передачи данных с HDD прямо в видео-память в момент чтения из HDD. В последней версии добавлен режим _GR −_ 256 _−_ 4 _x_ 4, позволяющий выводить видео-ролики с разрешением 160x128 на весь экран (аппаратное удвоение размера пикселя). + +#### **2.7 Особенности платы Sp2000** + +В плате Sp2000 описанные выше конфигурации сведены в две прошивки. Первая содержит Sprinter-1, Sprinter-2 и ZX-Spectrum+AY. Переключение между Sprinter-1 и Sprinter-2 осуществляется через системный порт, а ZX-Spectrum+AY фактически совпадает с конфигурацией Sprinter-1. Схема музыкального сопроцессора присутствует и доступна, как в Sprinter-1, так и в Sprinter-2. + +Конфигурации Game-1, DooM, Video, так же будут сведены в одну прошивку и будут переключаться через системный порт. + +### **Часть II** + +## **Блоки конфигураций компьютера** + +В этой части описываются блоки конфигураций. В каждой конфигурации возможно использование тех или иных блоков. О том, какие блоки в каких конфигурациях используются, будет сказано ниже. + +### **3 Основная Память** + +#### **3.1 Страницы, распределение памяти** + +Здесь так же приведено описание схемы распределения памяти Sprinter-97. (Для Sp2000 в данный момент она такая же.) + +Структура схемы распределения основной памяти Спринтера является двухуровневой. + +Основная память компьютера – 4Mb – разделена на блоки по 16kb, задаваемые однобайтовым номером. Эти блоки подключаются к логическим блокам Спектрумовской схемы распределения памяти. Что бы не путать понятия я буду называть блоки основной памяти физическими и писать их номера шестнадцатеричными цифрами – #00..#FF. Блоки спектрумовской схемы распределения памяти я буду называть логическими блоками и писать их номера в десятичной системе – 0..15. + +Адресное пространство процессора Z80 разделено на 4 окна с адресами #0000..#3FFF, #4000..#7FFF, #8000..#BFFF и #C000..#FFFF, которые для краткости я буду называть окнами с номерами 0, 1, 2 и 3. В каждом окне процессора располагается логический блок памяти согласно Спектрумовскому распределению. В окно 0 подключено ПЗУ, в окно 1 – страница 5, в окно 2 – страница 2, в окно 3 любая из страниц 0..7 для режима Spectrum-128, 0..15 для режима Scorpion-256 и 0..31 для режима Pentagon-512. Кроме этого, в режиме Scorpion-256 вместо ПЗУ может быть подключена логическая страница с номером 0. + +Каждый логический блок имеет свой собственный физический номер подключаемой в него страницы ОЗУ. Логические страницы с номерами 0, 2 и 5 имеют дублированные номера, один для жесткого подключения в окна 0, 1, 2 процессора, второй для подключения в окно 3. В режиме Спектрума номера физических страниц, выставленные в этих блоках, совпадают. + +Аналогичным образом на 16kb блоки разделено ПЗУ и КЭШ-ОЗУ. Физический номер страницы ПЗУ имеет значения #E0..#EF, а КЭШ – #F0..#FF. Реально на данный момент для адресации КЭШ ОЗУ используются только 2..1 биты из этого номера. + +Каждая страница ПЗУ или ОЗУ имеет свой порт, в котором указывается физический номер страницы. Всего таких портов страниц памяти 32 (в режиме Pentagon-512 добавляются еще 16 портов). 16 портов отвечают за номера страниц ОЗУ, подключаемые в третье окно процессора. Еще три порта отвечают за подключение страниц ОЗУ в окна 0..2 Восемь портов используются для подключения различных страниц ПЗУ. Один порт – для подключения страницы КЭШ-а вместо ПЗУ. И один порт – это порт системной страницы, подключаемой на место ПЗУ сразу после сброса машины по клавишам Ctrl+Alt+Del. + +``` + Схема распределения памяти Sprinter-а. + + Адресное пространство Страничные порты ПЗУ компьютера + процессора подключаемых страниц страницы по 16k + ┌──────────────┐ ┌───────┐ ┌──────────────┐ ┌──────────────┐ + │ #0000..#3FFF ├─>┤ порты ├──>┤ ROM_BASIC ├──>┬──┬──┬─>┤ EXPANSION │ + │ │ │ #7FFD,│ ├──────────────┤ │ │ │ ├──────────────┤ + │ │ │ #1FFD ├─┐ │ ROM_TR-DOS ├──>┤ │ ├─>┤ TR-DOS │ + ├──────────────┤ └───────┘ │ ├──────────────┤ │ │ │ ├──────────────┤ + │ #4000..#7FFF ├──────────┐ │ │ │ │ │ ├─>┤ BASIC128 │ + │ │ │ │ ├─ ─ ─ ─ ─ ─ ─ ┤ │ │ │ ├──────────────┤ + │ │ │ │ │ ROM_SYSTEM ├──>┘ │ ├─>┤ BASIC48 │ + ├──────────────┤ │ │ ├──────────────┤ │ │ ├──────────────┤ + │ #8000..#BFFF ├────┐ │ └>┤ RAM_0000 ├───>┐ │ ├─>┤ SYSTEM ROM │ + │ │ │ │ └──────────────┘ │ │ │ ├──────────────┤ + │ │ │ │ ┌──────────────┐ │ │ ├─>┤ SYSTEM ROM2 │ + ├──────────────┤ │ └──>┤ RAM_4000 ├───>┤ │ │ ├──────────────┤ + │ #C000..#FFFF ├┐ │ └──────────────┘ │ │ ├─>┤ CONFIG 2 │ + │ ││ │ │ │ │ ├──────────────┤ + │ ││ │ ┌──────────────┐ │ │ └─>┤ CONFIG 1 │ + └──────────────┘│ └────────>┤ RAM_8000 ├───>┤ │ └──────────────┘ + │ └──────────────┘ │ │ + │ │ │ ОЗУ компьютера + │ ┌───────┐ ┌──────────────┐ │ │ страницы по 16k + │ │ Порты ├──>┤ RAM_0 ├───>┤ │ ┌──────────────┐ + │ │ #7FFD,│ ├──────────────┤ ├───>┬─>┤ RAM_00 │ + └>┤ #1FFD ├──>┤ ├───>┤ │ │ ├──────────────┤ + │ │ ├─ ─ ─ ─ ─ ─ ─ │ │ │ ├─>┤ RAM_01 │ + │ ├──>┤ RAM_7 ├───>┤ └─>┤ ├──────────────┤ + │ │ ├──────────────┤ │ │ │ │ + │ ├──>┤ RAM_8 ├─>┬─│───>┤ ├─ ─ ─ ─ ─ ─ ─ ┤ + │ │ ├─ ─ ─ ─ ─ ─ ─ ┤ │ │ └──┤ RAM_7F │ + │ ├──>┤ ├─>┤ │ ├──────────────┤ + │ │ ├──────────────┤ │ └───>┬─>┤ RAM_80 │ + │ ├──>┤ RAM_F ├─>┴─>┐ │ ├─ ─ ─ ─ ─ ─ ─ ┤ + └───────┘ └──────────────┘ │ │ │ │ + Внешние устройства │ │ ├──────────────┤ + ───────────────────┐ ┌──────────────┐ │ ├─>┤ RAM_FE │ + Порты ├────>┤ ISA_1 ├<────┤ │ ├──────────────┤ + компьютера │ ├──────────────┤ │ └─>┤ RAM_FF │ + ├────>┤ ISA_2 ├<────┤ └──────────────┘ + │ ├──────────────┤ │ + ├────>┤ HDD ├<────┤ + │ ├──────────────┤ │ + ├────>┤ OVER DEVICES ├<────┘ + ───────────────────┘ └──────────────┘ +``` +Оставшиеся 3 порта страниц памяти остаются на данный момент в резерве. Схема распределения памяти позволяет подключить в адресное пространство процессора не только ОЗУ или ПЗУ, но и порты и память ISA карт, вставляемых в слот. + +При подключении в адреса #C000..#FFFF скорпионовских расширенных страниц ОЗУ, на их место можно переадресовать слоты. Для этого надо просто записать в порт одной из этих страниц значение, соответствующее ISA-слоту, к которому необходимо произвести обращение. Это значение так же указывает к чему ведется обращение, к портам или памяти слота (конкретные номера будут расписаны ниже). + +В некоторых конфигурациях схема распределения памяти упрощается для освобождения ресурсов ППЛМ. Могут отсутствовать порты #1FFD и #7FFD, а так же упрощается схема работы с устройствами, отображаемыми на память. + +#### **3.2 Видео-область, спектрумовский и графический режим адресации** + +Запись в видео-ОЗУ может осуществляться двумя способами – через два режима адресации видеопамяти. Это графический и спектрумовский режимы адресации. Графический режим адресации кроме вывода графики используется и для вывода на текстовый экран. Спектрумовский режим используется для вывода в режиме Спектрума, а так же для задания знакогенераторов. + +Видео-область основного ОЗУ и видео-ОЗУ – суть две различных области памяти. О видео-ОЗУ будет сказано ниже, а сейчас речь о видео-области основной памяти. + +Графическая видео-область в основной памяти составляет 256Kb ОЗУ и соответствует страницам #50..#5F. При подключении этих страниц в любое окно процессора и при обращении к адресам этого окна мультиплексор адреса переключается в режим графической адресации. В этом режиме биты 3..0 номера страницы не влияют на адрес памяти, а определяют особый режим вывода, о котором будет сказано ниже. Адрес памяти в графическом режиме задается номером, засылаемым в RGADR (он же PORT_Y), о котором так же будет сказано ниже, и десятью младшими битами адреса процессора. В графической видео-области содержится копия видеоданных, посылаемых на экран в графическом режиме (как будет ясно далее, копия не точная). + +В спектрумовском режиме адресации видео-область основного ОЗУ располагается в адресах #4000..#5FFF и #C000..#DFFF для спектрумовских страниц 5 и 7. Любая физическая страница основного ОЗУ (кроме #50..#5F) подключенная к этим областям памяти процессора может стать видео-областью. В этом режиме нет привязки страницы основного ОЗУ к странице видео-ОЗУ. Последняя определяется через RGADR. + +### **4 Видео-память** + +Видео-память Спринтера является теневой памятью. Весь вывод в видео-память производится параллельно с выводом в основную (за исключением некоторых особых случаев). При считывании из области видео-данных считывается информация из основной памяти, а видео остается недоступной. + +Недоступность видео-памяти не является принципиальным ограничением и есть признак конфигурации. Перепрограммирование ПЛМ в позволяет получить доступ к видео-ОЗУ, но на данный момент эта возможность не используется ни в одной прошивке, так как практически не особо требуется. + +В работе видеоконтроллера используются два основных режима адресации - спектрумовский и графический. В спектрумовском режиме видео-ОЗУ может оказаться тенью любой страницы основного ОЗУ, кроме страниц #50..#5F. Это позволяет при необходимости иметь множество копий спектрумовского экрана, например, для случая разработки многозадачного Спектрума. + +В графическом режиме видео-ОЗУ является тенью одного 256-килобайтного блока – страниц #50..#5F. Жесткое закрепление графического образа видео-памяти в основном ОЗУ обусловлено необходимостью иметь точные копии данных видеорежимов для работы компьютера. + +#### **4.1 Спектрумовский режим адресации** + +В Спектрумовском режиме вся видеопамять разбивается на 32 блока по 8 килобайт. Адрес блока определяется номером, записываемым в RGADR. Биты 4..0 являются номером блока, бит 7 разрешает использование 16-килобайтовых страниц, бит 6 запрещает вывод на экран в спектрумовском режиме. Бит 0 вместе с битом 1 порта #7FFD определяет младший бит номера спектрумовского блока видео-ОЗУ. Таким образом достигается подключение двух блоков спектрумовского экрана для страниц 5 и 7. + +Для примера, запись в RGADR номера #0C приведет к подключению к адресам #4000..#5FFF блока номер 12, а к адресам #C000..#DFFF (при условии, что установлена спектрумовская страница 7) блока номер 13. Запись в RGADR нечетного значения #0D приведет к подключению в #4000..#5FFF блока номер 13, а в #C000..#DFFF (к 7-й странице) блока номер 12. + +Запись в RGADR значения #80 приведет возможности иметь доступ в спектрумовском режиме сразу к 16kb – двум блокам видео-ОЗУ с номерами 0 и 1 в адресах #4000..#7FFF. Реально этот режим не использовался и не проверялся. Он был сделан для возможной совместимости со спектрумовским режимом 512 точек в строке, но остался невостребован. + +Если при работе какой либо программы требуется больше памяти, но не требуется вывод в спектрумовском режиме, RGADR рекомендуется устанавливать в значение #C0..#FF. В этом случае вывод в видео-ОЗУ в Спектрумовском режиме не производится. + +#### **4.2 Графический режим адресации** + +В графическом режиме адресации видео-ОЗУ используется тот же RGADR. Подобная реализация признана неудобной и в следующем варианте Sprinter-а предполагается разделить порты для графической и спектрумовской адресации. Неудобство заключается в том, что закрытие спектрумовского режима вывода осуществляется только при значениях этого порта больше #C0, а в графическом выводе используются все значения порта. Из-за этого приходится постоянно следить за положением RGADR и перед записью в адреса #4000..#7FFF устанавливать его в #C0, либо использовать для графического вывода первое окно, что так же не всегда удобно. + +Видео-ОЗУ в графическом режиме адресации разбивается на 256 строк по 1024 байта. Байты в строках адресуются линейно младшими битами адреса процессора, а номер строки записывается в RGADR. + +Расположение строк видео-ОЗУ таково, что спектрумовская адресация оказыватся как бы "поперек"строк. Это сделано для возможности вывода как горизонтальных, так и вертикальных линий с помощью команды типа LDIR. В графической адресации выводятся горизонтальные линии, в спектрумовской - вертикальные. Реально подобный вывод не использовался, так как оказалось проще выводить вертикальные линии с помощью акселератора (об этом ниже). + +#### **4.3 Подрежимы вывода графической адресации** + +Как было указано, страницы #50..#5F являются графическими. Адрес данных видео-ОЗУ, а так же основного ОЗУ в графической адресации зависит от порта RGADR (PORT_Y), и при установке любого значения из диапазона #50..#5F не меняется. Это используется для введения дополнительных подрежимов вывода, которые используются для ускорения работы со спрайтовой графикой, а так же для удобства программирования в некоторых иных случаях. + +Два подрежима задается 2-м и 3-м битами номера страницы из #50..#5F. + +Бит 3 отвечает за разрешение записи байта #FF. Если при выводе на экран использовать страницy #58..#5F, то в процессе записи проверятся, не равен ли записываемый байт значению #FF. Если равен, то запись не производится. + +Этот режим можно использовать для вывода спрайтов с «прозрачным» цветом (прозрачный цвет #FF). Фигурный спрайт выводится как прямоугольник, а все точки, которые не принадлежат спрайту в этом прямоугольнике записаны байтами #FF. + +Бит 2 отвечает за разрешение записи в основное ОЗУ параллельно с видео. Если при выводе использовать страницы #54..#57 или #5C..#5F, то вывод будет осуществляться только в видео-ОЗУ. В основном останутся те данные, которые были записаны туда ранее. + +Этот режим используется для временного вывода на экран, например для вывода курсора мыши без необходимости запоминания данных под курсором. Они остаются в основном ОЗУ. + +Как видно, биты 2 и 3 действуют независимо. Это позволяет комбинировать оба подрежима так как необходимо программисту. + +ВНИМАНИЕ! При программировании вывода на графический экран стоит придерживаться правила, что в биты 0 и 1 номера страницы записываются нули. Это позволит в будущем беспрепятственно использовать эти программы в конфигурациях, где эти биты будут выполнять новые дополнительные функции. + +#### **4.4 Распределение Video-RAM** + +Распределение видео-ОЗУ является частично жестким, частично программным. Жеская часть распределения отвечает где находятся данные видео-режима и данные палитры (более конкретно о них будет сказано ниже). Программное распределени отвечает, где находятся данные для вывода в графических, текстовых и спектрумовском режимах, открываемых функциями биоса. + +Пока для дальнейшего объяснения пока достаточно примерного распределения видео-ОЗУ. Данные палитры находятся в блоках 30-31 спектрумовской адресации или, что то же самое, на концах линий графической адресации – в адресах #03E0..#03FF. Данные режимов экрана находятся в блоках 24..29, или в терминах линий – в адресах #0300..#039F. Область линий #03A0..#03DF является зарезарвированной и ее использование в программах не рекомендуется. + +Блоки 0..23 или линии по адресам #0000..#02FF обявляются свободно используемыми в программах. При использовании функций биоса именно в этой области располагаются данные графических и спектрумовских экранов. Спектрумовский экран использует блоки 0 и 1 (#0000..#003F). Первый графический экран использует блоки 2..11 (#0040..#017F). Второй графический – блоки 12..21 (#0180..#02BF). Блоки 22 и 23 (#02C0..#02FF) используются для хранения знакогенераторов текстового режима. Сами же данные текстового режима находятся в области режима экрана и об этом будет сказано ниже. + +#### **4.5 Структура экрана, режимы экрана** + +Выше была описана адресация видео-ОЗУ так, как оно выглядит для процессора. Вывод же изображения на телевизор осуществляется с помощью записаной в ПЛМ видео-карты, которая позволяет менять режимы вывода простой перезаписью информации в видео-ОЗУ. Единственный порт, который меняет выводимое изображение – порт RGMOD, бит 0 которого переключает страницу режима и таким образом полностью меняет содержимое видео-экрана. + +Режим экрана задается данными в видео-ОЗУ. Весь экран представляет собой набор квадратов размером 8x8 точек режимa разрешения 320x256. При увеличении разрешения количество точек в квадрате увеличивается до 16x8. + +Режим экрана для каждого квадратика прописывается в области 24..29 блоков видео-ОЗУ. Весь экран описывается страницей режима, которая может быть переключена битом 0 порта RGMOD. Каждому квадратику на одной странице режима соответствует 8 байт, часть из которых не используется (зарезервировано). Реально используется от 2-х до 6-ти байт. + +Весь экран представляет собой набор из 56x39 (56x40) квадратиков, что соответствует телевизионным режимам 312(320) полных линий на кадр. Видимая область составляет 40x32 квадратика. Остальные соответствуют квадратикам, попадающим в область бордера, обратного хода луча и синхроимпульсов. Приниципиально возможно использование бордерных квадратиков для вывода изображения, но это не рекомендуется, так как не все телевизоры способны показывать эту область. + +Для подробного объяснения адресов режима я воспользуюсь следующими обозначениями: + +> _PM_ – страница режима (значения 0 или 1). +> _SQ.ab_ – квадратик с номером по горизонтали _a_ и номером по вертикали _b_ . +> _Line.1_ – номер графической линии для режима. +> _Line.2_ – номер графической линии для подрежима. +> _LA_ – адрес точки в графической линии. +> _Mode.0_ – первый байт режима. +> _Mode.1_ – второй байт режима. +> _Mode.2_ – третий байт режима. +> _Mode.3_ – четвертый байт режима. + +Для каждого квадратика _SQab_ : + +> _Line.1__ = 1 + 2 * _a_ + #80 * _PM_; +> _Line.2_ = _Line.1_ + 1; +> _LA_ = #0300 + 4 * _b_ + +Параметры _a_ и _b_ принимают значения от 0 до 55 и от 0 до 39 соответственно. _SQ.0.0_ – квадратик в верхнем левом углу видимой области графического экрана экрана. _SQ.4.4_ – самый верхний левый квадратик спектрумовского экрана. _SQ.39.31_ – нижний правый квадратик графического экрана. Как уже и было сказано, квадратики с номерами _a_ больше 39 и _b_ больше 31 соответствуют бордеру и области синхроимпульсов. Левый и верхний бордер соответствует квадратикам с _a_ = 55 и _b_ = 38(39) соответственно. + +Положение байтов _Mode.i_ в видео-ОЗУ соотстветсуют одинаковому _Line_ и адресу в строке _LA_ + _i_ . Основной режим определяется в _Line.1_, а подрежим используется при определении основного режима с разрешением 640 точек по горизонтали. Если в основном режиме появилось указание на 640 точек, то после вывода первых 8-ми точек, производится считывание дополнительного режима, с _Line.2_, которое переопределяет режим второй половинки квадратика. Это позволяет в текстовом 80-символьном режиме иметь независимое программирование символа и знакогенератора. + +Режим вывода в каждый момент времени полностью определяется считанными байтами _Mode.0..3_. Байт _Mode.3_ реально не используется и зарезервирован, поэтому режим определяется тремя байтами. + +Собственно, сам режим определяется байтом _Mode.0_, байт _Mode.1_ является просто байтом адреса данных, а _Mode.2_ используется в спектрумовском режиме как адрес атрибутов, а в текстовом собственно как атрибут символа. + +##### Распишу все режимы: + +_ZX_ − 40 – текстовый режим 40 символов в строке или 1 символ на знакоместо. Используется в спектрумовском режиме. На экране оказываются три различных знакогенератора, которые расположены в памяти ровно так, как полагается для Спектрума. + +_ZX_ − 80 – текстовый режим 80 символов в строке или 2 символа на знакоместо. Отличительной особенностью является возможность на одном экране иметь до 36 знакогенераторов, указываемых для каждого символа. + +_GR_ − 256 − 8 – графический режим 320x256 точек, 256 цветов. Он же 8x8 точек 256 цветов на одно знакоместо. В этом режиме (а так же в GR-16-16) экран можно представить как «текстовый» 40-символьный, в котором каждый символ имеет графический образ в 64 байта. Всего таких символов 3072. При определенном задании режима графические символы сливаются в одно графическое поле, на котором достаточно просто рисуются линии и другие графические примитивы. + +_GR_ − 16 − 16 – графический режим 640x256 точек, 16 цветов. Он же 16x8 точек 16 цветов на одно знакоместо. + +Следует отметить, что любой из вышеуказанных режимов устанавливается в каждый квадратик индивидуально. Таким образом на разных частях экрана могут одновременно присутствовать различные режимы вывода. + +#### **4.6 Спектрумовский режим, он же текстовый** + +_Mode.0_: + +- bits 3..0 – старшие биты (4..1) адреса блока, откуда выводятся данные. Младший бит определяется 3-м битом порта #7FFD. +- bit 4 – "1" признак режима. Значение "0" соответствует графическому режиму. +- bit 5 – признак разрешения "0" для 640 точек, "1" для 320 точек. +- bit 6..7 – старшие биты адреса в блоке (bit 12..11). + Они одинаковы как для байта пикселей так и для + байта атрибутов. + +Так как в спектрумовском экране используется только три комбинации битов 6..7, четвертая комбинация определяет особый режим – вывод бордера и синхросигналов. Таким образом комбинация "1111" в старших битах режима _Mode.0_ особая. При такой комбинации назначения младших битов изменяется, так как для вывода бордера не требуется никакого адреса данных: + +- bit 3..2 – значение "11" генерирует в этом квадратике сигнал Blank - гашение. +- bit 0 – значение "1" в присутствии сигнала Blank генерирует прерывание для процессора на восьмой линии квадратика. Именно программированием этого бита в нужном квадратике осуществляется "подгонка" сигнала INT под стандарт Pentagon или Scorpion. + +_Mode.1_: + +Как уже было сказано, этот байт определяет адрес данных в видео-ОЗУ, выводимых в текущий квадратик. В спектрумовском режиме он соответствует восьми младшим битам адреса в блоке и совместно с битами 6..7 байта _Mode.0_ определяет адрес спектрумовского символа в блоке. Недостающие 3 бита (bit 10..8) берутся из счетчика линий в квадратике. + +_Mode.2_: + +Определяет младшие восемь бит адреса атрибута. В спектрумовском режиме устанавливается равным _Mode.1_, а в текстовом используется как байт атрибута символа. При выборке атрибута производится специальное замешивание битов 6..7 байта _Mode.0_ таким образом, что бы атрибуты оказались в старших адресах блока по известному спектрумовскому закону. + +Как использовать этот режим для текстового режима? + +Для этого в один из спектрумовских экранов записывается знакогенератор. Прописывается так, что на спектрумовском экране он выглядит как набор ASCII из 256-ти символов, выведенных последовательно в 256 знакомест. У этих символов прописывается атрибут просто равный номеру символа. После этого байты _Mode.1_ и _Mode.2_ оказываются просто равными ASCII коду и атрибуту выводимого символа соответственно. А байт _Mode.0_ указывает на знакогенератор и в в принципе может определить 36 различных знакогенераторов. 3 за счет битов 7..6, еще 3 за счет битов 3..2 (комбинация "11" в этом месте попадает в область режима экрана и палитры, куда не стоит вписывать знакогенератор), и еще 4 за счет битов 1..0. Простым премножением получается 3 \* 3 \* 4 = 36 знакогенераторов. + +Страница режима устроена таким образом, что бы при выводе линии байты атрибута и цвета одного символа оказались рядом, и символы, расположенные в одной строке выводятся подобно выводу вертикальной линии символов и рядом расположенной вертикальной линии атрибутов. При использовании акселератора вывод строки оказывается очень быстрым (около миллиона символов в секунду). + +#### **4.7 Графический режим** + +Прежде чем расписывать байты режима объясню, как адресуются графические квадратики. Все видео-ОЗУ, разбитое на блоки или линии, можно представить в виде квадратиков 8x8 точек. На линии в 1024 байта умещается 128 квадратиков, каждый из которых по вертикали занимает 8 линий и, таким образом, по вертикали все видео-ОЗУ разбирается на 32 квадратика. Всего 4096 квадратиков, для адресации которых необходимо 12 бит. Они берутся из _Mode.0_ (четыре младших бита) и _Mode.1_ после того, как битом 4 байта _Mode.0_ определен графический режим. + +_Mode.0_: + +- bits 3..0 – старшие биты (4..1) адреса блока, так же как и в спектрумовском, но младший бит номера блока берется из 2-го бита _Mode_ 1. Они же формально представляют собой старшие биты номера квадратика по горизонтали. +- bit 4 – "0"признак режима (графический режим). +- bit 5 – признак разрешения "0" для 640 точек, "1" для 320 точек. +- bit 6..7 – номер палитры. В каждом квадратике можно задать одну из четырех графических палитр. _Mode.1_: +- bit 1..0 – Дополнительный адрес данных в блоке. Адрес квадратика по горизонтали. bit 2 – младший бит блока. +- bit 7..3 – Адрес квадратика по вертикали. + +Подобное "неправильное" разбиение адреса квадратиков возникло в результате оптимизации схемы "по объему ПЛМ". Ввиду нехватки места было решено, что лучше пожертвовать линейностью адресации в режиме экрана в пользу возможности иметь дополнительные возможности. В новой версии компьютера возможно устранение этой нелинейности. + +Графический режим 640 точек использует ту же схему адресации квадратиков. при этом каждый байт рабивается на две точки и таким образом из режима 8x8 256-ти цветных точек получается режим 16x8 16-ти цветных. Первыми выводятся младшие 4 бита, вторыми – старшие. + +#### **4.8 Палитра** + +Устройство палитры достаточно просто. Каждый момент при выводе точки, с одной из линий считывается 3 байта и выводится в 3 регистра с 3-мя ЦАП-ами на выходе. Таким образом, образуется 3 цвета Red, Greeb & Blue, которые определяют один из 16 млн. возможных цветов. + +Какие именно три байта выводить определяется схемой видео-карты. Все три байта выводятся всегда из одной области – с концов линий – адресов #03E0..#03FF. Номер линии соответствуют номеру цвета для 256-ти графического цветного режима или номеру атрибута для текстового и спектрумовского режима. В указанных адресах умещается 8 палитр по 256 цветов, считая по 1kb на каждую палитру. Реально из этого килобайта используется только 768 байт. Каждый четвертый байт никуда не выводится и принципиально схемотехнически не может попасть на регистр ЦАП-а. Четыре из этих восьми палитр используются для графических режимов и оставшиеся четыре для текстовой палитры. + +Про палитру в тексте следует сказать отдельно. Атрибут формально задает один цвет из палитры и, соответственно, четыре цвета из четырех палитр. из этих четырех цветов на каждую точку попадает только один. Выбор производится по двум битам – FLASH и биту из регистра сдвига в котором находятся восемь точек, считанные из знакогенератора. Таким образом, для каждого атрибута задается цвет бумаги, цвет символа, цвет мерцания бумаги и цвет мерцания символа. Если, например, цвет мерцания бумаги совпадает цветом бумаги, то мерцания на экране не наблюдается. Аналогично для цвета символа. Подобное решение позволяет любую кодировку цвета для каждого атрибута и разрешить проблему с различиями атрибутов в спектрумовском и IBM-ском вариантах. Просто в момент перехода с одного стандарта на другой в палитру загружаются необходимые данные. + +С графической палитрой все просто. Байт точки попадает на адрес линии для конкретной палитры и соответствующий ей цвет попадает на ЦАП-ы. В 16-ти цветном режиме используются 16 младших цветов палитры. + + #03E0..#03E2 – графическая палитра 0 + #03E4..#03E6 – графическая палитра 1 + #03E8..#03EA – графическая палитра 2 + #03EC..#03EE – графическая палитра 3 + #03F0..#03F2 – текстовая палитра 0 – цвет бумаги + #03F4..#03F6 – текстовая палитра 1 – цвет символа + #03F8..#03FA – текстовая палитра 2 – цвет мерцания бумаги + #03FC..#03FE – текстовая палитра 3 – цвет мерцания символа + +Байты расположены в порядке Blue Green Red. + +#### **4.9 Процесс вывода на экран** + +Что бы связать воедино все, что было сказано выше, распишу процесс вывода на экран, происходящий внутри ПЛМ. + +Упрощенная блок-схема видео-контроллера: + + ┌───────────────────────┐ ┌───────────────┐ + │ Sprinter Video Card │ │ RGB Registers ├───> RED + │ simple block diagramm │ │ & Video DACs ├───> GREEN + └───────────────────────┘ │ ├───> BLUE + └─────┬─┬───────┘ + │ │ + ┌──┬─────┐ ┌─────────┐ │ │ ┌──────┬───────┬──────┐ + CPU >══════╡ │ MXA │ │ VIDEO ├─│─│─┤ MODE │ Pixel │ PAL ├─────╖ + Adress >══════╡ │ ├─────┤ MEM ├─│─│─┤ Reg │ Atrib │ Reg ├─────╢ + ├──┤ ├─────┤ ├─│─│─┤ │ Reg │ ├─────╢ + Y-port >══════╡ │ ├─────┤ ├─│─│─┤ │ │ ├─────╢ + >══════╡ │ ├─────┤ │ │ │ │ │ │ │ ··· ║ + ┌───────────┐ ├──┤ ├─────┤ │ │ │ │ │ │ │ ··· ║ + │ Mode ├─────┤ │ ├─────┤ ├─│─│─┤ │ │ ├─────╢ + │ Counter ├─────┤ │ ├─────┤ ├─┴─┴─┤ │ │ ├─────╢ + └───────────┘ ├──┤ ├─────┤ │ └─┬──┬─┴─────┬─┴──────┘ ║ + ╓─── Adress ─────┤ │ ├─────┤ │ │ │ └───────────>──╢ + ╟─── From MODE ─────┤ │ ├─────┤ │ │ └───────────────────>──╢ + ║ ┌───────────┐ ├──┤ ├─────┤ │ └──────────────────────>──╢ + ╟─┤ Line/Pix ├─────┤ │ ├─────┤ │ ║ + ║ │ Counters ├─────┤ │ ├─────┤ │ ║ + ║ └───────────┘ ├──┤ ├─────┤ │ ║ + ╟─── Pixel/PAL ─────┤ │ ├─────┤ │ ║ + ╟─── Registers ─────┤ │ │ │ │ ║ + ║ └──┴─────┘ └─────────┘ ║ + ║ ║ + ╚══════════════════════════════════════════════════════════════════════════════╝ + +Тактовый генератор задает частоту 42MHz. Первым делом эта частота делится на 3, а затем на 2, получая 14 и 7 MHz для вывода пикселей. 14MHz в режиме 640 точек и 7MHz в режиме 320 точек. 7MHz делится еще раз на 8 получая номер точки в квадратике. Затем получившаяся частота делится на 56. Этот делитель является и счетчиком знакомест, номер которого подается как часть адреса режима экрана. Полученная после деления на 56 частота является частотой синхронизации строк. Она делится на 8 вертикальным счетчиком строк знакоместа. Далее деление частоты продолжается и для получения 312 или 320 линий на кадр используется управляемый счетчик – он же счетчик знакомест по вертикали и часть адреса режима экрана. И последний счетчик делит полученную частоту кадров на 32 что бы получить +сигнал FLASH. + +Данные счетчиков знакомест по горизонтали и вертикали подаются как часть адреса на видео-ОЗУ. Остальная часть адреса соответствует тому положению, где находятся данные видео-режима. И, таким образом, из видео-ОЗУ считываются данные режима, а именно 4 байта _Mode.i_. Эти байты определяют в каком режиме выводить данные на экран и из какого места их брать. В соответствии со считанными байтами _Mode.i_ из видео-ОЗУ производится следующая выборка, а именно выборка байта знакогенератора и атрибута для текстового режима или выборка байта цвета для графического. Из этих байтов (а в случае необходимости и из сигнала FLASH) формируется необходимый адрес цвета в палитре и производится следующий цикл считывания из памяти, при котором данные сразу же записываются в цветовые регистры с ЦАП-ами, которые и формируют сигнал цвета для монитора. + +Еще раз распишу немного подробнее, по тактам. + +Тактовая частота – 42MHz. Период одного пикселя – 6 однотактовых циклов. + +Циклы распределяются следующим образом: + +- TAKT 1 – выборка байта пикселей текстового режима в графическом режиме – холостой ход; +- TAKT 2 – выборка текстового атрибутa, он же выборка байта пикселя для GRAF-Modes; +- TAKT 3 – выборка 3-х байтов палитры для режимов 640 точек, в 320 - холостой ход; +- TAKT 4 – выборка слова режима экрана выборка производится один раз в четыре периода; +- TAKT 5 – цикл записи от процессора, данные пишутся только когда нужно; +- TAKT 6 – выборка 3-х байт палитры с записью в RGB регистры. + +Все начинается с такта 4. Адрес для режима определяется счетчиком вертикали и горизонтали. Считаются по 8 точек 320-го режима по вертикали и по 8 строк по горизонтали. Считанные данные помещаются в регистры режима _Mode.i_ , описанные выше. + +С пятым тактом все ясно. За исключением того, что для графического и текстового режимов изменяется адресация ОЗУ. Изменение задается номером страницы. Страницы 50..5F считаются графическим ОЗУ. Следует отметить, что понятие графического и текстового режима адресации не совсем верно отражает суть. Вывод данных в экранное ОЗУ может осуществляться в обоих режимах независимо от действительного режима экрана. + +6-й такт. Чтение палитры. В текстовом режиме адрес палитры составляет 10 бит. 8 бит – байт атрибута. 1 бит – пиксель. 1 бит – FLASH. Этот бит фактически переключает две палитры с частотой FLASH. Если палитры для данного атрибута совпадают то FLASH не наблюдается. + +В графическом режиме адрес палитры составляет 8 бит байта пикселя и 2 бита номера палитры, считанного в 4-м такте, но задержанного на 1 период для синхронного изменения режима и палитры в знакоместе. + +Еще один бит адреса используется для разделения палитр текстового и графического режимов. Оставшиеся адреса ОЗУ устанавливаются в "1" и вся палитра оказывается на концах 1024-х байтовых линий графического режима. + +- Такт 1. Здесь начинает действовать новый режим, считанный в такте 4. Адрес ОЗУ является адресом байта пикселей текстового режима. Байт пикселей записывается в сдвиговый регистр и первый выдвинутый бит начинает действовать в 6-м такте. +- Такт 2. Выбирается байт атрибута. Адрес отличается от адреса байта пикселей по известному Спектрумовскому закону. Если перед этим в 4-м такте был считан графический режим, то Адрес атрибута становится другим и соответствует байту пикселя графического режима. Регистр атрибута в графическом режиме является регистром байта пикселя. +- Такт 3. Чтение палитры для режима 640 точек. Следует заметить что в графическом режим 640 точек, 4 старших бита регистра пикселя маскируются нулями и в этом такте в младших битах адреса оказываются те четыре бита, которые были замаскированы в 6-м такте. Так организуется 16 цветов на точку. + +### **5 Звуковой выход** + +Звуковой выход платы Sp2000 представляет собой двухканальный 16-тибитный ЦАП - TDA1543, подключенный к ППЛМ. В данный момент реально используется 10 бит, для одновременного вывода 8-bit COVOX-а и сигнала AY-3-8910. + +#### **5.1 AY-3-8910** + +В ППЛМ платы Sp2000 вписывается схема, содержащая в себе схему аналога музыкального сопроцессора AY-3-8910/8912. Его программирование осуществляется по стандартным описаниям. + +#### **5.2 Бипер/Covox** + +Стандартный спектрумовский бипер (бит 5 порта #FE) выведен через ту же схему, что и Covox, и AY. (TDA1543) Программируется стандартно. + +Covox – 8-бит – позволяет выводить WAV сигналы. В стандартной конфигурации Covox подключен на порт #FB и #4F. Вывод последовательности байтов в любой из этих портов приведет появлению сигнала на звуковом выходе. + +В стандартной конфигурации на выходы левого и правого канала выдается один и тот же сигнал (монофоническое звучание). + +#### **5.3 COVOX-Blaster (CBL)** + +Covox-Blaster (CBL) – Covox с буферным ОЗУ. + +Подключение буферного ОЗУ осуществляется по следующей схеме: + + COVOX-Blaster block diagram + ┌──┬────┐ ┌──┬────┬──┐ + │ │ CT ├───┤X0│ MX │ │ + │ │ ├───┤X1│ │ │ + │ │ ├───┤X2│ │ │ + │ │ ├───┤X3│ │ │ ┌──┬─────┐ ┌────────────┐ + │ │ ├───┤X4│ │O0├─────┤A0│ RAM ├────╥────┤ │ + │ │ ├───┤X5│ │O1├─────┤A1│ ├────╫────┤ Register │ + │ │ ├───┤X6│ │O2├─────┤A2│ ├────╫────┤ & ├──── Audio-OUT + ─────> C│ ├───┤X7│ │O3├─────┤A3│ ├────╫────┤ Dac │ + Clk └──┴────┘ ├──┤ │O4├─────┤A4│ ├────╫────┤ │ + 15KHz ╓──┤Y0│ │O5├─────┤A5│ ├────╫────┤ │ + ╟──┤Y1│ │O6├─────┤A6│ ├────╫────┤ │ + ╟──┤Y2│ │O7├─────┤A7│ ├────╫────┤ │ + ╟──┤Y3│ │ │ ├──┤ │ ║ └────────────┘ + ╟──┤Y4│ │ │ ┌──┤WE│ │ ║ + ╟──┤Y5│ │ │ │ └──┴─────┘ ║ + Z80 ╟──┤Y6│ │ │ │ ║ + A15..A8 ╟──┤Y7│ │ │ │ ║ + ════════════╝ ├──┤ │ │ │ ║ + Mix ───────────────┤S │ │ │ │ ║ + └──┴────┴──┘ │ ║ + WR port #FB ────────┬────────────┘ ║ + │ ┌──┬────┬──┐ ║ + └────>OE│ BF │ │ ║ + │ │ │ │ ║ + Z80 D7..D0 ═════════════╡DI│ │DO╞═════════════╝ + └──┴────┴──┘ + +Счетчик работает на частоте 15 или 22 килогерца, в зависимости от состояния порта конфигурации Covox-а. Адрес мультиплексируется на момент записи в порт из процессора, все остальное время данные из ОЗУ записываются в регистр ЦАП-а. + +Ввод байтов в буферное ОЗУ осуществляется командой OTIR (OUTI), что позволяет ускорить вывод звука и создать достаточно большие паузы для работы других частей программы. Так как при использовании команды OTIR регистр B (который попадает на A15..A8 процессора) уменьшается, для нормальной работы CBL счетчик считает «назад». + +Для контроля за работой Covox-Blaster-а используется бит 7 порта #FE, в который выводится старший бит счетчика. Блок ОЗУ 256 байт условно разбит на две банки по 128 байт, и бит 7 порта #FE указывает какая из банок ОЗУ выводится в ЦАП в конкретный момент времени. Это используется программой вывода для определения, нужно ли подгружать следующие 128 байт в буфер. + +В плате Sp2000 COVOX-Blaster включен в основную прошивку и включается через порт управления CBL - #4E. Запись в этот порт значения #80 приводит к включению режима CBL, #00 - включение обычного COVOX-а. Другие биты порта #4E имеют значение и их следует выставлять в 0 для получения описанного выше режима CBL. В дальнейшем этот порт будет устанавливать режимы Stereo, 8/16-bit и частоту. + +```asm +;*********************************************************************** +; +; Пример программы для Covox-Blaster-a. +; +;*********************************************************************** + +CLEAR_COVOX: ; программа для очистки буфера ОЗУ и + ; отключения звука + LD A,80H ; значение, эквивалентное нулю на выходе Covox + LD BC,0FBH ; порт Covox-Blaster-а + +CLEAR_CBL: + OUT (C),A + DJNZ CLEAR_CBL + XOR A + LD (SND_P),A ; установить в страницу звука 0 (нет звука) + RET + +;*********************************************************************** + +;======================================================================= +; здесь должна располагаться программа, которая +; произведет рассчет первой страницы данных для COVOX-бластера и +; адреса данных. Страница и адрес соответственно в регистры A и HL +;======================================================================= +SOUND_START: ; программа инициализации Covox-Blaster-а + LD (SND_A),HL ; запомнить состояние адреса звука + LD (SND_P),A ; запомнить новую страницу WAV-данных + RET + +SND_A DB 0 +SND_P DW 0 + + +;*********************************************************************** +SOUND: + PUSH AF + LD A,(SND_P) ; проверка, что страница WAV-данных не равна 0 + AND A + JR Z,RET_ALL ; иначе выход -- нет звука + PUSH HL + +SND_MORE: + IN A,(0FEH) ; бит 7 порта #FE указывает состояние 7-го бита + ; счетчика выводимого байта (банк 0/1) + XOR 0 ; запомненное состояние Covox адреса +COV_ADR EQU $-1 + AND 80H ; проверить, переключение банки 128 байт + JP NZ,NO_LD_SND ; если изменения не было, вернуться. + + LD A,(SND_P) + AND A + JR Z,RET_ALL + PUSH DE + PUSH BC + + LD A,(COV_ADR) ; взять адрес Covox-а. + CPL ; инвертировать + LD B,A ; запомнить в B + LD HL,(SND_A) ; взять адрес WAV-данных + LD C,0FBH ; порт Covox-Blaster-а + IN A,(PAGE3) ; запомнить состояние PAGE3 + LD E,A + LD A,(SND_P) ; взять номер страницы WAV-данных + OUT (PAGE3),A ; переключить PAGE3 + LD D,16 ; повторять 16 раз +L_DDX: + OUTI ; выводить в Covox-Blaster + ; (OUTI работает несколько быстрее, чем OTIR) + OUTI + OUTI + OUTI + OUTI + OUTI + OUTI + OUTI + DEC D + JR NZ,L_DDX + + LD (SND_A),HL ; запомнить состояние адреса звука + LD A,H ; проверить, что адрес не дошел до конца страницы + AND A + JP NZ,NO_SNDP ; если не дошел, идти на выход + LD A,E ; вспомнить страницу PAGE3 + OUT (PAGE3),A + +;======================================================================= +; здесь должна располагаться программа, которая +; произведет рассчет новой страницы данных для COVOX-бластера и +; адреса данных. Страница и адрес соответственно в регистры A и HL +;======================================================================= + LD (SND_A),HL ; запомнить состояние адреса звука + LD (SND_P),A ; запомнить новую страницу WAV-данных + JR NO_SNDP1 +NO_SNDP: + LD A,E ; вспомнить страницу PAGE3 + OUT (PAGE3),A + +NO_SNDP1: + POP BC + POP DE +NO_LD_SND: + POP HL +RET_ALL: + POP AF + RET +``` + +#### **5.4 Sprinter-Sound-Card (SSC)** + +Разработанная на данный момент Sound-Card для Спринтера не поддерживается ни в одной прошивке ввиду довольно большого занимаемого объема ПЛМ. В плате Sp2000 объем уже достаточен и конкретная прошивка с SSC находится в планах. + +Основные параметры SSC: + +- 2 выходных канала (Stereo-OUT) +- Шестнадцать 8-битных голосов +- 256-byte Wave-Tables своя для каждого голоса +- 8-bit регулятор амплитуды для каждого голоса и каждого канала + +Программирование в данном описании не приводится ввиду возможной полной переработки схемы SSC. + +### **6 Акселератор операций с ОЗУ** + +Акселератор операций с ОЗУ предназначен для ускорения операций по пересылке данных или по заполнению ОЗУ одним байтом. Акселератор присутствует в чисто Sprinter-овских конфигурациях и поэтому никак не мешает работе обычных Spectrum-овских программ. + +Основой акселератора является быстрое внутреннее ОЗУ в ППЛМ. Операции по пересылке данных производятся путем записи блока данных в это внутреннее ОЗУ, а затем копировании его в нужное место памяти из этого ОЗУ. После одной записи копирование может производиться несколько раз и таким образом можно производить заполнение экрана текстурами. + +Для заполнения экрана одним цветом используется другой режим акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ производится запись данных с шины процессора, которые в этот момент не изменяются. + +Блок данных, записываемый в ОЗУ акселератора может иметь различную длинну из диапазона 1..256 байт. + +Управление акселератором производится непосредственно из программы. Для этого изпользуются команды процессора, которые фактически являются операциями типа NOP. Это команды LD A,A; LD B,B; LD C,C; LD D,D; LD E,E; LD H,H, LD L,L + +```asm + Назначение команд следующее: + - LD B,B - выключить акселетарор. + - LD D,D - включить акселератор в режим приема байта размера + блока далее следует команда типа LD A,dat, где dat + и будет новым размером блока. Если размер блока + был установлен ранее, его можно не устанавливать. + - LD C,C - Операция Fill - заполнение одним байтом. Последующая + команда типа LD (HL),A приведет к заполнению + указанного ранее количества байт значением A + - LD E,E - Операция Fill для графического экрана - заполнение + вертикальных линий. + - LD H,H - rezerved + - LD L,L - копирование блока. Последующая команда типа LD A,(HL) + приведет к заполнению ОЗУ акселератора данными из + адреса (HL), а команда типа LD (DE),A приведет к + перезаписи данных из ОЗУ акселератора в основное + или видео-ОЗУ. + - LD A,A - копирование блока для графического экрана подобна + команде LD L,L, но работает с вертикальными линиями + экрана. + +Пример использования акселератора: + + ; Считаем, что экранная страница уже открыта по адресу #C000 + LD HL,#C040 ; адрес начала линии первого экрана + LD DE,#C180 ; адрес начала линии второго экрана + LD BC,#140 ; длина экрана по горизонтали + DI ; запретить прерывания для работы с акселератором + LD D,D ; включить акселератор на установку размера блока + LD A,0 ; установить размер блока - 256 байт + LD A,A ; установить акселератор на копирование + ; вертикальных линий. + LDIR ; копировать ! + LD B,B ; выключить акселератор + EI ; включить прерывания +``` + +Этот отрезок программы произведет копирование всего экрана с одного экрана на другой. Время его исполения составляет примерно 1.2 инта. + +Дополнительные функции акселератора (AND, OR, XOR) работают подобным же образом. Для выполнения логических функций используются команды XOR (HL); OR (HL); AND (HL). + +Пример кодирования блока в 256 байт. + +```asm + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; число байт, которые надо закодировать + LD L,L + LD A,(DE) ; взять блок данных в ОЗУ акселератора + XOR (HL) ; произвести операцию XOR с данными акселератора + LD (HL),A ; запомнить в ОЗУ результат операции + LD B,B + EI +``` + +Скорость работы акселератора ограничивается только физической скоростью работы основного ОЗУ. Определить время работы команды с акселератором можно по такой примерной формуле: + +> Время работы = время работы команды без акселератора + время работы акселератора +> Время работы акселератора = число пересылаемых байт / 7000000 (секунд) + +Отключение прерываний во время работы акселератора необходимо, так как в этот момент сильно меняется система команд процессора и программа на прерывании не сможет работать нормально. В данный момент применяется прошивка, в которой акселератор может работать в режиме со включенными прерываниями. В момент прихода прерывания он отключается и включается обратно по команде RETI. Использовать этот режим следует с осторожностью. + +### **7 КЭШ-ОЗУ** + +Кэш-ОЗУ подключается двумя способами – через порт #FB стандартно по Pentagon-овски и как подобно ПЗУ через спец-порт... + +#### **7.1 Загрузка новых прошивок в ПЛМ** + +Описание загрузки прошивок с использованием функции BIOS... + +### **8 ISA, порт A20** + +Доступ к устройствам, подключенным к ISA шине осуществляется через страницы памяти. Для получения этого доступа достаточно установить расширенную Scorpion-овскую страницу и установить в нее номер страницы ОЗУ – #D0..#DF. Бит 1 номера означает выбор доступа к порту или памяти ISA, а бит 2 определяет к какому из двух слотов осуществляется доступ. + +### **9 Внутренние порты Z84C15** + +Ссылка на описание PIO, SIO и т.д. от Zilog. + +Один момент. Конфликт #1F с джойстиком и ВГ93 С джойстиком все пpосто. Ему вывод в #1F не мешает, а ввод из #1F для pаботы с поpтом не тpебуется. Пpи отключенном TR-DOS, с ВГ93 нет конфликтов, когда же он включен, то SP-DOS вместо #1F использует #0F, это избавляет от конфликта с паpаллельным поpтом. Для ноpмальной pаботы пpогpамм использующих #1F в пpошивке сделано аппаpатное пеpенапpавление поpта #1F в поpт #0F. Следовательно команды OUT (#1F),A пpосто не сpаботают. + +Что бы записать во внутpенний поpт пpоцессоpа, надо использовать вывод чеpез BC, т.е. LD BC,#1F : OUT (C),A. Эта команда не пеpенапpавляется. Это пpичина того, почему некотоpые пpогpаммы могут не увидеть джойстика. Они используют IN A,(C)... + +#### **9.1 Мышь** + +```asm +; (c) Denis Parinov +CMOUSE EQU #1B +DMOUSE EQU #1A +VSIZEX EQU 256 ;X SIZE SCREEN +VSIZEY EQU 192 ;Y SIZE SCREEN + +;INTERUPT +CALL READ_M +CALL C,MCORECT +RET + +;READING MOUSE +; HL - X COORD +; DE - Y COORD +; A - BUTTONS +; D0 - LEFT +; D1 - RIGHT + +MS_READ: + LD HL,(PIX_X) + LD DE,(PIX_Y) + LD A,(MB) + RET + +;INITIALIZING COM PORT + +MS_INIT: + DI + LD A,85 + OUT (#10),A + LD A,45 + OUT (#10),A + LD A,0 + OUT (CMOUSE),A + LD A,1 + OUT (CMOUSE),A + LD A,0 + OUT (CMOUSE),A + LD A,3 + OUT (CMOUSE),A + LD A,#41 + OUT (CMOUSE),A + LD A,4 + OUT (CMOUSE),A + LD A,#47 + OUT (CMOUSE),A + LD A,5 + OUT (CMOUSE),A + LD A,#E0 + OUT (CMOUSE),A + EI + RET +READ_M: + IN A,(CMOUSE) + RRCA + RET NC + IN A,(DMOUSE) + LD L,A + BIT 6,A + CCF + RET Z +TST_01: + IN A,(CMOUSE) + RRCA + JP NC,TST_01 + IN A,(DMOUSE) + LD E,A + BIT 6,A + CCF + RET NZ + TST_02: + IN A,(CMOUSE) + RRCA + JP NC,TST_02 + IN A,(DMOUSE) + LD D,A + BIT 6,A + CCF + RET NZ + LD A,E + AND #3F + LD E,A + LD A,L + AND #03 + RRCA + RRCA + OR E + LD E,A + LD A,D + AND #3F + LD D,A + LD A,L + AND #0C + RRCA + RRCA + RRCA + RRCA + OR D + LD D,A + LD A,L + RLCA + RLCA + RLCA + RES 6,A + JR NC,STBU + SET 6,A +STBU: + RLCA + RLCA + AND #03 + LD (MB),A + LD A,E + LD (MX),A + LD A,D + LD (MY),A + SCF + RET + +MCORECT: + LD HL,(PIX_X) + LD DE,(MX) + LD D,0 + BIT 7,E + JP NZ,DECX + ADD HL,DE + LD (PIX_X),HL + EX DE,HL + LD HL,VSIZEX-1 + AND A + SBC HL,DE + JP NC,YCOO + LD HL,VSIZEX-1 + LD (PIX_X),HL + JP YCOO +DECX: + LD A,E + NEG + LD E,A + AND A + SBC HL,DE + LD (PIX_X),HL + JP NC,YCOO + LD HL,0 + LD (PIX_X),HL +YCOO: + LD HL,(PIX_Y) + LD DE,(MY) + LD D,0 + BIT 7,E + JP NZ,DECY + ADD HL,DE + LD (PIX_Y),HL + EX DE,HL + LD HL,VSIZEY-1 + AND A + SBC HL,DE + RET NC + LD HL,VSIZEY-1 + LD (PIX_Y),HL + RET + + DECY: + LD A,E + NEG + LD E,A + AND A + SBC HL,DE + LD (PIX_Y),HL + RET NC + LD HL,0 + LD (PIX_Y),HL + RET + +PIX_X DEFW 128 +PIX_Y DEFW 96 + +MX DEFB #00 +MY DEFB #00 +MB DEFB #00 +``` + +#### **9.2 Принтер** + +Простой драйвер принтера... + +#### **9.3 Прерывания от ISA** + +Режим прерываний от ISA устанавливается через программирование PIO Z84C15 (управление портом B – 1Fh), описанное выше. Назначение битов самого порта следующее (внутренний порт Z84C15 1Eh, port B PIO): + +Bit0 - IRQ1 вход прерываний с первого слова Bit1 - IRQ2 вход прерываний со сторого слова Bit2 - DRQ2 вход Bit3 - DACK2 выход Bit4 - DRQ1 вход Bit5 - DACK1 выход Bit6,7 - используются для Printer-а + +#### **9.4 AT-Клавиатура** + +При программировании AT-клавиатуры следует помнить, что последовательный порт имеет FIFO буфер на 3 байта. После того, как принят и обработан один байт, стоит проверить нет ли еще принятых байтов и возвращаться из программы обработки клавиатуры только если этих байтов нет. + +Программа инициализации клавиатуры и считывания байта. + +```asm +;*********************************************************** +; Процедура инициализации клавиатуры +;*********************************************************** +COM_A EQU 19h +DAT_A EQU 18h + +KBD_INIT: + LD A,0 ; установка портов режима + OUT (COM_A),A ; в соответствии с описанием + LD A,1 ; последовательного порта Z84C15 + OUT (COM_A),A ; + LD A,0 + OUT (COM_A),A + LD A,3 + OUT (COM_A),A + LD A,0C1h + OUT (COM_A),A + LD A,4 + OUT (COM_A),A + LD A,5h + OUT (COM_A),A + LD A,5 + OUT (COM_A),A + LD A,062H + OUT (COM_A),A + RET + +;*********************************************************** +; Процедура считывания байта с клавиатуры +;*********************************************************** +READ_KBD: ; считывание с клавиатуры + IN A,(COM_A) + BIT 0,A ; проверить наличие байта + SCF ; установить флаг C + RET Z ; и вернуться, если не было байта + IN A,(DAT_A) ; считать байт + AND A ; сбросить C + RET ; и вернуться +``` + +Особенности спектрумовской реализации (доп бит для F1..F10) + +#### **9.5 Таймеры** + +Как пример, программа вывода Wav (от Алексея Гавриленко?) + +### **10 Контроллер FDD** + +Все программирование ВГ93 стандартно. Следует обратить внимание только на замену порта #1F на #0F в программе ПЗУ. В случае использования своих программ, этот порт так же должен быть #0F. + +#### **10.1 720/1.44** + +Программа переключения 720/1.44 для платы Sp2000. Обе должны выполняться в режиме TR-DOS и или при специально открытых портах 00BDh и 20BDh. + +```asm +Set_1440: + LD A,21h + OUT (0BDh),A + RET +Set_720: + LD A,01h + OUT (0BDh),A + RET +``` + +Использовать напрямую не рекомендуется, лучше пользоваться функциями BIOS для работы с дискетами. + +### **11 Контроллер HDD** + +Краткое описание контроллера, чтение/запись секторов через BIOS. Ссылка на документ по IDE... + +### **12 CMOS** + +Порты CMOS: + +- #FFBD – Data Read +- #BFBD – Data Write +- #DFBD – Adress Write + +Записывать какие либо данные в CMOS без ведома BIOS-а не рекомендуется. Исключение – установка регистров времени/будильника. + +#### **12.1 Описание регистров CMOS** + +PDF от Dallas 12887A... + +### **13 Дешифрация ПЗУ/КЭШ/Контроллеры/и т.п.** + +Особенности обращения к ПЗУ/КЭШ/ISA... + +#### **13.1 Схема распределения портов** + +Sprinter имеет две обособленные группы портов. Первая группа, это внутренние порты процессора Z84C15, вторая – внешние порты. Адресация портов первой группы не может быть изменена, так как эти порты на одном кристалле с процессором. Вторая группа погключается через ППЛМ и их адреса могут изменяться как угодно, с единственным условием, непересечения с адресами первой группы. + +О том какие порты имеются на кристалле Z84C15 можно прочитать в документации по этому процессору и здесь я упомяну некоторые из них. Один из последовательных портов используется для ввода данных с активной мыши. Один из параллельных используется для вывода данных, на второй параллельный порт заведены сигналы прерываний и запросов прямого доступа со слотов ISA. Параллельный порт процессора Z84C15 устроен таким образом, что на нем возможна организация прерываний по сигналам приходящим через параллельный порт. Фактически второй параллельный порт используется как контроллер прерываний. + +Схема распределения портов второй группы имеет свою особенность. Главной идеей было получение возможности бысро изменять конфигурацию портов без перегрузки ППЛМ. Это достигнуто путем применения карты распределения портов, располагающейся на специальной странице ОЗУ. + +При появлении цикла обращения к порту сначала происходит обращение к ОЗУ карты портов. В карте портов записано какой именно порт подключен к данному адресу. Далее происходит внутренняя дешифрация по байту из карты портов и обращение к выбранному порту. В режиме нетурбо это происходит без каких либо задержек, а в режиме турбо процессору выставляется сигнал WAIT в зависимости от необходимой длины цикла обращения к порту. + +Для подключения к какому либо адресу или отключения от него какого либо порта достаточно открыть карту портов и вписать в нужное место один байт. + +В странице карты портов содержится четыре карты, которые могут переключаться через системный порт. Таким образом можно осуществить быстрое переключение конфигурации портов, что может быть полезно при работе Spectrum-овских программ совместно со Sprinter-овским биосом. + +Карты портов расположена в странице 40h. Переключение производится через системный порт (адрес 7Ch/3Ch). При записи в системный порт значений 04h,0Ch,14h,1Ch происходит переключение на одну из четырех карт. Начальное значение 04h. + +Номер карты соответсвует адресам A12,A13 в странице (блоки по 4kb). На остальные адреса подаются следующие сигналы: + + A0 - A0 + A1 - A1 + A2 - A2 + A3 - A7 + A4 - A13 + A5 - A5 + A6 - A6 + A7 - A14 + A8 - A15 + A9 - /WR - сигнал записи + A10 - /DOS - 0 - дос включен, 1 - выключен + A11 - PN5 - сигнал блокировки порта Пентагона (может отсутствовать) + +Таким образом порт выбирается именно по указанным сигналам, т.е. например, нельзя назначить на адреса 0050h и 0058h различные порты. Участие в дешифрации сигнала /WR позволяет назначать различные порты на один и тот же адрес на чтение и запись. Так, например, в схеме контроллера дисковода на порт 0FFh на чтение назначено чтение порта джойстика и сигналов DRQ, INTRQ контроллера дисковода, а на запись - запись в микросхему ТМ9 - системный порт TR-DOS. + +Назначение порта производится записью соответствующего байта в карту памяти. Так, для того что бы назначить на некий адрес, скажем, на 7785h некий порт, первым делом следует удостовериться, что этот порт не пересекается ни с какими другими портами. Проще всего, это узнать, прочитав карту памяти из адреса, соответсывющего этому порту. Если в этом месте оказался нуль, значит, порт не занят и его возможно использовать (надо помнить, что не все незанятые порты стоит использовать, так как есть еще и внутренние порты Z84C15). + +Как определить адрес, откуда читать байт? + +Для этого надо из 7785h выделить биты 0, 1, 2, 5, 6, 7, 13, 14, 15, и установить соответсвенно им биты адреса карты памяти: + + A0=p_A0=1, A1=p_A1=0, A2=p_A2=1, A3=p_A7=1, A4=p_A13=1, A5=p_A5=0, + A6=p_A6=0, A7=p_A14=1, A8=p_A15=0, A9=xxx, A10=xxx, A11=xxx. + +Значениe xxx имеeтся в виду «не определено» . Это означает, что в карте памяти по всем адресам, у которых из A[11..0] биты A[8..0] равны 010011101b=09Dh следует прописать один и тот же байт, соответсвующий номеру порта. Биты A[15..A12] адреса устанавливаются соответсвенно номеру окна и номеру карты (обычно 1100b для окна C000-FFFF и нулевой карты), таким образом, рассчитанный адрес равен C09Dh, если xxx заменить на нули, а весь набор - C09Dh, C29Dh, C49Dh, C69Dh, C89Dh, CA9Dh, CC9Dh, CE9Dh. + +Если необходимо, что бы порт был «виден» только на запись, то A9 устанавливается в 0, если только на чтение - A9=1. Аналогично с битами DOS и PN5. Если нужно, что бы порт был виден только в DOS или только при открытом порте «Пентагона», необходимо устанавливать соответсувующие биты в адресе карты в конкретные значения. + +С другой стороны, при необходимости неполной дешифрации (например, порт 8-мибитный), надо установить в «не определено» значения для A13,A14,A15, то есть биты 4,7 и 8 адреса карты портов и рассчитать соответствующий набор адресов. + +Ввиду отсутствия дешифрации по части адресам, естественно, открытый для 7785h будет виден и по всем другим адресам, различающимся в битах A[12..8] и A[4..3]. + +Для наглядности напишу програму, которая откроет на чтение и запись порт 7785h некий виртуальный порт с номером 0D0h. + +```asm +OPEN_PORT: + LD B,0D0 ; номер виртуального порта +OPEN_P1: + DI ; запретить прерывания! Не дай бог нагадить в 40h + ; все полетит к чертям. + IN A,(PAGE3) + EX AF,AF’ ; сохранить адрес окна C000h + ; стеком не пользуюсь намеренно, бог его знает, где + ; он, a я страницами щелкаю + LD A,40h + OUT (PAGE3),A ; установить новый адрес окна на страницу 40h + +; Здесь я не буду проверять, что было записано в том месте, +; считая, что там были нули (но в реальном Спринтере стоит проверить, +; не занят ли он). Для проверки этой программы, лучше всего воспользоваться +; портом 0000h, для которого в следующей команде константа +; равна 0C000h, и он точно не зянят. Но здесь так для наглядности. + + LD HL,0C09Dh ; адрес в карте памяти для порта 7785h на запись +; это адрес, биты которого рассчитаны немного выше. Aдрес для карты 0, +; которая и устанавливается при обычной работе. + + LD (HL),B ; установить порт на чтение в режиме DOS + SET 1,H ; включить A9 в 1 (сигнал /WR) + LD (HL),B ; установить порт на запись в режиме DOS + SET 2,H ; включить A10 в 1 (сигнал DOS) + LD (HL),B ; установить порт на запись в режиме не-DOS + RES 1,H ; + LD (HL),B ; установить порт на чтение в режиме не-DOS + +; порт установлен открывать его в режиме отключенного порта пентагона я не +; стал, собственно, и не обязательно, если программа работает в 128-м +; режиме. + + EX AF,AF + OUT (PAGE3),A ; восстановить страницу + EI + RET + +CLOSE_PORT: + LD B,0 ; значение 0 - порт закрыт + JR OPEN_P1 ; все остальное так же как при открытии + +; теперь, что бы пользоваться портом 0, достаточно сделать так + + CALL OPEN_PORT + ..... + LD BC,0 + OUT (C),A + ..... + LD BC,0 + IN A,(C) + ..... + CALL CLOSE_PORT + +; можно вызывать и OPEN_P1, например + + LD B,0D1h ; открыть виртуальный порт 0D1h + CALL OPEN_P1 + +; Естественно, можно вызывать открытие нового виртуального +; порта и не закрывая старый. Надо только помнить, что порт +; стоит закрыть при выходе из программы. +``` + +О виртуальных портах. + +В Спринтере есть набор нескольких дополнительных портов, которые никак нигде не используются, но просто являются некими ячейками памяти. Это порты с номeрами D0h..DFh. Они используются при работе в режиме Pentagon-512 как адреса дополнительных страниц, но в режиме Pentagon-128/Scorpion-256 могут использоваться программистом для каких нибудь особых целей, например, эмуляции какого либо порта для уже написанных программ. А в некоторых случаях могут стать передатчиком дополнительных параметров (хотя и несколько извращенным). + +Байты номеров портов для карты памяти (для sp-97): + +```asm +00 - Нет порта +01h..0Fh - reserved +10h - порт ВГ93 (1F) +11h - порт ВГ93 (3F) +12h - порт ВГ93 (5F) +13h - порт ВГ93 (7F) +14h - порт на запись - состояние контроллера дисковода (FF) +15h - порт на чтение - джойстик и IRQ/INTRQ контроллера +16h..1Fh - reserved +20h - HDD - регистр данных +21h - HDD - регистр состояния/ошибок +22h - HDD - регистр количества секторов для операций R/W +23h - HDD - регистр сектора +24h - HDD - регистр дорожки-low +25h - HDD - регистр дорожки-high +26h - HDD - регистр головок/выбора мастер-слэйв +27h - HDD - регистр команд +28h - HDD - дополнительный регистр управления 3F6 +29h - HDD - дополнительный регистр состояния 3F7 +2Ah..2Fh - reserved +30h - ISA-SLOT 1 - memory R/W +31h - ISA-SLOT 2 - memory R/W +32h - ISA-SLOT 1 - ports R/W +33h - ISA-SLOT 2 - ports R/W +34h..3Fh - reserved +40h - ZX-Keyboard (порт FE) +41h..7Fh - reserved +80h..87h - reserved +88h - COVOX/COVOX-Blaster +89h..8Fh - reserved +90h - AY-8910-port (BFFD) +91h - AY-8910-port (FFFD) +92..BFh - reserved +C0h - Scorpion-256 port (1FFD) +C1h - Pentagon-128 port (7FFD) +C2h - Border, write only (FE) +C3h - reserved +C4h - port RGADR, PORT_Y (89) +C5h - port RGMOD
(C9) +C6h..C7h - reserved +C8h..CFh - копии C0..C7h (not used!) +D0h..DFh - Virtual Ports (USER ports) +E0h - ROM page EXRANSION +E1h - ROM page TR-DOS +E2h - ROM page BASIC-128 +E3h - ROM page BASIC-48 +E4h - ROM page EXRANSION’ +E5h - ROM page TR-DOS’ +E6h - ROM page BASIC-128’ +E7h - ROM page BASIC-48’ +E8h - RAM page (окно 0000-3FFF) +E9h - RAM page (окно 4000-7FFF) +EAh - RAM page (окно 8000-BFFF) +EBh - ROM page SYSTEM +ECh - RAM page CASHE +EDh..EEh - reserved +EFh - ROM page SYSTEM’ +F0h..FFh - RAM pages (окно C000-FFFF) +``` + +О последних 16-ти номерах поподробнее. Установка в какой либо порт значения от F0h до FFh приведет к одному и тому же результату, что и просто установка в этот порт значения F0h. В схеме сделана переадресация номера порта так, что при значении FXh номер порта берется как F0h+SpectrumPAGE, где SpectrumPAGE - номер спектрумовской страницы, адресуемой по портам 7FFD и 1FFD. Таким образом достигается совместимость с Пентагоном и Скорпионом по распределению памяти и делается возможным установка любого номера страницы спринтеровской памяти для любой страницы Спектрума. + +#### **13.2 Конкретные адреса портов, используемые в Sprinter-е** + +В предыдущей секции было рассказано, как устанавливать порты. Здесь же приводятся данные по уже установленным портам в в конкретных конфигурациях. + +Здесь я приведу адресацию портов для конфигураций Sprinter-1 и Sprinter-2. Сразу отмечу, что эти адреса легко могут быть изменены простой программой, в случае появления такой необходимости. + + +Стандартные порты. + + #FE – RD_KBD – порт клавиатуры + #FE – WR_BRD – порт бордюра + #7FFD – порт расширения ZX-Spectrum 128k + #1FFD – порт расширения Scorpion ZS-256 + #1F,#0F – RD_KEMPS – порт джойстика. В конфигурации + Sprinter-1 порт #1F аппаратно переадресуется на порт #0F + #BFFD, #FFFD – AY-PORTS – порты AY-сопроцессора + (ZX-Spectrum-256/AY) + +Не совсем стандартные порты. + + #FB, #4F – порт COVOX-а. + +Дополнительные 8-битные порты Sprinter-а. + + #82 – PAGE0 – страница ОЗУ, подключаемая вместо ПЗУ через порт #1FFD + #A2 – PAGE1 – страница ОЗУ, подключенная по адресу #4000 + #C2 – PAGE2 – страница ОЗУ, подключенная по адресу #8000 + #E2 – PAGE2 – страница ОЗУ, подключенная по адресу #C000 + Здесь надо отметить особо, через порт #E2 можно изменить любую + из 16-ти страниц скорпионовского распределения памяти. + #89 – RGADR и PORT_Y – вертикальная координата точки на графическом + экране или страница VIDEO-RAM для спектрумовского режима + #C9 – RGMOD – порт режима экрана. Переключает страницы режима экрана. + #3C, #7C – SYS_PORT – системный порт трогать не рекомендуется + #10..#1F,#EE,#EF,#F0,#F1,#F4 – внутренние порты Z84C15. + В отличие от остальных, эти адреса изменить невозможно, + так как они находятся вне ПЛМ. + +Порты страниц ОЗУ открыты как на запись, так и на чтение. Это позволяет легко выполнять программы, использующие переключение страниц, а затем возвращать эти страницы назад. При работе BIOS-а все страницы сохраняются. + +Дополнительные 16-тибитные порты Sprinter-а. + + #xx50..#xx55 – порты HDD – использовать внешними программами + не рекомендуется. Функции работы с HDD записаны в ПЗУ. + +Скрытые порты Sprinter-а. + +Скрытыми являются порты которые недоступны в конкретный момент времени, но могут стать доступными после проведения изменений в карте портов. Их адреса не указываются, так как они могут быть выставлены в любое место. + + Порт ПЗУ BASIC48 + Порт ПЗУ BASIC128 + Порт ПЗУ TR-DOS + Порт ПЗУ EXPANSION + Порт ПЗУ SYSTEM + +Через эти порты можно установить новые прошивки ПЗУ. Для этого их достаточно записать в ОЗУ с номерами страниц меньше #80 и записать в соответствующий порт номер этой страницы. При таком подключении страницы Эти страницы будут защищены от записи. + +Частично скрытыми, так же являются и порты #7FFD, #1FFD в обычном состоянии они доступны только на запись, но значения, записываемые в эти порты можно прочитать, открыв соответствующие порты на чтение. + +В других конфигурациях может отсутствовать часть портов или присутствовать новые порты. + +### **14 Сброс.** + +Простой сброса может быть осуществлен записью в страницу #A0, установленную в расширенную страницу Scorpion-овского распределения портов, т.е. следующей программой: + +```asm +SOFT_RESET: + DI + LD A,16 + LD BC,1FFDh + OUT (C),A + LD A,0A0h + OUT (PAGE3),A + LD (0C000h),A ; в этот момент подается RESET + DI ; глюкоуловитель + HALT +``` + +Более сложные варианты сброса, с перегрузкой прошивок, осуществляются через BIOS. + +#### **14.1 Старт машины** + +Описание старта на программном уровне (часть от Дениса)... + +#### **14.2 Доступ к HDD через память.** + +Доступ через память, как пример, программа Video... В данный момент на плате sp2000 отсутствует. + +### **Часть III** + +## **Прошивки ПЛМ** + +Перегузка через BIOS + +### **15 Sprinter-1** + +Перечисление всего что есть. Описание возможностей. + +#### **15.1 Режимы Spectrum-128/Scorpion-256/Pentagon-512** + +Соответственно. Пример программного переключения. + +#### **15.2 Доступ к функциям биоса и портам.** + +Список портов доступных/недоступных в конктретных конфигурациях. + +### **16 Sprinter-2** + +Добавления/убавления относительно Sprinter-1 + +#### **16.1 Акселератор, блочные операции AND, OR, XOR** + +Описание акселератора с примерами. + +### **17 Game-1** + +Описание прошивки, добавление/убавление относительно Sprinter-2 + +#### **17.1 Акселератор + Covox-Blaster** + +Использование COVOX-Blaster-а совместно с акселератором. + +### **18 Doom** + +Добавление относительно Game-1 + +#### **18.1 Акселератор с растяжением линий** + +Описание акселератора с растяжениями. Пример программые растяжениями, плюс ссылка на исходник Doom-Demo. + +### **19 Video** + +Особенности прошивки Video. Использование считывания с HDD прямо в экран. + +#### **19.1 Режим экрана 160x128** + +Дополнения к описанию режимов экрана... + +### **Часть IV** + +## **Программирование с использованием функций БИОС-а.** + +### **20 Функции биоса** + +Вызов функций производится через вход в TR-DOS 3D13h. Номер команды задается в регистре C. Установленный на выходе флаг C означает завершение работы функции с ошибкой. + +При работе части функций биоса необходимо что бы стек находился в области 8000h..0BFFFh, так как они используют для своей работы переключение страниц PAGE1 и PAGE3. Для устранения каких либо неприятностей связанных со стеком его следует всегда устанавливать в этот диапазон при вызове функций биоса Спринтера. + +Вызов функций биос так же может быть осуществлен через вход по RST 18h при подключенном системном ПЗУ, а так же через RST 8 при подключенном ОЗУ в нулевой банке путем установки на адрес RST 8 небольшой программы, переключающейся в ПЗУ биоса + +Для подключения системного ПЗУ можно воспользоваться такой последовательностью команд: + +```asm + DI + LD A,0 + OUT (07Ch),A ; после этого в 0-м адресе будет включена ПЗУ биоса + ; и программа может вызывать функции через RST 18h, + ; просто заменяя этим вызовом вызов CALL 3D13h +; * Обычные функции TR-DOS в этот момент не доступны +``` + +Что бы вернуться к обычному ПЗУ следует выполнить программу: + +```asm + LD A,0 + OUT (03Ch),A +``` + +Вызов из ОЗУ осуществляется через RST 8. При этом на адресе 8 должна располагаться такая программа: + +```asm + PUSH AF + LD A,0 + OUT (07Ch),A ; в этом месте вместо ОЗУ подключится ПЗУ биоса и + ; программа уйдет в него. + POP AF ; На эту команду происходит возврат при таком + ; вызове биоса. + RET +; Оптимизация кода в этом месте недопустима. Вместо LD A,0 можно установить +; две команды XOR A и DI +``` + +Далее вызов функций осуществляется аналогично RST 18h, но следует помнить, что адресное пстранство 0000..3FFF во время работы биоса занято ПЗУ и в нем не могут располагаться данные для работы функций. + +Вызов новых функций через 3D13h автоматически отключает прерывания. После исполнения функции программа должна включить их при необходимости. Если необходимо что бы прерывания были включены все время, следует использовать режим IM 2, с таблицей, стеком и обработчиком расположенным в области 8000h..BFFFh и пользоваться вызовом через RST 18h или RST 8 В этом случае прерывания в биосе не отключаются. + +#### **20.1 Работа с памятью** + +```asm +EMM_FN0: ; определение объемов ОЗУ + LD C,0C0h ; функция номер 0C0h + CALL 3D13h ; HL - общий объем памяти в страницах по 16kb + ; BC - объем свободной памяти в страницах по 16kb + +EMM_FN1: ; инициализация распределения памяти + ; стирается вся информация о выделенных ранее блоках + ; ОЗУ. Устанавливаются как занятые блоки с + ; системной информацией, а так же первые 256kb ОЗУ + LD C,0C1h ; функция номер 0C1h + CALL 3D13h ; выходных параметров нет + +EMM_FN2: ; выделение блока ОЗУ
+ LD B,num_pages ; запрашиваемое число страниц ОЗУ + LD C,0C2h ; номер функции
+ CALL 3D13h ; NC -> А - идентификатор блока + ; CF -> A=1 - нет памяти + +EMM_FN3: ; освободить блок ОЗУ + LD A,id_blk ; идентификатор блока + LD C,0C3h ; номер функции + CALL 3D13h ; NC - нормальное завершение + ; CF - неверный идентификатор блока + ; правильность идентификатора отслеживается не всегда + +EMM_FN4: ; получить физический номер страницы из блока
+ LD A,id_blk ; идентификатор блока + LD B,page ; логическая страница в блоке + LD C,0C4h ; номер функции + CALL 3D13h ; NC -> А - физический номер страницы
+ ; CF -> А=0 - нет такого блока, A=FF - конец блока + +EMM_FN5: ; получить список физических страниц блока + LD A,id_blk ; идентификатор блока + LD HL,bufer ; буфер длиной 256 байт для размещения списка + ; буфер должен быть длиной на единицу больше числа + ; страниц в блоке + LD C,0C5h ; номер функции + CALL 3D13h ; NC -> HL - тот же буфер, B - число страниц в блоке + ; данные по адресу HL - список физических страниц по + ; порядку. Список заканчивается байтом FF + ; CF -> неверный идентификатор блока. Старая + ; информация в буфере может быть затерта + +EMM_FN6: ; Получение адресов портов окон + LD A,win_num ; номер окна проецирования 0,1,2 или 3 + LD C,0C6h ; номер функции + CALL 3D13h ; NC -> C - 8-мибитный адрес порта, B - номер + ; подключенной в данный момент страницы ОЗУ + ; CF -> ошибка номера окна + +; Функция фактически не используется в данный момент. Адреса портов окон +; не изменялись с самого начала разработки компьютера и, надеюсь, не будут +; меняться. Для соблюдения приличий программисту следует хотя бы один раз +; вызвать эти функции и сравнить адреса портов с теми, что используются в +; программе и, если они не совпадают, выдать соответствующее предупреждение. +; В данный момент эти порты таковы: PAGE0=82h, PAGE1=0A2h, PAGE2=0C2h, +; PAGE3=0E2h + +EMM_FN7: ; получить следующую страницу блока по предыдущему + LD A,page ; физическая страница блока + LD C,0C7h ; номер функции + CALL 3D13h ; NC -> A - следующая физическая страница блока + ; A=FF - индицирует конец блока + ; CF -> ошибка номера страницы + +; Информация о распределении памяти хранится в виде RAM Allocation Table, +; похожей на дисковый FAT. Поэтому нахождение физического номера следующей +; страницы по предыдущему физическому номеру происходит значительно быстрее, +; чем поиск по увеличенному на единицу логическому номеру. + +EMM_FN8: ; слияние блоков + LD A,id_blk1 ; блок номер 1 + LD B,id_blk2 ; блок номер 2 + LD C,9Eh ; номер функции + CALL 3D13h ; NC -> A - блок результата + ; CF -> ошибка, неверный номер блока + +EMM_FN9: ; разделение блока + LD A,id_blk1 ; блок + LD B,len_blk ; новая длина блока + LD C,9Dh ; номер функции + CALL 3D13h ; NC -> A - блок результата, B - блок остатка + ; CF -> ошибка, неверный номер блока +``` + +#### **20.2 Работа с блоками как с RAM-Disk-ами** + +```asm +BLK_RD_WR: ; чтение/запись из/в блок(а) памяти секторами + ; по 256 байт + LD HL,bufer ; адрес буфера данных + LD DE,sector ; абсолютный номер сектора + LD B,sec_num ; число секторов + EX AF,AF’ + LD A,command ; команда 0 - чтение, FF - запись + EX AF,AF’ + LD A,id_blk ; идентификатор блока + LD C,0C8h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка идентификатора + +; * функция на бета-тестировании... + +BLK_TO_RAMD: ; назначить блок памяти RAM-Disk-у + ; любой блок памяти может содержать данные + ; RAM-Disk-а в формате TR-DOS для подключения этих + ; данных в качестве диска и служит эта функция + LD A,ram_disk ; номер RAM-Disk-а 0..15 - соответствует + ; RAM-Disk-ам от e: до t: + LD B,id_blk ; идентификатор блока + LD C,0C9h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка: неверный номер RAM-Disk-а или + ; RAM-Disk занят + +RAMD_CLEAR: ; освободить RAM-Disk + ; освобождение RAM-Disk-а не есть освобождение + ; блока ОЗУ. Это просто отключение блока ОЗУ от + ; RAM-Disk-а + LD A,ram_disk ; номер RAM-Disk-а - 0..15 + LD C,0CAh ; номер функции CALL 3D13h ; NC -> нормальное завершение, B - идентификатор ; блока отключенного от RAM-Disk-а ; CF -> ошибка: неверный номер RAM-Disk-а или ; RAM-Disk был свободен + +GET_RAMD_ST: ; получение идентификатора блока, назначенного на + ; RAM-Disk + LD A,ram_disk ; номер RAM-Disk-а 0..15 + LD C,0CEh ; номер функции + CALL 3D13h ; NC -> A - идентификатор блока. + ; A=0 - блок не назначен. + ; CF -> ошибка номера RAM-Disk-а +``` + +#### **20.3 Управление назначением на дисководы** + +Каждый из 4-х дисководов TR-DOS может быть переназначен для работы с RAM-Disk-ами, винчестером и реальными дисководами. + +```asm +RAMD_TO_DRV: ; назначение RAM-Disk на дисковод. + LD A,ram_disk ; номер RAM-Disk-а + LD B,drive ; номер дисковода 0..3 - соответствует дисководам + ; A:, B:, C:, D: + LD C,0CBh ; номер функции + CALL 3D13h ; NC -> нормальние завершение + ; CF -> ошибка: неверный номер драйва или рамдиска + +FDD_TO_DRV: ; назначение реального дисковода + LD А,disk_drive ; номер физического дисковода 0..3 + LD B,drive ; номер драйва 0..3 + ; Номер физического дисковода и номер драйва должны + ; совпадать, так как компьютер не имеет + ; электрической схемы переключения дисководов на + ; разные буквы. В будущих версиях железа, возможно, + ; это появится. + LD C,0CCh ; номер функции + CALL 3D13h ; NC -> нормальние завершение + ; CF -> ошибка: неверный номер драйва или дисковода + +HDD_TO_DRV: ; назначение винчестера на дисковод + LD A,hdd_drive ; Номер винчестера. Должен быть 0. В дальнейшем + ; будет иметь значения от 0 до 15 для подключения + ; различных разделов и master/slave + LD B,drive ; номер драйва 0..3 + LD C,0CDh ; номер функции + CALL 3D13h ; NC -> нормальние завершение + ; CF -> ошибка: неверный номер драйва или винчестера + +GET_DRV_ST: ; получить тип назначения на драйв + LD A,drive ; номер драйва 0..3 + LD C,0CFh ; номер функции + CALL 3D13h ; NC -> нормальние завершение. A - тип назначения + ; A=0..3 - назначен реальный дисковод A:, B:, C:, D: + ; A=4..19 - назначен RAM-Disk - A = ram_disk + 4 + ; A=40h..4Fh - назначен винчестер (40h+hdd_drive) + ; CF -> ошибка номера драйва +``` + +#### **20.4 Функции управления железом и определение версии** + +```asm +FN_VERSION: ; выдача информации о версии биоса и железа + LD HL,bufer ; буфер, куда будет помещена ASCIIZ строка с + ; названием и номером версии, конец строки отмечен + ; нулем. + LD C,0EFh ; номер функции + CALL 3D13h ; NC -> HL - тот же буфер с записанной строкой. + ; DE - версия биоса + ; BC - версия железа + ; BC=FFFF - not identifyed + ; BC=FFFE - Sprinter-1 + ; BC=FFFD - Sprinter-2 + ; BC=FFFC - Spectrum + AY8910 + ; BC=FFFB - Game-1 + ; BC=FFFA - Video-1 + ; BC=FFF9 - DooM + ; Иные значения BC - новые прошивки + ; версия железа выдается только + ; в биосах версий 1.16 и выше + ; CF -> ошибка. Очень старая версия, не имеющая + ; данной функции + +SPRINTER_1: ; переключение в конфигурацию Sprinter-1 + LD C,0F0h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> функция не исполнена, фатальная ошибка + ; машину следует перезапустить по RESET + +SPRINTER_2: ; переключение в конфигурацию Sprinter-2 + LD C,0F1h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> функция не исполнена, фатальная ошибка + ; машину следует перезапустить по RESET + +SPRINTER_ALL: ; переключение конфигурации пользователя + LD A,page_cnf ; страница с файлом прошивки для ПЛМ EPF10K10 + ; страница не может иметь номер больше 127 + ; Файл прошивки, естественно должен быть уже + ; загружен в эту страницу + LD C,0F3h ; номер функции + CALL 3D13h ; NC -> нормальние завершение + ; CF -> функция не исполнена, фатальная ошибка + ; машину следует перезапустить по RESET + +; Перед исполнением функций SPRINTER_1, SPRINTER_2 и SPRINTER_ALL биос +; проверяет загруженную прошивку по идентификатору. Если требуемая +; прошивка совпадает с текущей, то операция перезагрузки ПЛМ не +; производится. +; Во время исполнения этих функций наблюдается сбой синхронизации монитора, +; так как в этот момент происходит изменение всей схемы компьютера и +; сигналы синхронизации монитора просто отсутствуют. + +FN_SINC: ; установка синхронизации, очистка режима экрана + ; функция может быть отнесена и к группе функций + ; вывода на экран, так как полностью очищает + ; страницы режима экрана. На всем экране остается + ; только бордер + LD A,sinc_mode ; режим синхронизации + ; A=0 режим по умолчанию - используется для очистки + ; страниц режима (отключения вывода всех окон) + ; A=1 режим Scorpion - 312 строк в экране, + ; положение INT-а, как в Scorpion-256 + ; A=2 режим Pentagon - 320 строк в экране, + ; положение INT-a как в Pentagon-128 + LD C,0F2h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> неверный номер режима синхронизации + +; изменение режима синхронизации может привести к временному сбою +; синхронизации монитора. + +; DCP_FN0: ; функция управления дешифратором портов. +; LD C,0F4h ; В данный момент не доделана +; Функция позволит открывать/закрывать дополнительные порты компьютера + +SET_PORTS: ; глобальная установка портов + LD A,port_num ; внутренний номер порта + ; F0..FF - страницы Scorpion 0..15, подключаемые в + ; адрес 0C000h, страница именно та, которая + ; подключена в данный момент через 7FFD,1FFD + ; E0=EXPANSION, Е1=TR-DOS, E2=BASIC-128, E3=BASIC-48 + ; E4=EXPANSION’,Е5=TR-DOS’,E6=BASIC-128’,E7=BASIC-48’ + ; E8=RAM0, E9=RAM1, EA=RAM2, EB=SYS0, EC=CASH + ; ED,EE - reserv, EF=SYS1 + ; C0=COPY_1FFD, C1=COPY_7FFD, C2=COPY_BRD, C3-reserv + ; C4-reserv, C5=COPY_V_MODE, C6=COPY_SYS, C7-reserv + ; C8..CF - альтернативный набор для C0..C7 + ; D0..DF-reserv - доп. страницы для Pentagon-512 + ; 80..BF-user_ports! + ; 00..7F-внешние порты, использовать не рекомендуется + LD B,port_data ; данные, записываемые в страницу + LD C,0F8h ; номер функции + CALL 3D13h ; B - предыдущее содержание порта + +READ_PORTS: ; глобальное чтение портов + LD A,port_num ; внутренний номер порта + LD C,0F9h ; номер функции + CALL 3D13h ; B - содержание порта + +WRITE_PORTS: ; глобальная запись портов + LD A,port_num ; внутренний номер порта + LD B,data_port ; записываемые данные + LD C,0FАh ; номер функции + CALL 3D13h ; + +; Функции SET_PORTS, READ_PORTS и WRITE_PORTS позволяют иметь доступ +; к любым портам компьютера независимо от того, открыты они или нет. +; В данный момент функции недоступны и находятся в разработке +; С помощью этих функций будет возможно прочитать содержимое портов 1FFD и +; 7FFD, например, а так же установить нужные значения в закрытые системные +; порты. Порты User-а позволят эмулировать некоторые устройства, +; отсутствующие в Спринтере, а так же могут дать особый способ +; передачи данных между программами, минуя ОЗУ. + +CMOS_RD: ; читать из регистра CMOS + LD C,0F6h ; номер функции + LD D,cmos_reg ; номер регистра CMOS + CALL 3D13h ; NC - часы есть + ; CF - часов нет + +CMOS_WR: ; писать в регистр CMOS + LD C,0F7h ; номер функции + LD D,cmos_reg ; номер регистра CMOS + CALL 3D13h ; NC - часы есть + ; CF - часов нет + +; Функции CMOS_RD,CMOS_WR работают всегда. Если в машине нет микросхемы +; CMOS, она эмулируется. Наличие микросхемы определяется функцие CMOS_TEST. + +CMOS_TEST: ; проверить наличие CMOS + LD C,0F5h ; номер функции + CALL 3D13h ; NC - часы есть + ; CF - часов нет + +FN_TURBO: ; функция управления турбо режимом. + LD A,turbo_mode ; режим турбо: 2 - off, 3 - on + LD C,08Fh ; номер функции + CALL 3D13h ; NC -> исполнение + ; CF -> неверный режим турбо + +; * переключение режима турбо может не произойти, если прошивка не +; поддерживает это переключение. При этом ошибки не происходит. +``` + +#### **20.5 Функции печати и управления режимом экрана** + +```asm +WIN_OPEN: ; функция открытия окна. + LD IX,win_descriptor ; описатель окна +; IX - 32-хбайтовый описатель окна +; (IX+0) - горизонтальный размер окна в знакоместах +; (IX+1) - вертикальный размер в знакоместах +; (IX+2) - положение окна по горизонтали на экране +; (IX+3) - положение окна по вертикали на экране +; (IX+4) - режим знакоместа +; bit4=1 - text_mode bit4=0 - graf_mode +; bit5=0 - 16, bit5=1 - 8 точек в знакоместе +; graf_mode bit3..0 - не существенны +; bit7..6 - номер палитры +; text_mode bit7..6,3..0 - номер знакогенератора +; исключение: bit7..6=B"11" -> бордер +; (IX+5) - дополнительный режим знакоместа +; bit0=1 - указывает на включение спектрумовской +; адресации экрана +; (IX+6) - положение по X в поле графики (по знакоместам) +; (IX+7) - положение по Y в поле графики (по знакоместам) +; разъяснения о положении в поле графики - ниже +; (IX+8..31) - зарезервировано (переменные окна) + LD E,win_flag ; флаги окна + ; бит 0 указывает какую страницу режима включать + ; после исполнения функции + ; бит 4 указывает на какой странице режима + ; открывать окно + LD HL,win_place ; HL - место на экране по знакоместам + ; (копия в IX+2,3), в новых версиях биоса значение + ; HL не существенно + LD C,0B0h ; номер функции + CALL 3D13h ; NC -> A - номер окна + ; CF -> ошибка слишком много окон + LD (id_win),A ; сохранить идентификатор окна + +; * При открытии окна описатель копируется в системную страницу ОЗУ и +; программа может не сохранять его. +; ** В данный момент идентификатор окна всегда равен 0 +``` + +Видео-ОЗУ Спринтера можно представить как одно сплошное поле графики размером 1024 точки по горизонтали на 256 точек по вертикали Положение в поле графики показывает где будет находиться в этом поле верхний левый угол окна. Положение исчисляется в знакоместах. Т.е. Если указано положение по X – 2, по Y – 6, это означает, что верхний угол окна будет расположен по координатам X=16, Y=48 в поле графики видео-ОЗУ Таким образом, если, например, открыть два окна в разных местах, но с одинаковыми координатами в поле графики, на экране окажутся два идентичных окна, данные в которые будут попадать одновременно. + +Знакогенераторы текстовых режимов так же располагаются в видео-ОЗУ и имеют конкретные адреса в поле графики. При необходимости иметь на экране как графическое, так и текстовое изображение надо следить, что бы данные графических окон не попадали в поле графики, где расположены знакогенераторы + +При использовании какого либо знакогенератора, он занимает часть поля графики по координатам (координаты в знакоместах, т.е. в значениях байта IX+6 описателя окна) + +_X_ = (8 \* (_bit3..0_ of mode))..(8 \* ( _bit3..0_ of mode) + 7) + +По Y занимаются все положения. Таким образом, при использовании нескольких знакогенераторов сначала следует использовать знакогенераторы с номерами меняющимися в Bit7..6, так как они попадают в одни и те же координаты поля графики + +При открытии графических окон следует помнить, что в этот момент информация текстового экрана находящаяся в этом месте будет утеряна. При открытии текстового окна изменяется информация только в поле графики знакогенератора соответствующему этому текствовому экрану. Если эта информация и информация графического окна не пересекались, то при повторном открытии графического экрана, на нем автоматически восстановится графическая картинка + +```asm +WIN_CLOSE: ; закрытие окна + LD A,(id_win) ; идентификатор окна (пока должен быть 0) + LD C,0B1h ; номер функции + CALL 3D13h ; NC -> успешное завершение + ; CF -> ошибка - неверный идентификатор + ; Окно с номером 0 никогда не закрывается и попытка + ; закрытия приводит к ошибке + +LP_OPEN_S: ; Открытие стандартных окон. + LD E,win_flag ; флаги окна + ; bit 0 определяет страницу режима, которая будет + ; открыта после исполнения функции + LD C,080h ; номер функции + LD B,win_type ; тип открываемого окна + ; 0 - спектрумовское окно 32x24 + ; 1 - текстовое окно 64x24 + ; 3 - текстовое окно 80x32 + ; 4 - спектрумовское окно, HL - положение окна + ; 5 - текстовое окно 64x24, HL - положение окна + ; 7 - текстовое окно 80x32, HL - положение окна + ; 8 - графическое окно 0, HL - положение окна + ; 9 - графическое окно 1, HL - положение окна + LD HL,win_place ; положение окна для 4..9 типов + CALL 3D13h ; выполнить функцию +; ** Функция старая, использовать не рекомендуется. + +; Далее, в функциях запоминания, восстановления, перемещения и стирания +; подразумеваются локальные окна в смысле "окно в окне". Идентификатор окна +; относится к глобальному окну, отнисительно которого адресуются локальные + +WIN_COPY_WIN: ; копирование данных текстового окна в память + ; запоминание окна + LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD D,ver_place ; DE - положение локального окна в глобальном окне + LD E,hor_place ; положение по горизонтали в символах + LD IX,bufer ; адрес буфера для запоминания данных локального окна + EX AF,AF’ + LD A,bufer_page ; страница буфера для данных окна + EX AF,AF’ ; адрес буфера указывается для окна 0C000h + ; если адрес указан с 8000h, номер страницы буфера + ; не действителен + LD C,0B2h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка - неверный идентификатор окна +; при работе этой функции через RST 18h или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения своей работы. + +WIN_RESTORE_WIN: ; копирование данных из памяти в текстовое окно + ; восстановление окна + LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD D,ver_place ; DE - положение локального окна + LD E,hor_place ; положение по горизонтали в символах + LD IX,bufer ; адрес буфера данных для локального окна + EX AF,AF’ + LD A,bufer_page ; страница буфера данных окна + EX AF,AF’ ; адрес буфера указывается для окна 0C000h + ; если адрес указан с 8000h, номер страницы буфера + ; не действителен + LD C,0B3h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка - неверный идентификатор окна +; при работе этой функции через RST 18h или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения работы. + +; Данные для функций WIN_COPY_WIN и WIN_RESTORE_WIN имеют одинаковую +; структуру В данный момент эта структура похожа на структуру текстового +; экрана IBM, т.е. данные идут в формате sym1,atr1,sym2,atr2,.. сплошным +; массивом. Сначала данные для первой строки, затем сразу для второй и т.д. + +WIN_GET_SYM: ; взять символ с экрана + LD A,(id_win) ; идентификатор окна (пока должен быть 0) + LD DE,place ; положение символа: D - вертикаль, E - горизонталь + LD C,0B4h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; L - символ, H - атрибут, B - знакогенератор + ; CF -> ошибка неверный идентификатор окна + +WIN_PUT_SYM: ; положить символ на экран + LD A,(id_win) ; идентификатор окна (пока должен быть 0) + LD DE,place ; положение символа: D - вертикаль, E - горизонталь + LD B,sym_zg ; знакогенератор + LD L,symbol ; символ + LD H,atribute ; атрибут символа + LD C,0B5h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка неверный идентификатор окна + +WIN_SET_ZG: ; установка знакогенератора + LD A,sym_zg ; системный номер знакогенератора + LD DE,zg_form ; указатель на 2Kb данных знакогенератора +; Данные знакогенератора должны располагаться в таком виде, в каком они +; выглядели бы как набор символов на спектрумовском экране при переносе 2Kb +; LDIR-om в адрес 4000h +; * В будущем возможно изменение этого расположения на обычное + LD C,0B6h ; номер функции + CALL 3D13h ; NC -> завершение + ; CF -> ошибка (старая версия, нет функции) + +WIN_MOVE_WIN: ; перемещение окна + LD A,(id_win) ; идентификатор глобального окна (пока должен быть 0) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD D,ver_place ; DE - положение локального окна + LD E,hor_place ; положение по горизонтали в символах + LD IX,new_place ; новое положение локального окна + LD C,0B2h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка - неверный идентификатор окна + +; при работе этой функции через RST 18h или RST 8, обязательна установка +; DI, так как функция пользуется стеком для ускорения работы. + +; Далее следуют функции печати для работы с _текущим_ глобальным окном. +; В данный момент текущим всегда является последнее открытое окно +; На графическом экране функция не работает + +LP_PRINT_ALL: ; печать символов с атрибутом + LD A,symbol ; символ + LD E,atribute ; атрибут + LD B,num_sym ; число выводимых символов + LD C,081h ; номер функции + CALL 3D13h ; на экран выводится строка из B одинаковых + ; символов + ; регистры HL,IX - сохраняются + +LP_PRINT_SYM: ; Вывод символов на экран с текущего + ; знакоместа без атрибута + LD A,symbol ; символ + LD B,num_sym ; число выводимых символов + LD C,082h ; номер функции + CALL 3D13h ; на экран выводится строка из B одинаковых символов + ; атрибут остается тот, который был на экране + ; регистры HL,IX - сохраняются + +LP_PRINT_ATR: ; печать атрибутов + LD E,atribute ; атрибут + LD B,num_sym ; число выводимых символов + LD C,083h ; номер функции + CALL 3D13h ; на экран выводится строка из B одинаковых + ; атрибутов. Символы не меняются. + ; регистры HL,IX - сохраняются + +LP_SET_PLACE: ; Установка текущего знакоместа в окне + LD E,hor_place ; номер символа по горизонтали + LD D,ver_place ; номер символа по вертикали + ; ** Превышение границ приводит не к ошибке, а к + ; переустановке сначала, за вычетом полного + ; размера окна + LD C,084h ; номер функции + CALL 3D13h ; позиция печати устанавливается в соответстии с + ; регистром DE + +LP_PRINT_LN: ; Вывод строки символов на экран с текущего + ; знакоместа + LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh + LD E,atribute ; атрибут, с которым будет выведена строка + LD B,num_sym ; длина выводимой строки + LD C,085h ; номер функции + CALL 3D13h ; "исполнение желаний" + +LP_PRINT_LN2: ; Вывод строки символов на экран с текущего + ; знакоместа без атрибутов + LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh + LD B,num_sym ; длина выводимой строки + LD C,086h ; номер функции + CALL 3D13h ; строка будет выведена без изменения атрибутов в + ; месте печати + +LP_PRINT_LN3: ; Вывод строки символов на экран с текущего + ; знакоместа до разделителя. После разделителя + ; выводятся пробелы что бы вывести B символов + LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh + LD E,atribute ; атрибут, с которым будет выведена строка + LD D,delimiter ; разделитель + LD B,num_sym ; длина выводимой строки + LD C,087h ; номер функции + CALL 3D13h ; символы из (HL) выводятся на экран, пока не + ; встретится символ равный D, далее печатаются + ; пробелы, как дополнение строки до B символов + +LP_PRINT_LN4: ; Вывод строки символов длиной B на экран с текущего + ; знакоместа до разделителя D, без атрибутов. + LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh + LD D,delimiter ; разделитель + LD B,num_sym ; длина выводимой строки + LD C,088h ; номер функции + CALL 3D13h ; символы из (HL) выводятся на экран, пока не + ; встретится символ равный D, далее печатаются + ; пробелы, как дополнение строки до B символов + ; атрибуты не изменяются + +LP_CLS_WIN: ; очистка экрана + LD DE,place ; положение локального окна (глобальное = текущее) + LD H,ver_size ; HL - размер локального окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD B,atribute ; атрибут очистки + LC C,089h ; номер фунции + CALL 3D13h ; выполнение. Произворится выводом пробелов с + ; заданным атрибутом + +LP_SCROLL_UD: ; Скроллинг части глобального окна вверх/вниз + LD B,scroll_type ; тип скроллинга 1 - вверх / 2 - вниз + LD D,beg_line ; начальная строка скроллинга + LD E,num_lines ; число скроллируемых строк + LD C,08Ah ; номер функции + CALL 3D13h ; выполнение. Скроллируются полные строки + ; глобального окна + +LP_PRINT_LN5: ; Вывод строки символов на экран с текущего + ; знакоместа до разделителя после разделителя + ; вывод останавливается + LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh + LD E,atribute ; атрибут, с которым будет выведена строка + LD B,num_sym ; максимальная длина выводимой строки + LD C,08Bh ; номер функции + CALL 3D13h ; символы из (HL) выводятся на экран, пока не + ; встретится символ равный D или количество + ; символов не превысило B. Далее происходит + ; возврат + +LP_PRINT_LN6: ; Вывод строки символов на экран с текущего + ; знакоместа до разделителя после разделителя + ; вывод останавливается, без атрибутов + LD HL,line_adr ; адрес строки. Должен быть между 04000h и 0BFFFh + LD B,num_sym ; максимальная длина выводимой строки + LD C,08Ch ; номер функции + CALL 3D13h ; символы из (HL) выводятся на экран, пока не + ; встретится символ равный D или количество + ; символов не превысило B. Далее происходит + ; возврат. Атрибуты не выводятся + +LP_CLS_WIN2: ; очистка экрана, указанием символа заполнения + LD DE,place ; положение локального окна (глобальное = текущее) + LD H,ver_size ; HL - размер окна вертикаль/горизонталь + LD L,hor_size ; размер в символах + LD A,symbol ; символ очистки + LD B,atribute ; атрибут очистки + LC C,08Dh ; номер фунции + CALL 3D13h ; Выполнение. Произворится выводом пробелов с + ; заданным атрибутом и символом + +LP_GET_PLACE: ; получить текущее положение вывода на экран + ; в глобальном окне + LD C,08Eh ; номер функции + CALL 3D13h ; в регистр DE будут положены координаты, + ; в которых будет напечатан следующий символ + ; D - вертикаль, E - горизонталь +``` + +#### **20.6 Графические функции** + +```asm +; Координаты считаются от верхнего левого угла экрана + +PIC_POINT: ; установить точку + LD DE,Y_coord ; координата по вертикали + LD HL,X_coord ; координата по горизонтали + LD A,(id_win) ; идентификатор граф. окна (пока должен быть 0) + LD B,color ; цвет точки + LD C,0A1h ; номер функции + CALL 3D13h ; поставить точку + +; В действительности ставить точки на экране с помощью функции биоса, +; слишком медленно. Для этого лучше пользоваться прямым выводом данных +; на графический экран. Устройство экрана и способы прямого вывода +; графических данных описаны в файле архитектуры Спринтера. + +PIC_SET_PAL: ; установка палитры + LD HL,pal_data ; данные палитры: + ; список цветов по четыре байта B,G,R,Y + LD E,beg_color ; начальный цвет + LD D,num_colors ; количество устанавливаемых цветов + LD B,pal_mask ; маска при установке палитры. Для нормального + ; режима должнa быть FF + LD A,page_pal ; номер палитры 0..15 значения от 8 до 15 резервные + LD C,0A4h ; номер функции + CALL 3D13h ; установка палитры + +; данные палитры должны представлять собой список приблизительно такого вида: + DB blue1,green1,red1,0 + DB blue2,green2,red2,0 + ..................... + DB blueN,greenN,redN,0 +; N = num_colors. Значение num_colors равное 0 соответствует 256-ти цветам +; при записи в видео-ОЗУ все данные предварительно проходят функцию AND со ; значением pal_mask +``` + +Страницы палитры 0..3 соответствуют графическим режимам. Для вывода в соответствующей палитре нужно задать соответствующее значение bit7..6 в байте режима знакоместа + +Страницы 4..7 соответствуют текстовому режиму и режиму «Spectrum» В странице 4 задается цвет paper для каждого атрибута. В странице 5 задается цвет ink для каждого атрибута. В странице 6 задается цвет paper, которым он будет моргать в режиме flash В странице 7 задается цвет ink, которым он будет моргать в режиме flash Таким образом, для каждого из 256-ти атрибутов задается четыре цвета если цвета 4,5 совпадают с цветами 6,7 то режим flash оказывается отключенным. Для его включения в спектрумовском режиме надо поменять местами цвета 6 и 7. Если надо включить flash в режим IBM-CGA, следует установить цвета 6 и 7 одинаковыми и равными цвету 4 по сути режим flash всегда включен и на экране постоянно меняются цвета paper с 4-го на 6-й, а цвета ink с 5 на 7-й. Если эти пары цветов для атрибута знакоместа устанавливаются одинаковыми, то flash в этом месте не виден. Используя подобное задание цветов текстового режима можно легко добиться совместимости по цветам как со Спектрумом, так и с IBM + +```asm +SET_PAL_INIT: ; установка внутренней палитры. + LD A,PAL_PAGE ; страница палитры + LD B,PAL_N ; номер палитры + ; 2 - установка спектрумовской палитры + ; 1 - установка графической плаитры + LD C,0A6h ; номер функции + CALL 3D13h ; установка палитры +``` + +#### **20.7 Работа с винчестером и дисками MS-DOS** + +```asm +HDD_INIT: ; инициализация винчестера + LD C,040h ; номер функции + CALL 3D13h ; NC -> нормальное завершение + ; CF -> винчестер не найден + +HDD_RECAL: ; рекалибровка винчестера + LD C,041h ; номер функции +; * Функция зарезервирована для дальнейшего использования + +HDD_TEST_IDE: ; Тест наличия интерфейса IDE + LD C,042h ; номер функции + CALL 3D13h ; NC -> нормальние завершение + ; в регистре B информация о наличии устройств + ; bit0=1 - есть устройство "master" + ; bit1=1 - есть устройство "slave" + ; CF -> ошибка, аппаратная неисправность + +HDD_PREPARE: ; подготовка винчестера к операции чтения/записи + LD C,043h ; номер функции + LD HL,bufer_adr ; адрес буфера данных + LD A,bufer_page ; страница буфера, если адрес в окне 0C000h + LD B,sec_num ; число секторов + LD DE,sec_low ; абсолютный номер сектора младшая часть + LD IX,sec_high ; абсолютный номер сектора старшая часть + CALL 3D13h ; При исполнении производится вся подготовка к + ; операциям чтения/записи вычисление + +; цилиндров/головок/секторов и занесение их в регистры винчестера +; далее программа может сама только подать команду читать/писать и +; самостоятельно производить считывание/запись данных в винчестер. +; Команда удобна для работы программ в реальном времени, когда необходимо +; кроме чтения/записи данных производить какие либо иные действия. + +HDD_READ_BPB: ; читать BPB + LD C,044h ; номер функции + LD HL,bufer_adr ; адрес буфера для BPB + LD A,bufer_page ; страница буфера, если адрес в окне 0C000h + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка + +HDD_READ: ; читать сектора с винчестера + LD C,045h ; номер команды + LD HL,bufer_adr ; адрес буфера данных + LD A,bufer_page ; страница буфера, если адрес в окне 0C000h + LD B,sec_num ; число читаемых секторов + LD DE,sec_low ; абсолютный номер сектора младшая часть + LD IX,sec_high ; абсолютный номер сектора старшая часть + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка + +; ** При попадании межсекторного промежутка на адрес 0000h +; производится автоматическое переключение страницы ОЗУ по +; RAM Allocation Table. + +HDD_WRITE: ; писать сектора на винчестер + LD C,046h ; номер команды + LD HL,bufer_adr ; адрес буфера данных + LD A,bufer_page ; страница буфера, если адрес в окне 0C000h + LD B,sec_num ; число записываемых секторов + LD DE,sec_low ; абсолютный номер сектора младшая часть + LD IX,sec_high ; абсолютный номер сектора старшая часть + CALL 3D13h ; NC -> нормальное завершение + ; CF -> ошибка + +; ** При попадании межсекторного промежутка на адрес 0000h +; производится автоматическое переключение страницы ОЗУ по RAM +; Allocation Table. + +HDD_PART: ; настройка партиций и master/slave + LD C,047h +; * функция зарезервирована + +; В ближайшее время в описание биоса будут добавлены функции работы с FDD и +; CD-ROM +; * В данный момент они имеются, но предполагается их серьезная переделка. +; Некоторые функции зарезервированы для дальнейшего развития. Так же не +; описана часть графических функций, так как они в данный момент подвергаются +; серьезным переделкам. + + LD C,50H ; зарезервирована + +DRV_RESET: ; Сброс контроллера и настройка на диск + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + ; остальные номера резервные + LD C,51h ; + CALL 3D13H ; NC - нормальное завершение + ; CF - нет диска или нет устройства + + LD C,52h ; зарезервировано + + LD C,53h ; зарезервировано + +DRV_VERIFY: ; проверка секторов + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD HL,sec_h ; старшая часть номера сектора + LD IX,sec_l ; младшая часть номера сектора + LD B,n_sec ; количество секторов + LD C,54h ; + CALL 3D13h ; NC - нормальное завершение + ; CF - проверка с ошибкой или нет устройства + +DRV_READ: ; чтение с устройства + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD HL,sec_h ; старшая часть номера сектора + LD IX,sec_l ; младшая часть номера сектора + LD B,n_sec ; количество секторов + LD DE,bufer_adr ; адрес буфер для чтения + LD C,55h ; + CALL 3D13h ; NC - нормальное завершение + ; CF - ошибка чтения или нет устройства + +DRV_WRITE: ; запись на устройства + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD HL,sec_h ; страшая часть номера сектора + LD IX,sec_l ; младшая часть номера сектора + LD B,n_sec ; количество секторов + LD DE,bufer_adr ; адрес буфер для чтения + LD C,56h ; + CALL 3D13h ; NC - нормальное завершение + ; CF - ошибка чтения или нет устройства + +DRV_DETECT: ; определение параметров устройства + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD C,57h ; + CALL 3D13h ; NC - нормальное завершение + ; A - bit7 - 0 диск 720Кb + ; 1 диск 1.44Mb + ; CF - нет устройства или нет носителя + +DRV_GET_PAR: ; получить параметры носителя + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD C,58h ; + CALL 3D13h ; NC - нормальное завершение + ; L - число секторов + ; H - число головок + ; DE - количество цилиндров + ; IX - размер сектора в байтах + ; B - доп. параметры + ; для дискет бит7 - тип 1.44/720 + ; если в HL,DE все FF - устройства нет + ; CF - нет устройства + +DRV_SET_PAR: ; установить параметры носителя + LD A,drv_type ; бит 0..3 - номер устройства + ; бит 4..7 - тип устройства + ; 0 - дисковод + ; 6 - ram-disk + ; 8 - HDD + ; C - CD-ROM + LD L,n_secs ; L - число секторов + LD H,n_heads ; H - число головок + LD DE,n_cyls ; DE - количество цилиндров + LD IX,sec_size ; IX - размер сектора в байтах + LD B,ext_par ; B - доп. параметры + ; для дискет бит7 - тип 1.44/720 + LD C,59h ; + CALL 3D13h ; NC - нормальное завершение + +; Функции не отмеченные как зарезервированные, старые или тестируемые, +; меняться скорее всего не будут. +``` + +### **21 Дополнительные сведения по программированию** + +#### **21.1 Вывод на графический экран** + +В биосе имеются функции открытия графического экрана на весь экран 320x256 точек. После открытия этого режима экран представляет собой. набор из 256-ти линий, длиной по 320 байт. Соседние точки в линии - это соседние байты. Переключение линий производится через PORT_Y, в котором устанавливается номер линии, выводимой на экран. Номера линий считаются сверху экрана, начиная с нулевой. + +Для вывода в графический экран так же требуется открыть соответствующую страницу основного ОЗУ. В этой странице будет содержаться копия видеоизображения. + +Видео-ОЗУ является теневым ОЗУ, поэтому информация, находящаяся в основном ОЗУ, под которым находится видео-ОЗУ не обязательно будет совпадать с информацией, находящейся в этом видео-ОЗУ. Запись видео-данных может производиться и без перезаписи данных в оснвном ОЗУ, что оказывается полезным при работе, например, со спрайтами. Для работы со спрайтами так же предусмотрен режим записи в видео-ОЗУ с прозрачным цветом. В этом режиме информация, передаваемая в видео-ОЗУ проверяется на наличие байта #FF. Если этот байт обнаруживается, то цикл записи пропускается и на экране в этом месте остается те данные, какие были ранее. Таким образом на экране можно быстро прорисовывать спрайты, представляющие из себя прямоугольные картинки с «прозрачными» цветами. + +Пример программы вывода прямоугольной картинки на экран: + +```asm +PAGE3 EQU #E2 +RGADR EQU #89 + + LD A,#50 ; страница графического видеоэкрана + OUT (PAGE3),A ; установить в PAGE3 + LD HL,Pucture ; адрес картинки (Прямые Данные) + LD DE,#C040+HorPlace ; положение картинки на экране по горизонтали + LD A,VerPlace ; положение картинки на экране по вертикали + OUT (RGADR),A LD B,VerSize ; высота картинки +LOOP: PUSH DE ; запомнить положение на линии + PUSH BC ; запомнить счетчик высоты + LD BC,HorSize ; длина картинки + LDIR ; копировать линию + POP BC + POP DE + INC A ; следующая координата по Y + OUT (RGADR),A + DJNZ LOOP ; повторять нужное количество раз +``` + +Управление режимом вывода на экран (включение вывода с прозрачными цветами, отключение копирования в основное ОЗУ) осуществляется через младшие биты порта страницы графического экрана. + +#### **21.2 Особые режимы** + +Режим Bound, программирование режимом экрана (быстрые скроллинги). + +#### **21.3 Вывод палитр** + +Вывод палитры – функция БИОС. + +### **Часть V** + +## **Программирование в TR-DOS (дополнительные команды)** + +### **22 Работа с HDD и RAM-Disk TR-DOS через** + +Команды вводятся как обычно в TR-DOS строке побуквенно. Все команды доступные из командной строки работают и из BASIC-а через: + +##### **RANDOMIZE USR 15619: REM:comand** + +При наборе команд через знак "/" следует иметь в виду, что лишние пробелы в начале мешают ее исполнению (система распознает новую команду по знаку "/" в начале команды). + +При наборе имен файлов MS-DOS допускаются звездочки и вопросики, по правилам: * – любой набор символов, ? – один любой символ. + +#### **22.1 /HDT** + +**/HDT** – тест винчестера. Определяет тип винчестера и выводит на экран его марку. Если этого не происходит, это значит, что винчестер либо неверно подключен, либо незовместим (бывает с очень старыми моделями). + +#### **22.2 /HDD** + +**/HDD** – подключение винчестера к текущему диску A,B,C или D – к тому, на который указывает TR-DOS в начале в командной строки. + +#### **22.3 /CAT, /DIR** + +**/CAT /DIR** – выдача каталога. Команды **/CAT** и **/DIR** идентичны по исполнению. Работают так же команды типа: + +**/DIR \*.trd** – выдача каталога файлов с расширением .trd + +**/DIR a\*.dm\*** – выдача файлов, имена которых начинаются на a, а расширения на dm + +**/DIR ??xm.\*** – выдача файлов, имена которых имеют четыре буквы и оканчиваются на xm + +#### **22.4 /LOAD, /SAVE** + +**/LOAD x file.ext** – загрузка в RAM-Disk x файла file.ext RAM-Disk будет автоматически создан (или пересоздан, если такой был) + +Сокращенная команда: **/file.ext** – загрузка файла в RAM-Disk E + +**/SAVE x file.ext** – сохранение RAM-Disk-а в файла file.ext. При сохранении происходит замещение содержания существующего файла. Новый не создается, длина файла не меняется. + +При загрузке и сохранении работают и команды со звездочками и вопросиками, но выполняется только с первым найденым файлом. Например, команда **/\*.\*** загрузит в RAM-Disk E самый первый файл с винчестера. + +ВНИМАНИЕ: Команда **/SAVE** на данный момент является единственной командой TR-DOS, которая меняет содержимое винчестера. При своей работе она ЗАМЕЩАЕТ содержимое файла образом RAM-Disk-а. Если длина файла меньше длины RAM-Disk, то запишется лишь часть данных RAM-Disk-а, по количеству секторов файла. + +#### **22.5 /FDD** + +**/FDD** – подключение к текущему диску обычного дисковода. Если к этому диску был подключен винчестер или RAM-Disk, то они будут отключены и доступ с этого диска будет осуществляться к обычной дискете. + +После команды **/FDD** работают все команды **/SAVE** , **/LOAD** , **/DIR** с дискетами в формате MS-DOS. 1.44 или 720 диск распознается автоматически. + +После нее же работают и все стандартные команды TR-DOS, а так же расширенные команды из TRDOS-5.04Em. + +#### **22.6 /RMD** + +**/RMD X** – подключение к текущему диску рамдиска X (буквы от Е до S). После этой команды текущий дисковод работает с RAM-Disk-ом в только формате TR-DOS. Выполняются все TR-DOS команды, в том числе и FORMAT. При форматировании старое содержимое диска уничтожается, диск приобретает размер 640Kb и в него прописывается пустой каталог. + +ВНИМАНИЕ! Если RAM-Disk не был создан или подгружен с винчестера или дискеты, все попытки чтения каталога, файлов и т.п. приведут к появлению ошибки. + +Создать RAM-Disk можно командой: **FORMAT "name"** . Обязательно после того, как командой **/RMD X** был подсоединен нужный RAM-Disk. + +Подгрузка RAM-Disk-а осуществляется командой **/LOAD** . При этом RAM-Disk создается автоматически. Работа с TR-DOS на этом RAM-Disk-е будет возможна только если подгруженный файл был образом RAM-Disk-а. Если же это не так, то доступ к RAM-Disk-у все равно останется через команды чтения/записи секторов, вызываемые через точку #3D13. Таким образом можно подгружать и использовать в программах любые файлы. + +#### **22.7 /CLEAR** + +После того как RAM-Disk X сохранен (и не обязательно после этого) он может быть удален из памяти командой. + +##### **/CLEAR x** + +Объем памяти компьютера ограничен, поэтому не обязательно все 16 RAM-Disk-ов могут в нем уместиться. Кроме того, размер RAM-Disk определяется с точностью до 16Kb и может занимать все пространство памяти т.е. до 3.4Mb (Остальная память – 256K видео, 256K спектрумовская память и 80K системной памяти всегда заняты.) + +#### **22.8 Команды переключения конфигураций** + +TR-DOS предоставляет простое средство для преключения трех конфигураций, зашитых в ПЗУ непосредственно из командной строки. Для этого служат команды: **/Sprinter 1** , **/Sprinter 2** и **/AY** . Следует иметь в виду, что после переключения в Sprinter-2 спектрумовская клавиатура перестанет работать, и в случае вызова этой команды с консоли произойдет «подвисание». Использование этой команды может быть целесообразно в BASIC программах, которые переключат режим, выполнят некоторые действия и вернут режим в Sprinter 1 или AY, когда вновь возможно использование спектрумовской клавиатуры. + +#### **22.9 Дополнительные сервисные команды** + +Кроме описанных есть еще несколько сервисных команд: + +**/A: /B: /C: /D:** – переключение текущих дисководов без проверки их начичия. Удобно использовать из бейсика при работе с рамдисками, когда надо убрать возникновение ошибок из-за переключения на дисковод, к которому еще ничего не подключено. + +**/RD** – тестовая команда. Выводит внутреннюю таблицу Ram Allocation Table (подобна FAT), по которой можно увидеть какие страницы ОЗУ заняты, какие свободны. Таблица выводится сплошными цифрами в HEX формате. Каждая пара это номер, соответстующий некой странице. Если этот номер равен 00, это означает, что страница свободна. Таблица 16x16 двухбуквенных номеров соответствует 256-ти страницам основного ОЗУ. + +Создание новых файлов на HDD или дискетах MS-DOS на данный момент возможно только через командеры или функции DOS, вызываемые из ассемблера. Аналогично, копирование, удаление, перемещение, создание/удаление каталогов и т.д. + +Из TR-DOS можно работать только с файлами корневого каталога. Единственная команда TR-DOS меняющая содержимое HDD – команда **/SAVE** , замещающая содержимое файла, в который производится сохранение RAM-Disk-а. + +Большие и маленькие буквы в названиях MS-DOS файлов считаются одинаковыми. + +### **23 Дополнения TR-DOS 5.04Em** + +TR-DOS 5.04Em, на основе которого написан TR-DOS Спринтера, использовался в компьютерах Peters-256. + +TR-DOS 5.04Em является дальнейшим развитием версий 5.04Е, 5.04Е+. По сравнению с версией 5.03 в ней имеются следующие дополнения: + +Форматирование дискет в 3-х вариантах: **ORIGINAL** – обычный формат TR-DOS; + +**TURBO** – форматирование диска с другим расположением секторов, что приводит к ускорению операций чтения/записи диска примерно в 2 раза. однако, применение этого формата замедляет выполнение команды **VERIFY** , но эта команда реально почти не используется. + +**TURBO-FAST** – форматирование аналогично TURBO, но без операции проверки. Этот режим стоит применять только если есть уверенность в качестве дискет. Применение команды немного ускоряет саму операция форматирования. + +**QUICK** – быстрый формат. Команду можно применять, в случае, если диск уже отформатирован и надо просто удалить с него все файлы. TR-DOS не проводит физического форматирования, а просто прописывает в первых секторах пустой каталог. Следует отметить, что этот формат не годится для односторонних и 40-дорожечных дисководов, так как диск не проверяется и в него прописываются данные, что он двухсторонний, имеет 80 дорожек и 2544 свободных сектора. QUICK-формат автоматически используется для форматирования RAM-Disk-ов. + +Bыбор формата производится по запросу DOS после ввода обычной команды **FORMAT "name"** клавишами <1>, <2>, <3> или <4>. Kлавиша отменяет команду. Если необходимо форматировать диск из программы, так что бы TR-DOS не запрашивал тип формата, вслед за именем диска, сразу после кавычки надо поставить цифру 1, 2, 3 или 4, в соответствии с необходимым типом формата. + +При форматировании на экран выдается сообщение о номере форматируемой в данный момент дорожки и стороны диска. + +При записи файла на диск в случае если файл с таким именем на диске есть DOS выдает запрос о стирании старого файла. Если ответить или , то старый файл будет стерт и на его место будет записан новый файл, если он не длиннее старого. Если же новый файл длиннее, то он будет записан как обычно с первого свободного сектора диска, а в каталоге появится еще один стертый файл. B версии 5.03 такой случай просто приводит к остановке программы с ошибкой. + +При включении DOS сразу устанавливает, что дисководы A: и B: имеют тип 2x80.. Это приводит к отсутствию начальной проверки дисковода (нет звука "др-др-др"при первом выборе нового дискла). В процессе работы диск проверяется на тип, и DOS работает с ним как надо. + +Ускорeнная команда **MOVE**. В обычной версии 5.03 команда **MOVE** наиболее длинная по времени работы, кроме того создается впечатление, что дисковод больше стоит чем работает. Это объясняется тем что каждый раз при перемещении файла производится чтение каталога и запись в него. В данной версии чтение и запись каталога производятся один раз. Информация каталога сохраняется в ОЗУ и все операции с каталогом (только в команде **MOVE**) производятся в ОЗУ, что значительно ускоряет работу команды, в среднем в 3 – 4 раза, а в некоторых случаях и более. + +Введена новая команда – переименование диска: **MOVE "name"** . При этом команда **MOVE** не выполняется, а просто имя диска заменяется на **"name"**. + +В TR-DOS 5.04Em изменен редактор командной строки. Во-первых, устранена неприятность которая возникает при входе в DOS в 128 режиме. Во-вторых, устранено влияние клавиш редактирования, которые перемещают курсор строки в 48-м режиме. И, наиболее важная часть, - возможность вызова предыдущей команды с помощью клавиши . Если Вы хотите повторить операцию или повторить ее с немного изменнеными параметрами, то можно вызвать ее сразу после выполнения нажав клавишу . Если же Вы что-то набрали в командной строке, то клавиша не сработает (в 5.03 версии это приводит к вызову строки из BASIC программы). + +TR-DOS 5.04Em поддерживает работу с RAM-диском, основанном на дополнительном ОЗУ – 128k. Эта функция заменена на более модернизированные функции работы с RAM-Disk-ами Спринтера, описанные выше. + +### **24 Копирование файлов с TR-DOS дискет в RAM-Disk** + +Последовательность команд для достижения эффекта копирования в RAM-Disk E содержимого дискеты A: + +**\*"A:"** – переключение на диск A **/FDD** – подключение к диску A обычного дисковода + +**\*"B:"** – переключение на диск B **/RMD E** – подключение к диску B рамдиска E **FORMAT "name"** – форматирование RAM-Disk-а (можно не форматировать, а подгрузить файл с HDD командой **/LOAD E file.trd** ) + +**COPY "b:\*","a:\*"** – стандартная команда TR-DOS копирования всех файлов с A: на B: + +Действия собственно по копированию с дискет на RAM-Disk могут быть совершены стандартными спектрумовскими командерами, работающими с TR-DOS через точку входа #3D13. + +После этих команд на диске B: будет виден обычный каталог (команда TR-DOS: **CAT** ) и с этими файлами можно работать как с обычными TR-DOS файлами. + +После того, как нужные файлы скопированы на RAM-Disk, его следует сохранить, как описано в следующей секции. + +### **25 Сохранение содержимого RAM-Disk на винчестере** + +Для примера – RAM-Disk E. + +К какому дисководу был подключен RAM-Disk (и был ли подключен вообще) не имеет значения. Имеет значение, что этот RAM-Disk существует в памяти, т.е. был либо создан командой **FORMAT** , либо подгружен ранее с HDD. + +Последовательность команд: + +**/HDD** – подключение винчестера (какой диск стоял по умолчанию не имеет значения сработает на любом) + +**/SAVE E file.trd** – сохранение RAM-Disk-а E в файл file.trd + +Сохранение подгруженного с HDD RAM-Disk обратно, естветственно, стоит делать только в том случае, если в образе диска произошли изменения. Для избежания возможных глюков рабочие программы стоит держать в отдельном RAM-Disk-е, а изменяемые файлы на другом и иметь резервные копии файлов .trd с важными данными (это общая рекомендация для любых компьютерных систем). + +### **Часть VI** + +## **Программирование в Sprinter-DOS** + +(от Дениса) + +А этот текст для того что бы LATEX не ругался на пустоту в параграфе. А то, блин, развели тут, панимашь, пустых парахрафов, как мух нерезаных! + diff --git a/docs/Original/Акселератор/accel_r.txt b/docs/Original/Акселератор/accel_r.txt new file mode 100644 index 0000000..7df50ed --- /dev/null +++ b/docs/Original/Акселератор/accel_r.txt @@ -0,0 +1,97 @@ + Sprinter. + + -. + + : + +- 256 ( 640x256 - / 512 ) +- 256 ( 640x256 - 512 ) +- AND, OR, XOR . + + -. + + . + + , . + , + 1..256 . + + , +, . + + +. + , +. + + . + , , , + NOP. + + LD B,B - . + LD D,D - + LD A,dat, dat + . , + . + LD C,C - Fill - . + LD (HL),A + A + LD E,E - Fill - + . + LD H,H - rezerved + LD L,L - . LD A,(HL) + (HL), + LD (DE),A + -. + LD A,A - + LD L,L, . + + : + + ; , #C000 + LD HL,#C040 ; + LD DE,#C180 ; + LD BC,#140 ; + DI ; + LD D,D ; + LD A,0 ; - 256 + LD A,A ; + ; . + LDIR ; + LD B,B ; + EI ; + + + + . + 26 . + + (AND, OR, XOR) . + XOR (HL); OR (HL); AND (HL). + + 256 . + + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; , + LD L,L + LD A,(DE) ; + XOR (HL) ; XOR + LD (HL),A ; + LD B,B + EI + + + + . + : + + = + + + + = /7 + + , + . diff --git a/docs/Original/Архитектура/ARHITECT.TXT b/docs/Original/Архитектура/ARHITECT.TXT new file mode 100644 index 0000000..386ac1a --- /dev/null +++ b/docs/Original/Архитектура/ARHITECT.TXT @@ -0,0 +1,635 @@ + + ۰ + ۰ ۰ + ۰۰ + ۰ + ۰ ۰ + ۰ ۰ ⥪ Sprinter. + ߰ ߰ + + . + + ᠭ । 稥 । ⥫, + ⥪ ZX-Spectrum ࠧ⥩, +⭮ Pentagon-128 Scorpion-256, ⠪ 몠 BASIC +஥ ⢮ 몮 ᥬ Z80. + 뢠 䨣樥 設 - ॠ +⭮ 奬 ९ணࠬ㥬 ᪮ 奬 (). + 砥, 設 ⢮ 䨣権, + ᢮ 奬. + ⠪ ᯮ ⨥ -. ଠ쭮 +᫥, ஥ , ஬ ࠡ ᮪ + . - 뢠 ⮫쪮 ࠤ樨, + - 53710 Pentagon-128. + + + ⪨ Sprinter. + + pp . . . . . . . . . . . Z84C15 + ⮢ . . . . 21MHz/3.5MHz + . . . . . . . . . . . . . . 4096Kb + . . . . . . . . . . . . . 64Kb + . . . . . . . . . . . . . . .128Kb + - . . . . . . . . . 256Kb(512) + pp ᪮ . . . . . p181893 + p 1.44Mb p . . 3.5"᪠ + pp p . . . . . IDE/AT + pp p . . . 101key/AT + pp . . . . . . . MS-Mouse + ᫮ . . . . . . . ⠭p ISA-8 + AY-3-8910 ८-OUT + COVOX . . . . . . . . . 8bit x 4chanel + -p: . . . Spectrum standart + GRAF 320x256x256,640x256x16, TXT 80x32 + 室 TV CGA p, RGB + + + 孨᪠ ॠ. + + ஬ 設  Z84C15 EPF10K10QC208. +஬ 奬a , 72- SIMM + 4Mb, 256Kb -, 64Kb -, 奬 ஫ ᪮ + 181893, 祭 ⨪, 䮭, ਭ, +, ᪮, , , 奬 設 ISA-8 + ALTERA - EPM7032LC44. ᢮ +䨣樨 ।祭 ᯥ祭 ᨭ஭樨 砫쭮 +᪠ . ⠪ ।ᬮ७ 祭 +CMOS ᮢ ᭮ 奬 DALLAS. ஬ ਨ ஢ +奬 樨, 室 १ . + ன +ࠧ ⭮ . + + + ⥪ 設. + + 奬 p ᭮ 让 pppp㥬 ᪮ +p奬. 祭 ਩ ன १ +᮪ 設 䨣. + ppp ⢫ p⢥ +祭, ⠪ p pp㧪, p쭮 +奬 p⢥ p p. ᨫ쭮 뤥 +⥪ 鸞 ஢ ⮬ +, 騥 設, ᢮ . ᪨ + 塞 ⥪, ன +奬. , ਬ, ⮢ +祭 ਨ, ⠪ ᥪ㭤 +⥬ ९ணࠬ஢ , ⢥ 䨣 +⮢.  ⮫쪮 䨣, +ਬ, ⠪ 䨣 ZX-Spectrum. + ९ணࠬ㥬 奬 쭮 ᢮ +䠭⠧ ணࠬ 䨣樨 設. 뢠 +ࠡ ணࠬ । 䨣樨 +ᤥ , , , ਤ㬠 ᢮ 䨣, +⥬ ॠ । ᪮ ⮩ ணࠬ. + + + 筠 奬 Sprinter. + + Ŀ Ŀ >Sinc + ਭ 2 ISA SLOTS >R + Ĵ >G + Ŀ >B + Ŀ + + INT + Ŀ Ŀ Ŀ + ij ij Ĵ EPF10K10 Ĵ + ijDATAij Ĵ V_DATAĴ + ijĿ ij Ĵ Ĵ + < + Ĵ Ĵ + Z84C15 ADRESSĴ V_ADRESSĴ + Ŀ Ĵ Ĵ + + <ij ij > WE,CSi> + <ij ij DIR> + <ij ij > > Audio OUTs + Ŀ + Ŀ Ĵ MAIN + - ADRESSĴ + T > Sinchro Ĵ + A HDD_DIR <Ĵ + <Ĵ RAS,CAS,WEĴ + + + Ŀ + ਩ ன⢠ <Ĵ + FDD,HDD,KEMPSTON + Ŀ Ŀ + TAPE < Keyboard> + in/out ´ + + + 㭮 1. + + + + 奬 㪠. +⢮ ஢ 設 ⠪ ᫮. ᨣ ࠢ +ன ⨯஢ ᠬ SIMM-. + + + 쭥襥 ᠭ ⥪  ᠭ +䨣権 ⥩ 䨣権. । ⨬ ᫥ ᪠ ᪮쪮 +᫮ ४祭 ᠬ 䨣権. + + 㧪 䨣権. + + 祭 , ⠪ ᫥ RESET +ଠ, 室 ⢥ 䨣, +ࠥ. 室 ० 㧪 奬. + ⪫祭 ਨ. + ᭮ ࠭⢮ 뢠 祭 ࠭ + ࠭ -.  ᭮ ࠭⢮ + ਢ ணࠬ +祭 ࠭ ⮫쪮 ⢥ 楫 - 㧨 + 䨣樨. ⮩ ࠭ 室 +砫쭮 䨣樨. ( 䨣 Sprinter-1.) +ணࠬ 㧪 䨣樨 ஢ 䫠 - , ᫨ +⠭, 㦠 , ᫨ 襭, +. ⮬ ᭮ ४䨣஢ 奬 . + 奬 㧨 ᫥ ࠭ - + 䨣樨 ᬥ饭 #100 ⠢ 䫠,  +⥪⮢ ப "FLEX_10K_LOADING", ᠭ ᬥ饭 #80 ⮩ +࠭ -. ᫥ ⮣ ந , +⢫ ணࠬ ᯥ樠 ࠭ RESET_PAGE. +ணࠬ , ᪠ 室 䫠 FLEX_10K_LOADING +稭 㧪 . ⮬ ६ ࠥ 䫠, + ।頥 㧪 䨣樨 ⨨ + RESET ᫥ "筮" 砫 +䨣. ࠭ 䫠 ⠪ 祭 砥 +祭 ࠢ쭮 䨣樨 ६ ᯥਬ⮢ ணࠬ. +⨥ RESET ᥣ ୥ 奬 砫 䨣. + + ਬ砭: + ७ ଠ  ⮩ +ଠ樥 ALTERA. ஬ ᠬ 奬 ALTERA ⠢ + ணࠬ ᯥ祭 ࠧ 奬 . ᮦ, +ணࠬ ࠡ ⨯ ZX-Spectrum 襬 +ਬ 饬 । Sprinter-. ⮬ +ࠧࠡ⪠ 䨣権 ந ⮫쪮 稨 +筮 魮 設 ( Pentium-166) ணࠬ ࠧ +奬 , 業 ⠢ ⭨ ஢ . + 裡 ⨬, Sprinter ᪮쪮 +䨣権, ᠭ , ⠫ +㦥 ᪥ . ﭭ ᮢ襭⢮ + 䨣権 ࠧࠡ⪠ . + + 䨣 Sprinter-1. + + 砥 ᥡ 䨣 Spectrum-128/256, । + 4Mb, ७ ࠭ ० Spectrum, Text-80x32, Graf-320x256x256, +஫ ᪮, ஫ IDE , ஫ AT, +祭 ZX-Keyboard, 8-bit COVOX. + 䨣 ᨬ쭮 ਡ 䮣樨 ZX-Spectrum + ࠡ ᯥ㬮᪨ ணࠬ ⥯ + ७ ० ࠭ , ⠪ ࠡ +묨 ன⢠. + + 䨣 Sprinter-2. + + 砥 ᥡ 䨣 Spectrum-128/256, । + 4Mb, ७ ࠭ ० Spectrum, Text-80x32, Graf-320x256x256, +஫ ᪮, ஫ IDE , ஫ AT, +祭 ZX-Keyboard, Accelerator. + 䨣, Sprinter-1 ਡ ᯥ㬮᪮, + ⪨ ॡ ணࠬ ᮢ⨬. +ᯮ짮 ᥫ 権 ᭮ -. ᥫ +᪮ 樨 뫪 ⮬ + 䨧᪮ । ᪮ ᭮ . + ᫥ ᨨ 䨣 Sprinter-2 Spectrum-᪮ +. 0FEh 뢠 ᪠ 襤訩 +AT-. + + 䨣 ZX-Spectrum-256/AY. + + 䨣 ᨬ쭮 ਡ ZX-Spectrum-128/256 + 砥 ᥡ 奬 몠쭮 ᮯ AY-3-8910. ⮩ +䨣樨 ७ ० ࠭. + 奬 AY 砥 ᥡ ᮢ, + 㬠 ॣ . 饩 . + ⥭ ⮢ ᮯ. + 쥩 ᨨ AY । ⪨ ᪫. + + 䨣 Sprinter-3. + + 䨣 易 䨣樨 ZX-Spectrum. +⪫砥 ᭮ ࠭⢮ ࠧ 16k, + 砥  256- ࠭ . +ᯥ㬮᪨ ࠭, ᪨ ࠭ ⠪ , 䨣 +Sprinter-1 Sprinter-2. ⥫ 㭪樨 ᥫ. + ந 樨 AND, OR XOR . 8-bit +COVOX. + 쭥襬 । 祭 ⮩ 䨣樨 +ਭ஢᪮ 㪮 . + + 䨣 Game-1. + + 宦 䨣 Sprinter-3. ᥫ ᪨ +㭪権, 뢮 㪠 COVOX-Blaster - COVOX , +騬 뢮 筮 ᢮ ୮ ६ +㣮 ࠡ. 䨣 ਥ஢ ᯮ짮 +Sprinter-. + + + 奬 । . + + 奬 । 䨣 Sprinter-1 Sprinter-2 + 筮 ஧. ᪨ ।⠢ ᮡ 奬 +। Scorpion, +⥫쭮 奬, ந쭮 ⠭ +࠭ , , ⠪ . + ࠭ ᢮ , ஬ 㪠뢠 +⢨⥫ ࠭ 256- ࠭ 4Mb. ࠭, +஥㥬 ࠧ ᭮ ࠭⢠ ᢮ +ᮡ⢥ . .. ࠭, 砥 #4000..#7FFF, +࠭ 5 筮 Spectrum-᪮ । , 砥 + #C000..#FFFF ࠧ . + ᥣ ⠪ ⮢ ࠭ - 32. + 16 ⮢ ⢥ ࠭ , 砥 ᠬ +#C000..#FFFF. ⢥ 祭 ࠭ ᠬ +#0000..#3FFF, #4000..#7FFF #8000..#BFFF. ᥬ ⮢ ᯮ +祭 ࠧ ࠭ . - 祭 ࠭ +- . - ⥬ , 砥 + ࠧ ᫥ 設 蠬 Ctrl+Alt+Del. + ⠢訥 3 ࠭ १ࢥ. +奬 । ᭮ ࠭⢮ + ⮫쪮 , ISA , ⠢塞 + ᫮. + 祭 #C000..#FFFF ᪮௨᪨ ७ +࠭ , ॠᮢ ᫮. ⮣ + ࠭ 祭, ᮮ⢥饥 ISA-᫮, + ஬ 室 ந 饭. 祭 ⠪ 㪠뢠 + 祬 饭, ⠬ . + + + 奬 । Sprinter-. + + ᭮ ࠭⢮ ࠭ + 砥 ࠭ ࠭ 16k + Ŀ Ŀ Ŀ Ŀ + #0000..#3FFF > > ROM_BASIC >> EXPANSION + #7FFD, Ĵ Ĵ + #1FFD Ŀ ROM_TR-DOS > > TR-DOS + Ĵ Ĵ Ĵ + #4000..#7FFF Ŀ > BASIC128 + Ĵ + ROM_SYSTEM > > BASIC48 + Ĵ Ĵ Ĵ + #8000..#BFFF Ŀ > RAM_0000 > > SYSTEM ROM + Ĵ + Ŀ > SYSTEM ROM2 + Ĵ > RAM_4000 > Ĵ + #C000..#FFFF ÿ > CONFIG 2 + Ĵ + Ŀ > CONFIG 1 + ٳ > RAM_8000 > + + + Ŀ Ŀ ࠭ 16k + > RAM_0 > Ŀ + #7FFD, Ĵ >> RAM_00 + > #1FFD > > Ĵ + > RAM_01 + > RAM_7 > > Ĵ + Ĵ + > RAM_8 >ij> + Ĵ RAM_7F + > > Ĵ + Ĵ >> RAM_80 + > RAM_F >> + + 譨 ன⢠ Ĵ + Ŀ Ŀ > RAM_FE + > ISA_1 <Ĵ Ĵ + Ĵ > RAM_FF + > ISA_2 <Ĵ + Ĵ + > HDD <Ĵ + Ĵ + > OVER DEVICES < + + + 㭮 2. + + + + 㣨 䨣 奬 । 頥 +᢮ ᮢ . ⢮ #1FFD #7FFD, ⠪ + 頥 奬 ࠡ ன⢠, ⮡ࠦ묨 . + + + 奬 । ⮢. + + Sprinter ᮡ 㯯 ⮢. ࢠ 㯯, +७ Z84C15, - 譨 . +⮢ ࢮ 㯯 , ⠪ +⠫ ஬. 㯯 砥 १ + 㣮, ⢥ ᫮, 祭 +ᠬ ࢮ 㯯. + ⮬ ⠫ Z84C15 +㬥樨 ⮬ 㯮 . + ᫥⥫ ⮢ ᯮ ⨢ . + ࠫ ᯮ 뢮 , ன ࠫ + ᨣ 뢠 ᮢ אַ 㯠 ᫮⮢ ISA. +ࠫ Z84C15 ஥ ⠪ ࠧ, + ࣠ 뢠 ᨣ 室騬 १ ࠫ +. ᪨ ன ࠫ ᯮ ஫ +뢠. + 奬 । ⮢ ன 㯯 ᢮ ᮡ. + 뫮 祭 䨣 ⮢ + ॣ㧪 . ⨣ ⥬ ਬ । +⮢, ᯮ饩 ᯥ樠쭮 ࠭ . +  横 饭 ᭠砫 ந室 饭 + ⮢. ⮢ ᠭ 祭 + . ந室 ७ +⮢ 饭 ࠭ . ० ࡮ ந室 + থ, ० ࡮ ⠢ ᨣ WAIT +ᨬ 室 横 饭 . + 祭 ⪫祭 + 筮 ⮢ 㦭 +. + ࠭ ⮢ ᮤন , +४ १ ⥬ . ࠧ ⢨ ஥ +४祭 䨣樨 ⮢, ࠡ +Spectrum-᪨ ணࠬ ᮢ⭮ Sprinter-᪨ ᮬ. + + + ⮢, ᯮ㥬 Sprinter-. + + ਢ ⮢ 䨣権 Sprinter-1 +Sprinter-2. ࠧ ⬥, ⮩ +ணࠬ, 砥  ⠪ 室. + + + ⠭ . + + #FE - RD_KBD - + #FE - WR_BRD - + #7FFD - ७ ZX-Spectrum 128k + #1FFD - ७ Scorpion ZS-256 + #1F,#0F - RD_KEMPS - ⨪. 䨣樨 Sprinter-1 + #1F ⭮ ॠ #0F + #BFFD,#FFFD - AY-PORTS - AY-ᮯ (ZX-Spectrum-256/AY) + + ᮢᥬ ⠭ . + + #FB,#4F - COVOX-. + + + ⥫ 8- Sprinter-. + + #82 - PAGE0 - ࠭ , 砥 १ #1FFD + #A2 - PAGE1 - ࠭ , 祭 #4000 + #C2 - PAGE2 - ࠭ , 祭 #8000 + #E2 - PAGE2 - ࠭ , 祭 #C000 + ⬥ ᮡ, १ #E2 + 16- ࠭ ᪮௨᪮ । . + #89 - PORT_Y - ⨪쭠 न 窨 ᪮ ࠭ + ࠭ VIDEO-RAM ᯥ㬮᪮ ० + #C9 - RGMOD - ० ࠭. ४砥 ࠭ ० ࠭. + #3C,#7C - SYS_PORT - ⥬ ண ४ + + #10..#1F,#EE,#EF,#F0,#F1,#F4 - ७ Z84C15 + + ࠭ , ⠪ ⥭. + 믮 ணࠬ, ᯮ騥 ४祭 ࠭, +⥬ ࠭ . ࠡ BIOS- ࠭ +࠭. + + + ⥫ 16-⨡ Sprinter-. + + #xx50..#xx55 - HDD - ᯮ짮 譨 ணࠬ + ४. 㭪樨 ࠡ HDD ᠭ . + + + Sprinter-. + + 묨  㯭 +६, 㯭묨 ᫥ ஢ ⮢. + 㪠뢠, ⠪ ⠢  . + + BASIC48 + BASIC128 + TR-DOS + EXPANSION + SYSTEM + + १ ⠭ 訢 . ⮣ +筮 ࠬ ࠭ #80 +ᮮ⢥騩 ⮩ ࠭. ⠪ 祭 ࠭ + ࠭ 饭 . + 筮 묨, ⠪  #7FFD,#1FFD 筮 +ﭨ 㯭 ⮫쪮 , 祭, 뢠 + , ᮮ⢥騥 ⥭. + 㣨 䨣 ⢮ ⮢ +⢮ . + + + ࣠ ०. + + - Sprinter- ⠢ 256 . 쭥襬 +। ७ 512 , 祭 +᮪ ० ࠧ襭. + ० Spectrum-᪮ ࠭ ࣠ ⠪ +⠭⭮ ZX-Spectrum. ⠫ ० 砥 Sprinter-᪨ +࠭, ண 砥 ᥡ 㬮᪨ ࠭ +奬. + + ன⢮ ࠭. + + ࠭ ࠧ , ࠧ஬ ⠭⭮ +㬮᪮ . ⠭ ᢮ +ᮡ⢥ ० 뢮, ⠪ -, 㤠 ந +뢮 . + ᢮ ᮡ⢥ ० 뢮. + ⠭ ⠪ ०: + ZX-40 - ᯥ㬮᪨ ० ⯫ + ਡ⮬ . + ZX-80 - , 宦 ᯥ㬮᪨ ஥ +ᨬ, 뢠 ᨬ, ᦠ +ਧ⠫. + G256-8 - ᪨ ०. ।⠢ ᮡ ᨢ 8x8 +祪. 窥 256- 梥⮢, 롨ࠥ +16 梥⮢. ࠧ . +० G256-8 - . + G16-16 - ᪨ ०. ।⠢ ᮡ ᨢ +16x8 祪. 窠 16 梥⮢, 롨ࠥ 16 + 梥⮢. , G256-8 ⠭ + 4- . ᪨ ० ᥪ 㣮. + 16-梥⭮ ० 16 梥⮢ 256-梥⭮. + BORDER - 뢮 梥 थ. + BLANK - - ⠭ . + + ꥬ ० ⠢ 2 , +⮬ ० ᥣ ࠭ ᢮ १ 2.5 + -. + ࠭ ந ஫ + ᥣ, ⠪ ⥩ ࠭ ⠬. + + ࠭ ⠭ 祭, ⠪ +㭪権 . 㭪樨 뢠 ࠭ ᪨ +⥪⮢ 㦭 㦭 ࠧ. + + 㭪樨 ᪮ ࠭ ࠭ +320x256 祪. ᫥ ⮣ ० ࠭ ।⠢ ᮡ. + 256- , 320 . ᥤ 窨 - +ᥤ . ४祭 ந १ PORT_Y, ஬ +⠭ , 뢮 ࠭. +ᢥ ࠭, 稭 㫥. + 뢮 ᪨ ࠭ ⠪ ॡ +ᮮ⢥ ࠭ ᭮ . ⮩ ࠭ 㤥 ᮤঠ + ࠦ. + -  ⥭ , ⮬ ଠ, 室 +᭮ , 室 - 易⥫쭮 㤥 +ᮢ ଠ樥, 室饩 ⮬ -. - + ந १ ᭢ , 뢠 + ࠡ, ਬ, ࠩ⠬. ࠡ ࠩ⠬ ⠪ +।ᬮ७ ० - ஧ 梥⮬. ⮬ ० +ଠ, । - ஢ 稥 #FF. ᫨ + 㦨, 横 ய᪠ ࠭ ⮬ + ⠥ , 뫨 ࠭. ࠧ ࠭ + ᮢ뢠 ࠩ, ।⠢騥 ᥡ אַ㣮 ⨭ + "஧묨" 梥⠬. + + ਬ ணࠬ 뢮 אַ㣮쭮 ⨭ ࠭: + +PAGE3 EQU #E2 +RGADR EQU #89 + + LD A,#50 ; ࠭ ᪮ ࠭ + OUT (PAGE3),A ; ⠭ PAGE3 + LD HL,Pucture ; ⨭ ( ) + LD DE,#C040+HorPlace ; ⨭ ࠭ ਧ⠫ + LD A,VerPlace ; ⨭ ࠭ ⨪ + OUT (RGADR),A + LD B,VerSize ; ⨭ +LOOP: PUSH DE ; + PUSH BC ; 稪 + LD BC,HorSize ; ⨭ + LDIR ; ஢ + POP BC + POP DE + INC A ; ᫥ न Y + OUT (RGADR),A + DJNZ LOOP ; 㦭 ⢮ ࠧ + + ࠢ ० 뢮 ࠭ (祭 뢮 ஧묨 +梥⠬, ⪫祭 ஢ ᭮ ) ⢫ १ +訥 ࠭ ᪮ ࠭. + + + ᥫ 権 . + + ᥫ 権 ।祭 ᪮७ 権 + 뫪 ⮬. ᥫ + Sprinter-᪨ 䨣 ⮬ +蠥 ࠡ Spectrum-᪨ ணࠬ. + ᭮ ᥫ  ஥ ७ . +樨 뫪 ந ⥬ +७ , ⥬ ஢ 㦭 ⮣ . +᫥ ஢ ந ᪮쪮 ࠧ ⠪ +ࠧ ந ࠭ ⥪ࠬ. + ࠭ 梥⮬ ᯮ 㣮 ० +ᥫ. 㥬 ७ +ந 設 , +. + , 뢠 ᥫ ࠧ + 1..256 . + ࠢ ᥫ஬ ந ।⢥ ணࠬ. + ⮣ , 䠪᪨  +ﬨ ⨯ NOP. + LD A,A; LD B,B; LD C,C; LD D,D; LD E,E; LD H,H, LD L,L + 祭 ᫥饥: + LD B,B - 몫 ᥫ. + LD D,D - ᥫ ० ਥ ࠧ + ᫥ ⨯ LD A,dat, dat 㤥 + ࠧ஬ . ᫨ ࠧ ⠭ ࠭, + ⠭. + LD C,C - Fill - ⮬. ᫥ + ⨯ LD (HL),A ਢ 㪠 + ࠭ ⢠ 祭 A + LD E,E - Fill ᪮ ࠭ - + ⨪ . + LD H,H - rezerved + LD L,L - ஢ . ᫥ ⨯ LD A,(HL) + ਢ ᥫ 묨 (HL), + ⨯ LD (DE),A ਢ १ + ᥫ ᭮ -. + LD A,A - ஢ ᪮ ࠭ + LD L,L, ࠡ⠥ ⨪묨 ﬨ ࠭. + + ਬ ᯮ짮 ᥫ: + + ; ⠥, ࠭ ࠭ 㦥 #C000 + LD HL,#C040 ; 砫 ࢮ ࠭ + LD DE,#C180 ; 砫 ண ࠭ + LD BC,#140 ; ࠭ ਧ⠫ + DI ; 뢠 ࠡ ᥫ஬ + LD D,D ; ᥫ ⠭ ࠧ + LD A,0 ; ⠭ ࠧ - 256 + LD A,A ; ⠭ ᥫ ஢ + ; ⨪ . + LDIR ; ஢ ! + LD B,B ; 몫 ᥫ + EI ; 뢠 + + १ ணࠬ ந ஢ ᥣ ࠭ +࠭ 㣮. ६ ᯮ ⠢ ਬ୮ 1.2 . + + ⥫ 㭪樨 ᥫ 騥 䨣樨 +Sprinter-3 ࠡ ࠧ. 믮 ᪨ 㭪権 +ᯮ XOR (HL); OR (HL); AND (HL). + + ਬ ન 256 . + + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; ᫮ , ப + LD L,L + LD A,(DE) ; ᥫ + XOR (HL) ; ந XOR 묨 ᥫ + LD (HL),A ; १ 樨 + LD B,B + EI + + ࠡ ᥫ ࠭稢 ⮫쪮 䨧᪮ +᪮ ࠡ ᭮ . । ६ ࠡ +ᥫ஬ ⠪ ਬ୮ 㫥: + + ६ ࠡ = ६ ࠡ ᥫ + ६ + ࠡ ᥫ + ६ ࠡ ᥫ = ᫮ 뫠 /7000000 (ᥪ㭤) + + ⪫祭 뢠 ६ ࠡ ᥫ 室, ⠪ + 筮 ⥬ ணࠬ + 뢠 ᬮ ࠡ ଠ쭮. + + + 祭. + + Sprinter- த. 襭 +. , ন騩 ७ ० ࠡ . + + ᥬ ᪨ ᠬ 易 ਮ⥭ + "": + + Adress: -, . ⠭, . 35, . 31. + Phone: (812)-327-35-31 + E-mail: peters@atlant.ru + + 孨᪨ ᠬ : + + Fido: Ivan Mak (2:5030/529.24) + E-mail: ivan_mak@yahoo.com (६ ) + diff --git a/docs/Original/Разное/Форум.md b/docs/Original/Разное/Форум.md new file mode 100644 index 0000000..b196fbe --- /dev/null +++ b/docs/Original/Разное/Форум.md @@ -0,0 +1,1169 @@ +# Программирование Спринтера + +## Оглавление: + +- Экран и палитра +- Шрифты +- Память +- Файлы +- Звук +- ISA-8 слоты +- Summary +- More information +- Акселератор компьютера Sprinter +- Прерывания +- IDE контроллер +- FDD контроллер +- Клавиатура +- Коды ошибок DSS + +### Экран и палитра + +Функции для работы с экраном: + +Сейчас DOS поддерживает четыре режима экрана. + +Два текстовых: + + 40x32 символов c 16 цветами (режим 02h); + 80x32 символов c 16 цветами (режим 03h); + +и два графических: + + 320x256 точек с 256 цветами (режим 81h); + 640x256 точек с 16 цветами (режим 82h); + +Основным режимом является текстовый режим 80x32 (03h), если +ваша программа работает в другом режиме, то вам следует перед +переключением режима получить номер текущего режима функцией +51h GETVMOD и сохранить его, а перед завершением программы +восстановить его. + +Например: + +```asm + LD C,51h ;получить режим экрана + RST 10h + LD C,A ;поместить номер режима экрана в регистр C + PUSH BC ;и сохранить на стеке (B - страница, C - режим) + ... + ... ;ваша программа + ... + POP BC ;взять со стека режим экрана + LD A,C ;поместить номер режима экрана в регистр A + LD C,50h ;установить режим экрана + RST 10h + LD C,41h ;завершить программу. + RST 10h +``` + +DSS имеет функции вывода на текстовый экран символов и символьных +строк. Для графических режимов требуются собственные процедуры +вывода на экран. Например, при завершении программы вы можете +выдать строку на текстовый экран: + +```asm + LD HL,STRING ;указатель на строку символов + LD C,5Ch ;вывод строки символов + RST 10h + +STRING DB "Thank you for using my program..." ;текстовая строка + DB 13,10 ;символы возврата каретки и перевода строки + DB 0 ;символ конца строки +``` + +Для вывода на графический экран, вам необходимо подключить +видео память в одно из трех окон памяти 04000h-07FFFh, +08000h-0BFFFh, 0C000h-0FFFFh. Это осуществляется выводом +значения 50h в соответствующий порт 0A2h, 0C2h или 0E2h в +зависимости от окна памяти. При подключении обратите +внимание на то, чтобы стек вашей программы не попадал в +это адресное пространство. + +Например, если вам нужно поставить точку на экране, то +подпрограмма для режима 81h будет выглядеть так: + +```asm +; HL - горизонтальная координата +; DE - вертикальная координата + + IN A,(0E2h) ;считать из порта номер страницы подключенной в + ;третье окно памяти + LD C,A ;запомнить в регистре C + LD A,50h ;страница видео памяти + OUT (0E2h),A ;подключение видео памяти + LD A,E ;поместить вертикальную координату в регистр A. + OUT (89h),A ;выдать в порт + LD DE,0C000h ;адрес начала третьего окна памяти + ADD HL,DE ;получить адрес точки (адрес начала окна + + ;горизонтальная координата) + LD A,255 ;цвет выводимой точки (от 0 до 255) + LD (HL),A ;вывод точки на экран + LD A,C ;вспомнить номер страницы памяти + OUT (0E2h) ;подключить страницу памяти вместо страницы видео + ;памяти +``` + +Перед выводом точек следует установить необходимые цвета в +палитре. Различные режимы вывода на экран задаются номером +видео страницы от 50h до 5Fh. Подробнее о режимах вывода вы +можете прочитать в описании архитектуры компьютера. + +**50h (80) SETVMOD (Выбор режима экрана)** + + входные данные: + A - режим экрана + 02h - текстовый 40x32x16 цветов + 03h - текстовый 80x32x16 цветов + 81h - графический 320x256x256 цветов + 82h - графический 640x256x16 цветов + B - страница экрана 0/1 + C - 50h + выходные данные: + A - код ошибки, если CF=1 + +Функция устанавливает режим экрана. Седьмой бит режима экрана +установлен для графических режимов и сброшен для текстовых. +Существуют два текстовых режима и два графических. + +**51h (81) GETVMOD (Получить текущий режим экрана)** + + входные данные: + C - 51h + выходные данные: + A - текущий режим экрана + B - страница экрана 0/1 + +Функция возвращает текущий режим экрана и номер страницы экрана. + + +Q: +Здравствуйте. А как с палитрами??? Как загрузить произвольную +палитру (отдельный цвет). Желательно с исходником. +Почему системная палитра выглядит по разному в эмуляторе и реальном +Спринтере. + +A: +Пример из исходников Антона Енина ( + +```asm +;[]=======================================================================[] +; palette from Flex Navigator +CustomPalette: + db 0x00, 0x00, 0x00, 0x00 ; Black 00 + db 0x00, 0x00, 0xFF, 0x00 ; B.Red 01 + db 0x00, 0x80, 0x00, 0x00 ; Green 02 + db 0x00, 0xFF, 0xFF, 0x00 ; B.Yellow 03 + db 0x80, 0x00, 0x00, 0x00 ; Blue 04 + db 0xFF, 0xFF, 0x00, 0x00 ; Invert bg 05 + db 0x80, 0x00, 0x00, 0x00 ; Invert fg 06 + db 0x80, 0x80, 0x80, 0x00 ; BlackGray 07 + db 0xC0, 0xC0, 0xC0, 0x00 ; HighGray 08 + db 0x80, 0x00, 0x00, 0x00 ; Panel 09 + db 0xFF, 0xFF, 0x00, 0x00 ; Files 0A + db 0x00, 0xFF, 0xFF, 0x00 ; Select Files 0B + db 0x00, 0xFF, 0xFF, 0x00 ; InvSel Files 0C + db 0xC0, 0xC0, 0xC0, 0x00 ; Reserved 0D + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0E + db 0xFF, 0xFF, 0xFF, 0x00 ; White 0F + +;[]=======================================================================[] +;[]=======================================================================[] +; set requist video mode 640x256x16 +SetVideoMode: + + ld c, 0x51 ; save previos vmode + rst 0x10 + ld (vmode + 1), a + ld a, b + ld (vscrn + 1), a + sub a + call CrearVideoRam + ld bc, 0x0050 ; set 640x256x16 + ld a, 0x82 + rst 0x10 + ld hl, CustomPalette + ld de, 0x1000 + ld bc, 0xFFA4 + sub a + rst 0x08 ; load palette + ret + +;[]=======================================================================[] +``` + +```asm +;Установить 5-й цвет \"средне-зеленым\" + LD HL,COLOUR + LD DE,#0105 + LD BC,#FFA4 + XOR A + RST #08 + +; B G R +COLOUR DB #00,#80,#00,#00 + +;Изменить все 256 цветов в палитре + LD HL,COLOURS + LD DE,#0000 + LD BC,#FFA4 + XOR A + RST #08 + +;Параметры цвета +; B G R +COLOUR DB #00,#80,#00,#00 + +;Палитра +COLOURS DB #00,#00,#00,#00 ;Colour 0 + DB #00,#00,#80,#00 ;Colour 1 + DB #00,#80,#00,#00 ;Colour 2 + DB #00,#80,#80,#00 ;Colour 3 + ... + DB #FF,#FF,#FF,#00 ;Colour 255 +``` + +Как я понял, сейчас есть проблема с выводом на экран. +Попробую расписать схему видео-вывода на словах. + +Режим адресации. Задается номером страницы. +Если номер 5Xh - адресация графическая. +Если номер не 5Xh - адресация спектрумовская, и она включена все время, +даже если в соседней странице включился номер 5Xh. + +Спектрумовская адресация, это доступ к видеопамяти на запись в адресах +4000h..5FFFh или в 4000h - 7FFFh, в зависимости от состояния порта +PORT_Y (89h). + + Бит 6 = 1 - отключает вывод в спектрумовское окно памяти. + Бит 7 = 1 - расширяет спектрумовское окно с 8Kb до 16Kb + + Бит 4..0 - пределяет 8kb банк спектрумовского режима. + +Эти банки располагаются "вертикально", т.е. такой банк соответствует +32-м последовательным точкам на графической линии и 256-ти линиям. + +Сначала я чаще всего использовал окно 4000h..7FFFh для работы с +графикой, поэтому получилось так, что графическая адресация перекрывала +спектрумовскую при включении в порт A2h значения 5Xh, а выше 8000h +использовалось программой, потом, когда стали использовать для вывода на +экран страницу 0C000h, получилось так, что в странице 4000h оставалась +открыта видеопамять со спектрумовской адресацией, а порт 89h +используется и там и там, но с разным назначением. + +Т.е. после открытия страницы 0C000h для графики остается открытой и +спектрумовский способ адресации видеопамяти в странице 4000h..7FFFh. +P.S. Надеюсь, что не запутал все окончательно... + +### Шрифты + +#### *Несколько наборов шрифтов одновременно* + +Вот ответ, полученный от Ivan Mak. + +=== Cut === + +Через Bios: + + IX - 32-хбайтовый описатель окна + +(искать в описании, здесь только только самое важное) + + (IX+4) - режим знакоместа + bit4=1 - text_mode + bit5=0 - 16, bit5=1 - 8 точек в знакоместе (80/40 символов) + bit7..6,3..0 - номер знакогенератора + +исключение: bit7..6=B"11" - бордер + +... + +Он же (IX+4) - номер используемого знакогенератора в +этом окне, он же регистр B в функциях B4,B5 +Функция B0 открытие окна использует описатель, в котором указан +знакогенератор, открытый для всех символов данного окна. Он может +быть перебит прямой записью в видео-память или фунцией B5, +которая пишет символ со знакогенератором. При использовании +функции B0 четвертый бит регистра E определяет, какая страница +режима будет использоваться. Для работы с двумя страницами надо +открывать окно два раза со значениями 0 и 1 в 4-м бите рег.E + +--- + +**0B4h (180) WIN_GET_SYM Взять символ с экрана** + + Значение регистров на входе: + C=0B4h + A - идентификатор окна (д.б. 0) + DE - положение символа в окне: + D - вертикаль, E - горизонталь + Значение регистров на выходе: + NC - нормальное завершение + L - символ, + H - атрибут, + B - знакогенератор + CF - ошибка неверный идентификатор окна + +**0B5h (181) WIN_PUT_SYM Положить символ на экран** + + Значение регистров на входе: + C=0B5h + A - идентификатор окна + DE - положение символа в окне: + D - вертикаль, E - горизонталь + L - символ, + H - атрибут символа + B - знакогенератор + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка неверный идентификатор окна + +**0B6h (182) WIN_SET_ZG Установка знакогенератора** + + Значение регистров на входе: + C=0B6h + A - системный номер знакогенератора + DE - указатель на 2Kb данных знакогенератора + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка (старая версия, нет функции) + +**0B8h (184) WIN_GET_ZG Получение знакогенератора** + + Значение регистров на входе: + C=0B8h + DE - адрес, куда будет загружено 2kb знакогенератора + Значение регистров на выходе: + NC - нормальное завершение + CF - ошибка (старая версия, нет функции) + +Функция копирует имеющийся знакогенератор из ПЗУ + +--- + +Для работы напрямую, окна должны быть открыты биосом, +знакогенераторы установлены. Вывод символов осуществляется +в графическом режиме адресации, через страницу 50h. В порт +89h записывается номер символа, адрес в линии определяет +строку. В этот адрес записывается четыре байта, определяющих +символ, атрибут и знакогенератор. + + Bytes: + byte0 - знакогенератор/режим то же, что в (IX+4) + byte1 - символ + byte2 - атрибут + byte3 - reserved (заполнить нулями) + + Port_Y - номер линии засылаемый в порт 89h + линия 1+S S=0..79 - номер символа в строке для экрана 0 + линия 128+S S=0..79 - номер символа в строке для экрана 1 + (S=0 - выводит символ слева) + + Adress: в линии 768+N*4 - N - номер строки экрана 0..31. + Адрес одинаков для обоих экранов. + (N=0 выводит символ сверху) + + В режиме 40 символов, номера строк через один: 1,3,5\...79 + + Экраны переключаются нулевым битом порта 0C9h + +--- + +Текстовый экран устроен на удивление просто: в области описания +экрана в текстовом режиме на один символ отводится 4 байта (номер +знакогенератора, код символа, атрибут и один неиспользуемый байт), +причем надо обратить внимание на то, что в этом режиме экран "повернут +на бок". Что-бы вывести символ на экран, надо в Port_Y (0x89) записать +128+номер символа в строке (от 0 до 79), затем к адресу начала экранной +страницы прибавить 768 (для первого экрана), после чего мы получим адрес +байта, в котором хранится номер знакогенератора для вывода символа +(поменяйте его, если это необходимо), увеличиваем адрес на один и туда +записываем уже код самого символа, а в следующий байт - атрибут этого +символа. Что-бы перейти на следующую строку текстового экрана, надо +прибавить к адресу начала экранной страницы число 4*номер строки. +Используя акселератор (команду копирования вертикальной линии) можно +очень быстро выводить текст строки на экран. + +Остается только добавить что прямой доступ к области описания экрана не +рекомендован разработчиками, т.к. есть веротяность потери совместимости +со следующими моделями, где символы могут описываться подругому. Но если +вам необходима большая скорость вывода на экран в текстовом режиме и вы +готовы после выпуска программы вносить в неё изменения для обеспечения +совместимости со следующими моделями, либо выложить исходники программы, +что-бы желающие могли их исправить при необходимости, то, мне кажется +можно использовать прямой доступ. + +### Память + +В конфигурации спринтер по #0000...#3FFF, при работе ДСС находится +сама ДСС с её Резетами, то есть чтобы использывать когда сюда +подставленна страница пользователя резеты не доступны!. + +Это так в нижних 16K находится DSS / BIOS в остальных 48К +приложение, но с определенными особенностями. Стек не должен быть +выше #BFFF при вызове DSS и ниже #8000 при вызове некоторых +функций BIOS. + +В следующих версиях DSS планируется снятие ряда ограничений на стек +и расположения данных при вызове ее функций. + +Q: Теперь адресса #4000..#7FFF, #8000..#BFFF, #C000..#FFFF, когда ДСС +передаёт управление эти программам, какие банки там нахадятся по +умолчанию? + +A: В зависимости от адреса загрузки и размера приложения DSS выделяет +необходимое число страниц памяти. Так при размере меньше 16К будет +выделена одна страница, при размере больше 16К - две, и т.д. В окна с +"неиспользуемым" адресном пространством будет подключатся +специальная страница #FF. Если приложению требуется памяти больше чем +зарезервировано в exe-файле, оно должно выделить себе дополнительный +блок памяти самостоятельно. + + +Q: Теперь память можно челкать по портам #7FFD,1FFD или нет? +И если да, то как типа in #&7FFD,(номер страницы). + +Напрямую память можно счелкать через 4 порта памяти: + + #82 - #0000-#3FFFF + #A2 - #4000-#7FFFF + #C2 - #8000-#BFFFF + #E2 - #C000-#FFFFF + +Записывая физический номер страницы в порт. Список номеров +физических страниц для выделенного блока памяти можно получить +через BIOS. + +Q: Также хотеловсь бы увидет пример по использывани ф-ии +38х Setwin! + +A: SETWIN работает с логичискими страницами. + +**38h (56) SETWIN (Подключение страницы памяти)** + + входные данные: + A - идентификатор блока памяти + B - номер страницы в блоке (0,1,2\...) + H - биты 6 и 7 задают номер окна, в которое будет подключена страница + C - 38h + выходные данные: + A - номер страницы, если CF=0 + A - код ошибки, если CF=1 + +Функция вычисляет физический номер страницы в блоке памяти и +подключает её в окно адресного пространства в зависимости от +значения регистра HL. То есть, если HL указывает на адрес в +пределах от 04000h до 07FFFh, то страница подключается в первое +окно, от 08000h до 0BFFFh - второе окно, от 0C000h до 0FFFFh - +третье. + +На выходе в регистре A содержится физический номер страницы, +которая была подключена до выполнения функции. + +```asm +; Выделить блок памяти 32К и подключить его страницы в #8000 и #C000 окна: +; + + LD C,#3D ;GETMEM + LD B,2 ;BLOCK 32K + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR + LD (MEMHND),A ;SAVE MEMORY HANDLE + ; + LD HL,#8000 ;FRAME ADDRESS + LD C,#38 ;SETMEM + LD B,0 ;FIRST MEMORY PAGE + LD A,(MEMHND) ;MEMORY HANDLE + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR + ; + LD HL,#C000 ;FRAME ADDRESS + LD C,#38 ;SETMEM + LD B,1 ;SECOND MEMORY PAGE + LD A,(MEMHND) ;MEMORY HANDLE + RST #10 ;SYSTEM CALL + JR C,ERROR ;MEMORY ALLOCATION ERROR + ; +``` + + +Q: +Во! Пасибо большое? А еслищёлкать портами то есть возможномть что +программа будет совместима с будущей версией ПЗУ/АЛТЕРЫ/ДСС/ПЛАТЫ? + +A: +Да, в любом случае будет возможность запуска программ в той +конфигурации для которой она была написана. Что-то вроде режима +совместимости. Но если для программы не критично работа напрямую +через порты, лучше пользоваться SETWIN как более универсальный. + +> Так при размере меньше 16К будет выделена одна страница, при +> размере больше 16К - две, и т.д. В окна с "неиспользуемым" адресном +> пространством будет подключатся специальная страница #FF. + +Q: +Какие физические номера этих страниц к приме 1,2,3,,,256! + +A: +Это можно узнать через функцию BIOS, эти номера будут разными в +зависимости от того сколько памяти было выделено другим приложениям. + +Q: +Денис а такой вариант выделения памяти будет работать? + +```asm +START +ORG #4000 + NOP +ORG #8000 + NOP +ORG #C000 + NOP +``` + +Дальше нужный орг и прога! + +A: +Да, если конечно будет записан код от #4000 до конца программы, а не +от последнего ORG, как это делают некоторые ассемблеры. +Еще одно замечание, для DSS1.xx exe-файлы могут начинаться с #4100, +но после запуска можно использовать память с #4000. + + +Q: +В документации по спринтеру, есть такая фраза: +#82 - PAGE0 - страница ОЗУ, подключаемая вместо ПЗУ через порт #1FFD. +Что-бы это значило? + +```asm + ld a, номер_подключаемой_страницы + out (#82),a + ld a, _что?_ + out (#1ffd),a +``` + +A: + +```asm + LD A,1 ;RAM #0000-#3FFF + LD BC,#1FFD + OUT (C),A + ; + LD A,0 ;ROM #0000-#3FFF + LD BC,#1FFD + OUT (C),A +``` + +Fast-RAM включается подобно КЭШ-памяти в 'Пентагоне\'. +Включение/выключение происходит с помощью кода: + +```asm + DI + IN A,(#FB) ; включить Fast-RAM - 16к в 0-е окно + ; (в адреса #0000..#3FFF) + ... ; your programm + IN A,(#7B) ; выключить Fast-RAM + EI +``` + +Если надо использовать прерывания, программа должна установить +свой обработчик в адрес #0038. +Следует иметь в виду, что Fast-RAM может быть использована другими +программами, т.е. при запуске некоего процесса через DSS содержание +Fast-RAM может не сохраниться. + +Перед вызовом функций DSS и BIOS Fast-RAM надо отключать. + +### Файлы + +Q: +И ещё вопрос по функции 16h подскажите плз намера атрибутов в +частномти можно ли узнать размер файла этой функцией? + +Размер файла можно узнать с помощью функции 15h. + +A: + +**15h (21) MOVE_FP (Перемещение указателя в файле)** + + входные данные: + A - файловый манипулятор + HL:IX - смещение указателя в файле + B - способ перемещения + B=0 от начала файла + B=1 от текущего значения указателя + B=2 от конца файла + C - 15h + выходные данные: + A - код ошибки, если CF=1 + HL:IX - новое значение указателя + HL:IX интерпретируется как 32-битное число. Если число меньше 65536, + регистр HL содержит 0. Возможны следующие способы перемещения указателя: + B=0 Смещение считается от начала файла, если HL:IX=0, указатель + устанавливается на начало файла. + B=1 Смещение считается от текущего значения указателя. + B=2 Смещение считается от конца файла, если HL:IX=0, после перемещения + HL:IX получится длина файла в байтах. + +Атрибуты файла: + +Каждый бит байта атрибутов задаёт определённый атрибут файла. +Атрибуты файлов можно изменять специальной функцией ДОС. + + бит 0 - Только для чтения + бит 1 - Скрытый + бит 2 - Системный + бит 3 - Метка тома + бит 4 - Каталог + бит 5 - Архивный + бит 6 - Не используется + бит 7 - Не используется + +- Атрибут "только для чтения". При значении 1 из файла можно читать, +но в него нельзя писать и его нельзя стереть. +- Атрибут "скрытый". При значении 1 файл невиден для обычных операций +ДОС. +- Атрибут "системный". Указывает, что файл является системным. +- Атрибут "метка тома". В старых версиях MS-DOS использовался для +задания метки диска. +- Атрибут "каталог". При значении 1 идентифицирует файл как каталог, +подчинённый данному каталогу или элементы "." и "..". +- Атрибут "архивный". Этот бит устанавливается при операциях записи в +файл. +Его могут использовать утилиты создающие архивные копии для сохранения +изменённых файлов. + +### Звук + +Звук через COVOX-Blaster (COVOX с буферным ОЗУ) + +CBL=COVOX-Blaster + +Порт управления: 004Eh (**16-bit port!!!**, писать только +через OUT (c),reg) + +```asm +; bit 7 - COVOX-Blaster on (если 0 то обычный режим COVOX) +; bit 6 - STEREO-mode on +; bit 5 - 16bit-mode on +; bit 4 - Interrupt on - включение прерываний +; bits 3..0 - частота +; +; 0 16khz -- mono/stereo -- это старые режимы -- не использовать! +; 1 22khz -- mono/stereo -- это старые режимы -- не использовать! +; 2 reserved +; 3 reserved +; 4 reserved +; 5 reserved +; 6 reserved +; 7 reserved +; +; 8 7.8125 KHz -- mono/stereo 8/16 bit +; 9 10.9375 KHz -- mono/stereo 8/16 bit +; A 15.625 KHz -- mono/stereo 8/16 bit +; B 21.875 KHz -- mono/stereo 8/16 bit +; C 31.25 KHz -- mono/stereo 8/16 bit +; D 43.75 KHz -- mono/stereo 8/16 bit +; E 54.6875 KHz -- mono/stereo 8/16 bit +; F 109.375 KHz -- mono/stereo 8/16 bit +``` + +Порт 0FEh - биты запроса прерываний от CBL + + bit 7 - запрос данных для CBL + bit 5 - синхронизация экрана (кадровый импульс, 4мс длиной, 20мс период) + +Запись данных в COVOX-Blaster производится с помощью акселератора, +записью в страницу ОЗУ 0FDh (просто записать блок 128/256 байт с +адреса 0C000h) или через порт 4Fh командами OTIR блок записываемых +данных по запросу. Для 8 бит режима - 128 байт; для 16 бит - 256 байт + +Самый простой пример: + +```asm +Test: + LD BC,04Eh + LD A,8Bh ; включить 8 бит 22khz mono + OUT (C),A ; - CBL - включен! + INC C + LD HL,Sample + OTIR ; загрузить все 256 байт + RET + +Sample: + DB 80h,81,82h,... ; (256 отсчетов звука с нулем на уровне 80h) +``` + +Должен пищать одну ноту (если в Sample записать синус, то должно +чисто звучать). + +Запрос данных в бите 7 порта FE появляется для каждых 128 байт (256 +в режиме 16 бит). Его следует проверять, если его не оказалось, то +прерывание экранное, а не от CBL. + +При выставленных прерываниях от CBL, стоит использовать режим IM 2, +иначе, будет часто вызываться DOS-овая процедура прерываний и могут +появиться тормоза на высоких частотах. + +В режиме 8 бит сэмплы должны иметь уровень нуля на 80h, 16 бит +сэмплы - уровень нуля - 0000h +Stereo-сэмплы - должны иметь чередующиеся отсчеты левого и правого +канала. + +```asm +mono_8bit: + + DB 80h,81h,7Fh.... + +mono_16bit: + DW 0,1000,-1000... + +stereo_8bit: + DB 80h,80h,81h,80h,7Fh,80h... + ; здесь один канал играет, второй молчит + +stereo_16bit: + DW 0,0,1000,0,-1000,0... + ; аналогично, один канал играет, второй молчит +``` + +(При тестировании 16 бит режима следует помнить, что звук с +амплитудой в единицы почти не слышен) + +P.S. Формат данных выбран так, что бы из WAV-файлов данные в CBL +пересылать простой операцией блочной пересылки. + +### ISA-8 слоты + +#### Summary + +This article describe ISA-8 interaction. + +#### More information + +If you want to interaction with ISA devices, you have to make following +steps: +1) send 10h value to port 1FFDh(system port); +2) send control byte to port 0E2h(third memory window port); +control byte: +``` + D7...should be 1 + D6...should be 1 + D5...should be 0 + D4...should be 1 + D3...should be 0 + D2...specify number of ISA slot + D1...specify access mode (0 - ISA memory, 1 - ISA ports) + D0...should be 0 +``` +The read/write signals are forming from read/write signals +memory range 0C000h-0FFFFh. And the address lines A13...A0 +has taken from processor data-BUS. The other ISA-signals +such as RESET, AEN, A19...A14 can be set in port 9FBDh. +And default value is 00h. +``` +port 9FBDh: + D7...RESET + D6...AEN + D5...A19 + D4...A18 + D3...A17 + D2...A16 + D1...A15 + D0...A14 +``` + +```asm + +ISA_DIR EQU 9FBDh +SC_PORT EQU 1FFDh +PAGE3 EQU 0E2h + +SAVE_PAGE DB 0 ;variable for previous status of third memory port + +RESET_ISA: ; reset ISA device + LD C, ISA_DIR + LD A,0C0h + OUT (C),A + CALL Pause_10ms + LD A,0 + OUT (C),A + RET + +Pause_10ms: + LD HL,10000 + +Loop: + DEC HL + LD A,H + XOR L + JR NZ,Loop + RET + +OPEN_ISA_PORTS: ; open access to ISA + LD BC,SC_PORT + LD A,10h + OUT (C),A + IN A,(PAGE3) ; read value from memory port + LD (SAVE_PAGE),A ; save previous status of memory port + LD A,0D2h ; control byte for (first (upper) ISA slot) + OUT (PAGE3), A ; opening ISA port address space + LD C,ISA_DIR + LD A,0 ; high ISA addresses RESET and AEN signals. + OUT (C),A + RET + +CLOSE_ISA_PORTS: ; close access to ISA + LD A,(SAVE_PAGE) + OUT (PAGE3),A ; restore value of memory port + LD BC,SC_PORT + LD A,0 + OUT (C),A ; + RET + +WRITE_ISA_PORT: + LD HL,ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3 memory page + LD A,DATA_OUT ; data for writing + LD (HL),A ; write data to port which pointered HL + RET + +READ_ISA_PORT: + LD HL, ADRESS_PORT+0C000h ; ISA port address + 0C000h offset 3 memory page + LD A,(HL) ; read data from port which pointered HL + RET + +``` + +When you work with ISA, the access to third memory page are disabled. If +you want to address ISA-memory more than 3FFFh, you should specify high +bits in port 9FBDh. + +### Акселератор компьютера Sprinter. + +Акселератор предназначен для ускорения операций по пересылке блоков +данных в ОЗУ и видео-ОЗУ. + +Акселератор позволяет: + +- быстро заполнять горизонтальную или вертикальную линию длиной до 256 +точек одним цветом (в режиме 640x256 - одинарную/двойную горизонтальную +линию длиной до 512 точек) +- быстро копировать горизонтальную или вертикальную линию длиной до 256 +точек (в режиме 640x256 - горизонтальную линию до 512 точек) +- проводить быстрые операции AND, OR, XOR с блоками памяти. + +**Акселератор не может работать с блоками данных ПЗУ и Быстрого-ОЗУ.** + +ОЗУ акселератора является частью внутреннего ОЗУ ППЛМ. +Операции по пересылке данных производятся путем записи блока данных в +это внутреннее ОЗУ, а затем копировании его в нужное место ОЗУ из ОЗУ +акселератора. +Блок данных, записываемый в ОЗУ акселератора может иметь различную +длинну из диапазона 1..256 байт. +После одной записи копирование может производиться несколько раз и, +таким образом, можно производить заполнение экрана текстурами. +Для заполнения экрана одним цветом используется другой режим +акселератора. В нем вместо копируемого блока данных из внутреннего ОЗУ +производится запись данных с шины процессора, которые в этот момент не +изменяются. + +Управление акселератором производится непосредственно из программы. +Для этого изпользуются команды процессора, которые, фактически, являются +операциями типа NOP. + +```asm +LD B,B - выключить акселетарор. +LD D,D - включить акселератор в режим приема байта размера блока + далее следует команда типа LD A,dat, где dat и будет новым + размером блока. Если размер блока был установлен ранее, + его можно не устанавливать. +LD C,C - Операция Fill - заполнение одним байтом. Последующая + команда типа LD (HL),A приведет к заполнению указанного + ранее количества байт значением A +LD E,E - Операция Fill для графического экрана - заполнение + вертикальных линий. +LD H,H - rezerved +LD L,L - копирование блока. Последующая команда типа LD A,(HL) + приведет к заполнению ОЗУ акселератора данными из адреса (HL), + а команда типа LD (DE),A приведет к перезаписи данных из ОЗУ + акселератора в ОЗУ или видео-ОЗУ. +LD A,A - копирование блока для графического экрана подобна команде + LD L,L, но работает с вертикальными линиями экрана. +``` + +Пример использования акселератора: + +```asm + ; Считаем, что экранная страница уже открыта по адресу #C000 + LD HL,#C040 ; адрес начала линии первого экрана + LD DE,#C180 ; адрес начала линии второго экрана + LD BC,#140 ; длина экрана по горизонтали + DI ; запретить прерывания для работы с акселератором + LD D,D ; включить акселератор на установку размера блока + LD A,0 ; установить размер блока - 256 байт + LD A,A ; установить акселератор на копирование + ; вертикальных линий. + LDIR ; копировать + LD B,B ; выключить акселератор + EI ; включить прерывания +``` + +Эта часть программы произведет копирование всего содержимого первого +экрана на другой. Время исполения составляет примерно 26 милисекунд. +Дополнительные функции акселератора (AND, OR, XOR) работают таким же +образом. +Для выполнения логических функций используются команды XOR (HL); OR +(HL); AND (HL). + +Пример кодирования блока в 256 байт. +```asm + LD HL,ADRES_1 + LD DE,XOR_DAT + DI + LD D,D + LD A,0 ; число байт, которые надо закодировать + LD L,L + LD A,(DE) ; взять блок данных в ОЗУ акселератора + XOR (HL) ; произвести операцию XOR с данными акселератора + LD (HL),A ; запомнить в ОЗУ результат операции + LD B,B +EI +``` + +Скорость работы акселератора ограничивается только физической +скоростью работы основного ОЗУ. Определить примерное время работы +команды с акселератором можно по такой формуле: + +Время работы = время работы команды без акселератора + время работы акселератора + +Время работы акселератора = число пересылаемых байт /7 микросекунд +Во время работы акселератора необходимо отключать прерывания, так как в +этот момент изменяется система команд процессора и программа на +прерывании не сможет работать корректно. + +### Прерывания + +Кадровые и клавиатурные прерывания приходят с вектором 0FFh, отличать по +биту приема байта в порте клавиатуры, не пришел, значит экран. Возможно, +конечно, совпадение но это исключительно редкий случай. + +От мыши прерывания не приходят. Сделать можно, но сейчас их нет. Кстати +и различие от экранных прерываний **можно** (и, видимо, надо будет в +новой версии) сделать пожестче через прошивку в ПЛМ. + +От ISA и других внутренных портов процессора прерывания приходят с +другим вектором (настраивается в портах), поэтому в режиме IM 2 они +легко различаются. + +### IDE контроллер + +Доступ к поpтам осуществляется пpи неактивном Beta-Disk интеpфейсе. +Со схемой без поллитpы не pазобpаться, пpивожу поpты как есть: + +поpт pегистp накопителя + + ---- блок командных регистров ---- + xx50 0 (data) + 0051 1 (error/feature) + 0052 2 (sector count) + 0053 3 (sector number) + 0054 4 (cylinder low) + 0055 5 (cylinder high) + 4052 6 (device/head) + 4053 7 (status/command) + + ---- блок управляющих регистров ---- + 4054 16 (alternate status/control) + 4055 17 ? + +Пpи записи в поpт нужно его адpес увеличить на 0x100. + +Пpи чтении pегистpа данных пpи a8=0 выpабатывается стpоб чтения и +младшая часть (D0-D7) шины данных накопителя выдаётся на шину +спектpума, а стаpшая сохpаняется в теневом pегистpе. +Пpи a8=1 читается теневой pегистp (D8-D15). + +Пpи записи pегистpа данных когда a8=0 байт сохpаняется в теневом +pегистpе и стpоб записи для накопителя не выpабатывается. Пpи +записи pегистpа данных когда a8=1 выpабатывается стpоб записи +для накопителя и байт с шины спектpума выдаётся на D8-D15 шины +накопителя, на D0-D7 выдаётся содеpжимое теневого pегистpа. + +Контроллер имеет общий теневой регистр для записи и чтения. + +вот мои раскопки на эту тему от 13.10.2003: + + регистр команд | регистр состояния - 4153h запись, 4053h чтение + регистр накопителя | головки - 4152h запись, 4052h чтение + регистр циллиндра (старший байт) - 0155h запись, 0255h чтение + регистр циллиндра (младший байт) - 0154h запись, 0254h чтение + регистр данных - 0150h запись, 0050h чтение + +Верна информация. +С одним добавлением. Доступ открыт в режиме Sprinter-ZX, +а в режимах Pentagon, Scorpion и т.п. - закрыт! + +### FDD контроллер + + 0Fh Command/Status register + 3Fh Track register + 5Fh Sector register + FFh Drive Control register + +In Spectrum configuration the port 0Fh also mapped to 1Fh for TRDOS +compatibility. +But I would recommend to you don\'t use direct port access for it. +A Sprinter have BIOS functions for reading/writing any disk sectors. + +for example: + +At first, make reset disk and to set required parameters. +```asm +INIT_DISK: + LD D,n ; drive number 0-FDD A, 1-FDD B, 80h-HDD C\... + LD C,#51 ; reset disk + RST #08 ; BIOS call + ; + LD D,n ; drive number + LD E,n ; sectors per track. + PUSH DE + LD A,D + LD C,#58 ; get disk parameters + RST #08 ; BIOS call + LD A,H + POP HL + PUSH HL + LD H,A + POP AF + LD IX,256 ; sector size + LD C,#59 ; set disk parameters + RST #08 ; BIOS call + RET +``` + +And next to use BIOS fn. 055h for reading. +```asm +DRV_READ: ; reading from disk + LD A,drv_type ; bit 0..3 - drive number + ; bit 4..7 - drive type + ; 0 - FDD + ; 6 - ram-disk (reserved) + ; 8 - HDD + ; C - CD-ROM (reserved) + LD HL,sec_h ; sector number (high) + LD IX,sec_l ; sector number (low) + ; (HL:IX - 32bit sector number, like LBA) + LD B,n_sec ; sectors count + LD DE,bufer_adr ; memory address for reading + LD C,#55 ; + RST #08 ; CF=0 - read OK + ; CF=1 - read error +``` + +# Клавиатура + + +It's possible by DSS function 36h (K_SETUP). Sprinter has two keyboard +layouts (standard and alternative) which can be switched by [CTRL] + +[SPACE]. Each layout includes four keyboard modes. You can reload all +of them. + +```asm + LD HL,LAYOUT + LD A,0 ;LAYOUT FOR NORMAL MODE + LD BC,#0036 + RST #10 + +Esc EQU #1B +Bcs EQU #08 +Tab EQU #09 +Cps EQU #00 +Spc EQU #20 +Ent EQU #0D + +;Normal mode (without CAPS and SHIFT not pressed) + DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","[","]" + DB Cps,"a","s","d","f","g","h","j","k","l",";","'",Ent + DB #00,"z","x","c","v","b","n","m",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +;SHIFT mode (without CAPS and SHIFT are pressed) + DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","{","}" + DB Cps,"A","S","D","F","G","H","J","K","L",":",#22,Ent + DB #00,"Z","X","C","V","B","N","M","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +;CAPS mode (with CAPS and SHIFT not pressed) + DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs + DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]" + DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent + DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + +;CAPS+SHIFT mode (with CAPS and SHIFT are pressed) + DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs + DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}" + DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent + DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|" + DB #00,#00,Spc,#00,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 + DB #00,#00,#00,"/","*","-","+",Ent,#00 + DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00 +``` +--- + +Прерывания от клавиатуры выставляют бит 0 в порте 19h, им и отличаются +от прерываний экрана. Конечно, возможны случайные совпадения, когда +прерывание от клавиатуры пришло одновременно с экранным, но это очень +маловероятно. От других устройств прерывание может придти, но так же с +некими признаками в портах (но это только в случае, если программа эти +порты настроила и использует для себя) + +### Коды ошибок DSS + +This is a list of DSS error numbers. + + 00h (00) - Success + 01h (01) - Invalid function + 02h (02) - Invalid drive number + 03h (03) - File not found + 04h (04) - Path not found + 05h (05) - Invalid handle + 06h (06) - Too many open files + 07h (07) - File exist + 08h (08) - File read only + 09h (09) - Root overflow + 0Ah (10) - No free space + 0Bh (11) - Directory not empty + 0Ch (12) - Attempt to remove current directory + 0Dh (13) - Invalid media + 0Eh (14) - Invalid operation + 0Fh (15) - Directory exist + 10h (16) - Invalid filename + 11h (17) - Invalid EXE-file + 12h (18) - Not supported EXE-file + 13h (19) - Permission denied + 14h (20) - Not ready + 15h (21) - Seek error + 16h (22) - Sector not found + 17h (23) - CRC error + 18h (24) - Write protect + 19h (25) - Read error + 1Ah (26) - Write error + 1Bh (27) - Drive failure + 1Ch (28) - Unknown error : 28 + 1Dh (29) - Unknown error : 29 + 1Eh (30) - No free memory + 1Fh (31) - Invalid memory block + 20h (32) - Unknown error : 32 diff --git a/docs/new/01-architecture.md b/docs/new/01-architecture.md new file mode 100644 index 0000000..c2b3f1f --- /dev/null +++ b/docs/new/01-architecture.md @@ -0,0 +1,272 @@ +# 1. Архитектура компьютера Sprinter Sp2000 + +## 1.1 Общие сведения + +ZX Sprinter — универсальный компьютер на базе 8-битного процессора Z80. Основой является перепрограммируемая логическая матрица (ППЛМ/CPLD/FPGA), что обеспечивает гибкую изменяемую архитектуру — конфигурация схемы может меняться непосредственно во время работы. + +Материнская плата — Sp2000 (разработана в конце 2000 г.). + +| Параметр | Значение | +|---|---| +| Процессор | Z84C15 (Z80-совместимый, внутренние PIO/SIO/CTC) | +| Тактовая частота | 21 МГц (turbo) / 3.5 МГц (slow) | +| ОЗУ (main) | 4 МБ (72-pin SIMM) | +| Быстрое ОЗУ (КЭШ-ОЗУ) | 64 КБ (SRAM, без wait states) | +| ПЗУ | 256 КБ (8 страниц по 32 КБ) | +| Видео-ОЗУ | 256 КБ | +| Контроллер дисков | КР1818ВГ93 (аналог WD1793) | +| Поддержка НЖМД | IDE/AT | +| Контроллер клавиатуры | AT-совместимая (101 key), PS/2 | +| Контроллер мыши | Serial MS-Mouse (RS-232 через Z84C15 SIO) | +| Слоты расширения | 2 × ISA-8 | +| Звук | AY-3-8910 (в ППЛМ), 16-бит ЦАП TDA1543 (COVOX + AY) | +| COVOX-Blaster (CBL) | 16-bit с буферным ОЗУ 256 байт, 15/22 кГц | +| CMOS-часы | Dallas DS12887A (опционально, эмулируется при отсутствии) | +| Видеовыход | Аналоговый CGA-монитор, RGB, TV (SCART) | + + +## 1.2 Системная архитектура + +Упрощённая структура: + +``` + ┌─────────────┐ + ┌──────────┐ │ ISA-8 │ + │ Принтер │ │ слот 1..2 │ + │ Мышь │ └──────┬──────┘ + │ Джойстик │ │ + └─────┬────┘ ┌─────┴──────┐ + │ │ Буферы и │ + ┌─────┴──────┐ │ дешифраторы│ + │ Z84C15 │ └──────┬─────┘ + │ (CPU + │◄─────────┤ + │ PIO/SIO/ ├──────────┤ + │ CTC) ├──────────┤ + └─────┬──────┘ │ + │ ┌────┴──────────┐ + ┌─────┴──────┐ │ EP1K30QC208 │ + │ ROM 256K │◄───►│ (CPLD/FPGA) │◄───► VRAM 256K + │ Cache 64K │ │ │◄───► Main RAM + └────────────┘ │ │ + │ AY-3-8910 │ + │ COVOX/CBL │ + │ Accel. │ + └──────┬────────┘ + ┌───┴───┐ + │TDA1543│ + │ ЦАП │ + └───────┘ +``` + +Периферия (FDD, HDD, Kempston, клавиатура AT) подключается через ППЛМ. Вспомогательная ППЛМ (EPM7064 на Sp2000) обеспечивает синхронизацию и начальный запуск. Дешифрация адресов портов выполняется через ППЛМ, что позволяет перепрограммировать адреса портов. + +## 1.3 ППЛМ и загрузка конфигураций + +### Механизм конфигурирования + +При включении или RESET информация в ППЛМ стирается. ППЛМ переходит в режим ожидания загрузки блока данных конфигурации. Процессор отключён от периферии, в его адресное пространство включено ПЗУ и возможно КЭШ-ОЗУ. Любая запись процессора в адресное пространство в этот момент записывает данные в ППЛМ. + +Программа загрузчика в ПЗУ: +1. Проверяет флаг в КЭШ-ОЗУ по смещению `#80` (последняя страница КЭШа) +2. Если флаг (строка `ACEX_30K_LOADING`) установлен → загружает конфигурацию из КЭШ-ОЗУ (смещение `#100`) +3. Если флаг сброшен → загружает конфигурацию из ПЗУ + +### Смена конфигурации программно + +1. Загрузить файл прошивки в последнюю страницу КЭШ-ОЗУ (смещение `#100`) +2. Записать флаг `ACEX_30K_LOADING` по смещению `#80` +3. Выполнить программный сброс записью в страницу RESET_PAGE (`#A0`), +4. После сброса загрузчик находит флаг, загружает прошивку в ППЛМ и стирает флаг + +При аппаратном RESET флаг отсутствует — загружается начальная конфигурация из ПЗУ. + +### Ограничения + +- Внутренний формат данных ППЛМ — закрытая информация Altera +- Программа разводки схем — MAX+Plus II — не работает на ZX-Spectrum/Sprinter (требуется PC) + + + +## 1.4 Конфигурации ППЛМ + +### Sprinter-1 +Максимально совместима с ZX-Spectrum. Включает: +- Режимы Spectrum-128/Scorpion-256/Pentagon-512 +- Расширенная память до 4 МБ +- Расширенный экран: Spectrum, Text-80×32, Graf-320×256×256 +- Контроллер дисковода (ВГ93), контроллер IDE +- AT-клавиатура, подключённая как ZX-Keyboard (через порт `#FE`) +- COVOX 8-bit +- AY-3-8910 (доступен) + +### Sprinter-2 +Требования к совместимости жёстче. Добавляет: +- Акселератор операций с ОЗУ (fill, copy, AND, OR, XOR) +- AT-клавиатура через внутренний последовательный порт Z84C15 (сканкоды, не ZX-матрица) + +### ZX-Spectrum+AY +Максимальное приближение к ZX-Spectrum-128/256. AY-3-8910 (3-я версия, в ППЛМ): 3 голоса, шум, амплитуда, огибающая (обнаружена ошибка в формирователе огибающей [IvanMak.txt:224–229]). + +### Game-1 +На базе Sprinter-2. Акселератор без логических функций. COVOX-Blaster (15 кГц). + +### DooM +Развитие Game-1. Акселератор с аппаратным растяжением/сжатием вертикальных и горизонтальных линий. + +### Video +Похожа на Game-1, добавлена возможность передачи данных с HDD прямо в видео-память. Режим `GR-256-4×4` — 160×128 с аппаратным удвоением пикселя. + +### Плата Sp2000 +Конфигурации Sprinter-1, Sprinter-2 и ZX+AY объединены в одну прошивку. Переключение — через системный порт. Game-1, DooM, Video также планируется свести в одну. + +## 1.5 Система памяти (обзор) + +Адресное пространство Z80 (64 КБ) разделено на 4 окна по 16 КБ: + +| Окно | Адреса | Название | Назначение (по умолчанию) | +|---|---|---|---| +| W0 | `#0000..#3FFF` | PAGE0 | ПЗУ (системное) | +| W1 | `#4000..#7FFF` | PAGE1 | ОЗУ, страница 5 | +| W2 | `#8000..#BFFF` | PAGE2 | ОЗУ, страница 2 | +| W3 | `#C000..#FFFF` | PAGE3 | ОЗУ, любая страница (0..N) | + +Основная память — 4..64 МБ — делится на блоки по 16 КБ. Управление через порты страниц (`#82`, `#A2`, `#C2`, `#E2` для окон 0..3). ПЗУ: `#E0..#EF`. КЭШ-ОЗУ: `#F0..#FF`. + +Детально — `04-memory.md`. + +## 1.6 Видеосистема (обзор) + +Основа — ППЛМ + 256 КБ видео-ОЗУ. Два режима адресации VRAM: +- **Спектрумовский** — экран 32 блока по 8 КБ, адрес через RGADR +- **Графический** — 256 строк × 1024 байта, линейная адресация; страницы `#50..#5F` + +Режимы вывода (задаются для каждого квадратика 8×8): +- ZX-40 — текстовый 40×32 (Spectrum-совместимый) +- ZX-80 — текстовый 80×32, до 36 знакогенераторов +- GR-256-8 — графический 320×256×256 цветов +- GR-16-16 — графический 640×256×16 цветов + +Палитра: 8 палитр по 256 цветов из 16 млн. Цвет: 3 байта RGB (BGR) на цвет. + +четыре из этих восьми палитр используются для графических режимов и оставшиеся четыре для текстовой палитры — 4 текстовые палитры (paper, ink, flash-paper, flash-ink) по адресам `#03F0..#03FE`. + +Детально — `05-graphics.md`. + +## 1.7 Акселератор (обзор) + +Акселератор — быстрое внутреннее ОЗУ в ППЛМ. Присутствует в Sprinter-2 и выше. Управляется через NOP-команды процессора (`LD D,D`, `LD L,L`, `LD C,C` и др.), которые ППЛМ распознаёт как инструкции акселератора. + +Операции: fill, copy, AND, OR, XOR. + +**время копирования полного экрана.** - «~1.2 инта» (~24 мс при 50 Гц) + +**формула скорости.** +«Время работы акселератора = число пересылаемых байт / 7000000 (секунд)» + +**акселератор и прерывания.** требуется DI/EI (акселератор сильно меняет систему команд). + +Детально — `06-accel.md`. + +## 1.8 Быстрое ОЗУ (КЭШ-ОЗУ) + +64 КБ SRAM с доступом без wait states на частоте 21 МГц. Физические страницы `#F0..#FF`, реально 4 страницы по 16 КБ. + +Подключается через порт `#FB` (стандартный Pentagon-овский), чтение `IN A,(#FB)` — включает, `IN A,(#7B)` — выключает. + +Ограничения: +- Несовместимо с акселератором +- Не сохраняется между процессами +- Конфликт с COVOX по порту `#FB` +- На Sp2000 используется для загрузки прошивок ППЛМ и как временное хранилище + +Детально — `04-memory.md`. + +## 1.9 ISA-слоты + +Два 8-битных ISA-слота. + +Возможны два способа доступа к ISA — вероятно, разные конфигурации ППЛМ: + +- Через страницы памяти `#D0..#DF` [IvanMak.txt:855–858]: «Бит 1 номера означает выбор доступа к порту или памяти ISA, а бит 2 определяет к какому из двух слотов осуществляется доступ.» +- Через управляющие порты [Parinov.txt:798–857]: (1) запись `#10` в порт `1FFDh`, (2) запись управляющего байта в порт `0E2h` (бит D2=слот, D1=порт/память), (3) использование порта `9FBDh` для старших адресов. + +## 1.10 Звук (обзор) + +COVOX: ЦАП TDA1543 — 16-битный стерео, COVOX — 8-битный, реально используется 10 бит для одновременного вывода COVOX и AY. + +**порт CBL.** +«Порт управления: 004Eh (16-bit port!!!, писать только через OUT (C),reg)» — 16-бит, требуется `OUT (C),A`. + +Компоненты звукового тракта: +- **16-битный ЦАП TDA1543** (реально 10 бит) — подключён к ППЛМ +- **AY-3-8910** — эмуляция в ППЛМ (3-я версия: 3 голоса + шум + огибающая) +- **COVOX 8-bit** — порты `#FB` / `#4F`, через TDA1543 +- **Бипер** — бит 3 порта `#FE` +- **COVOX-Blaster (CBL)** — COVOX с буферным ОЗУ 256 байт, 15/22 кГц. Управление порт `#4E` + +Детально — `08-io.md`. + +## 1.11 Клавиатура (обзор) + +В Sprinter-1 — ZX-клавиатурная матрица через порт `#FE`. В Sprinter-2 и выше — AT-клавиатура через внутренний SIO Z84C15 (порты `#18`/`#19`). Сканкоды напрямую, FIFO на 3 байта. + +Детально — `08-io.md`. + +## 1.12 Мышь + +Microsoft Mouse (2 кнопки) через последовательный порт Z84C15. Порт команд: `#1B`, порт данных: `#1A`. + +Детально — `08-io.md`. + +## 1.13 Дисковая подсистема + +- **FDD**: КР1818ВГ93 (WD1793). Порт `#1F` перенаправляется на `#0F` в ПЗУ. Поддержка 720 КБ / 1.44 МБ. +- **HDD**: IDE/AT. Порты `#XX50..#XX55`, регистры `#20..#29`. +- **CMOS Dallas DS12887A**: порты `#FFBD` (read), `#BFBD` (write), `#DFBD` (address). + +Детально — `08-io.md`. + +## 1.14 Система прерываний (обзор) + +Поддерживаются IM1 и IM2. Генерация INT — через бит 0 порта `#FE`. CTC Z84C15 — таймер, SIO — клавиатура. ISA-слоты — IRQ через PIO порт B (`#1F`). + +Детально — `07-irq.md`. + +## 1.15 Сброс и старт машины + +Программный сброс (без перезагрузки ППЛМ) [IvanMak.txt:1385–1394]: +``` +DI +LD A, 16 +LD BC, 1FFDh +OUT (C), A +LD A, 0A0h +OUT (PAGE3), A ; PAGE3 = #E2 +LD (0C000h), A ; в этот момент происходит RESET +DI +HALT +``` + +Сброс с перезагрузкой ППЛМ — через функции BIOS (`02-bios.md`). Аппаратный RESET — начальная конфигурация из ПЗУ. + +## 1.16 Плата Sp2000 — особенности + +- Конфигурации объединены в две прошивки ППЛМ (Sprinter-1+Sprinter-2+ZX+AY — одна; Game-1+DooM+Video — другая) +- AY-сопроцессор доступен и в Sprinter-1, и в Sprinter-2 +- ОЗУ: 72-pin SIMM, от 4 до 64 МБ +- Внутренние порты Z84C15: `#10..#1F`, `#EE`, `#EF`, `#F0`, `#F1`, `#F4` — их адреса вне ППЛМ +- Обнаружена ошибка в формирователе огибающей AY (3-я версия) + +## 1.17 Кросс-ссылки + +- BIOS: `02-bios.md` +- DSS/ESTEX: `03-dss.md` +- Память, режимы, банки: `04-memory.md` +- Видео, палитра: `05-graphics.md` +- Акселератор: `06-accel.md` +- Прерывания: `07-irq.md` +- Диски, джойстик, принтер, ISA: `08-io.md` +- Клавиатура, мышь: `09-input.md` +- Звук: `10-sound.md` +- Карта портов: `11-ports.md` +- Баги: `12-bugs.md` diff --git a/docs/new/02-bios.md b/docs/new/02-bios.md new file mode 100644 index 0000000..6195904 --- /dev/null +++ b/docs/new/02-bios.md @@ -0,0 +1,1234 @@ +# 2. BIOS Sprinter Sp2000 — полный справочник + +## 2.1 Общие сведения + +BIOS Sprinter — набор системных функций, доступных через три способа вызова: + +| Способ | Применение | Прерывания | +|--------|-----------|-----------| +| `CALL 3D13h` | Из любой точки, через системный вход | **Отключает** (DI) | +| `RST 8` | Из EXE (обработчик в DSS), код в #0008 | Не отключает | +| `RST 18h` | При подключённом ПЗУ в W0 | Не отключает | + +Для `CALL 3D13h` после вызова программа сама включает прерывания (EI). Если прерывания нужны постоянно — использовать `RST 18h`/`RST 8` с обработчиком и стеком в `#8000..#BFFF` в режиме IM 2. + +### Конвенция регистров + +- **C** — номер функции +- Остальные регистры — входные параметры (по функции) +- **CF=0** — успех, выходные данные в регистрах +- **CF=1** — ошибка, код ошибки в **A** + +### Включение/отключение ПЗУ в W0 + +```asm +LD A,0 +OUT (07Ch),A ; включить ПЗУ BIOS в окно 0 +; ... вызовы RST 18h ... +LD A,0 +OUT (03Ch),A ; отключить ПЗУ, вернуть ОЗУ +``` + +### Ограничения + +- Стек — обязательно в `#8000..#BFFF` (W2), так как часть функций переключает W1 и W3 +- HL, IX обычно сохраняются в функциях вывода текста, но не гарантируется во всех +- Некоторые функции окно́вых операций (WIN_COPY_WIN, WIN_RESTORE_WIN, WIN_MOVE_WIN) **требуют DI** при вызове через RST 18h/8 — используют стек для ускорения + +--- + +## 2.2 Системные функции (00h–0Fh) + +### 00h — BOOT + +Перезагрузка системы. Параметров нет. Не возвращается (полный ресет). + +### 01h — INIT + +Инициализация BIOS. Параметров нет. Вызывается автоматически при старте. Повторный вызов сбрасывает состояние окон, палитр и системных переменных к умолчаниям. + +### 02h — GET_KEY (`A=0`) + +Ожидание и получение нажатой клавиши. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | A=0 | (зарезервировано) | +| Выход | A | ASCII-код нажатой клавиши | + +Блокирует выполнение до нажатия. Не эхо-печатает символ на экран. Возвращает расширенный ASCII (8-бит), для F-клавиш и стрелок — смотри GET_EXT_KEY. + +### 03h — GET_EXT_KEY + +Получение расширенной клавиши (без ожидания, опрос). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | — | | +| Выход | D | Скан-код клавиатуры | +| Выход | E | ASCII-символ (0 если нет символа) | + +Если нет нажатия — возвращает D=E=0 (или неопределённое значение — проверять). Для F-клавиш, стрелок и других не-ASCII клавиш E=0, D=скан-код. + +### 04h — PR_OK + +Проверка готовности к вводу. Параметров нет. Назначение точно не документировано. + +### 05h — IS_EXT_KEY + +Проверка, есть ли в буфере расширенная клавиша. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | — | | +| Выход | A | 0 = нет клавиши, 1 = есть | + +Не блокирует, не считывает. После `A=1` вызывает `GET_EXT_KEY`. + +### 06h + +Зарезервировано. + +### 08Fh — FN_TURBO + +Управление режимом турбо и режимом FDD. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `08Fh` | +| Вход | A | `2` = turbo off, `3` = turbo on, `12h` = FDD 720K, `13h` = FDD 1.44M | +| Выход | CF=0 | Успех | +| Выход | CF=1 | Неверный режим | + +Переключение турбо может не произойти, если прошивка ППЛМ не поддерживает его. Ошибки при этом нет (CF=0). + +--- + +## 2.3 Управление памятью (0C0h–0C7h, 09Eh, 09Dh) + +### 0C0h — EMM_FN0 + +Определение объёмов ОЗУ. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0C0h` | +| Выход | HL | Общий объём ОЗУ в страницах по 16 КБ | +| Выход | BC | Свободный объём ОЗУ в страницах по 16 КБ | + +### 0C1h — EMM_FN1 + +Инициализация распределения памяти. Стирает всю информацию о выделенных ранее блоках ОЗУ. Блоки с системной информацией и первые 256 КБ ОЗУ помечаются занятыми. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0C1h` | +| Выход | — | Нет | + +### 0C2h — EMM_FN2 + +Выделение блока ОЗУ. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0C2h` | +| Вход | B | Число запрашиваемых страниц (16 КБ каждая) | +| Выход (CF=0) | A | Идентификатор блока | +| Выход (CF=1) | A | `1` = не хватает памяти | + +### 0C3h — EMM_FN3 + +Освобождение блока ОЗУ. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0C3h` | +| Вход | A | Идентификатор блока | +| Выход (CF=1) | C | Неверный идентификатор | + +Правильность идентификатора отслеживается не всегда. + +### 0C4h — EMM_FN4 + +Получение физического номера страницы из блока по логическому номеру. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0C4h` | +| Вход | A | Идентификатор блока | +| Вход | B | Логический номер страницы в блоке | +| Выход (CF=0) | A | Физический номер страницы | +| Выход (CF=1) | A | `0` = блок не существует, `255` = страница за пределами блока | + +### 0C5h — EMM_FN5 + +Получение списка всех физических страниц блока. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0C5h` | +| Вход | A | Идентификатор блока | +| Вход | HL | Адрес буфера (256 байт) | +| Выход (CF=0) | B | Число страниц в блоке | +| Выход (CF=0) | HL | Тот же буфер; в нём — список физических страниц по порядку, завершающийся байтом `0FFh` | +| Выход (CF=1) | — | Неверный ID блока; данные в буфере могут быть затерты | + +Буфер должен быть на 1 байт больше числа страниц в блоке. + +### 0C6h — EMM_FN6 + +Получение адреса порта окна и текущей подключённой страницы. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0C6h` | +| Вход | A | Номер окна (0, 1, 2 или 3) | +| Выход (CF=0) | C | 8-битный адрес порта окна | +| Выход (CF=0) | B | Физический номер текущей страницы | +| Выход (CF=1) | — | Неверный номер окна | + +> **Примечание:** функция практически не используется — адреса портов окон фиксированы с начала разработки: `PAGE0=82h`, `PAGE1=0A2h`, `PAGE2=0C2h`, `PAGE3=0E2h`. Рекомендуется вызвать её один раз для верификации. + +### 0C7h — EMM_FN7 + +Получение следующей страницы в блоке по физическому номеру. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0C7h` | +| Вход | A | Физическая страница | +| Выход (CF=0) | A | Следующая физическая страница того же блока; `0FFh` = конец блока | +| Выход (CF=1) | — | Страница не принадлежит никакому блоку (свободна) | + +Информация о распределении памяти хранится в RAM Allocation Table (FAT-подобная), поэтому переход по «следующей» странице быстрее, чем поиск по логическому номеру. + +### 09Eh — EMM_FN8 + +Слияние двух блоков памяти в один. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `09Eh` | +| Вход | A | Идентификатор блока 1 | +| Вход | B | Идентификатор блока 2 | +| Выход (CF=0) | A | Идентификатор объединённого блока | +| Выход (CF=1) | A | Неверный идентификатор | + +### 09Dh — EMM_FN9 + +Разделение блока на две части. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `09Dh` | +| Вход | A | Идентификатор блока | +| Вход | B | Новая длина первой части (в страницах) | +| Выход (CF=0) | A | Идентификатор блока-результата (первая часть) | +| Выход (CF=0) | B | Идентификатор блока-остатка (вторая часть) | +| Выход (CF=1) | — | Неверный идентификатор | + +--- + +## 2.4 Функции «железа» (0EFh, 0F2h, 0F5h–0F7h) + +### 0EFh — FN_VERSION + +Выдача информации о версии BIOS и модели компьютера. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0EFh` | +| Вход | HL | Адрес буфера для строки (результат — ASCII, поля разделены, конец — двойной ноль) | +| Выход (CF=0) | HL | Тот же буфер с заполненной строкой | +| Выход (CF=0) | DE | Версия BIOS | +| Выход (CF=0) | BC | Версия железа (*см. таблицу*) | +| Выход (CF=0) | A | Количество полей в буфере (всегда 2) | +| Выход (CF=1) | — | Очень старая версия BIOS, нет функции | + +**Значения BC (версия железа):** + +| BC | BIOS_v3.txt | IvanMak.txt | +|----|-------------|-------------| +| `FFFF` | Не определено | Не определено | +| `FFFE` | Spectrum, режим Sprinter ZX | Sprinter-1 | +| `FFFD` | Конфигурация Sprinter | Sprinter-2 | +| `FFFC` | Зарезервировано | Spectrum+AY8910 | +| `FFFB` | Зарезервировано | Game-1 | +| `FFFA` | Зарезервировано | Video-1 | +| `FFF9` | Зарезервировано | DooM | +| иные | Новые прошивки | Новые прошивки | + +> **Примечание:** BIOS_v3.txt помечает `FFF9–FFFC` как «зарезервировано», IvanMak присваивает им конкретные конфигурации. Исходный код BIOS v3.04 (FUNC_BIOS_MAIN.ASM) возвращает `ID_SPRINTER` с тремя полями: `"Firmware vX.Y"`, `"Sprinter"`, версия битстрима. Версия дискового ПЗУ — v2.56, CPLD — v3.05 (определяются в `_BIOS.REV` и сборке). Реальные возвращаемые коды BC зависят от прошивки ППЛМ. + +Поля в буфере HL (через `HL`): первое — версия BIOS, второе — название модели компьютера. + +### 0F2h — FN_SICF + +Установка режима синхронизации и очистка страниц режима экрана. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0F2h` | +| Вход | A | `0` — режим по умолчанию (очистка страниц режима), `1` — Scorpion (312 строк, INT как в Scorpion-256), `2` — Pentagon (320 строк, INT как в Pentagon-128) | +| Выход (CF=0) | — | Успех | +| Выход (CF=1) | — | Неверный номер режима | + +При `A=0` происходит полная очистка страниц режима — на всём экране остаётся только бордер. Смена режима синхронизации может привести к временному сбою монитора. + +### 0F5h — CMOS_TEST + +Проверка наличия микросхемы CMOS (часы реального времени). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0F5h` | +| Выход (CF=0) | — | Часы есть (физическая микросхема DS12887A или эмуляция) | +| Выход (CF=1) | — | Часов нет | + +Функции CMOS работают всегда — если микросхемы нет, BIOS эмулирует её память. + +### 0F6h — CMOS_RD + +Чтение регистра CMOS. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0F6h` | +| Вход | D | Номер регистра CMOS | +| Выход | A | Прочитанные данные | +| Выход (CF=0) | — | Часы есть | +| Выход (CF=1) | — | Часов нет | + +### 0F7h — CMOS_WR + +Запись в регистр CMOS. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0F7h` | +| Вход | D | Номер регистра CMOS | +| Вход | A | Записываемые данные | +| Выход (CF=0) | — | Часы есть | +| Выход (CF=1) | — | Часов нет | + +--- + +## 2.5 Функции управления окнами (0B0h–0B8h) + +> **Важно:** в текущей версии BIOS идентификатор окна (`A`) для **всех** оконных функций обязан быть `0`. Возможность работы с несколькими окнами не реализована — при открытии нового окна старый описатель теряется. Единственный валидный идентификатор — `0`. + +### Дескриптор окна (для WIN_OPEN) + +32-байтовый блок, адрес в **IX**: + +| Смещение | Размер | Описание | +|----------|--------|----------| +| IX+0 | 1 | Горизонтальный размер окна (в знакоместах) | +| IX+1 | 1 | Вертикальный размер окна (в знакоместах) | +| IX+2 | 1 | Положение окна по горизонтали на экране (знакоместа) | +| IX+3 | 1 | Положение окна по вертикали на экране (знакоместа) | +| IX+4 | 1 | **Режим знакоместа** | +| | | Бит 4: `1` = text mode, `0` = graf mode | +| | | Бит 5: `0` = 16 точек/знакоместо, `1` = 8 точек | +| | | graf mode: биты 7–6 = номер палитры, биты 3–0 несущественны | +| | | text mode: биты 7–6,3–0 = номер знакогенератора; `11xxxxxx` = бордер | +| IX+5 | 1 | Бит 0: `1` = включить спектрумовскую адресацию экрана | +| IX+6 | 1 | Положение X в поле графики (в знакоместах) | +| IX+7 | 1 | Положение Y в поле графики (в знакоместах) | +| IX+8..31 | 24 | Зарезервировано (должны быть нулями) | + +При открытии окна дескриптор копируется в системную страницу ОЗУ — программа может не сохранять его. Вместо этого используется **идентификатор окна** (возвращается WIN_OPEN). + +> **Важно:** в текущей версии BIOS хранится только один описатель окна. Идентификатор всегда 0. При открытии нового окна старый описатель теряется. + +### 0B0h — WIN_OPEN + +Открытие окна. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0B0h` | +| Вход | IX | Адрес 32-байтового дескриптора окна | +| Вход | E | Бит 0: какую страницу режима включать; бит 4: на какой странице открывать | +| Выход (CF=0) | A | Идентификатор окна | +| Выход (CF=1) | — | Слишком много окон | + +### 0B1h — WIN_CLOSE + +Закрытие окна. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0B1h` | +| Вход | A | Идентификатор окна | +| Выход (CF=1) | — | Неверный идентификатор | + +Окно с номером 0 никогда не закрывается — попытка закрыть его возвращает CF=1. + +### 0B2h — WIN_COPY_WIN + +Копирование текстового окна в буфер (запоминание). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0B2h` | +| Вход | A | Идентификатор глобального окна | +| Вход | H | Размер по вертикали (в символах) | +| Вход | L | Размер по горизонтали (в символах) | +| Вход | D | Вертикальное положение в глобальном окне | +| Вход | E | Горизонтальное положение в глобальном окне | +| Вход | IX | Адрес буфера (относительно `#C000`; если от `#8000` — страница недействительна) | +| Вход | A' | Страница буфера (должна принадлежать программе) | +| Выход (CF=1) | — | Неверный идентификатор | + +> **Требует DI** при вызове через RST 18h/8 — использует стек для ускорения. + +### 0B3h — WIN_RESTORE_WIN + +Восстановление окна из буфера. + +Параметры — полностью идентичны WIN_COPY_WIN. + +> **Требует DI** при вызове через RST 18h/8. + +### 0B4h — WIN_GET_SYM + +Получение символа и атрибута с экрана. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0B4h` | +| Вход | A | Идентификатор окна | +| Вход | D | Вертикальная позиция символа | +| Вход | E | Горизонтальная позиция символа | +| Выход (CF=0) | L | Символ | +| Выход (CF=0) | H | Атрибут | +| Выход (CF=0) | B | Номер знакогенератора | +| Выход (CF=1) | — | Неверный идентификатор окна | + +> **Важно:** анализ исходного кода BIOS v3.04 (FUNC_LOW_PRINT.ASM) подтверждает: `A` **обязан быть 0**. Реализация начинается с `AND A / SCF / RET NZ` — при `A ≠ 0` сразу возвращается CF=1. Многооконная поддержка не реализована. + +### 0B5h — WIN_PUT_SYM + +Вывод символа на экран. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0B5h` | +| Вход | A | Идентификатор окна | +| Вход | D | Вертикальная позиция | +| Вход | E | Горизонтальная позиция | +| Вход | L | Символ | +| Вход | H | Атрибут символа | +| Вход | B | Номер знакогенератора | +| Выход (CF=1) | — | Неверный идентификатор окна | + +### 0B6h — WIN_SET_ZG + +Установка знакогенератора. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0B6h` | +| Вход | A | Системный номер знакогенератора | +| Вход | DE | Указатель на 2 КБ данных знакогенератора | +| Выход (CF=1) | — | Старая версия, нет функции | + +### 0B7h — WIN_MOVE_WIN + +Перемещение окна. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0B7h` | +| Вход | A | Идентификатор глобального окна | +| Вход | H | Размер локального окна по вертикали (символы) | +| Вход | L | Размер локального окна по горизонтали (символы) | +| Вход | D | Положение локального окна по вертикали (символы) | +| Вход | E | Положение локального окна по горизонтали (символы) | +| Вход | IX | Новое положение локального окна (как DE — D=верт, E=гор) | +| Выход (CF=1) | — | Неверный идентификатор | + +> **Требует DI** при вызове через RST 18h/8. + +### 0B8h — WIN_GET_ZG + +Получение знакогенератора. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0B8h` | +| Вход | DE | Адрес буфера (2 КБ) | +| Выход (CF=1) | — | Старая версия, нет функции | + +--- + +## 2.6 Функции вывода текста (081h–08Eh) + +Все функции этого раздела работают с **текущим окном** (последнее открытое). К графическому экрану не применимы. CF=0 на выходе — всегда успех (кроме особо оговоренных). + +### 081h — LP_PRINT_ALL + +Печать `B` одинаковых символов с атрибутом. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `081h` | +| Вход | A | Символ | +| Вход | E | Атрибут | +| Вход | B | Количество символов | + +HL, IX сохраняются. + +### 082h — LP_PRINT_SYM + +Печать `B` одинаковых символов **без изменения атрибута**. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `082h` | +| Вход | A | Символ | +| Вход | B | Количество символов | + +HL, IX сохраняются. + +### 083h — LP_PRINT_ATR + +Печать `B` одинаковых атрибутов. Символы на экране не меняются. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `083h` | +| Вход | E | Атрибут | +| Вход | B | Количество символов | + +HL, IX сохраняются. + +### 084h — LP_SET_PLACE + +Установка текущей позиции печати в окне. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `084h` | +| Вход | E | Горизонтальная позиция (столбец) | +| Вход | D | Вертикальная позиция (строка) | + +Превышение границ окна приводит к переустановке позиции с начала (за вычетом полного размера окна) — не ошибка. + +### 085h — LP_PRINT_LN + +Вывод строки символов с атрибутом с текущей позиции. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `085h` | +| Вход | HL | Адрес строки (обязательно в `#4000..#BFFF`) | +| Вход | E | Атрибут | +| Вход | B | Длина строки | + +### 086h — LP_PRINT_LN2 + +Вывод строки символов без атрибутов с текущей позиции. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `086h` | +| Вход | HL | Адрес строки (`#4000..#BFFF`) | +| Вход | B | Длина строки | + +### 087h — LP_PRINT_LN3 + +Вывод строки до разделителя, с атрибутом. После разделителя — пробелы до длины `B`. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `087h` | +| Вход | HL | Адрес строки (`#4000..#BFFF`) | +| Вход | E | Атрибут | +| Вход | B | Максимальная длина | +| Вход | D | Символ-разделитель | + +### 088h — LP_PRINT_LN4 + +Вывод строки до разделителя, без атрибутов. После разделителя — пробелы. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `088h` | +| Вход | HL | Адрес строки (`#4000..#BFFF`) | +| Вход | B | Максимальная длина | +| Вход | D | Символ-разделитель | + +### 089h — LP_CLS_WIN + +Очистка экрана (заполнение пробелами с заданным атрибутом). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `089h` | +| Вход | D | Вертикальное положение локального окна | +| Вход | E | Горизонтальное положение локального окна | +| Вход | H | Размер по вертикали | +| Вход | L | Размер по горизонтали | +| Вход | B | Атрибут очистки | + +### 08Ah — LP_SCROLL_UD + +Скроллинг части глобального окна вверх/вниз. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `08Ah` | +| Вход | B | `1` = вверх, `2` = вниз | +| Вход | D | Начальная строка скроллинга | +| Вход | E | Число скроллируемых строк | + +Скроллируются полные строки глобального окна. + +### 08Bh — LP_PRINT_LN5 + +Вывод строки до разделителя с атрибутом. После разделителя вывод **останавливается** (не заполняется пробелами). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `08Bh` | +| Вход | HL | Адрес строки (`#4000..#BFFF`) | +| Вход | E | Атрибут | +| Вход | B | Максимальная длина | +| Вход | D | Символ-разделитель | + +### 08Ch — LP_PRINT_LN6 + +Вывод строки до разделителя без атрибутов. Останов на разделителе. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `08Ch` | +| Вход | HL | Адрес строки (`#4000..#BFFF`) | +| Вход | B | Максимальная длина | +| Вход | D | Символ-разделитель | + +### 08Dh — LP_CLS_WIN2 + +Очистка экрана с указанием символа заполнения. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `08Dh` | +| Вход | D | Вертикальное положение локального окна | +| Вход | E | Горизонтальное положение локального окна | +| Вход | H | Размер по вертикали | +| Вход | L | Размер по горизонтали | +| Вход | B | Атрибут очистки | +| Вход | A | Символ заполнения | + +### 08Eh — LP_GET_PLACE + +Получение текущей позиции печати. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `08Eh` | +| Выход | D | Текущая строка (вертикаль) | +| Выход | E | Текущий столбец (горизонталь) | + +--- + +## 2.7 Графические функции (0A0h–0A8h) + +### 0A0h — PIC_OPEN_WIN + +Открытие окна в пиксельных координатах (в отличие от WIN_OPEN, работающего в знакоместах). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A0h` | +| Вход | IX | Адрес 32-байтового дескриптора окна (формат как у WIN_OPEN) | +| Вход | HL | Упакованные пиксельные координаты: X + Y×64 + #4000 + #1000×RGMOD | +| Вход | E | Бит 0: страница режима | +| Выход (CF=0) | — | Успех | + +### 0A1h — PIC_POINT + +Установка точки (пикселя) на экране. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A1h` | +| Вход | DE | Координата Y (вертикаль, пиксели) | +| Вход | HL | Координата X (горизонталь, пиксели) | +| Вход | A | Идентификатор окна | +| Вход | B | Цвет точки | +| Выход (CF=1) | — | Неверный идентификатор окна | + +Координаты отсчитываются от верхнего левого угла экрана. + +### 0A2h — PIC_FN2 + +Заполнение или копирование блока. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A2h` | +| Вход | DE | Координата Y (вертикаль, пиксели) | +| Вход | HL | Координата X (горизонталь, пиксели) | +| Вход | IX | Размеры: IXH = вертикальный размер, IXL = горизонтальный | +| Вход | A | Цвет заполнения | +| Вход | B | Бит 0: `1` = вторая страница режима | +| Выход (CF=0) | — | Успех | + +### 0A3h — PIC_FN3 + +Копирование блока между страницами. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A3h` | +| Вход | DE | Координата Y назначения | +| Вход | HL | Координата X назначения | +| Вход | A'HL' | Адрес источника (теневые регистры) | +| Вход | BC' | Длина в байтах | +| Вход | B | Бит 0: `1` = вторая страница режима | +| Выход (CF=0) | — | Успех | + +### 0A4h — PIC_SET_PAL + +Установка палитры. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A4h` | +| Вход | HL | Указатель на данные палитры (B,R,G,0 для каждого цвета) | +| Вход | E | Номер начального цвета | +| Вход | D | Количество устанавливаемых цветов | +| Вход | B | Маска (для нормального режима — `0FFh`) | +| Вход | A | Бит 0–3: номер палитры (0..7; 8..15 зарезервированы). Бит 7: `0` = установить, `1` = загрузить палитру в память. Биты 4–6: зарезервированы (0). | + +Формат данных палитры по адресу HL: +```asm +DB blue1, green1, red1, 0 +DB blue2, green2, red2, 0 +... +DB blueN, greenN, redN, 0 +``` +N = количество цветов. 0 соответствует 256 цветам. Перед записью в VRAM данные проходят `AND` с маской `B`. + +> **Примечание:** исходный код BIOS v3.04 (FUNC_SCREEN.ASM:190-261) подтверждает бит 7: `ADD A,A` сдвигает A влево, устанавливая CF из бита 7; при CF=1 выполняется `PIC_GET_PAL` (чтение палитры в память), при CF=0 — установка. IvanMak и Parinov описывают регистр неполно (бит 7 опущен). + +**Страницы палитры:** +- **0–3** — графические режимы (выбор через биты 7–6 байта режима знакоместа) +- **4** — PAPER (текстовый и спектрумовский режимы) +- **5** — INK +- **6** — PAPER в режиме FLASH +- **7** — INK в режиме FLASH +Для отключения FLASH в конкретном атрибуте: установить цвета палитры 4 = 6 и 5 = 7. Для включения FLASH в режиме IBM-CGA: 6 = 7 = 4 (PAPER мерцает в INK). + +### 0A5h — PIC_FN5 + +Установка страницы режима (RGMOD). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A5h` | +| Вход | E | Режим: бит 0 = RGMOD | +| Выход | — | Нет | + +### 0A6h — SET_PAL_INIT + +Установка внутренней палитры (инициализация). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A6h` | +| Вход | A | Страница палитры | +| Вход | B | `1` = графическая палитра, `2` = спектрумовская, `3` = текстовая CGA | +| Выход (CF=1) | — | Неверный номер палитры | + +### 0A7h — PIC_FN7 + +Рисование линии. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A7h` | +| Вход | DE | Координата Y начала | +| Вход | HL | Координата X начала | +| Вход | H' | Длина линии (приращение по X) | +| Вход | A | Цвет линии | +| Вход | B | Бит 0: `1` = вторая страница режима | +| Выход (CF=0) | — | Успех | + +### 0A8h — PIC_FN8 + +Рисование линии с массивом цветов. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0A8h` | +| Вход | DE | Координата Y начала | +| Вход | HL | Координата X начала | +| Вход | H' | Длина линии | +| Вход | IX | Массив цветов (последовательность байт цвета для каждого пикселя) | +| Вход | B | Бит 0: `1` = вторая страница режима | +| Выход (CF=0) | — | Успех | + +--- + +## 2.8 Функции диска (50h–5Fh) + +### Кодировка номера устройства (для всех DRV-функций) + +Регистр A = биты 7..4 (тип) + биты 3..0 (номер): + +| Тип (биты 7..4) | Устройство | +|-----------------|-----------| +| `0x` | FDD (дисковод) | +| `6x` | RAM-DISK | +| `8x` | HDD | +| `Cx` | CD-ROM | + +Номер сектора: **HL:IX** — HL = старшая часть, IX = младшая. + +### 50h, 52h, 53h — зарезервированы + +Не реализованы. Вызов без параметров, возврата нет. + +### 51h — DRV_RESET + +Сброс контроллера и настройка на указанное устройство. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `51h` | +| Вход | A | Номер и тип устройства | +| Выход (CF=1) | — | Нет диска или нет устройства | + +### 54h — DRV_VERIFY + +Проверка секторов (внутренняя, на совпадение ECC). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `54h` | +| Вход | A | Номер и тип устройства | +| Вход | HL:IX | Номер сектора | +| Вход | B | Количество секторов | +| Выход (CF=1) | — | Ошибка проверки | + +> **Примечание:** функция реализована **только для ATA/HDD** (ATA_5x_VERIFY в ATA_DRV.asm:472). Для FDD, RAM-диска и CD-ROM не поддерживается — возвращает CF=1. В ранних версиях (до v3.0x) действительно отсутствовала. + +### 55h — DRV_READ + +Чтение секторов с устройства. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `55h` | +| Вход | A | Номер и тип устройства | +| Вход | HL:IX | Номер сектора | +| Вход | B | Количество секторов | +| Вход | DE | Адрес буфера для данных | +| Выход (CF=0) | HL:IX | Номер сектора + количество прочитанных | +| Выход (CF=0) | DE | Адрес буфера + (количество × размер сектора) | +| Выход (CF=1) | — | Ошибка чтения | + +### 56h — DRV_WRITE + +Запись секторов на устройство. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `56h` | +| Вход | A | Номер и тип устройства | +| Вход | HL:IX | Номер сектора | +| Вход | B | Количество секторов | +| Вход | DE | Адрес буфера с данными | +| Выход (CF=0) | HL:IX | Номер сектора + количество записанных | +| Выход (CF=0) | DE | Адрес буфера + (количество × размер сектора) | +| Выход (CF=1) | — | Ошибка записи | + +### 57h — DRV_DETECT + +Определение параметров устройства (тип носителя). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `57h` | +| Вход | A | Номер и тип устройства | +| Выход (CF=0) | A | Биты: bit7=0 = 720 КБ, bit7=1 = 1.44 МБ | +| Выход (CF=1) | — | Нет устройства или носителя | + +### 58h — DRV_GET_PAR + +Получение параметров носителя. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `58h` | +| Вход | A | Номер и тип устройства | +| Выход (CF=0) | L | Число секторов на дорожке | +| Выход (CF=0) | H | Число головок | +| Выход (CF=0) | DE | Количество цилиндров | +| Выход (CF=0) | IX | Размер сектора в байтах | +| Выход (CF=0) | B | Доп. параметры: bit7 = тип 1.44/720 | +| Выход (CF=1) | — | Нет устройства | + +Если `HL=DE=0FFFFh` — устройства нет. + +### 59h — DRV_SET_PAR + +Установка параметров носителя. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `59h` | +| Вход | A | Номер и тип устройства | +| Вход | L | Число секторов на дорожке | +| Вход | H | Число головок | +| Вход | DE | Количество цилиндров | +| Вход | IX | Размер сектора в байтах | +| Вход | B | Доп. параметры: bit7 = тип 1.44/720 | +| Выход (CF=0) | — | Успех | + +### 5Ah — EXT_VERSION + +Версия дисковой спецификации. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `5Ah` | +| Выход (CF=0) | D | Версия | +| Выход (CF=0) | E | Модификация | +| Выход (CF=1) | — | Ошибка | + +### 5Fh — DRV_LIST + +Список дисковых устройств. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `5Fh` | +| Вход | IX | Буфер для списка | +| Выход (CF=0) | — | Буфер заполнен | + +Формат списка в буфере: +``` +IX+0 — размер заполненного буфера +IX+1 — количество FDD +IX+2 — количество HDD +IX+3 — количество CD-ROM +IX+4 — #00 = конец списка, иначе количество устройств нового типа +``` + +--- + +## 2.9 Дополнительные функции (из IvanMak.txt) + +### 80h — LP_OPEN_S + +Открытие стандартных окон. Вход: A = номер окна (см. таблицу). Выход: CF=1 = ошибка. + +**Типы стандартных окон:** + +| A | Описание | +|---|----------| +| 0 | 32×24 ZX Spectrum | +| 1 | 64×24 текстовое | +| 2 | 40×32 текстовое | +| 3 | 80×32 текстовое | +| 4 | 32×24 ZX Spectrum, HL = положение на экране | +| 5 | 64×24 текстовое, HL = положение | +| 6 | 40×32 текстовое, HL = положение | +| 7 | 80×32 текстовое, HL = положение | +| 8 | Графическое окно 0, HL = положение | +| 9 | Графическое окно 1, HL = положение | + +### 0F0h — SPRINTER_1 + +Переключение конфигурации ППЛМ в Sprinter-1. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0F0h` | +| Выход (CF=1) | — | Фатальная ошибка, требуется RESET | + +Если текущая прошивка уже Sprinter-1 — перезагрузка ПЛМ не производится. + +### 0F1h — SPRINTER_2 + +Переключение в Sprinter-2. Аналогично SPRINTER_1, C=`0F1h`. + +### 0F3h — SPRINTER_ALL + +Переключение на пользовательскую конфигурацию. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0F3h` | +| Вход | A | Страница с файлом прошивки ПЛМ (≤127) | +| Выход (CF=1) | — | Фатальная ошибка, требуется RESET | + +Файл прошивки должен быть предварительно загружен в указанную страницу. + +> **Важно:** во время переключения конфигурации (0F0h–0F3h) происходят сбой синхронизации монитора и перестройка всей схемы. Перед вызовом — DI, после — полная реинициализация периферии. + +### Функции с пометкой «в разработке» (из IvanMak.txt) + +Эти функции перечислены в исходнике, но явно помечены как неготовые: + +- **0F4h — DCP_FN0**: управление дешифратором портов. Позволит открывать/закрывать дополнительные порты. «В данный момент не доделана». +- **0F8h — SET_PORTS**: глобальная установка порта по внутреннему номеру. Позволяет читать/писать любые порты независимо от того, открыты ли они. +- **0F9h — READ_PORTS**: глобальное чтение порта. +- **0FAh — WRITE_PORTS**: глобальная запись порта. + +Из комментариев: «В данный момент функции недоступны и находятся в разработке». Позволят читать/писать закрытые системные порты (1FFD, 7FFD) и эмулировать отсутствующие устройства. + +### HDD-функции (40h–47h) + +Подтверждены в исходниках BIOS v3.04 — добавлены к версии 3.06. Перечень: + +| Номер | Название | +|-------|----------| +| 40h | HDD_INIT | +| 41h | HDD_RECAL | +| 42h | HDD_TEST_IDE | +| 43h | HDD_PREPARE | +| 44h | HDD_READ_BPB | +| 45h | HDD_READ | +| 46h | HDD_WRITE | +| 47h | HDD_PART | + +### RAM-Disk функции (0C8h–0CFh) + +Подтверждены в исходниках BIOS v3.04 — добавлены к версии 3.06: + +| Номер | Название | +|-------|----------| +| 0C8h | BLK_RD_WR — чтение/запись блока секторами (256 байт) | +| 0C9h | BLK_TO_RAMD — загрузить блок в RAM-disk | +| 0CAh | RAMD_CLEAR — очистить RAM-disk | +| 0CBh | RAMD_TO_DRV — скопировать RAM-disk на диск | +| 0CCh | FDD_TO_DRV — скопировать FDD на устройство | +| 0CDh | HDD_TO_DRV — скопировать HDD на устройство | +| 0CEh | GET_RAMD_ST — получить статус RAM-disk | +| 0CFh | GET_DRV_ST — получить статус устройства | + +--- + +## 2.10 Функции, добавленные к версии 3.06 + +Следующие функции отсутствуют в документации BIOS_v3.txt и IvanMak, но реализованы в исходных кодах BIOS v3.04. + +### Управление памятью и RAM-disk (96h–9Ch) + +#### 96h — EMM.GetBanksPorts + +Получение адреса порта окна и текущей страницы (аналог 0C6h с другим форматом вызова). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `96h` | +| Вход | A | Номер окна (0–3: 0→SLOT0, 1→SLOT1, 2→SLOT2, 3→SLOT3) | +| Выход (CF=0) | C | Адрес порта окна | +| Выход (CF=0) | B | Текущая физическая страница | +| Выход (CF=1) | — | Неверный номер окна | + +#### 97h — EMM.CheckColdInit + +Проверка необходимости холодной инициализации (используется при загрузке). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `97h` | + +Если системная страница содержит корректный ID_SPRINTER — тёплый старт (возврат к caller). Если ID не совпадает — переход на полную инициализацию, которая не возвращается. + +#### 98h — RAMD_CALC_PAGE + +Расчёт физического адреса сектора RAM-disk. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `98h` | +| Вход | DE | Track/sector RAM-disk | +| Вход | A | Номер RAM-disk (0–15) | +| Выход (CF=0) | HL | Физический адрес | +| Выход (CF=0) | A | Физическая страница | +| Выход (CF=1) | — | Номер RAM-disk ≥ 16 | + +#### 99h — SET_DISK_REDIR + +Установка перенаправления диска TR-DOS на указанное устройство. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `99h` | +| Вход | E | Тип устройства: 0=FDD, 1–3=FDD, 4=RAMD0, 5=RAMD1, 6=RAMD2, 7=RAMD3, 8=HDD | +| Выход | A | Предыдущее значение перенаправления | + +#### 9Ah — GET_DISK_REDIR + +Получение текущего перенаправления диска. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `9Ah` | +| Выход (CF=0) | A | Текущий тип устройства (0=FDD, 4=RAMD0, 8=HDD) | + +#### 9Bh — GET_RAMD_NUM + +Получение номера RAM-disk по его ID. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `9Bh` | +| Вход | A | ID RAM-disk | +| Выход (CF=0) | A | Номер RAM-disk (0–15) | +| Выход (CF=1) | — | RAM-disk с таким ID не найден | + +#### 9Ch — SWAP_RAM_DRIVES + +Переключение между наборами Sprinter и ZX RAM-дисков. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `9Ch` | +| Вход | B | `0` = переключить на Sprinter, `0FFh` = переключить на ZX, `0FEh` = только получить инфо | +| Выход | A | Текущий набор RAM-дисков | + +### Терминальный вывод (0E0h) + +#### 0E0h — LP_PR_LINE_DIR + +Терминальный вывод строки с обработкой управляющих символов (BELL, Backspace, LF, CR). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0E0h` | +| Вход | HL | Адрес строки | +| Вход | DE | Координаты: D=позиция Y, E=позиция X | +| Вход | B | Цвет атрибута | +| Вход | A | Управляющий байт | + +### PC-link (0E8h–0E9h) + +#### 0E8h — FN_SEND_BYTE + +Отправка байта через PC-link (LPT1 параллельный порт, протокол Kempston PC-Link). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0E8h` | +| Вход | A | Байт для отправки | +| Выход (CF=0) | — | Успех | +| Выход (CF=1) | — | Таймаут — PC не отвечает | + +#### 0E9h — FN_RECEIVE_B + +Приём байта через PC-link. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0E9h` | +| Выход (CF=0) | A | Полученный байт | +| Выход (CF=1) | — | Таймаут | + +### Клавиатура (0EAh) + +#### 0EAh — FN_KBD_OUT + +Посылка байта на внешнюю AT-клавиатуру (через SIO канал A, микросхема Z80182). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0EAh` | +| Вход | A | Байт данных | +| Вход | B | Параметр скорости | +| Выход (CF=0) | — | Успех | + +### Микросхема ACEX (0EDh) + +#### 0EDh — FN_CRIPT + +Чтение информации о кристалле ACEX CPLD. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0EDh` | +| Вход | B | `0` = board ID, `1` = chip version | +| Выход (B=0, CF=0) | HL | Номер платы | +| Выход (B=0, CF=0) | A | Тип платы | +| Выход (B=0, CF=0) | BC | BoardID.start | +| Выход (B=0, CF=0) | DE | BoardID.end | +| Выход (B=1, CF=0) | A | Версия кристалла (chip_version) | + +### Конфигурация AY8910 (0EEh) + +#### 0EEh — RST_CONF.AY8910 + +Переключение конфигурации ППЛМ в режим ZX Spectrum + AY8910. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0EEh` | +| Выход (CF=0) | — | Успех | + +### Режим Spectrum (0FBh–0FCh) + +#### 0FBh — GOTO_SPEC + +Переход в режим ZX Spectrum. Устанавливает FDD 720K, переключает ПЗУ, переводит систему в режим совместимости со Spectrum. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0FBh` | + +#### 0FCh — ZX_MEMORY_MANAGER + +Переключение на ZX-менеджер страниц памяти (стандартный ZX Spectrum порт 7FFD). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0FCh` | + +### REINIT (0FDh) + +#### 0FDh — REINIT + +Перезапуск системы с выбором режима. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0FDh` | +| Вход | B | `1` = RESTART (полный перезапуск), `2` = Soft reset, `3` = Hard reset, `4` = освобождение всей памяти кроме ZX-страниц | + +--- + +## 2.11 Быстрый вызов RST 8 + +Для вызова BIOS из EXE-файла через RST 8 в `#0008` устанавливается код: + +```asm +PUSH AF +LD A,0 +OUT (7Ch),A ; включить ПЗУ BIOS в W0 +POP AF +RET +``` + +Этот код уже присутствует в блоке ОС Estex при загрузке EXE. + +**Ограничение:** адресное пространство `#0000..#3FFF` во время работы BIOS занято ПЗУ — данные для функций не могут там располагаться. Оптимизация кода для RST 8 недопустима (в ПЗУ стоит обратное переключение через порт `#3Ch`). + +--- + +## 2.12 Кросс-ссылки + +- DSS/ESTEX: `03-dss.md` +- Видеорежимы и палитра: `05-graphics.md` +- Порты: `11-ports.md` +- Баги BIOS: `12-bugs.md` +- Управление окнами DSS (SETWIN/SETWIN1/SETWIN2): `03-dss.md §3.6` +- Функции DSS (GET_DRV_ST, SET_DISK_REDIR, EMM): `03-dss.md` +- Дескрипторы окон: проектный `libc-reference.md` diff --git a/docs/new/03-dss.md b/docs/new/03-dss.md new file mode 100644 index 0000000..6a54840 --- /dev/null +++ b/docs/new/03-dss.md @@ -0,0 +1,1082 @@ +# 3. DSS/ESTEX — дисковая подсистема + +## 3.1 Общие сведения + +DSS (Disk SubSystem) / ESTEX — расширение BIOS для работы с дисковой подсистемой, файловой системой, памятью, клавиатурой и экраном. + +| Свойство | Значение | +|----------|----------| +| Способ вызова | `RST 10h` | +| Номер функции | Регистр **C** | +| Успех | CF=0, выходные данные в регистрах | +| Ошибка | CF=1, код ошибки в **A** | +| Стек | Обязательно в `#8000..#BFFF` (W2) | + +Документирован в версиях: + +| Версия | Источник | Особенности | +|--------|----------|-------------| +| v1.54 | ProgrammerManual.txt | Одна из первых; нумерация файловых функций 10h–1Fh | +| v1.55 | ProgrammerManual.txt (приложение) | Переименование FREEMEM→INFOMEM, RETMEM→FREEMEM | +| v1.6 | DiskSyscalls.txt | Нумерация файловых функций 0Ah–1Fh; добавлены 0Ch/0Dh | +| v1.60 | DSS 1.60 rst 10.txt | Уточнения; добавлены 0Ch/0Dh, SET_CACHE_FLAG, RESET_CACHE_FLAG | +| v1.71 | Исходный код DSS 1.71 | BETA; добавлены SCANDRV, LIB_SUB; удалены 0Ch/0Dh/34h; версия D=01h, E=71 | + +> **Смена нумерации между v1.54 и v1.6:** в v1.54 файловые функции занимали диапазон 10h–1Fh (OPEN=10h, CLOSE=11h, READ=12h…). Начиная с v1.6 они смещены — CREATE=0Ah, OPEN=11h. В данном справочнике описана версия **DSS 1.71** (исходный код), с указанием отличий от v1.54–v1.60 где применимо. + +--- + +## 3.2 Системные и дисковые функции (00h–0Fh) + +### 00h — VERSION + +Версия DSS. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `00h` | +| Выход | D | Номер версии (DSS 1.71: 1) | +| Выход | E | Модификация (DSS 1.71: 71) | +| Выход | BC | Номер сборки (build) | +| Выход | HL | `0` (зарезервировано) | + +### 01h — CHDISK + +Смена текущего диска. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `01h` | +| Вход | A | Номер диска (0=A, 1=B…) | +| Выход (CF=0) | A | Максимальный номер диска (4 для дисков A–E) | +| Выход (CF=1) | A | Код ошибки | + +### 02h — CURDISK + +Номер текущего диска. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `02h` | +| Выход (CF=0) | A | Текущий номер диска (0=A, 1=B…) | +| Выход (CF=1) | A | Код ошибки | + +> **v1.54:** ошибка не возвращается (нет механизма CF=1). Добавлено в v1.6. + +### 03h — DSKINFO + +Информация о диске. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `03h` | +| Вход | A | Номер диска (0=A, 1=B… `0FFh` = текущий) | +| Выход (CF=0) | A | Размер кластера в секторах | +| Выход (CF=0) | HL | Общее количество кластеров | +| Выход (CF=0) | DE | Количество свободных кластеров | +| Выход (CF=0) | BC | Размер сектора в байтах | +| Выход (CF=1) | A | Код ошибки | + +> Слоты `04h–07h` — зарезервированы (заглушки NOPS в DSS 1.71). + +### 08h — SCANDRV (DSS 1.71) + +Пересканирование драйверов устройств. Обновляет список доступных логических дисков. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `08h` | +| Выход (CF=0) | A | Количество найденных логических дисков | +| Выход (CF=1) | A | Ошибка (KERNEL_PANIC если boot-диск потерян) | + +Функция отсутствует в документации v1.54–v1.60. Впервые реализована в DSS 1.71. + +### 09h — BOOTDSK + +Номер системного диска (с которого загружена ОС). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `09h` | +| Вход | B | `0` | +| Выход (CF=0) | A | Номер системного диска (0=A, 1=B…) | +| Выход (CF=1) | A | Код ошибки | + +> **v1.54:** B не указан; ошибка не возвращается. + +### 0Ah — CREATE + +Создание файла (с перезаписью существующего). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0Ah` | +| Вход | HL | Указатель на файловую спецификацию | +| Вход | A | Атрибут файла | +| Выход (CF=0) | A | Файловый манипулятор (handle) | +| Выход (CF=1) | A | Код ошибки | + +**v1.54:** CREATE находится на `C=18h`. Номер `0Ah` в v1.54 занят другой функцией. + +### 0Bh — CREATE_NEW + +Создание нового файла (только если не существует). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0Bh` | +| Вход | HL | Указатель на файловую спецификацию | +| Вход | A | Атрибут файла | +| Выход (CF=0) | A | Файловый манипулятор | +| Выход (CF=1) | A | Код ошибки | + +Если файл уже существует — возвращает ошибку. + +### 0Ch — SET_CACHE_FLAG (v1.60, удалена в DSS 1.71) + +Установка флага кэш-памяти. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0Ch` | +| Выход (CF=0) | A | Номер страницы для сохранения переключателя | +| Выход (CF=1) | — | Ошибка | + +Функция присутствовала в DSS v1.60. В DSS 1.71 заменена на заглушку (возвращает `INVALID_FUNCTION`). + +### 0Dh — RESET_CACHE_FLAG (v1.60, удалена в DSS 1.71) + +Сброс флага кэш-памяти. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0Dh` | +| Выход (CF=1) | — | Ошибка | + +В DSS 1.71 заменена на заглушку (возвращает `INVALID_FUNCTION`). + +### 0Eh — DELETE + +Удаление файла. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `0Eh` | +| Вход | HL | Указатель на файловую спецификацию | +| Выход (CF=1) | A | Код ошибки | + +> **v1.54** дополнительно требует A = атрибут файла. В v1.6/v1.60 атрибут не используется — HL только. + +--- + +## 3.3 Файловые функции (10h–1Fh) + +### 10h — RENAME + +Переименование файла. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `10h` | +| Вход | HL | Указатель на старое имя | +| Вход | DE | Указатель на новое имя | +| Выход (CF=1) | A | Код ошибки | + +### 11h — OPEN + +Открытие существующего файла. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `11h` | +| Вход | HL | Указатель на файловую спецификацию | +| Вход | A | Режим доступа: `0` = чтение/запись, `1` = чтение, `2` = запись | +| Выход (CF=0) | A | Файловый манипулятор | +| Выход (CF=1) | A | Код ошибки | + +### 12h — CLOSE + +Закрытие файла. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `12h` | +| Вход | A | Файловый манипулятор | +| Выход (CF=1) | A | Код ошибки | + +### 13h — READ + +Чтение из файла. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `13h` | +| Вход | A | Файловый манипулятор | +| Вход | HL | Адрес буфера в памяти | +| Вход | DE | Количество читаемых байт | +| Выход (CF=0) | DE | Реально прочитано байт | +| Выход (CF=0) | A | `0` = прочитаны все байты, `0FFh` = прочитано меньше | +| Выход (CF=1) | A | Код ошибки | + +### 14h — WRITE + +Запись в файл. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `14h` | +| Вход | A | Файловый манипулятор | +| Вход | HL | Адрес данных в памяти | +| Вход | DE | Количество записываемых байт | +| Выход (CF=0) | DE | Реально записано байт | +| Выход (CF=1) | A | Код ошибки | + +### 15h — MOVE_FP + +Перемещение файлового указателя. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `15h` | +| Вход | A | Файловый манипулятор | +| Вход | HL:IX | Смещение | +| Вход | B | Способ: `0` = от начала, `1` = от текущей, `2` = от конца | +| Выход (CF=0) | HL:IX | Новая позиция указателя | +| Выход (CF=1) | A | Код ошибки | + +### 16h — ATTRIB + +Получение/изменение атрибута файла. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `16h` | +| Вход | HL | Указатель на файловую спецификацию | +| Вход | B | `0` = получить атрибут, `1` = установить | +| Вход | A | Атрибут (для установки) | +| Выход (CF=0) | A | Атрибут файла | +| Выход (CF=1) | A | Код ошибки | + +### 17h — GET_D_T + +Дата и время файла. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `17h` | +| Вход | A | Файловый манипулятор | +| Выход (CF=0) | D | День | +| Выход (CF=0) | E | Месяц | +| Выход (CF=0) | IX | Год | +| Выход (CF=0) | H | Час | +| Выход (CF=0) | L | Минуты | +| Выход (CF=0) | B | Секунды | +| Выход (CF=1) | A | Код ошибки | + +### 18h — PUT_D_T + +Установка даты и времени файла. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `18h` | +| Вход | A | Файловый манипулятор | +| Вход | D | День | +| Вход | E | Месяц | +| Вход | IX | Год | +| Вход | H | Час | +| Вход | L | Минуты | +| Вход | B | Секунды | +| Выход (CF=1) | A | Код ошибки | + +### 19h — F_FIRST + +Поиск первого файла по маске. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `19h` | +| Вход | HL | Указатель на файловую спецификацию (с маской `*`/`?`) | +| Вход | DE | Рабочий буфер: 44 байта (B=0) или 256 байт (B=1) | +| Вход | A | Атрибуты для поиска | +| Вход | B | `0` = имя в формате 11 байт "FilenameExt", `1` = "filename.ext",0 | +| Выход (CF=1) | A | Код ошибки | + +После успешного поиска имя первого совпавшего файла — в буфере DE. + +### 1Ah — F_NEXT + +Поиск следующего файла (после F_FIRST). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `1Ah` | +| Вход | DE | Рабочий буфер (тот же, что в F_FIRST) | +| Выход (CF=1) | A | Код ошибки (0Fh = No more files) | + +### 1Bh — MKDIR + +Создание каталога. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `1Bh` | +| Вход | HL | Указатель на путь | +| Выход (CF=1) | A | Код ошибки | + +### 1Ch — RMDIR + +Удаление каталога (каталог должен быть пуст). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `1Ch` | +| Вход | HL | Указатель на путь | +| Выход (CF=1) | A | Код ошибки | + +### 1Dh — CHDIR + +Смена текущего каталога. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `1Dh` | +| Вход | HL | Указатель на путь | +| Выход (CF=1) | A | Код ошибки | + +### 1Eh — CURDIR + +Получение текущего каталога. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `1Eh` | +| Вход | HL | Буфер (256 байт) | +| Выход (CF=1) | A | Код ошибки | + +--- + +## 3.4 Дата и время (20h–22h) + +### 21h — SYSTIME + +Текущие дата и время системы. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `21h` | +| Выход | D | День | +| Выход | E | Месяц | +| Выход | IX | Год | +| Выход | H | Час | +| Выход | L | Минуты | +| Выход | B | Секунды | +| Выход | C | День недели (0=воскресенье) | + +### 22h — SETTIME + +Установка даты и времени. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `22h` | +| Вход | D | День | +| Вход | E | Месяц | +| Вход | IX | Год | +| Вход | H | Час | +| Вход | L | Минуты | +| Вход | B | Секунды | +| Выход (CF=1) | A | Код ошибки | + +--- + +## 3.5 Функции клавиатуры (30h–37h) + +### 30h — WAITKEY + +Ожидание и получение символа с клавиатуры (блокирующий). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `30h` | +| Выход | A | Код символа (позиционный/скан-код) | +| Выход | D | Позиционный код | +| Выход | E | ASCII-код | +| Выход | C | Режим клавиатуры (битовое поле, см. ниже) | +| Выход | B | Состояние shift'ов (битовое поле) | + +**Регистр C (режим клавиатуры):** + +| Бит | Описание | +|-----|----------| +| 7 | RUS/LAT (0=LAT, 1=RUS) | +| 3 | Num Lock | +| 2 | Scroll Lock | +| 1 | Insert | +| 0 | Caps Lock | + +**Регистр B (состояние shift'ов):** + +| Бит | Описание | +|-----|----------| +| 7 | Left Shift | +| 6 | Right Shift | +| 5 | Ctrl | +| 4 | Alt | +| 3 | Left Ctrl | +| 2 | Left Alt | +| 1 | Right Ctrl | +| 0 | Right Alt | + +### 31h — SCANKEY + +Опрос клавиатуры без ожидания (неблокирующий). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `31h` | +| Выход (ZF=1) | — | Нет нажатой клавиши | +| Выход (ZF=0) | A | Код символа | +| Выход (ZF=0) | D | Позиционный код | +| Выход (ZF=0) | E | ASCII-код | +| Выход (ZF=0) | C | Режим клавиатуры | +| Выход (ZF=0) | B | Состояние shift'ов | + +Поля C и B — те же, что в WAITKEY. + +### 32h — ECHOKEY + +Ожидание символа с эхо-печатью на экран. Вход/выход — полностью идентичен WAITKEY. + +### 33h — CTRLKEY + +Получить состояние клавиатуры (без считывания символа). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `33h` | +| Выход | A | `0` = нет символов в буфере | +| Выход | C | Режим клавиатуры | +| Выход | B | Состояние shift'ов | + +### 35h — K_CLEAR + +Очистить буфер клавиатуры и выполнить подфункцию. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `35h` | +| Вход | B | Номер подфункции: `30h`, `31h`, `32h`, `33h` или `34h` | +| Выход | — | Зависит от подфункции (см. соответствующую функцию) | + +Перед вызовом указанной подфункции очищает буфер клавиатуры. Подфункция `34h` (EDIT) присутствовала в v1.54–v1.60, но в DSS 1.71 заменена на заглушку (NOPS). + +### 36h — K_SETUP + +Управление настройками клавиатуры. + +**B = 0** — установить раскладку: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `36h` | +| Вход | B | `0` | +| Вход | A | Номер раскладки: `0`=normal, `1`=shift, `2`=caps, `3`=caps+shift, `4`..`7`=альтернативные | +| Выход | — | — | + +**B = 1** — получить состояние звуковых переменных. + +**B = 2** — установить звуковые переменные: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `36h` | +| Вход | B | `2` | +| Вход | A | bit0 = сигнал переполнения буфера, bit1 = сигнал смены раскладки | + +### 37h — TESTKEY + +Опрос буфера клавиатуры (неблокирующий, без снятия символа). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `37h` | +| Выход (ZF=1) | — | Нет символов в буфере | +| Выход (ZF=0) | A | Код символа | +| Выход (ZF=0) | D | Позиционный код | +| Выход (ZF=0) | E | ASCII-код | +| Выход (ZF=0) | C | Режим клавиатуры | +| Выход (ZF=0) | B | Состояние shift'ов | + +От SCANKEY отличается тем, что опрашивает буфер, а не физическую клавиатуру. + +--- + +## 3.6 Управление памятью (38h–3Fh) + +### 38h — SETWIN + +Подключение страницы памяти в произвольное окно. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `38h` | +| Вход | A | Идентификатор блока памяти | +| Вход | B | Номер страницы в блоке (0, 1, 2…) | +| Вход | H | Биты 6–7: номер окна (0–3) | +| Выход (CF=0) | A | Номер замещённой физической страницы | +| Выход (CF=1) | A | Код ошибки | + +### 39h — SETWIN1 + +Подключение страницы в окно 0 (`#0000..#3FFF`). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `39h` | +| Вход | A | Идентификатор блока | +| Вход | B | Номер страницы в блоке | +| Выход (CF=0) | A | Номер замещённой страницы | +| Выход (CF=1) | A | Код ошибки | + +### 3Ah — SETWIN2 + +Подключение страницы в окно 1 (`#4000..#7FFF`). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `3Ah` | +| Вход | A | Идентификатор блока | +| Вход | B | Номер страницы в блоке | +| Выход (CF=0) | A | Номер замещённой страницы | +| Выход (CF=1) | A | Код ошибки | + +> **Опечатка в DiskSyscalls v1.6 и DSS 1.60:** обе ошибочно указывают `C=39h` для SETWIN2, что дублирует номер SETWIN1. Правильный номер — `3Ah` (согласно v1.54). + +### 3Bh — SETWIN3 + +Подключение страницы в окно 2 (`#8000..#BFFF`). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `3Bh` | +| Вход | A | Идентификатор блока | +| Вход | B | Номер страницы в блоке | +| Выход (CF=0) | A | Номер замещённой страницы | +| Выход (CF=1) | A | Код ошибки | + +### 3Ch — INFOMEM + +Информация о распределении памяти. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `3Ch` | +| Выход | HL | Общее количество страниц (16 КБ каждая) | +| Выход | BC | Количество свободных страниц | + +> v1.54 называет эту функцию **FREEMEM**. Переименована в INFOMEM начиная с v1.55, однако исходный код DSS 1.71 всё ещё использует метку `FREEMEM`. + +### 3Dh — GETMEM + +Выделение блока памяти. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `3Dh` | +| Вход | B | Размер блока в страницах (16 КБ каждая) | +| Выход (CF=0) | A | Идентификатор блока | +| Выход (CF=1) | A | Код ошибки (`1` = не хватает памяти) | + +### 3Eh — FREEMEM + +Освобождение блока памяти. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `3Eh` | +| Вход | A | Идентификатор блока | +| Выход (CF=1) | A | Код ошибки | + +> v1.54 называет эту функцию **RETMEM**. Переименована в FREEMEM начиная с v1.55, однако исходный код DSS 1.71 всё ещё использует метку `RETMEM`. + +### 3Fh — SETMEM + +Изменение размера блока памяти. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `3Fh` | +| Вход | A | Идентификатор блока | +| Вход | B | Новый размер в страницах | +| Выход (CF=1) | A | Код ошибки | + +--- + +## 3.7 Исполнение программ (40h–42h) + +### 40h — EXEC + +Загрузка и выполнение EXE-файла. После завершения возвращает управление. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `40h` | +| Вход | HL | Указатель на файловую спецификацию | +| Вход | B | `0` = короткое имя, `1` = полный путь | +| Выход (CF=0) | A | Код завершения программы | +| Выход (CF=1) | A | Код ошибки | + +### 41h — EXIT (метка в DSS 1.71: LEAVE) + +Завершение текущей программы. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `41h` | +| Вход | B | Код завершения | +| Выход (CF=0) | A | Код завершения | +| Выход (CF=1) | A | Код ошибки | + +### 42h — WAIT (метка в DSS 1.71: GET_ERR) + +Получить код завершения последней выполненной программы (после EXEC). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `42h` | +| Выход | A | Код завершения | + +--- + +## 3.8 Строки и командная строка (43h–45h) + +### 43h — GSWITCH + +Выделение параметра из командной строки. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `43h` | +| Вход | HL | Указатель на командную строку | +| Вход | DE | Буфер для выделяемого параметра | +| Выход | HL | Указатель на следующий параметр | +| Выход | CF=0 | Есть ещё параметры | +| Выход | CF=1 | Конец строки (в буфере — последний параметр или ноль) | + +### 44h — DOSNAME + +Преобразование имени файла между форматами. + +**B = 0** — из 11-символьного в DOS ("FILENAMEEXT" → "filename.ext"): + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `44h` | +| Вход | B | `0` | +| Вход | HL | 11 символов имени | +| Вход | DE | Буфер для DOS-имени | + +**B = 1** — из DOS в 11-символьный: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `44h` | +| Вход | B | `1` | +| Вход | HL | Имя в формате DOS | +| Вход | DE | Буфер (11 байт) | + +| Выход (CF=1) | A | Код ошибки | + +### 45h — EXCMDLN (метка в DSS 1.71: EX_PATH) + +Разбор командной строки. Многорежимная функция. + +**Подфункция 0** — разобрать строку (определить, какие компоненты указаны): + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`0` | +| Вход | HL | Указатель на командную строку | +| Выход (CF=0) | A | Битовое поле: bit7=`*`/`?`, bit3=диск, bit2=путь, bit1=расширение, bit0=имя | +| Выход (CF=1) | A | Код ошибки | + +**Подфункция 1** — выделить имя диска: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`1` | +| Вход | HL | Командная строка | +| Вход | DE | Буфер (≤13 байт) | +| Выход (CF=0) | A | Номер диска (0=A, 1=B…) | +| Выход (CF=0) | DE | Буфер: `"A:",0` | + +**Подфункция 2** — выделить директорию: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`2` | +| Вход | HL | Командная строка | +| Вход | DE | Буфер (≤256 байт) | +| Выход (CF=0) | A | Результат разбора (как в подф. 0) | +| Выход (CF=0) | DE | Буфер: `"DIR1\\DIR2\\",0` | + +**Подфункция 3** — выделить имя файла: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`3` | +| Вход | HL | Командная строка | +| Вход | DE | Буфер (≤13 байт) | +| Выход (CF=0) | A | Результат разбора | +| Выход (CF=0) | DE | Буфер: `"FILE.EXT",0` | + +**Подфункция 4** — выделить расширение: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`4` | +| Вход | HL | Командная строка | +| Вход | DE | Буфер (≤4 байта) | +| Выход (CF=0) | A | Результат разбора | +| Выход (CF=0) | DE | Буфер: `"TXT",0` или `"C ",0` | + +**Подфункция 5** — выделить все компоненты (диск, путь, имя, расширение): + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`5` | +| Вход | HL | Командная строка | +| Вход | DE | Буфер указателей (8 байт, 4 слова) | +| Выход (CF=0) | A | Результат разбора | +| Выход (CF=1) | A | Код ошибки | + +Буфер DE — 4 слова (адреса пользовательских буферов): + +| Смещение | Размер | Буфер | Максимум | +|----------|--------|-------|----------| +| DE+0 | 2 | Имя диска | 13 байт | +| DE+2 | 2 | Директория | 256 байт | +| DE+4 | 2 | Имя файла | 13 байт | +| DE+6 | 2 | Расширение | 4 байта | + +> **Ошибка во всех источниках:** документация (v1.54, v1.6, v1.60) указывает смещения DE+3 и DE+4 для имени файла и расширения. Это накладывает их на одно слово (DE+3 находится внутри адреса директории). Правильные смещения — DE+4 и DE+6. + +**Подфункция 7** — выделить параметр командной строки: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`7` | +| Вход | HL | Командная строка (или указатель с предыдущего вызова) | +| Вход | DE | Буфер для параметра | +| Выход | HL | На следующий параметр | +| Выход | CF=0 | Есть ещё | +| Выход | CF=1 | Конец строки | + +**Подфункция 8** — 11-символьный → DOS (аналог DOSNAME B=0): + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`8` | +| Вход | HL | 11 символов | +| Вход | DE | Буфер для DOS-имени | +| Выход (CF=1) | A | Код ошибки | + +**Подфункция 9** — DOS → 11-символьный (аналог DOSNAME B=1): + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `45h`, B=`9` | +| Вход | HL | Имя в формате DOS | +| Вход | DE | Буфер (11 байт) | +| Выход (CF=1) | A | Код ошибки | + +--- + +## 3.9 Переменные окружения (46h–47h) + +### 46h — ENVIRON + +Работа с системным окружением. + +**B = 0** — получить системное окружение целиком: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `46h`, B=`0` | +| Вход | HL | Буфер | +| Выход (CF=0) | DE | Конец буфера | + +**B = 1** — получить переменную окружения: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `46h`, B=`1` | +| Вход | HL | Имя переменной | +| Вход | DE | Буфер для значения | +| Выход (CF=0) | A | `0` = найдена, `0FFh` = не найдена | + +**B = 2** — установить/удалить переменную: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `46h`, B=`2` | +| Вход | HL | `"ИМЯ=значение"` (для удаления — `"ИМЯ="`) | +| Выход (CF=0) | A | `0` = успех | +| Выход (CF=1) | A | Код ошибки | + +### 47h — APPINFO + +Информация о текущем приложении. + +**B = 0** — параметры командной строки: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `47h`, B=`0` | +| Вход | HL | Буфер данных | +| Выход (CF=1) | A | Код ошибки | + +**B = 1** — полный путь к каталогу программы: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `47h`, B=`1` | +| Вход | HL | Буфер | +| Выход (CF=1) | A | Код ошибки | + +**B = 2** — полный путь и имя файла программы: + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `47h`, B=`2` | +| Вход | HL | Буфер | +| Выход (CF=1) | A | Код ошибки | + +--- + +## 3.10 Экран (50h–5Ch) + +Функции экрана работают с текущим видеорежимом, установленным через SETVMOD. Для работы с окнами через BIOS см. `02-bios.md`. + +### 50h — SETVMOD + +Установка видеорежима. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `50h` | +| Вход | A | Режим: `02h`=текст 40×32×16, `03h`=текст 80×32×16, `81h`=графика 320×256×256, `82h`=графика 640×256×16 | +| Вход | B | Страница экрана (0/1) | +| Выход (CF=1) | A | Код ошибки | + +### 51h — GETVMOD + +Текущий видеорежим. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `51h` | +| Выход (CF=0) | A | Текущий режим | +| Выход (CF=0) | B | Страница экрана | +| Выход (CF=1) | A | Код ошибки | + +### 52h — LOCATE + +Установка позиции курсора. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `52h` | +| Вход | D | Строка | +| Вход | E | Столбец | +| Выход | — | — | + +### 53h — CURSOR + +Текущая позиция курсора. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `53h` | +| Выход | D | Строка | +| Выход | E | Столбец | + +### 54h — SELPAGE + +Выбор активной страницы экрана. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `54h` | +| Вход | B | Страница экрана (0/1) | +| Выход (CF=1) | A | Код ошибки | + +### 55h — SCROLL + +Прокрутка окна. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `55h` | +| Вход | D | Строка верхнего левого угла | +| Вход | E | Столбец верхнего левого угла | +| Вход | H | Высота | +| Вход | L | Ширина | +| Вход | B | `1` = вверх, `2` = вниз | +| Вход | A | `0` = очищать освободившуюся строку | + +### 56h — CLEAR + +Очистка области экрана. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `56h` | +| Вход | D | Строка верхнего левого угла | +| Вход | E | Столбец | +| Вход | H | Высота | +| Вход | L | Ширина | +| Вход | B | Атрибут заполнения | +| Вход | A | Символ заполнения | + +### 57h — RDCHAR + +Чтение символа и атрибута с экрана. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `57h` | +| Вход | D | Строка | +| Вход | E | Столбец | +| Выход | A | Символ | +| Выход | B | Атрибут | + +### 58h — WRCHAR + +Запись символа с атрибутом на экран. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `58h` | +| Вход | D | Строка | +| Вход | E | Столбец | +| Вход | A | Символ | +| Вход | B | Атрибут | + +### 59h — WINCOPY + +Сохранение области экрана в буфер. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `59h` | +| Вход | D | Строка | +| Вход | E | Столбец | +| Вход | H | Высота | +| Вход | L | Ширина | +| Вход | B | Страница буфера | +| Вход | IX | Адрес буфера | + +### 5Ah — WINREST + +Восстановление области экрана из буфера. Параметры — идентичны WINCOPY. + +### 5Bh — PUTCHAR + +Печать символа в текущей позиции курсора. + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `5Bh` | +| Вход | A | Символ | + +Курсор сдвигается на одну позицию вправо. + +### 5Ch — PCHARS + +Печать строки с текущей позиции курсора. Строка завершается нулём. + +```asm +LD HL,MSG +LD C,5Ch +RST 10h +; ... +MSG: db "Hello, world!",0Dh,0Ah,0 +``` + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `5Ch` | +| Вход | HL | Адрес строки (завершается `0`) | + +### 5Dh — LIB_SUB (DSS 1.71) + +Библиотечная подфункция. В текущей реализации DSS 1.71 содержит одну подфункцию: + +**B = 1** — восстановление системных шрифтов (SETUP_CURSORS): + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `5Dh` | +| Вход | B | `1` | +| Выход | — | — | + +Функция в стадии развития — список подфункций пополняемый. + +--- + +## 3.11 Принтер (5Fh) + +### 5Fh — PRINT + +Вывод символа на принтер (без ожидания готовности). + +| | Регистр | Описание | +|--|---------|----------| +| Вход | C | `5Fh` | +| Вход | A | Символ | +| Выход | B | Символ (возвращается без изменений) | +| Выход | CF=1 | Принтер не готов | + +--- + +## 3.12 Системная консоль и командный интерпретатор + +DSS предоставляет командную строку через EXCMDLN (45h). Командный интерпретатор поддерживает внутренние команды: + +`DIR`, `ERA`/`DEL`, `REN`, `COPY`, `TYPE`, `MD`/`MKDIR`, `RD`/`RMDIR`, `CD`/`CHDIR`, `DATE`, `TIME`, `VER`, `FORMAT`, `LABEL`, `VOL`, `SYS`, и др. + +Загрузка `.EXE`-файлов: см. EXEC (40h). Переменные окружения: см. ENVIRON (46h). + +--- + +## 3.13 Коды ошибок ESTEX + +| Код | Значение | +|-----|----------| +| 00h | Нет ошибки | +| 01h–05h | Диск: не готов, не найден, защищён от записи, ошибка данных | +| 06h | Ресурс не найден | +| 08h | Файл не найден | +| 09h | Путь не найден | +| 0Ah | Нет доступа | +| 0Bh | Invalid access code | +| 0Ch | Invalid drive | +| 0Dh | Unable to remove current directory | +| 0Eh | Not same device | +| 0Fh | No more files | +| 10h–1Fh | Ошибки ввода-вывода | + +Коды `1Ch`, `1Dh`, `20h` — зарезервированы (в документации ProgrammerManual). + +--- + +## 3.14 Кросс-ссылки + +- Загрузка EXE и модель памяти: `04-memory.md` +- Файловые операции и `FILE*`: проектный `file-buffering-design.md` +- API libc: проектный `libc-reference.md` +- Порты дисков и IDE: `11-ports.md` +- Баги DSS: `12-bugs.md` +- BIOS (окна, графика): `02-bios.md` diff --git a/docs/new/04-memory.md b/docs/new/04-memory.md new file mode 100644 index 0000000..4b44cfa --- /dev/null +++ b/docs/new/04-memory.md @@ -0,0 +1,387 @@ +# 4. Управление памятью Sprinter Sp2000 + +## 4.1 Аппаратная модель памяти + +Z80 видит 64 КБ, разбитые на **четыре окна (window) по 16 КБ**. Каждое окно независимо маппится на физическую страницу (page) ОЗУ или ПЗУ через порт-регистр страницы: + +| Окно | Адреса | Порт страницы | Назначение | +|------|--------|---------------|------------| +| W0 | `#0000..#3FFF` | `#82` (PAGE0, ROM.SLOT0) | RST-обработчики, BIOS/DSS ядро | +| W1 | `#4000..#7FFF` | `#A2` (SLOT1, PAGE1) | Приложение | +| W2 | `#8000..#BFFF` | `#C2` (SLOT2, PAGE2) | **Стек — обязательно здесь** | +| W3 | `#C000..#FFFF` | `#E2` (SLOT3, PAGE3) | Разделяемые страницы DSS, графика, резидентный код | + +- Запись в порт `#82`/`#A2`/`#C2`/`#E2` меняет физическую страницу окна; чтение возвращает текущую. +- Для совместимости со старыми моделями (ZX-Spectrum 128, Scorpion, Pentagon) работают также порты `#7FFD`, `#1FFD`, `#DFFD`, `#EFF7`: + +| Порт | Описание | +|------|----------| +| `#7FFD` | Биты 0-2: страница W3; бит 3: выбор ПЗУ (0=DOS, 1=Basic/48) | +| `#1FFD` | Биты 0-2: страница W0; бит 3: дополнительная память; бит 4: турбо | +| `#DFFD` | Страница W1 (Pentagon, когда бит 5 порта `#7FFD`=0) | +| `#EFF7` | Страница W2 (Pentagon) | + +> **Страница `#FF`:** если окно не выделено программе (образ меньше 16/32 КБ), DSS маппит его на специальную страницу `#FF`. Чтение даёт `#FF`, запись игнорируется. Это ключевая причина «молчаливой» порчи данных — см. §4.9. + +> **Физические страницы:** порты `#82`/`#A2`/`#C2`/`#E2` адресуют физические 16-КБ страницы в адресном пространстве Sprinter. Диапазон страниц зависит от установленной памяти (обычно 0..127 для 2 МБ, 0..255 для 4 МБ). Старшие страницы заняты видео-ОЗУ и ПЗУ. + +--- + +## 4.2 Окно W0 (#0000..#3FFF) — системное + +W0 — критическое окно: в нём живут обработчики `RST 08h` (BIOS), `RST 10h` (DSS/ESTEX) и `RST 18h` (BIOS-EXP). Пока в W0 стоит системная страница, вызовы доступны. + +**ROM/RAM switching:** + +| Действие | Код | +|----------|-----| +| Включить ПЗУ в W0 | `OUT (#7C),A` (SYS_PORT.ROM) | +| Выключить ПЗУ, вернуть ОЗУ | `OUT (#3C),A` (SYS_PORT.RAM) | + +При включённом ПЗУ в W0 отображается системная страница BIOS. Для вызова RST-функций W0 должен быть в ПЗУ — BIOS сам переключает его при входе через `RST 08h`. + +**Требования к прерываниям:** + +Sprinter работает в режиме **IM1** — вектор прерывания фиксирован на `#0038` (всегда в ПЗУ/ОЗУ W0). Обработчик EXP.asm по адресу `#0038`: + +1. Переключает W3 на SYS_PAGE. +2. Проверяет флаг `INT_ID` = `#AA`. +3. Если есть пользовательский обработчик — вызывает его (адрес из SYS_PAGE). +4. Восстанавливает W3, `EI`, `RETI`. + +Регистр `I` инициализирован в `#3F` (наследие ZX-Spectrum), но при IM1 не используется для диспетчеризации. Если программа переключается в **IM2** — `I` и расположение таблицы векторов определяются программой произвольно, стандартного расположения нет. + +**DSS и W0:** при вызове `RST 10h` DSS переключает W0 на свою рабочую страницу (COREPAGE = 4), выполняет функцию и восстанавливает W0. Если в W0 до вызова была ОЗУ, DSS восстановит её; если ПЗУ — вернёт ПЗУ. + +**Практические рекомендации:** +- Для вызова системных функций держите W0 в ПЗУ (или не заботьтесь — RST 08h и RST 10h его переключат сами). +- При IM1 (режим по умолчанию) прерывание идёт на `#0038` — это ПЗУ, переключение W0 не требуется. +- При IM2 программа сама управляет таблицей векторов — не забывайте про `DI`/`EI` при переключении W0. + +**Размещение своей RAM-страницы в W0:** + +Если программе нужно дополнительное окно (например, для атласов спрайтов или кода, +не требующего системных вызовов), можно временно маппить свою страницу в W0. Для +безопасной работы страница должна содержать корректную таблицу RST-векторов в +первые `#40` байт: + +| Адрес | Инструкция | Назначение | +|-------|-----------|------------| +| `#0000` | `JP boot` или `RST 00h` (обычно не используется) | | +| `#0008` | `JP rst08_stub` | RST 08h — BIOS | +| `#0010` | `JP rst10_stub` | RST 10h — ESTEX/DSS | +| `#0018` | `JP rst18_stub` | RST 18h — BIOS-EXP | +| `#0020..#0030` | `JP _w0_unused_stub` | RST 20h-30h — не используются | +| `#0038` | `JP isr_stub` | IM1 (RST 38h) | +| `#0066` | `RETN` или `JP nmi_stub` | NMI | + +Каждый стаб (в этой же странице, выше `#40`) выполняет одну задачу: сохранить +текущий номер страницы W0, переключить W0 обратно на ПЗУ (`OUT (#7C),A` — +SYS_PORT.ROM), выполнить настоящий системный вызов, после чего восстановить +страницу программы и вернуться к исходному caller'у. Типовой паттерн для ESTEX +(`RST 10h`): + +```asm +rst10_stub: + IN A, (#82) ; сохранить свою страницу W0 + PUSH AF + OUT (#7C), A ; включить ПЗУ в W0 (SYS_PORT.ROM) + ; теперь в W0 — системная страница, RST 10h будет обработан корректно + RST #10 ; вызвать настоящий ESTEX (DSS сам переключит W0 + ; на COREPAGE и восстановит ПЗУ на выходе) + POP BC + LD A, B + OUT (#82), A ; вернуть свою страницу в W0 + RET ; возврат к исходному caller'у +``` + +Такой же паттерн для RST 08h и RST 18h. Для IM1 (`RST 38h`) — аналогично, но +прерывание может прийти в любой момент, поэтому критические секции (своя +страница в W0) обязаны быть обёрнуты в `DI`/`EI` (или проверять вложенность +через счётчик), иначе повторное прерывание при уже замапленной странице +попадёт в стаб, а не в EXP.asm. + +**Важно:** пока в W0 стоит ваша страница, системные вызовы (`RST 08h`/`10h`/`18h`) +проходят через стабы и работают корректно, но с накладными расходами +(~10+ тактов на каждый вызов). Код на странице не должен вызывать DSS/BIOS +напрямую — только через RST. При этом сам стаб не должен использовать +RST-инструкции, так как они адресуют W0, который в момент вызова стаба +всё ещё содержит вашу страницу, а не ПЗУ — сначала переключите ПЗУ через +`OUT (#7C),A`. + +Перед первым маппингом своей страницы в W0 сохраните текущее значение порта +`#82` (`IN A,(#82)` — оно даёт номер системной/ПЗУ-страницы). Эта страница +понадобится стабам для восстановления после вызова во время прерываний, +когда ПЗУ уже может быть в W0, а стаб не успел его переключить. +Подтверждённая реализация: `tests/w0page` (см. `sprite-api-design.md §9в`). + +--- + +## 4.3 Окно W1 (#4000..#7FFF) — приложение + +W1 — основное окно для кода и данных приложения. По умолчанию содержит страницу 5 (RAM, инициализируется BIOS). + +**Использование BIOS/DSS:** + +BIOS и DSS могут **временно** переключать W1 на свою рабочую страницу. Это происходит: + +- При файловых операциях DSS: чтении FAT, загрузке секторов — DSS маппит одну из страниц разделяемого пула в W1 (DIRPAGE, FATPAGE, TXTPAGE, DRVPAGE). +- При графических операциях BIOS: `PIC_FN2`/`PIC_FN3` (блоковые копии) могут переключать W1 на страницу видео-ОЗУ. +- **Важно:** перед возвратом из вызова BIOS/DSS **восстанавливает** предыдущую страницу W1. Типовой паттерн в исходниках DSS: + + ```asm + IN A,(SLOT1) ; сохранить текущую страницу W1 + PUSH AF + ... работа с разделяемым буфером ... + POP BC + LD C,SLOT1 + OUT (C),B ; восстановить W1 + ``` + + Для вызывающей программы переключение W1 полностью прозрачно — после возврата из любой функции DSS/BIOS содержимое W1 идентично тому, что было до вызова. + +**Практические рекомендации:** +- Размещайте код и данные в W1, рассчитывая, что он остаётся стабильным между вызовами. +- При длительных файловых операциях (последовательный `READ` больших объёмов) W1 может быть затронут только в моменты внутреннего обращения DSS к FAT/буферам, но не во время собственно чтения данных в буфер программы. +- Если нужно гарантированно сохранить данные через вызов DSS — используйте W2, который BIOS/DSS **никогда не трогают**. + +--- + +## 4.4 Окно W2 (#8000..#BFFF) — стек (критично) + +W2 — **единственное окно, которое BIOS и DSS гарантированно не трогают**. Поэтому стек ОБЯЗАН находиться здесь: + +- **SP ≤ #BFFF** при вызовах DSS (`RST 10h`). +- **SP ≥ #8000** при вызовах BIOS (`RST 08h`). +- Пересечение → стек в `#8000..#BFFF`. +- По умолчанию SP инициализируется в `#BFFE` (значение из EXE-заголовка, §4.7). + +**Почему W2 — единственное стабильное окно:** + +| Окно | Может быть переключено BIOS/DSS | Почему | +|------|--------------------------------|--------| +| W0 | Да | DSS переключает на COREPAGE при `RST 10h`; BIOS переключает на ПЗУ | +| W1 | Да, временно | DSS маппит разделяемые буферы для FAT/директорий; BIOS при графических операциях — и **восстанавливает** перед возвратом | +| W2 | **Нет** | **Никогда. Стек должен быть доступен всегда.** | +| W3 | Да, временно | DSS маппит разделяемые буферы; BIOS при графике переключает на видео-ОЗУ; оба **восстанавливают** исходную страницу перед возвратом | + +**EXEC и W2:** при загрузке новой программы (`EXEC`, функция 40h) DSS сохраняет страницу W2 в EXSTACK (вместе с W1 и W3). После завершения программы (`EXIT`, функция 41h) W2 восстанавливается. + +**Практические рекомендации:** +- Размещайте стек строго в W2. Стандартное значение `SP = #BFFE` — начало стека с запасом ~14 КБ до `#8000`. Можно уменьшить, если программа неглубокая. +- W1 и W3 при вызовах DSS и BIOS **сохраняются и восстанавливаются** (см. §4.3, §4.5), но W2 — единственное окно, которое **никогда не трогается** ни DSS, ни BIOS. +- Если программе нужно больше памяти, чем даёт W2 (например, для хранения больших массивов), выделяйте блоки через DSS `GETMEM` (функция 3Dh) и мапьте их в W1 или W3. + +--- + +## 4.5 Окно W3 (#C000..#FFFF) — разделяемые страницы + +W3 — окно, в которое DSS временно маппит страницы своего разделяемого пула для дисковых буферов и служебных данных (адрес `#C000`): + +| Страница | Назначение | Адрес в W3 | +|----------|------------|-------------| +| DIRPAGE (0) | Буфер директории | `#C000` | +| FATPAGE (1) | Кеш FAT | `#C000` | +| TXTPAGE / ENVPAGE (2) | Буфер строки/окружения | `#C000..` (PATH_PNT_ARRAY `#FC80`, ENVTEMP `#FE00`) | +| DRVPAGE (3) | Страница драйвера | `#C000` | +| COREPAGE (4) | Ядро DSS (маппится в W0 при `RST 10h`) | — | + +**DSS СОХРАНЯЕТ и ВОССТАНАВЛИВАЕТ W3** после каждой операции. Типовой паттерн в исходниках: + +```asm +IN A,(SLOT3) ; сохранить текущую страницу W3 +PUSH AF +... работа с разделяемым буфером ... +POP BC +LD C,SLOT3 +OUT (C),B ; восстановить W3 +``` + +Это означает, что для вызывающей программы переключение W3 полностью прозрачно — после возврата из любой функции DSS содержимое W3 идентично тому, что было до вызова. + +**Какие функции трогают W3:** + +Функции, обращающиеся к файловой системе, временно маппят разделяемые страницы в W3: поиск файла (`F_FIRST`/`F_NEXT`), чтение FAT (`OPEN`, `READ`, `WRITE`), работа с каталогами (`CHDIR`, `MKDIR`), буферы драйвера диска. Функции без дисковой активности (`VERSION`, `CURDISK`, `WAITKEY`, `LOCATE`, `SYSTIME`, `ENVIRON` и т.п.) W3 не трогают вообще. + +BIOS при графических операциях также временно переключает W3 на страницы видео-ОЗУ (например, `PIC_SET_PAL`, `PIC_FN2`) — и тоже восстанавливает. + +**Практические рекомендации:** +- W3 можно использовать для данных программы — после возврата из любой функции DSS содержимое W3 не меняется. +- Единственное исключение — `EXEC` (функция 40h): она загружает новую программу, и W3 получает страницы загруженного образа. Это ожидаемое поведение. +- Если программа не вызывает дисковых и графических функций — W3 полностью стабилен. +- **Стек нельзя размещать в W3** — не потому что W3 «теряется», а потому что переключение W3 происходит ВО ВРЕМЯ вызова. Если `SP` указывает на W3, то в момент, когда DSS временно маппит свой буфер, все push/pop внутри DSS будут обращаться к буферной странице, а не к данным программы. Кроме того, при прерывании IM1 обработчик EXP.asm сам переключает W3 на SYS_PAGE — что также сломает стек, если он в W3. + +--- + +## 4.6 Физическая память и страницы + +Физическая память Sprinter — не сплошной массив RAM. Разные области адресного +пространства зарезервированы под видео-ОЗУ, ПЗУ и кеш. Номер страницы — это +значение, которое записывается в порт окна (`#82`/`#A2`/`#C2`/`#E2`); +8-битный порт даёт **256 значений** (`#00..#FF`). + +**Фиксированная карта страниц:** + +| Диапазон | Страниц | Назначение | +|----------|---------|------------| +| `#00..#4F` (0..79) | 80 (1,25 МБ) | RAM общего назначения | +| `#50..#5F` (80..95) | **16 (256 КБ)** | **Видео-ОЗУ (VRAM) — фиксировано в железе** | +| `#60..#DF` (96..223) | 128 (2 МБ) | RAM общего назначения (верхний диапазон) | +| `#E0..#EF` (224..239) | **16 (256 КБ)** | **ПЗУ: BIOS + EXP + ZX ROMs + bitstream — фиксировано** | +| `#F0..#FF` (240..255) | 16 (256 КБ) | **Fast RAM (кеш) / системные страницы** | + +**Выделенные страницы:** + +| Страница | Назначение | +|----------|------------| +| `4` | **COREPAGE** — ядро DSS (маппится в W0 при `RST 10h`) | +| `5` | Стандартная страница приложения W1 (по умолчанию) | +| `#41` (65) | **Spec_Page** — сохранение состояния при soft-reset [EXP.asm:859,1019] | +| `#FE` (254) | **SYS_PAGE** — системные данные BIOS (INT_ID, INT_ADRESS, буферы) [MAIN.asm:58] | +| `#FF` (255) | **Dummy-страница**: чтение → `#FF`, запись игнорируется | + +**Ключевые моменты:** + +- **VRAM (`#50..#5F`) фиксирована аппаратно**, независимо от объёма RAM. Эти + 16 страниц не являются частью RAM SIMM — это отдельная микросхема 256 КБ. + Биты 2-3 номера страницы кодируют режим записи: `#50` normal, `#54` без + ОЗУ-тени, `#58` прозрачный (байт `#FF` не пишется), `#5C` оба режима. +- **ПЗУ (`#E0..#EF`)** — 256 КБ флеш-памяти с BIOS, EXP, ZX Spectrum 48/128 ROM, + TR-DOS, логотипом и битстримом для CPLD. +- **Fast RAM (`#F0..#FF`)** — до 512 КБ быстрого SRAM (0 wait-states), + доступна через порт `#FB`. `#FE` (SYS_PAGE) и `#FF` (dummy) — часть этого + диапазона. При включённом кеше порт `#FB` конфликтует с CBL-звуком. +- Для 2 МБ RAM: `#60..` заполнены до `#7F` (32 стр. = 512 КБ); остаток + `#80..#DF` — неиспользуемые страницы (отображаются как `#FF`). +- Для 4 МБ RAM: `#60..#DF` целиком заполнены RAM (128 стр. = 2 МБ). + +> **Нумерация:** порты `#82`/`#A2`/`#C2`/`#E2` дают прямой доступ по +> физическому номеру (#00..#FF). Порты `#7FFD`/`#1FFD` (совместимость с +> ZX-Spectrum 128) используют сквозную нумерацию: номер в `#7FFD` (0..7) +> маппится на физические страницы видеоОЗУ `#50..#5F` младшими 3 битами; +> для работы с произвольными страницами используйте порты `#82`/`#A2`/`#C2`/`#E2`. + +--- + +## 4.7 EXE-файл: формат и загрузка + +Загрузка исполняемых файлов выполняется функцией DSS `EXEC` (40h). Формат EXE-файла: + +**Заголовок (512 байт):** + +| Смещение | Размер | Поле | Описание | +|----------|--------|------|----------| +| +0 | 3 | `EXE_EXT` | Сигнатура `"EXE"` | +| +3 | 1 | `VERSION` | Минимальная версия DSS (1 = v1.xx, 0 = без пути/аргументов) | +| +4 | 2 | `OFFCOD1` | Младшее слово смещения образа в файле | +| +6 | 2 | `OFFCOD2` | Старшее слово смещения (OFFCOD2 << 16 + OFFCOD1 = offset) | +| +8 | 2 | `LOADER` | Размер первичного загрузчика (0 = весь образ сразу) | +| +10 | 6 | `RESERVED` | Зарезервировано | +| +16 | 2 | `LD_ADDR` | Адрес загрузки (`#4100..#FFFF`, старший байт маскирован `#3F`) | +| +18 | 2 | `PC_REG` | Точка входа (entry point) | +| +20 | 2 | `SP_REG` | Начальный SP (по умолчанию `#BFFE`) | +| +22 | 1 | `UnUsedPoint` | Не используется | +| +23 | 489 | `RESERVED2` | Зарезервировано (обнуляется; используется как временный стек EXEC) | + +**Процесс загрузки (EXEC, функция 40h):** + +1. Открыть файл на чтение. +2. Считать 512-байтный заголовок в буфер ядра. +3. Проверить сигнатуру `"EXE"` и версию (≥ минимальной 1). +4. Если `LOADER=0`: seek на смещение `OFFCOD2:OFFCOD1`, считать весь образ по адресу `LD_ADDR`. +5. Если `LOADER>0`: считать только первичный загрузчик по адресу `LD_ADDR` (он дочитает остальные сегменты). +6. Выделить блок памяти через `GETMEM` (функция 3Dh), зарегистрировать в таблице RAM. +7. Сохранить текущие страницы окон (SLOT1-3) в EXSTACK. +8. Определить, сколько страниц нужно, и замаппить их через `SETWIN1`/`SETWIN2`/`SETWIN3`: + - Если `LD_ADDR ≥ #C000`: маппится только W3. + - Если `LD_ADDR ≥ #8000`: маппятся W2 и W3. + - Иначе: маппятся W1, W2 и W3. +9. Построить **PSP** (Program Segment Prefix) — блок данных сразу ниже `LD_ADDR`: + - `LD_ADDR-3`: файловый манипулятор (file handle). + - `LD_ADDR-2`: идентификатор блока памяти. + - `LD_ADDR-1`: номер задачи. + - `LD_ADDR+0`: размер CLP (командной строки). + - `LD_ADDR+1..+128`: CLP-буфер. + - После CLP: строка пути `"A:\DIR\FILE.EXE",0`. +10. Установить SP из заголовка (`SP_REG`), сохранить IX → адрес PSP. +11. Если `VERSION=0` — установить текущий каталог из пути PSP. +12. Затолкать в стек адрес возврата (RETFAR к DSS), **EI**, JP на точку входа. + +**Multi-bank EXE:** + +При наличии нескольких банков (`LOADER>0`) файл устроен так: + +``` +[512-байт заголовок] [HOME-сегмент] [Банк 1 (16 КБ)] [Банк 2 (16 КБ)] ... +``` + +- HOME-сегмент: образ, загружаемый DSS по `LD_ADDR`. +- Банки: 16-КБ блоки, каждый на своей физической странице. +- `LOADER` = размер HOME-сегмента (DSS загружает только его; первичный загрузчик сам дочитывает банки через `READ` из оставшегося открытым файла). + +--- + +## 4.8 Прерывания и память + +**Обработчик IM1 (`RST 38h`):** + +Вектор фиксирован на `#0038` (W0). Реализация в EXP.asm: + +1. Переключает W3 на SYS_PAGE (BIOS). +2. Проверяет флаг `INT_ID` = `#AA` (установлен при инициализации BIOS). +3. Если флаг совпадает — вызывает пользовательский обработчик, адрес которого хранится в SYS_PAGE (`INT_ADDRESS`, `INT_PAGE`). +4. После возврата восстанавливает W3 и выполняет `EI; RETI`. + +Это позволяет пользовательским программам устанавливать свои обработчики INT без полного перехвата вектора. + +**Обработчик IM1 (системный):** + +При возникновении прерывания Z80 исполняет `RST 38h` → вызов по адресу `#0038`. Реализация в EXP.asm (всегда доступна, т.к. `#0038` в W0): + +1. Переключает W3 на SYS_PAGE (BIOS). +2. Проверяет флаг `INT_ID` = `#AA` (установлен при инициализации BIOS). +3. Если флаг совпадает — вызывает пользовательский обработчик, адрес и страница которого хранятся в SYS_PAGE (`INT_ADDRESS`, `INT_PAGE`). Это позволяет программам устанавливать свои ISR без полного перехвата вектора. +4. После возврата восстанавливает W3 и выполняет `EI; RETI`. + +**Обработчик IM2 (опционально, для продвинутых программ):** + +Sprinter по умолчанию не использует IM2. Исходники содержат шаблон `IM2_INT.asm` для программ, желающих переключиться на IM2: + +1. Сохраняет AF, BC, DE, HL, IX, IY и теневые регистры. +2. Включает ПЗУ (`OUT (#7C),A`) — KEYSCAN требует ПЗУ в W0. +3. Вызывает KEYSCAN (опрос AT-клавиатуры). +4. Восстанавливает все регистры, `EI`, `RETI`. + +При переходе на IM2 программа сама выбирает значение `I` и размещает таблицу векторов в соответствующем диапазоне памяти. + +**Рекомендации:** +- Если программа не использует прерывания — держите W0 в ПЗУ. +- Если программа использует IM1 — можно переопределить обработчик через структуру в SYS_PAGE (флаг `INT_ID`, поля `INT_ADDRESS`/`INT_PAGE`). +- Если программа использует IM2 — переключение полностью на ответственности программы; ядро Sprinter не предоставляет стандартного расположения таблицы векторов. + +--- + +## 4.9 Типовые грабли + +- **Данные читаются как `#FF` / не сохраняются** — код или данные попали в незамапленное окно (страница `#FF`). Причина: образ программы меньше 16 КБ, DSS выделил только одну страницу, а код/данные распределены линкером в незамапленные окна. Лечение: убедитесь, что код и данные укладываются в одно окно, или явно выделяйте и мапьте остальные окна через `GETMEM`/`SETWIN1`-`SETWIN3`. + +- **Крэш при вызове RST при нестандартном W0** — если перед вызовом W0 содержал произвольную страницу ОЗУ, DSS при `RST 10h` переключит его, но может не восстановить корректно. Решение: перед вызовом RST включите ПЗУ (`OUT (#7C),A`), если не уверены в состоянии W0. + +- **Стек в W3 (не-рабочий вариант)** — если стек размещён в W3, при любом дисковом вызове W3 будет переключён на разделяемый буфер DSS, и стековые данные будут забиты. Результат: мгновенное зависание при возврате из функции. Единственное рабочее место для стека — W2. + +- **CBL не работает при включённом кеше** — порт `#FB` используется как кеш-память (Fast RAM) и как порт CBL-звука. Если кеш включён, запись в `#FB` уходит в кеш, а не в CBL. Детали: `11-ports.md`, `12-bugs.md`. + +- **Прерывание уходит не туда при IM2** — если программа переключилась в IM2 с неинициализированной таблицей векторов, любое прерывание приведёт к исполнению мусора. Решение: используйте IM1 (режим по умолчанию) или инициализируйте таблицу перед переключением. + +- **Не путать W3 с «теряется после вызова»** — многие источники утверждают, что DSS сбрасывает W3. На самом деле DSS **сохраняет и восстанавливает** W3 после каждой операции. Стек всё равно нельзя размещать в W3 (см. §4.5), но для данных W3 полностью стабилен между вызовами. Если ваша программа полагается на старый миф — проверьте код. + +--- + +## 4.10 Кросс-ссылки + +- Порты страниц и детали регистров: `11-ports.md` +- BIOS (графика, окна): `02-bios.md` +- DSS/ESTEX (EXEC, GETMEM, SETWIN): `03-dss.md` +- Прерывания: `07-irq.md` +- Баги (CBL vs кеш, порт #FB): `12-bugs.md` +- EXE-формат и PSР: `memory/exe-format.md` diff --git a/docs/new/05-graphics.md b/docs/new/05-graphics.md new file mode 100644 index 0000000..df87281 --- /dev/null +++ b/docs/new/05-graphics.md @@ -0,0 +1,279 @@ +# 5. Графика и видеосистема + +## 5.1 Общие сведения + +Видеосистема Sprinter Sp2000 реализована в ППЛМ. Видео-ОЗУ — 256 КБ +(512 КБ на некоторых платах [Architecture.txt:17]). + +| Параметр | Значение | +|---|---| +| VRAM | 256 КБ, независимая микросхема (не часть RAM SIMM) | +| Физические страницы | `#50..#5F` (16 страниц × 16 КБ), фиксировано в железе | +| Видеорежимы | ZX-40, ZX-80, GR-256-8, GR-16-16 | +| Палитра | 8 палитр × 256 цветов из 16 млн (RGB, BGR) | +| Видеовыход | CGA-монитор, RGB, TV (SCART) | + +**Теневая память (Shadow RAM):** Видео-ОЗУ Спринтера является теневой памятью +(§5.4). Программа управляет режимом записи через номер подключаемой страницы +(§5.3): банк `0x50` пишет одновременно в VRAM и в основное ОЗУ; банк `0x54` +пишет только в VRAM, не трогая ОЗУ. На экране **всегда** отображается +содержимое VRAM, независимо от режима записи [IvanMak.txt:317–322]. + +--- + +## 5.2 Режимы адресации видео-ОЗУ + +Видео-ОЗУ может адресоваться двумя способами — **спектрумовским** и +**графическим** [IvanMak.txt:296–300]. Спектрумовский режим используется для +Spectrum-совместимого вывода и загрузки знакогенераторов; графический — для +всех остальных видеорежимов (320×256×256, 640×256×16, текст 80×32). + +### 5.2.1 Спектрумовский режим адресации + +В этом режиме VRAM разбивается на **32 блока по 8 КБ**. Адрес блока задаётся +через порт `RGADR` (`PORT_Y`, `#89`): + +| Бит | Назначение | +|-----|-----------| +| 4..0 | Номер блока (0..31) | +| 5 | Не используется | +| 6 | Запрет вывода (1 = отключить спектрумовский вывод) | +| 7 | Разрешение 16-КБ страницы (1 = два блока в `#4000..#7FFF`) | + +Бит 0 RGADR вместе с битом 1 порта `#7FFD` определяет чётность подключаемого +блока VRAM: чётный RGADR → блок N в `#4000..#5FFF`, блок N+1 в `#C000..#DFFF`; +нечётный → наоборот [IvanMak.txt:333–339]. + +Для записи в определённую пару спектрумовских блоков: +1. Записать номер блока в `RGADR` (`OUT (#89),A`). +2. Убедиться, что в окне (`#4000` или `#C000`) стоит подходящая страница + основного ОЗУ (любая, кроме `#50..#5F`). +3. Чтение/запись по спектрумовским адресам (`#4000..#5FFF`, + `#C000..#DFFF`) попадает в VRAM через текущий блок. + +**Выключение спектрумовского вывода:** Если программа не использует +Spectrum-совместимую графику, `RGADR` рекомендуется установить в `#C0..#FF` +(бит 6 = 1). В этом случае вывод в VRAM через спектрумовский режим не +производится [IvanMak.txt:346–348]. + +### 5.2.2 Графический режим адресации + +В графическом режиме видео-ОЗУ организовано как матрица **256 строк +(rows) × 1024 байта** [IvanMak.txt:357–358]. Адресация: + +``` +VRAM_адрес = (RGADR << 10) | (Z80_A[9:0]) + где RGADR[7:0] = Y (номер строки, 0..255) + Z80_A[9:0] = X (смещение в строке, 0..1023) +``` + +Страницы `#50..#5F` при маппинге в любое окно Z80 включают графическую +адресацию. При этом младшие 4 бита номера страницы не влияют на адрес +памяти, а задают подрежим вывода (§5.3). + +**Важная особенность:** Z80-адрес внутри окна (биты A[13:10] для окна W3) +**игнорируется** — весь 16-КБ диапазон окна отображает **одну и ту же +строку**, выбранную `RGADR`. Доступ к другим строкам — только через смену +`RGADR`. Это означает, что утверждение из SprinterGraphics programming.txt +о доступе к строкам 18..31 через адреса `#C400..#FC00` **неверно**. + +**Структура 1-КБ строки (1024 байта):** + +| Смещение в строке | Назначение | +|-------------------|-----------| +| `#000..#13F` (0..319) | Экранная страница 0 (первые 320 байт) | +| `#140..#27F` (320..639) | Экранная страница 1 (следующие 320 байт) | +| `#280..#3FF` (640..1023) | Не используется / данные палитры | + +Две экранные страницы (0 и 1) переключаются битом 0 порта `RGMOD` [IvanMak.txt:409]. + +**Работа с адресацией из программы:** + +```asm +; Установить страницу VRAM (0x50) в W3 +IN A, (#E2) ; сохранить текущую W3 +LD (old_page), A +LD A, #50 +OUT (#E2), A ; W3 = VRAM страница 0x50 + +; Выбрать строку Y +LD A, Y ; Y = 0..255 +OUT (#89), A ; RGADR = Y + +; Чтение/запись пикселя (X,Y) для экранной страницы 0 +LD HL, #C000 + X ; X = 0..319 +LD (HL), colour ; запись байта пикселя + +; Восстановить страницу +LD A, (old_page) +OUT (#E2), A +``` + +--- + +## 5.3 Подрежимы вывода (страницы `#50..#5F`) + +Биты 2 и 3 номера страницы (из диапазона `#50..#5F`) задают подрежимы вывода +[IvanMak.txt:364–386]: + +| Бит | Страницы | Эффект | +|-----|----------|--------| +| 3 | `#58..#5F` | **Прозрачный цвет** — запись байта `#FF` игнорируется (для спрайтов) | +| 2 | `#54..#57`, `#5C..#5F` | **Без тени** — запись только в VRAM, не в основное ОЗУ (для курсора мыши) | + +Биты 0 и 1 должны быть 0 для совместимости с будущими прошивками +[IvanMak.txt:384–386]. + +--- + +## 5.4 Теневая память (Shadow RAM) и двойная запись + +Видео-ОЗУ Спринтера является теневой памятью по отношению к основному ОЗУ +[IvanMak.txt:317–322]. Видеоконтроллер **всегда** читает изображение из VRAM +для вывода на экран; основное ОЗУ в формировании изображения не участвует. +Однако при записи через графические банки `#50..#5F` поведение зависит от +выбранного подрежима: + +- **Банк `0x50` (normal):** запись идёт **одновременно** в VRAM и в + соответствующую область основного ОЗУ. Чтение из того же Z80-адреса + возвращает данные из основного ОЗУ, а не из VRAM — VRAM для процессора + на чтение не видна. +- **Банк `0x54` (noshadow):** запись — только в VRAM, основное ОЗУ не + изменяется. Чтение — из основного ОЗУ (там хранится «фон»). +- **Банк `0x58` (transparent):** как normal, но байт `#FF` не пишется. +- **Банк `0x5C` (sprite):** transparent + noshadow. +- **Обычные банки (не `#50..#5F`):** никакого доступа к VRAM нет, + чтение/запись идут напрямую в основное ОЗУ. + +**Зачем это нужно:** + +1. **Восстановление после переключения видеорежима:** данные в основном ОЗУ + остаются нетронутыми, так что при возврате в графический режим экран можно + восстановить без перерисовки [IvanMak.txt:325]. +2. **Heal спрайтов** (libbgi): фон, на который был выведен спрайт в банке + `GFX_BANK_SPRITE` (`0x5C`, без тени), остался в основном ОЗУ. После + перемещения спрайта фон копируется из основного ОЗУ обратно в VRAM + (операция heal), стирая спрайт. +3. **Курсор мыши** без сохранения/восстановления: временный вывод через + `GFX_BANK_NOSHADOW` (`0x5C`) — в основном ОЗУ данные под курсором не + портятся, достаточно при следующем обновлении просто перерисовать фон. + +**Режимы записи (см. §5.3):** + +| Режим | Пишет в VRAM | Пишет в осн. ОЗУ | Применение | +|-------|:---:|:---:|-----------| +| `0x50` (normal) | Да | Да | Обычный вывод | +| `0x54` (noshadow) | Да | **Нет** | временные эффекты | +| `0x58` (transparent) | Да (кроме `#FF`) | Да | Спрайты с прозрачностью без heal | +| `0x5C` (sprite) | Да (кроме `#FF`) | **Нет** | Курсор, спрайты (прозрачность + heal) | + +--- + +## 5.5 Видеорежимы + +Система поддерживает независимую установку режима для каждого квадратика +8×8 (или 16×8 для 640-режимов) на экране [IvanMak.txt:405–469]. + +### Режимы вывода + +| Режим | Разрешение | Цветов | Описание | +|-------|-----------|--------|----------| +| ZX-40 | 320×256 | 16 | Текстовый 40×32, Spectrum-совместимый | +| ZX-80 | 640×256 | 16 | Текстовый 80×32, до 36 знакогенераторов | +| GR-256-8 | 320×256 | 256 | Графический, 1 байт/пиксель | +| GR-16-16 | 640×256 | 16 | Графический, 4 бита/пиксель | + +### Формат пикселей + +**GR-256-8 (320×256×256):** один байт = один пиксель. Строка содержит +320 байт для экранной страницы 0 (смещения `#000..#13F`) и 320 байт для +страницы 1 (`#140..#27F`). Полный экран: 320 × 256 = 81 920 байт на страницу. + +**GR-16-16 (640×256×16):** один байт = два пикселя: младший полубайт — +левый/первый пиксель, старший — правый/второй. Строка содержит 320 байт на +экранную страницу, что даёт 640 пикселей (320 × 2). Структура строки та же: +320 байт на страницу 0, 320 на страницу 1. + +### Установка режима + +Режим задаётся 4 байтами `Mode0..Mode3` в области режимов VRAM +(`#0300..#039F`). Полное описание формата Modei — [IvanMak.txt:448–469]. + +Для переключения видеорежима из программ используется функция DSS `SETVMOD` +(50h) [DiskSyscalls.txt:345–349]: + +| A (режим) | Описание | +|-----------|----------| +| 02h | Текстовый 40×32×16 | +| 03h | Текстовый 80×32×16 | +| 81h | Графический 320×256×256 | +| 82h | Графический 640×256×16 | + +B — страница экрана (0/1). Вызов: `RST 10h` с C=50h. Флаг C = ошибка +(например, режим не поддерживается данным монитором). + +--- + +## 5.6 Палитра + +8 палитр по 256 цветов, каждая занимает 1 КБ в VRAM по адресам +`#03E0..#03FE` [IvanMak.txt:540–568]. + +| Адреса | Палитра | Назначение | +|--------|---------|-----------| +| `#03E0..#03E2` | Граф. 0 | Графические режимы | +| `#03E4..#03E6` | Граф. 1 | —//— | +| `#03E8..#03EA` | Граф. 2 | —//— | +| `#03EC..#03EE` | Граф. 3 | —//— | +| `#03F0..#03F2` | Текст. 4 | Цвет бумаги | +| `#03F4..#03F6` | Текст. 5 | Цвет символа | +| `#03F8..#03FA` | Текст. 6 | Цвет мерцания бумаги | +| `#03FC..#03FE` | Текст. 7 | Цвет мерцания символа | + +Каждый четвёртый байт в каждой палитре не используется — не может попасть +на ЦАП [IvanMak.txt:545–547]. Выбор палитры для каждого квадратика — через +биты 7..6 байта Mode1 [BIOS_v3.txt:348]. + +> **Примечание:** Architecture.txt упоминает всего 5 палитр (4 графические + +> 1 текстовая), но IvanMak описывает все 8: 4 графические (0–3) и 4 текстовые +> (4–7: бумага, символ, мерцание бумаги, мерцание символа) +> [IvanMak.txt:547–548, 561–568]. + +--- + +## 5.7 Структура VRAM в терминах BIOS + +При использовании BIOS распределение VRAM [IvanMak.txt:387–404]: + +| Адреса (линии) | Назначение | +|----------------|-----------| +| `#0000..#003F` | Спектрумовский экран (блоки 0..1) | +| `#0040..#017F` | Первый графический экран (блоки 2..11) | +| `#0180..#02BF` | Второй графический экран (блоки 12..21) | +| `#02C0..#02FF` | Знакогенераторы текстового режима | +| `#0300..#039F` | Область описания режимов экрана | +| `#03A0..#03DF` | Зарезервировано | +| `#03E0..#03FF` | Палитра | + +--- + +## 5.8 Заблуждения и неподтверждённое + +**Миф о строках 18–31:** В документе SprinterGraphics programming.txt +утверждается, что после выбора строки Y через RGADR, по адресам +`#C400..#FC00` доступны строки Y+1..Y+15 (с шагом 1 КБ). В эмуляторе MAME +это **не работает** — весь 16-КБ диапазон страницы `#50..#5F` отображает +только строку Y, независимо от бит A[13:10] адреса Z80. Требуется проверка +на реальном Sprinter Sp2000. + +--- + +## 5.9 Кросс-ссылки + +- Палитра и видеорежимы BIOS: `02-bios.md §2.7` +- SETVMOD (DSS): `03-dss.md §3.10` +- Акселератор: `06-accel.md` +- Быстрое ОЗУ и конфликт с акселератором: `04-memory.md §4.6` +- Порты RGADR/RGMOD: `11-ports.md` +- Баги акселератора: `12-bugs.md` +- Проектные документы: `sprite-api-design.md`, `accel-fill-budget.md` diff --git a/docs/new/06-accel.md b/docs/new/06-accel.md new file mode 100644 index 0000000..63b490e --- /dev/null +++ b/docs/new/06-accel.md @@ -0,0 +1,221 @@ +# 6. Акселератор + +## 6.1 Общие сведения + +Акселератор — внутреннее устройство, реализованное в ППЛМ. Присутствует почти +во всех конфигурациях Sprinter (Sprinter-2 и выше). Предназначен для ускорения +пересылки блоков данных между RAM и VRAM (до физического предела скорости ОЗУ). +Не поддерживает ПЗУ и Fast RAM [accelerator_doc.txt:5]. + +**Возможности:** + +- Быстрая заливка горизонтальной или вертикальной линии экрана (1..256 пикселей) + одним цветом; в режиме 640×256 — линия 1..512 пикселей. +- Быстрое копирование горизонтальной или вертикальной линии (1..256 пикселей). +- Логические операции AND, OR, XOR с блоками данных. + +**Внутренняя память:** 256 байт в ППЛМ. Данные загружаются в эту память, +затем копируются в выбранный участок RAM/VRAM. Операция копирования может +повторяться многократно — это позволяет заполнять экран текстурой без +перезагрузки данных. + +**Автоматический инкремент адреса:** + +- **Горизонтальные** операции (`LD L,L` — копирование, `LD C,C` — заливка): + акселератор автоматически инкрементирует регистр HL (адрес приёмника) на + каждом шаге. Для копирования источник (DE) также инкрементируется. +- **Вертикальные** операции (`LD A,A` — копирование, `LD E,E` — заливка): + акселератор автоматически меняет порт `RGADR` (`#89`) — координату Y. + После завершения операции `RGADR` содержит новое значение + (Y + размер_блока, если не было переполнения). +- **Комбинированный** режим (горизонтальный источник + вертикальный приёмник): + сначала загружается байт из последовательных данных, затем выполняется + вертикальная запись. `RGADR` инкрементируется; регистр-источник (DE) + тоже инкрементируется — можно последовательно читать спрайт и рисовать + его вертикальными строками (§6.3, пример «Спрайт»). + +## 6.2 Команды + +Акселератор управляется специальными инструкциями Z80, которые выполняются +как NOP обычным процессором, но распознаются ППЛМ [IvanMak.txt:810–848]. + +| Инструкция | Код | Действие | +|-----------|:---:|----------| +| `LD B,B` | `#40` | **Выключить** акселератор | +| `LD D,D` | `#52` | **Включить** + режим «задать размер блока» | +| `LD A,size` | `#3E size` | Установить размер блока (сразу после `LD D,D`) | +| `LD C,C` | `#4F` | **Горизонтальная заливка** одним байтом | +| `LD E,E` | `#5B` | **Вертикальная заливка** одним байтом | +| `LD L,L` | `#6D` | **Горизонтальное копирование** блока | +| `LD A,A` | `#7F` | **Вертикальное копирование** блока | +| `LD H,H` | `#64` | Зарезервировано | + +**Логические операции** (AND, OR, XOR) выполняются командами +`AND (HL)`, `OR (HL)`, `XOR (HL)` после загрузки блока в память акселератора. + +## 6.3 Примеры + +### Копирование экрана (страница 0 → страница 1) + +```asm +; страница VRAM уже открыта по адресу #C000 +LD HL, #C000 ; адрес начала линии первого экрана +LD DE, #C140 ; адрес начала линии второго экрана +LD BC, #140 ; длина строки по горизонтали (320) +DI ; запретить прерывания +LD D,D ; включить акселератор: режим размера блока +LD A, 0 ; размер блока = 256 байт (0 = 256) +LD A,A ; вертикальное копирование +LDIR ; копировать +LD B,B ; выключить акселератор +EI ; разрешить прерывания +``` + +Время исполнения: ~1.2 прерывания (~24–26 мс на полный экран) +[IvanMak.txt:822–823], [accelerator_doc.txt:37]. + +### Заливка блока одним цветом + +```asm +LD DE, #C000 + X ; X — смещение по горизонтали +LD A, Y +OUT (#89), A ; RGADR = Y +DI +LD D,D ; режим размера блока +LD A, width ; ширина блока +LD B,B ; стоп +LD A, colour ; цвет заливки +LD C,C ; горизонтальная заливка +LD (DE), A ; залить +LD B,B ; стоп +EI +``` + +### XOR блока данных + +```asm +LD HL, addr_1 +LD DE, xor_data +DI +LD D,D +LD A, 0 ; 256 байт +LD L,L ; горизонтальное копирование +LD A, (DE) ; загрузить блок в память акселератора +XOR (HL) ; XOR с данными в RAM +LD (HL), A ; сохранить результат +LD B,B ; стоп +EI +``` + +### Копирование вертикальной линии с разделением load/write + +Загрузка байта в буфер акселератора и запись из буфера в VRAM разнесены — +между ними можно выполнять произвольный код (например, сменить Y). + +Буфер акселератора и размер блока **сохраняются** между включениями и +выключениями (`LD B,B`), что позволяет гибко разделять чтение +и запись. + +```asm +LD HL, #C000 + X1 ; источник +LD DE, #C000 + X2 ; приёмник + +DI +LD D,D ; акселератор вкл, режим размера +LD A, size ; размер блока +LD B,B ; выключить (размер запомнен) + +LD A, Y1 +OUT (#89), A ; RGADR = Y1 + +LD A,A ; вертикальное копирование +LD A, (HL) ; загрузить байт из (HL) в буфер акселератора +LD B,B ; выключить (буфер запомнен) + +LD A, Y2 +OUT (#89), A ; RGADR = Y2 (смена Y между load и write) + +LD A,A ; вертикальное копирование +LD (DE), A ; записать буфер в (DE) — акселератор пишет + ; вертикальную линию size пикселей +LD B,B ; выключить +EI +``` + +### Спрайт вертикальными строками из последовательных данных + +Спрайт хранится как последовательность байт вертикальных линий. Для каждой +колонки спрайта: загружается байт из последовательных данных, затем +акселератор пишет его вертикально (автоинкремент `RGADR`). После завершения +колонки — сдвиг по X (`INC HL`) и повтор. + +```asm +LD DE, sprite_data ; DE → последовательные данные спрайта +LD HL, #C000 + X_COORD ; HL → начальная позиция на экране +LD B, sprite_width ; ширина спрайта в колонках + +LD D,D ; акселератор вкл, режим размера +LD A, sprite_height ; высота одной вертикальной линии +LD B,B ; акселератор выключили (размер акселератор запомнил) + +row: +LD A, Y_COORD +OUT (#89), A ; RGADR = стартовая Y +DI +LD L,L ; режим «загрузить из последовательных данных» +LD A, (DE) ; загрузить байт спрайта в буфер акселератора +LD A,A ; вертикальное копирование +LD (HL), A ; записать — акселератор копирует байт + ; вертикально, RGADR++ на каждом шаге +LD B,B ; выключить акселератор +EI +INC HL ; следующая колонка по X +DJNZ row +``` + +## 6.4 Скорость + +Время работы акселератора ограничено только физической скоростью ОЗУ +[IvanMak.txt:840–843]: + +``` +Время ≈ время команды без акселератора + число_байт / 7 000 000 (сек) +``` + +## 6.5 Комбинированный режим: общая схема + +Общий паттерн для работы с акселератором в комбинированном режиме +(горизонтальный источник + вертикальный приёмник): + +``` +LD D,D ; 1. Включить акселератор, режим размера +LD A, size ; 2. Задать размер блока (1..256) +LD L,L ; 3. Режим «горизонтальный источник» +<чтение байта> ; 4. Загрузить байт в буфер акселератора (LD A,(DE) и т.п.) +LD A,A ; 5. Режим «вертикальный приёмник» +<запись байта> ; 6. Записать — акселератор делает вертикальное копирование + ; с автоинкрементом RGADR и приёмника +LD B,B ; 7. Выключить акселератор +``` + +После шага 6 `RGADR` содержит Y + size, HL — X + 1 (если был `INC HL`). + +## 6.6 Прерывания + +**Старая прошивка:** DI обязателен на время работы акселератора — система +команд Z80 сильно меняется, и ISR не сможет корректно выполниться +[IvanMak.txt:844–846]. + +**Новая прошивка:** акселератор может работать с EI. По приходу прерывания +он отключается, а по `RETI` включается обратно [IvanMak.txt:846–848]. +Использовать этот режим следует с осторожностью — без проверки на реальном +железе неизвестно, какая версия прошивки установлена. + +--- + +## 6.7 Кросс-ссылки + +- Баги акселератора: `12-bugs.md` +- Использование акселератора в libbgi: `sprite-api-design.md` +- Ограничение скорости: `accel-fill-budget.md` +- Fast RAM и конфликт с портом CBL: `04-memory.md §4.6` diff --git a/docs/new/07-irq.md b/docs/new/07-irq.md new file mode 100644 index 0000000..9de04f8 --- /dev/null +++ b/docs/new/07-irq.md @@ -0,0 +1,92 @@ +# 7. Прерывания (IRQ) + +## 7.1 Общие сведения + +Sprinter Sp2000 поддерживает режимы прерываний IM1 и IM2. + +### Источники прерываний + +| Источник | Происхождение | Описание | +|----------|---------------|----------| +| Кадровые (INT) | Видеоконтроллер | Квадратик экрана в 8-й линии | +| CTC | Z84C15 | Таймерные прерывания | +| SIO | Z84C15 | AT-клавиатура | +| PIO | Z84C15 (бит 0 порта B, `#1F`) | ISA-слоты | +| CBL | COVOX-Blaster | Запрос данных | + +### Различение источников + +Кадровые и клавиатурные прерывания приходят с вектором `0FFh` [Parinov.txt:956]. Способ различения: + +- Клавиатура выставляет бит 0 в порте `19h` — признак приёма байта [Parinov.txt:1049] +- Если бит 0 порта `19h` не установлен — прерывание кадровое + +> **Примечание:** [Parinov.txt:956] описывает альтернативный метод — «отличать по биту приема байта в порте клавиатуры». Оба метода сводятся к проверке бита 0 в порте `19h`. + +### Выбор режима прерываний (IM1 vs IM2) + +| Режим | Контекст | Источник | +|-------|----------|----------| +| IM2 | Рекомендован для работы с BIOS через RST | IvanMak.txt:1469–1473 | +| IM1 | Используется DSS для своих обработчиков | — | +| IM1 | Fast-RAM секция предполагает обработчик по `#0038` | Parinov.txt:601 | +| IM2 | Рекомендован при выставленных прерываниях от CBL | Parinov.txt:762–763 | + +> **Примечание:** разные подсистемы рекомендуют разные режимы. IM2 предпочтителен при интенсивной работе с прерываниями (CBL, BIOS). IM1 используется DSS по умолчанию. + +## 7.2 Кадровые прерывания (INT) + +Генерируются в момент прохождения 8-й строки квадратика (настраивается через бит 0 порта `#FE`). Положение INT подстраивается под стандарт Pentagon (320 строк) или Scorpion (312 строк). + +> **Мышь — есть ли аппаратные прерывания?** [Parinov.txt:956] утверждает: «От мыши прерывания не приходят. Сделать можно, но сейчас их нет.» [ProgrammerManual.txt:1784–1786] описывает драйвер мыши, где «каждое нажатие и отпускание клавиш или перемещение мыши вызывает прерывание», и документирует функцию «80h MOUSE HARDWARE INTERRUPT» [ProgrammerManual.txt:1930–1937]. Parinov (разработчик драйвера) отрицает их наличие — возможно, ProgrammerManual описывает планируемую функциональность. + +## 7.3 CTC (Z84C15) + +Таймер CTC используется для: + +- Генерации периодических прерываний +- Задания частоты CBL (COVOX-Blaster) +- Синхронизации звука + +## 7.4 SIO (Z84C15) + +Внутренний SIO Z84C15 обслуживает: + +- AT-клавиатуру (порты `#18`/`#19`) +- RS-232 (для мыши и других последовательных устройств) + +## 7.5 IM1 — вектор #0038 + +Стандартный Z80-режим. Все INT ведут на адрес `#0038`. Используется DSS для своих обработчиков. + +## 7.6 IM2 — таблица векторов + +IM2 использует таблицу векторов (256 байт) в фиксированной странице (обычно W3). Вектор прерывания — `0FFh`. + +Для работы IM2 требуется: + +1. Таблица векторов в резиденте (W3) +2. Регистр I = старший байт адреса таблицы +3. Каждый вектор — адрес обработчика (2 байта) + +## 7.7 Акселератор и прерывания + +При работе акселератора система команд Z80 сильно меняется. + +| Режим | Описание | Источник | +|-------|----------|----------| +| Старый | DI обязателен | IvanMak.txt:844–846, Parinov.txt:954 | +| Новый | EI/RETI: по INT акселератор отключается, по RETI включается | IvanMak.txt:846–848 | + +> **Примечание:** IvanMak описывает два режима (старый — DI, новая прошивка — EI/RETI). Parinov знает только старый. Без тестирования на железе неизвестно, какая версия прошивки установлена. + +## 7.8 Цепочка обработчиков + +TODO (проектный `im2_isr_design.md`): цепочка irq_install/remove, FPS-делитель, обработчики клавиатуры. + +## 7.9 Кросс-ссылки + +- Порты прерываний: `11-ports.md` +- Проектный документ по IM2/ISR: `im2_isr_design.md` +- Клавиатура: `09-input.md §9.1` +- CBL (прерывания): `10-sound.md §9.4.6` diff --git a/docs/new/08-io.md b/docs/new/08-io.md new file mode 100644 index 0000000..95dd6b2 --- /dev/null +++ b/docs/new/08-io.md @@ -0,0 +1,197 @@ +# 8. Ввод-вывод + +## 8.1 Клавиатура и мышь + +Клавиатура и мышь вынесены в отдельный документ: `09-input.md`. + +Сводная информация по портам и прерываниям — `09-input.md §§9.1–9.6`. + +## 8.2 Звук + +Звуковая подсистема (AY-3-8910, COVOX, COVOX-Blaster, бипер) вынесена +в отдельный документ: `10-sound.md`. + +Сводная карта звуковых портов: `11-ports.md §11.6`. + +## 8.3 Дисковая подсистема + +### 8.3.1 FDD (WD1793 / КР1818ВГ93) + +Контроллер дисковода — стандартный Beta Disk Interface (WD1793). +Аппаратное перенаправление `#1F → #0F` (см. §8.4). + +**Регистры (по данным MAME sprinter.cpp):** + +| Z80-адрес | Регистр | +|-----------|---------| +| `#0F` | Status (чт) / Command (зп) | +| `#1F` | —//— (аппаратный ремап на `#0F`) | +| `#3F` | Track | +| `#5F` | Sector | +| `#7F` | Data | +| `#FF` | Drive Control (выбор дисковода) | + +**Противоречие: адресация регистров ВГ93.** +> - [IvanMak.txt:1270–1274]: 4 регистра + `#FF` — управление дисководом. +> - [Parinov.txt:963]: 3 регистра (data-регистр `#7F` пропущен). +> +> MAME реализует полный набор по IvanMak: Status/Command (`#0F`), Track (`#3F`), +> Sector (`#5F`), Data (`#7F`). Data-регистр важен — через него читаются/пишутся +> сектора. Parinov, вероятно, упустил его. + +**Turbo-режим FDD (DCP 0x16/0x17, биты):** +- Бит 0 = скорость (0=норм, 1=турбо) +- Бит 1 = отключение FDD [sprinter.cpp:914–920] + +### 8.3.2 HDD (IDE/ATA) + +Два ATA-интерфейса: первичный и вторичный. Доступ — через DCP-декодер +(внутренние коды 0x20–0x2b). + +**Регистры ATA CS0 (по sprinter.cpp):** + +| DCP код | Z80-адрес (старш.) | Регистр | +|---------|-------------------|---------| +| 0x20 | `#xx50` | Data (16-bit через защёлку байтов) | +| 0x21 | `#xx51` | Error (чт) / Features (зп) | +| 0x22 | `#xx52` | Sector Count | +| 0x23 | `#xx53` | Sector Number | +| 0x24 | `#xx54` | Cylinder Low | +| 0x25 | `#xx55` | Cylinder High | +| 0x26 | `#xx56` | Device/Head | +| 0x27 | `#xx57` | Status (чт) / Command (зп) | +| 0x28 | `#xx58` | Alt Status (чт) / Device Control (зп) (CS1) | +| 0x2a | HDD1 select (вторичный) | +| 0x2b | HDD2 select (первичный) | + +**16-битный data-порт:** MAME реализует защёлку байтов: чтение `#xx50` +возвращает младший байт (bit8=0), затем старший (bit8=1) [sprinter.cpp:958–972]. + +**Противоречие: HDD — разные адреса для чтения и записи.** +> - [IvanMak.txt:1366]: кратко: «#xx50..#xx55 – порты HDD» +> - [Parinov.txt:958–959]: таблица с разными адресами для R/W: +> `0050h` (чт) / `0150h` (зп) — data, `4053h` (чт) / `4153h` (зп) — status/command. +> +> MAME использует единую карту DCP-кодов (0x20–0x28) без разделения R/W. +> Parinov описывает реальное поведение на Sprinter-2, где адресная линия A8 +> управляет направлением — это внешняя особенность конкретной ППЛМ-прошивки. +> IvanMak упрощает до базовых DCP-кодов. + +Доступ к IDE открыт в режиме Sprinter-ZX, в режимах Pentagon/Scorpion — закрыт. + +### 8.3.3 CMOS (Dallas DS12887A) + +Микросхема DS12887A (RTC + 114 байт NV RAM). Совместима с MC146818A. +Доступ через DCP-коды 0x1c–0x1e. + +| Z80-адрес | DCP код | Функция | +|-----------|---------|---------| +| `#DFBD` | 0x1d | Запись адреса регистра CMOS | +| `#FFBD` | 0x1c | Чтение данных из выбранного регистра | +| `#BFBD` | 0x1e | Запись данных в выбранный регистр | + +При отсутствии микросхемы CMOS эмулируется BIOS [BIOS_v3.txt:308–310]. + +**Карта регистров RTC (совместимо с MC146818A):** + +| Рег. | Назначение | Формат | +|------|-----------|--------| +| 0x00 | Секунды | BCD | +| 0x01 | Секунды (будильник) | BCD | +| 0x02 | Минуты | BCD | +| 0x03 | Минуты (будильник) | BCD | +| 0x04 | Часы | BCD | +| 0x05 | Часы (будильник) | BCD | +| 0x06 | День недели (1=воскресенье) | BCD | +| 0x07 | Число | BCD | +| 0x08 | Месяц | BCD | +| 0x09 | Год | BCD | +| 0x0a | Регистр A (UIP, divider, rate) | биты | +| 0x0b | Регистр B (SET, PIE, AIE, UIE, SQWE, DM, 24/12, DSE) | биты | +| 0x0c | Регистр C (IRQF, PF, AF, UF) | биты (чт) | +| 0x0d | Регистр D (VRT) | биты (чт) | +| 0x0e–0x7f | 114 байт NV RAM | пользовательские | + +--- + +## 8.4 Джойстик + +**Два Kempston-совместимых джойстика** [sprinter.cpp:1106–1175]: + +- **JOY1** — через CIO_DTRB (DCP 0x15, совмещён с Beta state при чтении) +- **JOY2** — через PIO PB + +**Формат данных (Kempston):** + +| Бит | Кнопка | +|:---:|--------| +| 0 | Вправо | +| 1 | Влево | +| 2 | Вниз | +| 3 | Вверх | +| 4 | Fire | +| 5 | — | +| 6 | — | +| 7 | — | + +**Противоречие: джойстик #1F vs #0F.** +> - [IvanMak.txt:1344]: «#1F,#0F — RD_KEMPS — порт джойстика. +> В Sprinter-1 порт #1F аппаратно переадресуется на порт #0F.» +> - [IvanMak.txt:861–868]: команды `OUT (#1F),A` не срабатывают +> из-за перенаправления. Надо использовать `LD BC,#1F : OUT (C),A`. +> +> В Sprinter-1 включено аппаратное перенаправление `#1F → #0F`, +> из-за чего `IN A,(#1F)` не читает джойстик. MAME подтверждает: +> на Sp2000 (`m_cnf` bit 0) перенаправление отключается +> [sprinter.cpp:1106]. Ремап действует только на запись: при OUT +> порт `#1F` маппится на `#0F` через DCP [sprinter.cpp:1080]. + +JOY2 читается через PIO port A [sprinter.cpp:1136–1140]. + +--- + +## 8.5 Параллельный порт (принтер) + +Centronics-совместимый через ППЛМ. BIOS-функции печати: 082h–08Ch +(см. `02-bios.md`). + +--- + +## 8.6 Шина ISA + +Два 8-битных ISA-слота на частоте X_SP/5 (~7 МГц). Доступ — через +DCP-декодер и страницы памяти. + +**Управляющие порты ISA (DCP 0xD0–0xDF, 0xF8–0xFF):** + +| Бит | Назначение | +|:---:|-----------| +| 2 | 0 = ISA memory access, 1 = ISA I/O access | +| 1 | Выбор слота (0 = slot 0, 1 = slot 1) | + +Адресное расширение: `m_isa_addr_ext` (запись через DCP 0x1b) — биты +расширения адреса для ISA-циклов [sprinter.cpp:1032–1039]. + +**Memory-маппинг ISA:** При pg3 & 0xF9 == 0xD0 (бит 10 окна W3 = 1, +BANK_ISA_MASK) обращения к окну W3 (`#C000–#FFFF`) направляются на ISA-шину +вместо RAM [sprinter.cpp:178–181, 530–532]. Длина — 16 КБ. + +**I/O-доступ к ISA:** через тот же DCP-декодер. Устройства устанавливают +сигнал `m_io_input_wait` = true при совпадении адреса. + +> **Примечание:** В MAME есть TODO: «ISA memory slots» — ISA memory-циклы +> пока не эмулируются [sprinter.cpp:576]. На реальном Sprinter поддержка +> зависит от прошивки ППЛМ. + +Слот 0 обычно занят ZX-Bus-адаптером [sprinter.cpp:26]. + +--- + +## 8.7 Кросс-ссылки + +- BIOS-функции: `02-bios.md` +- Клавиатура, мышь: `09-input.md` +- Звук: `10-sound.md` +- Порты: `11-ports.md` +- Акселератор: `06-accel.md` +- Прерывания: `07-irq.md` diff --git a/docs/new/09-input.md b/docs/new/09-input.md new file mode 100644 index 0000000..d94ae63 --- /dev/null +++ b/docs/new/09-input.md @@ -0,0 +1,595 @@ +# 9. Клавиатура и мышь + +## 9.1 Общие сведения + +Клавиатура Sprinter — AT-совместимая (101 key, PS/2). В Sprinter-1 +дополнительно присутствует ZX-клавиатурная матрица через порт `#FE` +(скан-код через AT-контроллер преобразуется в ZX-матрицу). Sprinter-2+ +использует AT-клавиатуру через внутренний SIO Z84C15 (канал A). + +Мышь — Microsoft Serial Mouse (2 кнопки) через RS-232 на SIO-B (канал B +Z84C15). + +### Порты SIO + +| Порт | Назначение | +|------|-----------| +| `#18` | SIO-A data — клавиатура | +| `#19` | SIO-A control — статус/управление | +| `#1A` | SIO-B data — мышь | +| `#1B` | SIO-B control — мышь | + +Бит 0 порта `#19` — признак прерывания от клавиатуры (используется в IM2 +для различения источников с общим вектором `#FF`). + +### Прерывания + +Клавиатура и мышь работают в IM2, общий вектор `#FF` (совместно с +кадровым и CBL). Различение источника — по портам SIO и флаговым битам +(`07-irq.md §7.2`). + +--- + +## 9.2 Клавиатура: BIOS и ESTEX + +### FN_KBD_OUT (BIOS $EA) + +Отправляет байт непосредственно на AT-клавиатуру [BIOS_v3.txt:0EAh]. + +``` +Вход: C = $EA + A = байт команды/данных для AT-клавиатуры +Выход: нет +``` + +Используется для низкоуровневой настройки клавиатуры (LED-индикаторы, +повтор, задержка). + +### ESTEX: функции клавиатуры (30h–37h) + +Через `RST 10h` с C=30h–37h [DiskSyscalls.txt:30h–37h]. + +**WAITKEY (30h):** ждёт нажатия, возвращает код. + +``` +Вход: C = 30h +Выход: A = код символа + D = скан-код + E = ASCII-код (0 для функциональных клавиш) +``` + +**SCANKEY (31h):** опрос без ожидания. + +``` +Вход: C = 31h +Выход: A = код символа (0 если нажатий нет) + D = скан-код + E = ASCII-код +``` + +**ECHOKEY (32h):** ждёт + эхо-вывод. + +``` +Вход: C = 32h +Выход: A = код символа + D = скан-код + E = ASCII-код +``` + +**CTRLKEY (33h):** состояние модификаторов и режимов. libc: `kbd_mod_state()`. + +``` +Вход: C = 33h +Выход: C = mode (биты режимов — см. ниже) + B = shift (биты зажатых модификаторов) +``` + +| Бит C | Режим | +|-------|-------| +| 0 | РУС/ЛАТ (0=ЛАТ, 1=РУС) | +| 1 | NumLock | +| 2 | ScrollLock | +| 3 | CapsLock | +| 4 | Insert | + +| Бит B | Модификатор | +|-------|------------| +| 0 | Left Shift | +| 1 | Right Shift | +| 2 | Ctrl (любой) | +| 3 | Alt (любой) | +| 4 | Left Ctrl | +| 5 | Left Alt | +| 6 | Right Ctrl | +| 7 | Right Alt | + +**K_CLEAR (35h):** сбросить буфер клавиатуры. + +``` +Вход: C = 35h +``` + +**K_SETUP (36h):** настройка раскладки. [DiskSyscalls.txt:36h] + +``` +Вход: C = 36h + A = 0 — получить текущий номер раскладки + A = 1 — установить раскладку по номеру из B + A = 2 — получить имя текущей раскладки (адрес HL) +Выход: при A=0: A = номер раскладки + при A=2: HL = адрес строки с именем +``` + +| Номер | Раскладка | +|-------|----------| +| 0 | Английская (US) | +| 1 | Русская | +| 2 | Английская (UK) | +| 3 | Украинская | + +Переключение раскладки по Ctrl+Space (если не переназначено). + +**TESTKEY (37h):** тест на нажатие (без извлечения из буфера). + +``` +Вход: C = 37h +Выход: A = код символа (0 если нет) + D = скан-код + E = ASCII-код +``` + +--- + +## 9.3 Клавиатура: необработанный (raw) доступ + +Штатный DSS (WAITKEY/SCANKEY/CTRLKEY) даёт событийный интерфейс — +нажатия, а не состояния клавиш. Для игр и real-time приложений требуется +чтение **зажатых клавиш в каждый момент**. Это реализуется через +перехват SIO-A напрямую в обработчике IM2, минуя DSS. + +### 9.3.1 Принцип + +1. Установить свой обработчик IM2 (общий вектор `#FF`). +2. В обработчике читать байты с SIO-A (порт `#18`), декодировать + PS/2 Scan Code Set 2, обновлять битовую карту held-состояний. +3. Основной код по кадровому прерыванию (или раз в кадр) читает карту + опросом — без ожидания. +4. DSS не получает байт с клавиатуры, пока обработчик их забирает. + Для восстановления нормального ввода — временно отключить перехват. + +### 9.3.2 SIO-A и прерывания + +SIO-A (порт данных `#18`, управление `#19`) работает в IM2. + +**Инициализация SIO-A** (выполняется BIOS при загрузке, повторно не требуется): + +| WR | Значение | Эффект | +|:--|:---------|--------| +| WR0 | `0x10` | Сброс RR1 (ошибка) | +| WR1 | `0x07` | Прерывания по Rx готовности | +| WR3 | `0xC1` | Rx 8 бит, без CRC | +| WR4 | `0x44` | ×1 клок, 1 стоп-бит, без паритета | +| WR5 | `0xEA` | Tx 8 бит, DTR+RTS=1 | + +**Различение в IM2:** при входе в обработчик проверить бит 0 порта `#19`. +Если 0 — прерывание не от SIO-A (кадровое, CBL — пропустить). + +### 9.3.3 PS/2 Scan Code Set 2 — протокол + +SIO-A передаёт скан-коды PS/2 Set 2. Каждый байт с порта `#18` — +один байт протокола. Размер сообщения: + +| Последовательность | Значение | +|:------------------|:---------| +| `` | Make — клавиша нажата (код < 0xF0) | +| `0xF0 ` | Break — клавиша отпущена | +| `0xE0 ` | Extended — расширенная клавиша (стрелки, RAlt, RCtrl) | +| `0xE0 0xF0 ` | Extended break | + +Make-байт устанавливает бит клавиши в held-карте. +Break-байт сбрасывает. + +**FSM декодирования (2 состояния):** + +``` +PEND_MAKE: + получить байт B + if B == 0xF0 → переход PEND_BREAK + if B == 0xE0 → переход PEND_EXT, Bзап = B + иначе → make(B) + +PEND_BREAK: + получить байт B + переход PEND_MAKE + if (ext_flag) → break_ext(B); ext_flag = 0 + иначе → break(B) + +PEND_EXT: + получить байт B + if B == 0xF0 → ext_flag = 1, переход PEND_BREAK_EXT + иначе → make_ext(B); переход PEND_MAKE + +PEND_BREAK_EXT: + получить байт B + ext_flag = 0 + break_ext(B) + переход PEND_MAKE +``` + +### 9.3.4 Битовая карта held-состояний + +Массив 128 байт (1024 бита для кодов 0..1023, расширенные — с битом +`0x0100`). + +Простая реализация: + +```asm +; HL = code (0..0x1FF) +; IX = base адреса карты +LD A, H +AND A, 0x07 ; номер бита 8..10 +LD D, A +LD A, L +RRCA ; HL/8 (3 сдвига) +RRCA +RRCA +AND A, 0x1F +LD L, A +LD A, H +AND A, 0x07 +ADD A, A ; +8*... +ADD A, A +ADD A, A +ADD A, L +LD L, A +LD H, 0x00 +ADD IX, HL ; IX = &bitmap[code / 8] +LD A, D +INC A +LD B, A ; B = номер бита в байте + 1 +XOR A +SCF ; carry=1 для make, 0 для break +RL A +DJNZ $-2 ; A = 1 << (code & 7) +; make: OR (IX), A ; break: CPL + AND (IX), A +``` + +### 9.3.5 Overrun recovery + +SIO FIFO глубиной 3 байта. Если обработчик прерывания не успевает +забрать байты (длинная DI-секция, акселератор), FIFO переполняется — +RR1 bit5 = 1. С этого момента цепочка make+break нарушена, возможны +залипшие клавиши. + +**Алгоритм восстановления:** + +1. Обнаружить overrun (читать SIO RR1, бит 5). +2. Сбросить held-карту **всех клавиш, кроме**: + + | Код PS/2 | Клавиша | Почему | + |:--------:|:--------|:-------| + | `0x12` | Left Shift | PS/2 автоповтор — только последняя | + | `0x59` | Right Shift | нажатая клавиша. Если сбросить | + | `0x14` | Left Ctrl | модификатор, он не восстановится до | + | `0x11` | Left Alt | физического отпускания. Игра «теряет» | + | `0xE014` | Right Ctrl | шифт/контрол/альт при каждом overrun. | + | `0xE011` | Right Alt | | + +3. Взвести флаг «был overrun» — основной код может проигнорировать + held-состояние на этот кадр. + +### 9.3.6 Координация с DSS + +Пока обработчик забирает байты с SIO-A, FIFO пуст — DSS не видит +клавиатуру. Для вызова DSS-функций (консоль, диалоговые окна): + +1. Переключить флаг «raw active = 0» в IM2-обработчике. +2. Обработчик начинает пропускать байты в DSS (JP `0038h` или + через штатный трамплин). +3. После завершения ввода — переключить флаг обратно. + +**Внимание:** если обработчик просто перестаёт читать SIO-A, но не +возвращает управление DSS, порт SIO-A перестанет генерировать +прерывания (FIFO полон, Rx готов = 0). Для корректной передачи +управления нужно разрешить DSS-обработчику читать SIO-A. + +### 9.3.7 Пример: минимальный raw-обработчик + +```asm +; Флаги: raw_active = 1 — перехватывать, 0 — пропускать в DSS +; Карта: kbd_held — 128 байт, занулена при старте +; FSM: kbd_state — 0=PEND_MAKE, 1=PEND_BREAK, 2=PEND_EXT, 3=PEND_BREAK_EXT +; kbd_ext — флаг extended (0/1) + +KBD_ISR: + ; Проверить, что прерывание от SIO-A + IN A, (#19) ; SIO-A RR0 + BIT 0, A ; бит 0 = прерывание от SIO-A? + RET Z ; нет — пропустить + + IN A, (#18) ; прочитать байт скан-кода + BIT raw_active ; перехват активен? + JP Z, DSS_IRQ ; нет — пусть DSS обработает + + ; FSM: текущее состояние в kbd_state + LD HL, kbd_state + LD A, (HL) + AND A, 3 + JP Z, .pend_make + DEC A + JP Z, .pend_break + DEC A + JP Z, .pend_ext + ; .pend_break_ext + LD (HL), 0 ; → PEND_MAKE + LD A, B ; код клавиши + CALL break_ext + EI + RETI + +.pend_make: + LD A, B ; байт с SIO-A (уже в B из IN) + CP 0xF0 + JR Z, .set_break + CP 0xE0 + JR Z, .set_ext + CALL make ; обычный make + LD (HL), 0 ; остаёмся PEND_MAKE + EI + RETI + +.set_break: + LD (HL), 1 ; → PEND_BREAK + EI + RETI + +.set_ext: + LD (HL), 2 ; → PEND_EXT + EI + RETI + +.pend_break: + LD (HL), 0 ; → PEND_MAKE + CALL break + EI + RETI + +.pend_ext: + LD A, B + CP 0xF0 + JR Z, .set_ext_break + CALL make_ext + LD (HL), 0 + EI + RETI + +.set_ext_break: + LD (HL), 3 ; → PEND_BREAK_EXT + EI + RETI +``` +Размер кода — ~60 байт. + +--- + +## 9.4 Мышь + +Драйвер мыши установлен в системном shell Sprinter и доступен через +SST-вызов `RST 30h`. + +### 9.4.1 SST-функции мыши + +Вызов: `RST 30h` с A = номер функции. Выход в зависимости от функции +(см. таблицу). + +| № | Назначение | Вход | Выход | +|:-:|:-----------|:-----|:------| +| `$00` | Инициализация | A=$00 | — | +| `$01` | Показать курсор | A=$01 | — | +| `$02` | Спрятать курсор | A=$02 | — | +| `$03` | Читать состояние | A=$03 | DE=X, HL=Y, A=buttons (b0=left, b1=right) | +| `$04` | Переместить курсор | A=$04, DE=X, HL=Y | — | +| `$05` | Установить границы X | A=$05, DE=min, HL=max | — | +| `$06` | Установить границы Y | A=$06, DE=min, HL=max | — | +| `$07` | Вид курсора (текст) | A=$07, DE=sym_and:sym_xor, HL=attr_and:attr_xor | — | +| `$09` | Загрузить курсор (граф.) | A=$09, IX=pointer | — | +| `$0B` | Прочитать курсор | A=$0B | IX=pointer (копия) | +| `$0C` | Чувствительность X | A=$0C, D=value (1..255) | — | +| `$0D` | Чувствительность Y | A=$0D, D=value (1..255) | — | +| `$0E` | Прочитать чувств. X | A=$0E | D=value | +| `$0F` | Прочитать чувств. Y | A=$0F | D=value | +| `$11` | Уведомить о смене режима | A=$11, D=режим (0=текст, 1=граф-256, 2=граф-16) | — | + +**Пример: прочитать состояние мыши в asm:** + +```asm + LD A, $03 ; READ + RST 30h + ; DE = X, HL = Y, A = buttons + LD (mouse_x), DE + LD (mouse_y), HL + AND A, 3 + LD (mouse_btn), A +``` + +### 9.4.2 Чувствительность + +Значение — **делитель**: драйвер считает N raw-шагов мыши, прежде чем +сдвинуть курсор на 1 пиксель. **Меньше = быстрее** (чувствительнее). +Рекомендуемое начальное значение: 2 по обеим осям. + +```asm + LD A, $0C ; SET_SENS_H + LD D, 2 + RST 30h + LD A, $0D ; SET_SENS_V + LD D, 2 + RST 30h +``` + +### 9.4.3 Порядок инициализации + +После загрузки драйвер мыши уже инициализирован shell. Если программа +начинает «с чистого листа» (без shell), инициализация обязательна: + +```asm + LD A, $00 ; INIT — инициализировать драйвер + RST 30h + LD A, $05 ; BOUNDS_X: границы экрана + LD DE, 0 + LD HL, 319 ; для 320×256 + RST 30h + LD A, $06 ; BOUNDS_Y + LD DE, 0 + LD HL, 255 + RST 30h + LD A, $01 ; SHOW — показать курсор + RST 30h +``` + +### 9.4.4 Смена видеорежима + +После переключения видеорежима (графический → текстовый и обратно) +обязательно вызвать `$11`: + +```asm + LD A, $11 + LD D, 1 ; 0=текст, 1=граф-256, 2=граф-16 + RST 30h +``` + +Иначе драйвер применяет старые координаты, и курсор рисуется +неправильно. + +### 9.4.5 Прямой доступ к SIO-B (raw mouse) + +Мышь подключена через SIO-B (порты `#1A`/`#1B`), Microsoft Serial Mouse, +1200 бод 7E1. Если программа хочет читать мышь напрямую, минуя +SST-драйвер (например для нестандартного протокола или экономии на +SST), SIO-B нужно инициализировать самостоятельно: + +**Инициализация SIO-B (1200 7E1):** + +```asm + LD HL, .sio_init + LD B, 6 + LD C, #1B ; SIO-B control + OTIR + JR .done +.sio_init: + DB #10 ; WR0: сброс RR1 + DB #04 ; WR1: прерывания выкл + DB #44 ; WR4: ×1 клок, 1 стоп, без паритета + DB #C1 ; WR3: Rx 8 бит + DB #EA ; WR5: Tx 8 бит, DTR+RTS=1 + DB #15 ; WR0: сброс ошибки + выбран RR1 +.done: +``` + +**Чтение байта с мыши (опрос, без прерываний):** + +```asm + IN A, (#1B) ; SIO-B RR0 + BIT 0, A ; бит 0 = Rx готов? + JR Z, .no_data + IN A, (#1A) ; прочитать байт + ; обработать ... +``` + +**Формат пакета Microsoft Serial Mouse:** + +Длина: 3 байта. + +| Байт | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +|:----:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:| +| 0 | 1 | 0 | 0 | 0 | L | R | Y7 | Y6 | +| 1 | 0 | X6 | X5 | X4 | X3 | X2 | X1 | X0 | +| 2 | 0 | Y5 | Y4 | Y3 | Y2 | Y1 | Y0 | X7 | + +- Координаты X/Y — **относительные** (приращения с последнего пакета), знаковые. +- `X7` — старший бит X (знак), `X6..X0` — младшие. +- `Y7..Y6` — старшие биты Y, `Y5..Y0` — младшие. +- `L` — левая кнопка (1 = нажата), `R` — правая. + +**Декодирование:** + +```asm +; B = байт 0, C = байт 1, D = байт 2 +; X: + LD A, C ; байт 1: X6..X0 + LD E, A + LD A, D ; байт 2: X7 + RLCA + RLCA + AND A, 0x80 + OR A, E ; A = X (7 бит + знак) + ; знаковое расширение в HL + LD L, A + RLCA + SBC A, A + LD H, A ; HL = X (знаковое 16-бит) + +; Y: + LD A, B ; байт 0: Y7..Y6 + RLCA + RLCA ; A[1:0] = Y7..Y6 + AND A, 0xC0 + LD E, A + LD A, D ; байт 2: Y5..Y0 + RLCA + RLCA ; A[7:2] = Y5..Y0 + AND A, 0xFC + OR A, E ; A = Y (7 бит + знак) + ; знаковое расширение в DE + LD E, A + RLCA + SBC A, A + LD D, A ; DE = Y (знаковое 16-бит) + +; Кнопки: + LD A, B + AND A, 0x30 ; биты L (4) и R (5) + RRCA ; A = 0..3 + RRCA + RRCA + RRCA + LD (buttons), A +``` + +--- + +## 9.5 Особенности игровой клавиатуры + +Документ: `kbd-games.md`. Ниже — ключевые паттерны для реализации. + +- **Held-state vs edge-detect:** DSS — событийный (сообщает только момент + нажатия). Raw-канал (§9.3) — state-based (зажата/не зажата прямо сейчас). + Играм нужен второй. +- **Sync once per frame:** раз в кадр (по кадровому прерыванию) проверять + held-карту. Между кадрами карта обновляется только в IM2-обработчике. +- **Edge-detect:** для одноразовых действий (прыжок, выстрел) — запоминать + предыдущее held-состояние и сравнивать: + ``` + pressed = held & ~prev_held + prev_held = held + ``` +- **Типоматик:** игнорировать повторные make, пока не придёт break. + Реализация: при make — установить бит только если он ещё не был + установлен; при break — сбросить. +- **Автоотмена (reject):** если за кадр нажато больше N клавиш (например + 4) — игнорировать все (защита от баунса и мусора). +- **Recovery:** при overrun — очистить held-карту всех клавиш, кроме + модификаторов (LShift 0x12, RShift 0x59, LCtrl 0x14, LAlt 0x11, + RCtrl 0xE014, RAlt 0xE011). + +--- + +## 9.6 Кросс-ссылки + +- Прерывания (IM2, вектор #FF): `07-irq.md §7.2` +- DSS-функции клавиатуры: `03-dss.md §3.6` +- BIOS FN_KBD_OUT: `02-bios.md §2.7` +- Порт клавиатуры `#FE`: `11-ports.md §11.3` +- Игровая клавиатура: `kbd-games.md` +- Баги: `12-bugs.md` +- SIO и порты прерываний: `11-ports.md §11.2` diff --git a/docs/new/10-sound.md b/docs/new/10-sound.md new file mode 100644 index 0000000..2c10ab2 --- /dev/null +++ b/docs/new/10-sound.md @@ -0,0 +1,377 @@ +# 10. Звук + +## 10.1 Общие сведения + +> Документ описывает звуковую подсистему платы **Sp2000** и более новых моделей. +> Информация о Sprinter-97 не рассматривается. + +Звуковая подсистема Sprinter Sp2000 включает три компонента: + +| Компонент | Тип | Описание | +|-----------|-----|----------| +| GM80C760 (AY-3-8910 совм.) | Музыкальный сопроцессор | 3 голоса + шум + огибающая, эмуляция в ППЛМ | +| COVOX | 8-битный ЦАП | Прямой вывод сэмплов через порт `#FB`/`#4F` | +| CBL (COVOX-Blaster) | COVOX с буфером | 256 байт буфера, прерывания, разные режимы | + +Весь звук выводится через **16-битный ЦАП TDA1543** (двухканальный, стерео). +Реально используется 10 бит для одновременного смешивания 8-bit COVOX и AY +[IvanMak.txt:632–634]. + +**На Sp2000 все три компонента присутствуют в основной прошивке ППЛМ.** +CBL включается через порт `#4E` (бит 7 = 1). При выключенном CBL (бит 7 = 0) +работает обычный 8-bit COVOX [IvanMak.txt:662–666]. + +## 10.2 GM80C760 (AY-3-8910) + +### 10.2.1 Реализация + +AY-функция реализована на микросхеме **GM80C760** (ППЛМ ALTERA EP1K30), +AY-3-8910/8912 совместимая. Это не отдельная дискретная микросхема +[IvanMak.txt:636–637]. + +На EP1K30 (Sp2000) реализована **3-я версия** AY. Включает три голоса, +шум и генератор огибающей (envelope). В формирователе огибающей обнаружена +небольшая ошибка, детали не документированы [IvanMak.txt:224–229], +[12-bugs.md §11.2]. + +### 10.2.2 Порты + +| Порт | Назначение | +|------|-----------| +| `#BFFD` | AY-8910 — запись номера регистра (address) | +| `#FFFD` | AY-8910 — чтение/запись данных регистра (data) | + +Внутренние номера в карте дешифратора ППЛМ: `90h` (`#BFFD`), `91h` (`#FFFD`) +[IvanMak.txt:1298–1299]. + +### 10.2.3 Программирование + +Программирование — **стандартное для AY-3-8910/8912** +[IvanMak.txt:636–637]: + +```asm +; Установить регистр AY +LD BC, #BFFD +OUT (C), A ; A = номер регистра (0..15) +LD BC, #FFFD +OUT (C), A ; A = значение + +; Прочитать регистр AY (3-я версия) +LD BC, #BFFD +OUT (C), A ; A = номер регистра +LD BC, #FFFD +IN A, (C) ; читать данные +``` + +**Регистры AY-3-8910** (стандартные): + +| № | Назначение | +|:-:|-----------| +| 0 | Частота канала A (младший байт) | +| 1 | Частота канала A (старшие 4 бита) | +| 2 | Частота канала B (младший байт) | +| 3 | Частота канала B (старшие 4 бита) | +| 4 | Частота канала C (младший байт) | +| 5 | Частота канала C (старшие 4 бита) | +| 6 | Период шума | +| 7 | Микшер (включение каналов и шума) | +| 8 | Громкость A | +| 9 | Громкость B | +| 10 | Громкость C | +| 11 | Период огибающей (младший байт) | +| 12 | Период огибающей (старшие 8 бит) | +| 13 | Форма огибающей | +| 14 | Порт I/O A (не используется на Sprinter) | +| 15 | Порт I/O B (не используется на Sprinter) | + +**Стерео:** AY имеет два выходных канала, но в стандартной конфигурации +Sprinter оба канала получают монофонический сигнал. + +--- + +## 10.3 COVOX (8-бит) + +### 10.3.1 Порты + +| Порт | Назначение | +|------|-----------| +| `#FB` | COVOX data (он же порт включения КЭШ-ОЗУ по IN) | +| `#4F` | COVOX data (альтернативный адрес) | + +[IvanMak.txt:642, 1347] + +### 10.3.2 Программирование + +Простейший вывод сэмплов — последовательная запись байтов в порт `#FB` +или `#4F`: + +```asm +; Цикл вывода сэмплов (8 бит, моно) +LD HL, sample_data +LD BC, sample_length +loop: +LD A, (HL) +OUT (#FB), A +INC HL +DEC BC +LD A, B +OR C +JR NZ, loop +``` + +### 10.3.3 Конфликт с Fast RAM (КЭШ-ОЗУ) + +Порт `#FB` используется **для двух целей**: +- `OUT (#FB), A` — запись в COVOX +- `IN A, (#FB)` — включение КЭШ-ОЗУ + +Если КЭШ-ОЗУ включено, запись в `#FB` уходит в кэш, а не в COVOX. +Перед работой с COVOX кэш нужно отключать: `IN A, (#7B)` +[IvanMak.txt:850–851], [12-bugs.md §11.4]. + +--- + +## 10.4 COVOX-Blaster (CBL) + +### 10.4.1 Общее описание + +**CBL (COVOX-Blaster)** — COVOX с буферным ОЗУ на **256 байт**. Позволяет +выводить звук поблочно, освобождая процессор для другой работы +[IvanMak.txt:647], [Parinov.txt:688]. + +### 10.4.2 Порт управления `#4E` + +**Порт `#4E` — 16-битный! Только через `OUT (C),A`** (с `LD BC,004Eh`) +[Parinov.txt:692–693]. + +> **Примечание:** IvanMak.txt упоминает его как 8-битный, но Parinov.txt явно +> указывает 16-битный доступ. Современный код использует `OUT (C),A`. + +**Биты порта `#4E`** [Parinov.txt:695–698]: + +| Бит | Мнемоника | Назначение | +|-----|-----------|-----------| +| 7 | **CBL_ON** | 1 = CBL включён, 0 = обычный COVOX | +| 6 | **STEREO** | 1 = стерео, 0 = моно | +| 5 | **16BIT** | 1 = 16-битные сэмплы, 0 = 8-битные | +| 4 | **IRQ_EN** | 1 = включить прерывания от CBL | +| 3–0 | **FREQ** | Частота дискретизации (см. таблицу) | + +### 10.4.3 Частоты дискретизации + +[Parinov.txt:700–718]: + +| Код | Частота | Примечание | +|:---:|---------|-----------| +| 0 | 16 kHz | старые режимы, **НЕ ИСПОЛЬЗОВАТЬ** | +| 1 | 22 kHz | старые режимы, **НЕ ИСПОЛЬЗОВАТЬ** | +| 2–7 | — | зарезервировано | +| **8** | **7.8125 kHz** | mono/stereo, 8/16-bit | +| **9** | **10.9375 kHz** | mono/stereo, 8/16-bit | +| **A** | **15.625 kHz** | mono/stereo, 8/16-bit | +| **B** | **21.875 kHz** | mono/stereo, 8/16-bit | +| **C** | **31.25 kHz** | mono/stereo, 8/16-bit | +| **D** | **43.75 kHz** | mono/stereo, 8/16-bit | +| **E** | **54.6875 kHz** | mono/stereo, 8/16-bit | +| **F** | **109.375 kHz** | mono/stereo, 8/16-bit | + +> **Важно:** коды 0 и 1 — старые режимы из первых прошивок, несовместимы с +> новыми режимами (8–F). Использовать только коды 8–F. + +### 10.4.4 Режимы и формат данных + +[Parinov.txt:767–783]: + +| Режим | Нулевой уровень | Размер блока | Формат данных | +|-------|:---------------:|:------------:|--------------| +| mono 8-bit | `80h` | 128 байт | `DB 80h, 81h, 7Fh, ...` | +| mono 16-bit | `0000h` | 256 байт | `DW 0, 1000, -1000, ...` | +| stereo 8-bit | `80h,80h` | 128 байт | `DB 80h,80h, 81h,80h, ...` (L, R чередуются) | +| stereo 16-bit | `0000h,0000h` | 256 байт | `DW 0,0, 1000,0, ...` (L, R чередуются) | + +Формат данных выбран так, чтобы WAV-файлы можно было пересылать в CBL +простой `OTIR` [Parinov.txt:791]. + +### 10.4.5 Буфер CBL и механизм банок + +CBL имеет буферное ОЗУ на **256 байт**, организованное как кольцевой буфер +[Parinov.txt:758–760]: + +- Счётчик CBL считает **«назад»** — из-за особенности команды `OUTI`, где `B` + уменьшается и попадает на A15..A8. +- Для 8-битных режимов буфер условно разбит на **две банки по 128 байт**. +- Для 16-битного режима блок = **256 байт** (весь буфер). + +**Механизм работы:** + +1. Процессор записывает блок данных (128 байт для 8-бит, 256 байт для 16-бит) + в буфер CBL. +2. Аппаратный счётчик CBL автоматически считывает данные из буфера и + отправляет в ЦАП на заданной частоте. +3. Бит 7 порта `#FE` указывает, какая банка сейчас выводится в ЦАП. +4. Когда банка переключается — CBL запрашивает следующую порцию данных + (через прерывание или polling). +5. Запрос данных возникает для **каждых 128 байт (256 в 16-битном режиме)**. + +### 10.4.6 Порт статуса `#FE` + +**Бит 7 порта `#FE`** — запрос данных для CBL [Parinov.txt:720–724]: + +| Бит | Назначение | +|-----|-----------| +| 7 | **CBL data request** — 1 = CBL запрашивает новую порцию данных | +| 5 | **Frame sync** — кадровый импульс (4 мс длиной, 20 мс период) | + +> **Примечание:** В MAME при выключенном CBL бит 7 порта #FE всегда = 1. +> Это следует учитывать при разработке обработчика прерываний +> [`im2_isr_design.md:26–31`]. + +**Противоречие** [08-io.md §8.3]: +- IvanMak.txt описывает бит 7 как старший бит счётчика CBL для polling + (определение, какая половина буфера выводится). +- Parinov.txt описывает его как запрос прерывания. +- Оба описывают одну физическую линию, но в разных режимах (polling vs interrupt). + +### 10.4.7 Прерывания и IM2 + +- При включённых прерываниях CBL (бит 4 порта `#4E` = 1) необходим **режим IM 2**. +- Если остаться на IM1, DOS-процедура прерываний будет вызываться слишком часто, + что вызовет тормоза на высоких частотах [Parinov.txt:762–764]. +- **Вектор прерывания CBL — `#FF`** (как и у клавиатуры, и у кадрового). + Отличать — по биту 7 порта `#FE` [`sprinterIntLib.asm:24–26`]. + +**Обработчик прерываний на IM2:** + +```asm +; Проверка источника +IN A, (#FE) +RLCA ; бит 7 → CF +JR NC, not_cbl ; не CBL — на другой обработчик + +; CBL запрашивает данные +LD BC, 804Fh ; B = 128 (счётчик), C = 4Fh (порт CBL data) +LD HL, next_block +OTIR ; вывести 128 байт в буфер CBL +... +``` + +### 10.4.8 Запись данных в CBL + +**Способ 1: OTIR/OUTI через порт `#4F`** + +```asm +LD BC, 804Fh ; B = 128 (счётчик), C = #4F (CBL data) +LD HL, data_block +OTIR ; вывести 128 байт +``` + +**Способ 2: через страницу ОЗУ `#FD` с акселератором** + +Страница `#FD`, отображённая в окно `#C000`, аппаратно связана с буфером CBL. +Для 8-битного режима — записать 128 байт; для 16-битного — 256 байт +[Parinov.txt:727–731]. + +```asm +; Запись блока данных в CBL через страницу #FD с акселератором +IN A, (#E2) ; сохранить текущую страницу W3 +LD (.save_page), A +LD A, #FD +OUT (#E2), A ; W3 = страница CBL + +LD DE, #C000 ; приёмник (CBL buffer) +LD B, 0 ; B = 0 → 256 байт (или 128 для 8-bit) +LD D,D ; ACC_ON: включить акселератор +LD L,L ; ACC_CopyBlock_Horizontal +LD A, (HL) ; загрузить байт в буфер акселератора +LD (DE), A ; записать в CBL +LD B,B ; ACC_OFF: выключить акселератор + +LD A, (.save_page) +OUT (#E2), A ; восстановить страницу +``` + +### 10.4.9 Полный пример + +Из `docs/samples/Пример для CBL.asm` [sprinterIntLib.asm]: + +```asm +; Инициализация IM2 +LD A, #BE +LD I, A ; таблица векторов по #BE00 +IM 2 + +; Вектор прерывания CBL = #BEFF +; (Interrupt_Vector OR 0FFh) + +; Включение CBL +LD BC, #4E +LD A, %10011000b ; bit7=1 CBL on, bit4=1 IRQ en, bits3-0=1000 = 7.8125 kHz +OUT (C), A + +; В ISR: +; IN A, (#FE) +; RLCA +; JR NC, .NoSound +; ... копировать 128 байт через страницу #FD с акселератором + +; После проигрывания: +; Установить NumberPage=2, подождать HALT + +; Выключение CBL: +LD BC, #4E +LD A, 0 +OUT (C), A +``` + +### 10.4.10 Известные проблемы + +1. **CBL vs Fast RAM:** порт `#FB` используется и для COVOX/CBL, и для + включения КЭШ-ОЗУ (см. §10.3.3). +2. **Щелчок перед первым звуком:** известная проблема при старте CBL + [`TODO.md:263`]. +3. **Помехи при движении мыши:** часть тиков прерываний, обслуживающих + CBL-насос, уходит на обслуживание мыши [`TODO.md:270–277`]. +4. **Порт #4E — 8-бит vs 16-бит:** IvanMak подразумевает 8-битный, + Parinov требует 16-битный `OUT (C),A` (см. §10.4.2). +5. **MAME: бит 7 порта #FE = 1 при выключенном CBL:** может вызвать + ложные срабатывания обработчика (см. §10.4.6). + +--- + +## 10.5 Бипер + +Стандартный Spectrum-бипер — бит 3 (в некоторых конфигурациях бит 5) +порта `#FE`. Выведен через ту же схему TDA1543, что COVOX и AY +[IvanMak.txt:639–640]. + +```asm +; Включить бипер +LD A, %00001000 ; бит 3 = 1 +OUT (#FE), A + +; Выключить бипер +LD A, %00000000 ; бит 3 = 0 +OUT (#FE), A +``` + +--- + +## 10.6 SSC (Sprinter Sound Card) + +Разрабатывалась, но **не реализована** ни в одной прошивке Sp2000 +из-за большого объёма ПЛМ [IvanMak.txt:763–772]. + +Параметры проекта: +- 2 канала +- 16 восьмибитных голосов +- 256-байтные Wave-таблицы для каждого голоса +- 8-битный регулятор амплитуды + +--- + +## 10.7 Кросс-ссылки + +- Порты звука: `11-ports.md` +- Баги AY и CBL: `12-bugs.md` +- Fast RAM и конфликт с COVOX: `04-memory.md §4.6` +- 08-io.md (остальной ввод-вывод): `08-io.md` diff --git a/docs/new/11-ports.md b/docs/new/11-ports.md new file mode 100644 index 0000000..2a57f17 --- /dev/null +++ b/docs/new/11-ports.md @@ -0,0 +1,103 @@ +# 11. Карта портов + +## 11.1 Системные порты Z84C15 (внутренние) + +Эти адреса изменить невозможно — находятся вне ППЛМ [IvanMak.txt:869–870]. + +| Порт | Назначение | Доступ | +|------|-----------|--------| +| `#10` | SIO A data / CTC channel 0 | R/W | +| `#11` | SIO A control / CTC channel 1 | R/W | +| `#12` | SIO B data / CTC channel 2 | R/W | +| `#13` | SIO B control / CTC channel 3 | R/W | +| `#14` | PIO A data | R/W | +| `#15` | PIO A control | R/W | +| `#16` | PIO B data | R/W | +| `#17` | PIO B control | R/W | +| `#18` | SIO data channel A (клавиатура) | R/W | +| `#19` | SIO control channel A (статус клавиатуры) | R/W | +| `#1A` | SIO data channel B (мышь) | R/W | +| `#1B` | SIO control channel B (мышь) | R/W | +| `#1E` | PIO B бит 0 — IRQ от ISA | R | +| `#1F` | PIO B + джойстик (Kempston) | R/W | +| `#EE` | CTC channel 2 (альтернативный) | R/W | +| `#EF` | CTC channel 3 (альтернативный) | R/W | +| `#F0` | CTC channel 0 (альтернативный) | R/W | +| `#F1` | CTC channel 1 (альтернативный) | R/W | +| `#F4` | CTC — альтернативный доступ | | + +## 11.2 Управление памятью + +| Порт | Назначение | Источник | +|------|-----------|----------| +| `#7FFD` | Основной: W3 page (0–2), RAM/ROM select, lock | IvanMak.txt:1343 | +| `#1FFD` | Расширенный: W0 page (0–2), turbo, extended RAM, VRAM segment | IvanMak.txt:1345 | +| `#DFFD` | W1 page select (Pentagon-512) | IvanMak.txt:1346 | +| `#EFF7` | W2 page select (Pentagon-512) | IvanMak.txt:1346 | +| `#82` | W0 page (PAGE0) — всегда доступен | IvanMak.txt:1348 | +| `#A2` | W1 page (PAGE1) — всегда доступен | IvanMak.txt:1348 | +| `#C2` | W2 page (PAGE2) — всегда доступен | IvanMak.txt:1348 | +| `#E2` | W3 page (PAGE3) — всегда доступен | IvanMak.txt:1348 | + +## 11.3 Видео + +| Порт | Назначение | Источник | +|------|-----------|----------| +| `#89` | RGADR (PORT_Y) — номер строки/блока видео-ОЗУ | IvanMak.txt:1349 | +| `#C9` | RGMOD — страница режима экрана (бит 0: 0/1) | IvanMak.txt:1350 | + +## 11.4 Управление конфигурацией/прошивкой + +| Порт | Назначение | Источник | +|------|-----------|----------| +| `#FB` | Включение КЭШ-ОЗУ (IN), COVOX data | IvanMak.txt:1351 | +| `#7B` | Выключение КЭШ-ОЗУ (IN) | Parinov.txt:598 | + +## 11.5 Дисковая подсистема + +| Порт | Назначение | Источник | +|------|-----------|----------| +| `#0F` | ВГ93 Command/Status (после ремапинга #1F → #0F) | IvanMak.txt:1270 | +| `#1F` | ВГ93 Command/Status (оригинал, ремапится) | IvanMak.txt:1344 | +| `#3F` | ВГ93 Track register | IvanMak.txt:1271 | +| `#5F` | ВГ93 Sector register | IvanMak.txt:1272 | +| `#7F` | ВГ93 Data register | IvanMak.txt:1273 | +| `#FF` | ВГ93 Drive Control (write); IRQ/джойстик (read) | IvanMak.txt:1274 | +| `#BD` | Переключение режима FDD (720K/1.44M) | IvanMak.txt:1347 | +| `xx50` | IDE Data | Parinov.txt:958 | +| `xx51` | IDE Error/Features | Parinov.txt:958 | +| `xx52` | IDE Sector Count | Parinov.txt:958 | +| `xx53` | IDE Sector Number | Parinov.txt:958 | +| `xx54` | IDE Cylinder Low | Parinov.txt:958 | +| `xx55` | IDE Cylinder High | Parinov.txt:958 | +| `4052h` (R) / `4152h` (W) | IDE Device/Head | Parinov.txt:959 | +| `4053h` (R) / `4153h` (W) | IDE Status/Command | Parinov.txt:959 | +| `FFBD` | CMOS data read | BIOS_v3.txt:308 | +| `BFBD` | CMOS data write | BIOS_v3.txt:308 | +| `DFBD` | CMOS address write | BIOS_v3.txt:308 | + +## 11.6 Звук + +| Порт | Назначение | Источник | +|------|-----------|----------| +| `#FB` | COVOX data (also КЭШ-ОЗУ enable) | IvanMak.txt:642 | +| `#4F` | COVOX/CBL data | IvanMak.txt:642 | +| `#4E` | CBL control (8/16-bit — см. `10-sound.md §9.4.2`) | IvanMak.txt:662, Parinov.txt:692 | + +## 11.7 Джойстик и системные + +| Порт | Назначение | Источник | +|------|-----------|----------| +| `#FE` | ZX-клавиатурная матрица, бипер, CBL статус | IvanMak.txt:1344 | +| `#1F` | Джойстик (Kempston) / PIO B | IvanMak.txt:1344 | + +## 11.8 Кросс-ссылки + +- BIOS-функции: `02-bios.md` +- DSS-функции: `03-dss.md` +- Управление памятью: `04-memory.md` +- Звук (AY, COVOX, CBL): `10-sound.md` +- Видео/палитра: `05-graphics.md` +- Прерывания: `07-irq.md` +- Детали I/O: `08-io.md` +- Баги: `12-bugs.md` diff --git a/docs/new/12-bugs.md b/docs/new/12-bugs.md new file mode 100644 index 0000000..0235488 --- /dev/null +++ b/docs/new/12-bugs.md @@ -0,0 +1,54 @@ +# 12. Баги BIOS, DSS и железа Sp2000 + +## 12.1 DRV_VERIFY (54h) не существует + +Функция `54h DRV_VERIFY` описана во всей документации BIOS, но в реальности отсутствует — всегда возвращает CF=1. + +> [bugs.txt:58–59]: «Нет биосной функции "54h" (DRV_VERIFY) верификации секторов, описанной в документации. Поэтому она всегда возвращает установленный флаг "Carry".» + +Источники, содержащие описание несуществующей функции: +- [BIOS_v3.txt:258–261] +- [IvanMak.txt:2198–2210] + +## 12.2 AY-3-8910 — ошибка в формирователе огибающей + +Третья версия AY в ППЛМ Sp2000 содержит ошибку в схеме формирователя огибающей (envelope generator). Детали не документированы. + +> [IvanMak.txt:224–229]: «Третья версия схемы AY ... включает в себя ... генератор огибающей. ... В схеме формирователя огибающей обнаружена небольшая ошибка. ... В следующей версии AY предполагается данный недостаток исключить.» + +## 12.3 Акселератор — конфликт с прерываниями + +При работе акселератора система команд Z80 сильно меняется, что может приводить к сбоям в обработчиках прерываний. + +> [IvanMak.txt:844–846]: «Отключение прерываний во время работы акселератора необходимо, так как в этот момент сильно меняется система команд процессора и программа на прерывании не сможет работать нормально.» + +Новая прошивка акселератора позволяет работать с прерываниями — при приходе INT акселератор отключается и включается обратно по RETI [IvanMak.txt:846–848]. Без тестирования на реальном железе неизвестно, какая версия прошивки установлена. + +## 12.4 Быстрое ОЗУ — конфликт с COVOX + +Порт `#FB` используется как для включения КЭШ-ОЗУ (IN), так и для вывода данных в COVOX (OUT). Если КЭШ-ОЗУ включено, запись в COVOX может давать неожиданные результаты. + +> [IvanMak.txt:850–851, 642] + +Перед вызовом RST или выходом в DOS КЭШ-ОЗУ обязательно отключать (`IN A,(#7B)`). + +## 12.5 STA_VID — потеря старшего байта (0A8h?) + +> [bugs.txt:33]: «В БИОСе в функции STA_VID (возможно 0A8h) теряется старший байт параметра. В v2.12 функцию рекомендуется вызывать с учетом этого.» + +Относится к BIOS v2.12. Не проверялось, исправлено ли в v3.00. + +## 12.6 Несовместимость с реальным железом — только MAME + +Многие перечисленные баги и квирки зафиксированы в документации, но не подтверждены на реальном Sprinter Sp2000. Все тесты тулчейна выполняются в MAME. Актуальность багов для реального железа неизвестна. + +> [TODO.md]: «Проверка на реальном железе — в планах» + +## 12.7 Кросс-ссылки + +- BIOS v3.00: `02-bios.md` +- DSS/ESTEX: `03-dss.md` +- Акселератор: `06-accel.md` +- Fast RAM: `04-memory.md §4.6` +- Проектный TODO: `TODO.md` +- Проектный список багов: `converted/bugs.txt` diff --git a/docs/new/13-telegram.md b/docs/new/13-telegram.md new file mode 100644 index 0000000..d3e4e43 --- /dev/null +++ b/docs/new/13-telegram.md @@ -0,0 +1,169 @@ +# 13. Информация из Telegram-чатов (Sp2022 и развитие Sprinter) + +## 13.1 Источники + +Данные извлечены из 319 HTML-файлов чатов Telegram, выгруженных из чата по Sprinter (n/w). Обработано 317 602 сообщения, отфильтровано технических — 72 307 (15 МБ текста). + +Основные авторы технических сообщений: RomanRom2, KromosS, solegstar, nzeemin, holub. + +## 13.2 BIOS 3.06 / DSS 1.71.57 + +KromosS (23 января 2026): «I am running the DSS 1.71.57 / Bios 3.06». + +Зафиксированные версии BIOS: +- 3.05 — предыдущая стабильная +- 3.06 — текущая, 23.01.2026 +- Прошивка ППЛМ и ROM собираются через Intel Quartus + +BIOS 3.06 собрана из ROM-файла, загружаемого через загрузчик. Процесс сборки: +1. Конфигурация ППЛМ через Quartus +2. Сборка ROM-образа (IS28F020 — 256 КБ flash) +3. Программирование через специальный загрузчик + +## 13.3 Эволюция аппаратных платформ + +RomanRom2 (11 ноября 2025) подробно описал историю развития Sprinter в 10 пунктах: + +| Этап | Платформа | Описание | Период | +|------|-----------|----------|--------| +| 1 | Sp2000 | Оригинальная плата, 8 DIP VRAM | 2000–2001 | +| 2 | Sp2000s | Баг в разводке ALTERA: ISA зеркалированы | ~2001 | +| 3 | Sp2000s Light | Баг фикс с MGTF, ISA распаяны не полностью | ~2002 | +| 4 | Sp2021s | Новая ревизия от solegstar | ~2021 | +| 5 | Sp2022s/d | Собственный дизайн (Zeal Hardware / RomanRom2) | 2022 | +| 6+ | Sp2024d/du | Планируется, с USB-контроллером | ~2024 | + +### Детали: + +**Sp2000 (оригинал)** +- Плата 2000–2001 года +- ПЗУ 256 КБ, VRAM 256 КБ (8 DIP-микросхем) +- ALTERA ACEX 1K EP1K30 + +**Sp2000s** +- ALTERA-баг: в оригинальной плате зеркально разведены ISA-слоты, на Sp2000s исправлено +- Новый баг разводки: ISA адреса «перевёрнуты» — при устанавке платы в слот слоты просто не видятся. В Sp2000s Light фикс с MGTF (соединительная плата), один ISA-слот не распаян + +**Sp2022 (Zeal Hardware)** +- Новая разработка на современной элементной базе +- Варианты: Sp2022s (Sp2000 layout, SMD), Sp2022d (две платы, digitized) +- SMD-компоненты, технология 2022 года +- Расширенная память, улучшенное питание +- Sp2022du — вариант с USB-контроллером (планируется для Sp2024) + +**Sp2024** +- Sp2024d — следующее поколение +- Sp2024du — с интегрированным USB для клавиатуры/мыши +- Планируется USB-контроллер + +### Sp2022 — модификации + +| Модификация | Описание | +|-------------|----------| +| sp2022s | SMD, layout аналогичен Sp2000 | +| sp2022d | Две платы (digitized), расширенная память | +| sp2022d-black | Чёрная текстолит | +| sp2022release | Готовая плата для пользователей | +| sp2022m | Мобильная версия (будущее) | +| sp2022i | ITX-формфактор | +| sp2022atx | ATX-формфактор | +| sp2022t | Новая ревизия | +| sp2022du | С USB-контроллером | + +## 13.4 Изменения компонентов + +### ПЗУ и загрузка +- ROM: IS28F020 (256 КБ Flash, 5V) +- Загрузка через Quartus → ROM-образ → загрузчик +- ROM-файлы обсуждаются в чате + +### VRAM +- Оригинал Sp2000: CY7C109D-10VXI (5V, 128K×8) +- Sp2022: CY7C1019DV33-10VXI (3.3V, 128K×8) +- Переход на 3.3V логику + +### Video-DAC +- Sp2022: обсуждаются TDA8772 (трипл 8-бит video-DAC) или ADV7120/ADV7125 +- Некоторые платы используют ADV7125 (трипл 10-бит) ??? + +### CMOS +- DS12887A (оригинал) +- На Sp2022 — замена на современный аналог + +### КЭШ-ОЗУ +- W24512 (64K×8) — для Sp2022 + +### SDRAM +- Оригинал: 72-pin SIMM +- Sp2022: SDRAM (DDR) на плате + +## 13.5 Аппаратные баги + +### Sp2000s — ALTERA routing bug +При переразводке Sp2000 под Sp2000s допущена ошибка в разводке ALTERA (ACEХ 1K). ISA-адреса оказались «зеркальными» — при установке платы в слот половинка линий данных перевёрнута, из-за чего слоты не видятся CPU. Исправлено на Sp2000s Light с помощью MGTF (мезонинная плата-переходник). + +### Sp2000s Light — ISA unsoldered +На Sp2000s Light один ISA-слот не распаян, второй — через MGTF. + +### IDE active short +В некоторых ревизиях — короткое замыкание на линиях IDE при активном доступе. Требует подтягивающих резисторов. + +### FDISK CHS-LBA +Типовые проблемы с разметкой дисков — ошибки пересчёта CHS в LBA в утилитах FDISK для Sprinter. + +## 13.6 MAME-эмуляция + +- holub разрабатывает форк MAME для Sprinter +- Timing issues: Z80 Z84C15 эмулируется не полностью (внутренние PIO/SIO/CTC) +- Работа над корректной эмуляцией Sp2022 + +## 13.7 Статистика по платформам + +| Платформа | Упоминаний | Период | +|-----------|-----------|--------| +| sp2000 | 243 | 2000–2001 | +| sp2022 | 122 | 2022–2024 | +| sp2022d | 66 | 2022–2024 | +| sp2000s | 44 | 2001–2002 | +| sp2022s | 43 | 2022–2024 | +| sp2024d | 6 | 2024+ | +| sp2024du | 4 | 2024+ (план) | +| sp2022i | 3 | 2022–2024 | +| sp2022m | 1 | будущее | + +## 13.8 Компонентная статистика + +| Компонент | Упоминаний | +|-----------|-----------| +| Z80 | 1317 | +| USB | 800 | +| BIOS v3.xx | 813 | +| MAME | 496 | +| DDR | 172 | +| ACEX | 147 | +| ALTERA | 115 | +| CY7C | 82 | +| Z84C15 | 87 | +| TDA1543 | 55 | +| SDRAM | 48 | +| IS28F020 | 30+ | +| Quartus | упоминается | + +## 13.9 Противоречия с docs/new/ + +### BIOS v3.06 / DSS 1.71.57 +Основные источники (BIOS_v3.txt, IvanMak.txt) документируют BIOS 3.00, не 3.06. Версия 3.06 обнаружена только в Telegram. DSS 1.71.57 значительно новее, чем 1.60 в документации. + +### Sp2022 — новое железо +Вся документация в docs/converted/, part2/ и reference/ описывает Sp2000 (2000–2001). Sp2022 — полностью новая платформа с современной элементной базой (SMD, 3.3V VRAM, USB, SDRAM). Документация отсутствует. + +### Состав BIOS +Неизвестно, какие функции из IvanMak.txt (HDD, RAM-disk, конфигурационные, портовые) реализованы в BIOS 3.06, а какие нет. Также неизвестно, исправлены ли баги (DRV_VERIFY, AY envelope). + +## 13.10 Кросс-ссылки + +- Аппаратная архитектура Sp2000: `01-architecture.md` +- BIOS v3.00: `02-bios.md` +- Проектный TODO: `TODO.md` +- Сырые данные: `docs/tg/_messages.jsonl`, `docs/tg/_technical.txt` +- Фильтр: `docs/tg/_filter.py` diff --git a/docs/new/INDEX.md b/docs/new/INDEX.md new file mode 100644 index 0000000..e21f8f9 --- /dev/null +++ b/docs/new/INDEX.md @@ -0,0 +1,112 @@ +# INDEX — сводный указатель документации Sp2000 + +## Документы + +| № | Файл | Содержание | +|---|------|-----------| +| 01 | `01-architecture.md` | Общая архитектура: процессор, ППЛМ, конфигурации, обзор памяти/видео/акселератора/звука/ISA/клавиатуры/мыши/дисков/прерываний | +| 02 | `02-bios.md` | BIOS v3.00: вызовы (RST 8/18h, CALL 3D13h), полная таблица функций, видео/палитра/диск/принтер | +| 03 | `03-dss.md` | DSS/ESTEX v1.60: файловые функции, диски, память, консоль, коды ошибок | +| 04 | `04-memory.md` | Память: 4 окна, страницы, порты (#7FFD/#1FFD/#DFFD/#EFF7), EXE-формат, Fast RAM | +| 05 | `05-graphics.md` | Графика: VRAM, адресация (спектрумовская/графическая), видеорежимы, палитра, shadow RAM | +| 06 | `06-accel.md` | Акселератор: команды, примеры, скорость, прерывания | +| 07 | `07-irq.md` | Прерывания: IM1/IM2, INT, CTC, SIO, CBL, цепочка обработчиков | +| 08 | `08-io.md` | Ввод-вывод: FDD, HDD, CMOS, джойстик, принтер, ISA, карта портов | +| 09 | `09-input.md` | Клавиатура (BIOS/DSS/raw) и мышь (RST 30h): API, протоколы, прерывания | +| 10 | `10-sound.md` | Звук: AY-3-8910, COVOX, COVOX-Blaster (CBL), бипер, SSC | +| 11 | `11-ports.md` | Сводная карта портов: Z84C15, память, видео, диски, звук, конфигурация | +| 12 | `12-bugs.md` | Баги: DRV_VERIFY, AY envelope, акселератор+IRQ, Fast RAM+COVOX | +| 13 | `13-telegram.md` | Telegram-чаты: BIOS 3.06, эволюция Sp2000→Sp2022, Sp2022 варианты, Sp2024, аппаратные баги, MAME | + +## Противоречия — сводка + +### Критические (меняют ABI) + +| Тема | Файл | Источники | +|------|------|-----------| +| SETWIN2: 39h vs 3Ah | `03-dss.md` | DiskSyscalls.txt vs ProgrammerManual.txt | +| EXCMDLN subfunc 5: смещения | `03-dss.md` | Все источники дают неверные DE+3/DE+4 | + +### Средние + +| Тема | Файл | Источники | +|------|------|-----------| +| WIN_RESTORE_WIN: C=0B2h (опечатка) | `02-bios.md` | BIOS_v3.txt vs IvanMak.txt | +| WIN_MOVE_WIN: C=0B2h (опечатка) | `02-bios.md` | IvanMak.txt vs BIOS_v3.txt | +| WIN_GET_SYM: A=0 обязательно? | `02-bios.md` | Parinov.txt vs BIOS_v3.txt | +| PIC_SET_PAL: битфилд vs номер | `02-bios.md` | BIOS_v3.txt vs IvanMak.txt | +| LP_PRINT_SYM: 082h=(131) неверно | `02-bios.md` | Ошибка десятичной аннотации | +| FN_VERSION: значения BC | `02-bios.md` | BIOS_v3.txt vs IvanMak.txt | + +### Низкие + +| Тема | Файл | Источники | +|------|------|-----------| +| CBL порт 8/16-бит | `10-sound.md` | IvanMak vs Parinov | +| CBL bit7 #FE: статус vs IRQ | `10-sound.md` | IvanMak vs Parinov | +| Адресация ВГ93: #7F data reg | `08-io.md` | IvanMak vs Parinov; MAME подтверждает IvanMak | +| HDD: R/W разные адреса | `08-io.md` | IvanMak vs Parinov; MAME использует единую карту DCP | +| Джойстик #1F vs #0F | `08-io.md` | IvanMak: ремап #1F → #0F; MAME на Sp2000 отключает | + + +## Кросс-ссылки между документами + +``` +01-architecture.md ← 02-bios.md (BIOS call conventions) + ← 04-memory.md (memory overview) + ← 05-graphics.md (video overview) + ← 06-accel.md (accel overview) + ← 07-irq.md (interrupt overview) + ← 08-io.md (disk, joystick, printer, ISA overview) + ← 09-input.md (keyboard, mouse overview) + ← 10-sound.md (sound overview) + ← 11-ports.md (ISA ports) + +02-bios.md ← 05-graphics.md (PIC_SET_PAL, SET_MODE) + ← 11-ports.md + ← 12-bugs.md (DRV_VERIFY) + +03-dss.md ← 04-memory.md (SETWIN/SETWIN1/SETWIN2) + ← 11-ports.md + ← 12-bugs.md + +04-memory.md ← 06-accel.md (Fast RAM conflict with accel) + ← 11-ports.md + ← 03-dss.md (window functions) + +05-graphics.md ← 02-bios.md (PIC_SET_PAL, SETVMOD) + ← 06-accel.md (accelerator for fast pixel ops) + ← 10-sound.md (CBL for video) + ← 11-ports.md (RGADR, RGMOD) + +07-irq.md ← 10-sound.md (CBL interrupt sources) + ← 11-ports.md + ← 08-io.md (disk I/O interrupt sources) + ← 09-input.md (keyboard, mouse interrupt sources) + +08-io.md ← 02-bios.md (printer functions) + ← 09-input.md (keyboard, mouse moved here) + ← 10-sound.md + ← 11-ports.md + ← 07-irq.md (mouse IRQ) + +11-ports.md → все документы +``` + +## Проектные документы (не входят в docs/new/) + +| Файл | Связь | +|------|-------| +| `memory-management.md` | C-specific memory models (legacy, перекрывается `04-memory.md`) | +| `fast_ram.md` | Детальный анализ Fast RAM — уточняет `04-memory.md §4.6` | +| `file-buffering-design.md` | FILE* дизайн — уточняет `03-dss.md` | +| `im2_isr_design.md` | IM2/ISR дизайн — уточняет `07-irq.md` | +| `sprite-api-design.md` | Спрайтовое расширение BGI | +| `kbd-games.md` | Клавиатура в играх — уточняет `09-input.md §9.5` | +| `libc-reference.md` | API libc | +| `libc-roadmap.md` | План работ по libc | +| `libc-split-asm-cases.md` | Правила сплита asm | +| `libc-headers.md` | Стратегия заголовков | +| `accel-fill-budget.md` | Бюджет тактов акселератора | +| `TODO.md` | Roadmap проекта | +| `bugs/` | Баг-репорт SDCC z80 | diff --git a/docs/reference/Форум.doc b/docs/reference/Форум.doc index 2986188828307e9968aec6da06b0a4183ab16889..28873b14324042a20c7102bf9c74642d980bed22 100644 GIT binary patch literal 152576 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 CabN6B|m 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 literal 166912 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 diff --git a/docs/reference/Форум.docx b/docs/reference/Форум.docx new file mode 100644 index 0000000000000000000000000000000000000000..36d2a0726a754bdfc39938fe34c1b6b7c7623ea5 GIT binary patch literal 52668 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 literal 0 HcmV?d00001 diff --git a/libbgi/common/gfx_scroll_h.c b/libbgi/common/gfx_scroll_h.c index 706100e..a6b9f85 100644 --- a/libbgi/common/gfx_scroll_h.c +++ b/libbgi/common/gfx_scroll_h.c @@ -46,10 +46,16 @@ void gfx_scroll_h(const gfx_rect_t *area, int16_t dx, gfx_rect_t *dirty) { * DI/EI-банды по 16 строк leaf делает сам (h: 0=256). Между бандами по * ширине CPU-адрес двигаем на 256 (Port_Y выбирает строку). */ while (w) { - uint8_t cw = (w > 256) ? 256 : (uint8_t)w; /* 0 => 256 */ + // Закомментированный блок должен работать правильно но не работает + // почему-то при w > 256 второй проход мусорит + // TODO: разобраться + // uint8_t cw = (w > 256) ? 256 : (uint8_t)w; /* 0 => 256 */ + // _bgi_scroll_rows_raw(src, dst, cw, h, (uint8_t)area->y); + // src += 256; dst += 256; + // w -= (w > 256) ? 256 : w; + uint8_t cw = (w > 255) ? 255 : (uint8_t)w; /* 0 => 256 */ _bgi_scroll_rows_raw(src, dst, cw, h, (uint8_t)area->y); - src += 256; dst += 256; - w -= (w > 256) ? 256 : w; + src += cw; dst += cw; w -= cw; } _bgi_end();