Info Guide
#11
05 июля 2015 |
|
Системки - Программы с поддержкой HDD, или "Linux" для Спектрума с винтом (или SD-картой).
Shmatrix Программы с поддержкой HDD, или "Linux" для Спектрума с винтом (или SD-картой) ZET-9 Всем спеко-кодерам посвящается. Итак, СВЕРШИЛОСЬ ЧУДО!!! Вы подключили винчестер к своему Спектруму и теперь хо─ тите сделать прогу (и не одну),которая бу─ дет его (винчестер) использовать. Имеем следующие исходные данные: -Спектрум с подключенным IDE-контролле─ ром и винчестером; -свободное время для кодинга на энтом Спектруме. Хотим получить: -минимум - замутить прогу для винта (ну, это для начинающих...); -максимум - создать НЕЧТО - типа алго─ ритма разработки и использования ПО для винта и собственно по этому алгоритму со─ творить некое ПО, которое позволило бы за─ юзать винчестер с максимальной эффективно─ стью. Каким же способом можно эффективно ис─ пользовать винчестер? Некоторые думают,что эффективно исполь─ зовать винчестер можнотолько при наличии на винте некой "ОСи"; другие в качестве "камня преткновения" предлагают создать некоторую файловую систему, которая,будучи размещена на винчестере,автоматически под─ нимет производительность (т.е.почти то же, что и эффективность) винчестера до небыва─ лых высот. Отдельно взятые товарищи, из числа тех, которым не удалось поработать с винтом на Спектруме,вообще не считают винчестер чем- то особенным (хотя он,винчестер,несомненно именно такимособенным и является), возмо─ жно, потому что они думают, что скорость работы винта на Спектруме примерно равна скорости работы с дисководом,а если иногда и превышает её, то незначительно. Не будем верить никому,а попробуем сами разобраться, что же такое винчестер на Спектруме и что он может дать Спектруму в плане удобства использования. Во-первых, это скорость. Во-вторых... Такой объём - это в первую очередь свобода выбора. Приведу только один пример. Можно изобретать разные алгоритмы упаковки виде─ ороликов и потом разрабатывать супер-про─ цедуры для декодирования упакованных кад─ ров "на лету",чтобы показывать видео в ре─ альном времени без "рывков", и при этом один видеоролик будет занимать, например 20 МБ. А можно просто хранить неупакован─ ное видео (причем,в отличие от предыдущего варианта - вместе с неупакованным цифровым звуком) и простейшей процедурой читать ка─ дры с винта прямо на экран - и это будет работать даже на Спектруме-48К. Ну и что с того, что такой видеоролик будет занимать сотни мегабайт? У нас этих мегабайт на ви─ нте может быть 40 000, 80 000 или даже 128 тысяч - хватит на пол-тыщи видеороликов. Для наших экспериментов будем использо─ вать подход "чисто спектрумовского кодера" - но не ограничимся только этим подходом в кодинге, а попробуем применять и другие подходы, которые использовали и используют хакеры всегда и везде: -никаких ограничений,кроме тех,которыми мы сами себя ограничим (например, мы сами создаём ограничение, что наши проги будут работать на Спектруме-128 и выше, а на Спектруме-48 не будут); -никаких правил, кроме тех, которые мы сами себе придумаем (например, правило не использовать команды типа OUT (C),0 - так как они не работают на процессоре Z84); -нет ничего невозможного - неважно, что кто-то сказал, что вот конкретно вотэто сделать нельзя,это всего лишь означает,что именноэтогоещё пока никто не сделал. Прежде чем начать кодить,совершим крат─ кий экскурс в историю спектрумовского ко─ динга.Рассмотрим,какие виды прог создавали кодеры последние 10-15 лет, а также кратко коснёмся отношений кодеров к взаимодейст─ вию их творений (программ) с различными конфигурациями Спектрумов и с операционной системой (ежели таковые конфигурации и ОСи имелись на тот момент времени, который бу─ дем рассматривать). Проги,создаваемые кодерами,можноуслов─ но разделить на три вида: 1)Где ось - бут. Такие программы от системы требуют только одно - загрузить код программы в память и запустить его, а далее программа сделает всё сама. Таких прог примерно две трети (66%) от общего числа. 2)Прога + ядро. Таких прог примерно одна треть (33%) от общего числа. 3)Full OS. Такие проги составляют оставшийся 1%. Предполагается использовать все три ва─ рианта программ. Пользователь может выб─ рать,какой режим будет загружаться по умо─ лчанию.И он может это менять так часто,как ему будет нужно. Теперь рассмотрим более подробно каждый пункт. 1. Ось - бут Это проги, которые: -хранятся на винте в виде файлов; -загружаются с винта в память; -сами загружают файлы с винта; -записывают обработанные данные в файлы на винте. Сразу возникает первый вопрос - кто загружает проги с винта? - А кто загружает проги с дискеты? - Специальная прога типа "Бут". В функции бута входит показать спи─ сок программ, расположенных на дискете, и дать пользователю возможность выбрать из этого списка какую-нибудь прогу. Значит, надо сделать подобный бут, но для винта. Такой бут должен уметь показать список программ на винте, и после того, как поль─ зователь кнопками вверх и вниз выберет прогу и нажметEnter, бут должен загрузить прогу в память. То есть для начала нам надо разместить на винте два файлика - бут и прогу. Теперь возникает вопрос - а кто загру─ зит в память бут? - А кто загружает в па─ мять бут с дискеты?- Некое ПО, расположен─ ное в ПЗУ и запускаемое после старта/сбро─ са. Значит, нам надо в ПЗУ расположить спе─ циальный загрузчик, который после сброса будет загружать в память некий код из заг─ рузочной области винта, и этот код, будучи загружен и запущен,сам загрузит прогу-бут, расположенную на винте. А уже бут позволит загрузить с винта нашу прогу (а в дальней─ шем - выбирать и запускать одну из многих прог). Тем, у кого в ПЗУ есть прошивка Gluk 6.x, ничего делать не надо, так как в этой прошивке уже есть пунктHDD BOOT. Владель─ цы KAY-1024, АТМ-2 и Скорпионов с ПрофПЗУ тоже могут использовать готовые загрузчики из ПЗУ. А остальным можно предложить про─ шивку, которую надо прошить вместо Basic- 128,в ней Real Commander 1.96 (запускаемый при нажатии reset) и загрузчик с винта (запускаемый при нажатии reset+пробел).Или самим добавить в Ваше любимое ПЗУ загруз─ чик с винта. Для Nemo IDE он занимает135 байт. Теперь возникает ещё два вопроса: как поместить код,бут и прогу на винт,и что же это за код, который будет загружен загруз─ чиком? Этот код должен уметь загрузить с винта каталог, найти там наш бут,загрузить бут в память и передать ему управление. Т.е.этот код должен содержать в себе драйвер винта и драйвер файловой системы,которая на вин─ те. Откуда взять драйверы винта и файловой системы? Теоретически можно взять драйверы из системы iS-DOS, CP/M или из программы WDC, но на использование этих драйверов сначала надо получить разрешение у их ав─ торов.Крутые Кодеры сами могут разработать любые драйвера, ну а мы на первых порах воспользуемся готовыми драйверами, которые можно взять из системы DNA OS. Таким образом попутно решается и преды─ дущий вопрос - используем систему DNA, и запишем на винт нашу прогу и бут,а в каче─ стве кода с драйверами в загрузочную об─ ласть винта запишем ядро системы DNA. В дальнейшем мы сможем использовать другое решение. А пока для наших экспери─ ментов этого будет достаточно. Ещё более подробно про программы 1-го типа: После того, как прога загружена,она за─ пускается, и если ей не нужно обращаться к дисковым устройствам, то на этом миссия системы, роль которой для прог 1-го типа играетSHMATRIX (программа-бут),завершена. А что же делать, если прога хочет обра─ титься к дискам (например, к HDD) и загру─ зить/сохранить один или несколько файлов? Для этого проге 1-го типа нужен драйвер винта и драйвер файловой системы, которая на винте. Поскольку есть несколько вариан─ тов подключения винта, то получается, что прога не сможет обойтись только одним ва─ риантом драйвера. Какие же подходы можно использовать, чтобы решить эту задачу? Рассмотрим, что применяли кодеры для TR-DOS-программ - на примере программ, ра─ ботающих с разными моделями памяти. Сначала использовали один универсальный драйвер, который сам пытался определить, какая из схем расширения верхней памяти используется. Как правило, определялись не все, а то─ лько несколько самых основных схем. Это объяснялось тем,что невозможно было в при─ нципе узнать, сколько всего схем существу─ ет (постоянно изобретались новые схемы подкючения), а для существующих схем, по которым кодер имел нужную информацию, не─ льзя было проверить драйвер по причине от─ сутствия данной схемы. Еще одним недостатком были глюки, кото─ рые наблюдались при работе драйвера на "нестандартных" схемах,а иногда и на "ста─ ндартных". Также применялся похожий подход, с уни─ версальным драйвером,но без автоматическо─ го определения - в этом случае пользовате─ лю предлагалось тем или иным способым выб─ рать модель памяти вручную (например,через меню, или с помощью диск-доктора). В дальнейшем был придуман наиболее уни─ версальный способ:автор сам делал драйверы для наиболее распространённых схем, причём оформлял каждый драйвер в виде отдельного файла с одинаковой структурой,а в докумен─ тации к программе приводил исходник драй─ вера (одного или всех) с комментариями для того, чтобы владельцы "нестандартных" схем расширения могли сделать свой драйвер. Для настройки такой программы на режим работы с использованием определённой схемы рас─ ширения достаточно было скопировать на ди─ скету саму программу и сразу следом за ней нужный драйвер. При запуске программы TR-DOS сначала загружает бейсиковую часть, внутри которой находится загрузчик, и передаёт ему управ─ ление. Загрузчик должен загрузить оставшу─ юся часть программы. В данном случае за─ грузчик загружает на один (несколько) сек─ тор(ов) больше - в зависимости от длины драйвера), и передаёт управление загружен─ ной программе. При этом в памяти уже нахо─ дится нужный драйвер,и программа сразу на─ чинает его использовать. Если теперь попробовать распространить последний вариант из рассмотренных выше для нашего случая, то получим в результате почти то же самое. Т.е.программу с набором драйверов HDD, для настройки которой сам пользователь будет в начале один раз выби─ рать нужный драйвер для подключенного IDE- контроллера и HDD. (Например, путём распа─ ковки драйвера из архива драйверов, подго─ товленных автором программы.) Но тут возникает следующая проблема.Как загрузчик программы сможет загрузить осно─ вную часть программы и сам драйвер? Для TR-DOS-программ всё было понятно - загруз─ чик обращался к процедурам по адресу#3D13 или использовал точку входа #3D2F. Для программы, загружаемой с HDD, никаких про─ цедур и точек входа нет. Можно процесс загрузки основной части программы и нужного драйвера возложить на систему,а для программ 1-го типа в качест─ ве системы выступаетSHMATRIX (прога-бут). Тогда окончательный вариант будет вы─ глядеть так (впрочем, никто не мешает каж─ дому придумать свой собственный "окончате─ льный" вариант): Бут(SHMATRIX или то,что напишет кодер) загружает исполняемый файл программы с именем (например) PROGRAM.COD, по адресу #6000, а если файл больше, чем 40960, то первую часть из файла - длина части 40960 байт. Далее бут загружает файлы с именами: PROGRAM.C00 (в страницу 0), PROGRAM.C01 (в страницу 1), PROGRAM.C03 (в страницу 3), PROGRAM.C04 (в страницу 4), PROGRAM.C06 (в страницу 6), PROGRAM.C07 (в страницу 7), в случае, если один или несколько из этих файлов существуют в данном каталоге. Их может быть и больше,если больше страниц памяти. В одном из этих файлов (например, в PROGRAM.C00 ) будет находиться кодовый блок, содержащий драйверы HDD, CD или DVD- привода для конкретного контроллера IDE, подключенного к компьютеру, на котором за─ пускается данная программа. Эти драйверы программа будет использовать для загрузки файлов,которые программа должна обработать (с HDD, CD/DVD), для записи результатов обработки в файлы, расположенные на HDD и для загрузки дополнительных частей прог─ раммы, не помещающихся в памяти (если это необходимо программе). В остальных файлах (PROGRAM.C01-C07 ) могут располагаться куски программы (гра─ фика, музыка, коды, тексты и т.д.),которые сразу будут загружены в память бутом, и программе не придется совершать лишних "телодвижений". Если программе не нужно выполнять опе─ рации с файлами, то кодовый блок с драй─ верами ей не нужен - и при этом файл PROGRAM.C00 будет отсутствовать. Откуда появится файлPROGRAM.C00 в ка─ талоге с программой? Автор программы сам подготавливает несколько вариантов такого файла: для IDE-контроллеров Nemo, SMUC, ATM, а пользователь сам переименует один из этих файлов, соответствующих тому IDE- контроллеру, который он использует. В зависимости от вида программы автор может внести в кодовый блок только драй─ веры HDD или только драйверы CD/DVD, или и то, и другое. Также если в будущем будет создан новый драйвер (например,для SD-кар─ точек) - то достаточно будет добавить его (с именем PROGRAM.C00 ) в каталог с прог─ раммой, и программа будет работать с ним. Также возможен такой вариант. В случае, если программа занимает небольшой объём, автор может не создавать этот файл, а раз─ местить все драйвера внутри основного бло─ ка программыPROGRAM.COD. При запуске пре─ длагать пользователю выбрать IDE-контрол─ лер из списка Nemo,SMUC,ATM и в дальнейшем работать с ними. Но этот вариант неудобен тем, что нельзя будет добавить драйвер пользователя, не перекомпилируя программу. И ещё может быть фантастический вари─ ант, когда кодовый блок с драйверами будет содержать ещё и драйвера файловой систе─ мы,например FAT16/FATЗ2, и тогда пользова─ тели, которые захотят использовать другую файловую систему,скомпилируют кодовый блок с драйвером, например файловой системы NTFS (или iS-DOS),скомпилируют свою версию SHMATRIX (с драйвером этой файловой систе─ мы), и программа успешно будет работать с файлами, расположенными на этих файловых системах. Теперь лирическое отступление по нашей теме под названием "один вечер из жизни спеко-кодера": Загрузчик в ПЗУ загружает с винчестера 48 секторов по 512 байт, начиная с сектора 2 от начала винчестера (если считать сек─ тора с нуля, т. е. самый первый сектор на винчестере - это сектор 0). В этих сек─ торах должен быть исполняемый код. Запишем туда ядро. При запуске ядро загружает файл sh и запускает его. Загружаем ALASM с дискеты, загружаем файлsave2hdd, компилируем и запускаем - в результате ядро запишется на винт. Итак,теперь после сброса и нажатия кно─ пки происходит следующее: загрузчик загру─ зит ядро, а ядро загрузит sh и запустит его. Файла sh еще нет на винте. Создаем sh в аласме. После запуска sh файлы стандартного ввода(1) и вывода (0) уже открыты. Добав─ ляем вывод на экран приглашения (знак ре─ шётки), далее чтение из файла с номером1 (это ввод с клавиатуры) и запись в файл с номером0 (это вывод на экран): L1 LD A,1 CALL read buf LD HL,buf1 CP 13 JR Z,ENTER_Y LD (HL),A INC HL LD (buf+1),HL LD A,0 CALL write INC C CP 32 JR NZ,l1 ENTER_Y JR l1 Компилируем и запуском командыR со─ храняем на винт - на винте теперь файл SH.RUN. Теперь у нас есть оболочка, которая мо─ жет принимать символы нажатых клавиш и отображать их на экране, а после нажатия Enter можно что-нибудь сделать, после чего перейти на следующую строку и напечатать там приглашение для ввода команды(#). Добавляем команду a, чтобы можно было переходить в ALASM из sh. Точно также до─ бавляем командуd, чтобы можно было пере─ ходить в STS из sh. Теперь после ресета и загрузки sh с ви─ нта можно по командам a и d выпадать в ALASM и STS. Теперь надо научить sh загру─ жать ALASM и STS. Загружаем ALASM с дискеты. Переходим в STS - загружаем файлalasmЧ2.C на#7900, в адрес#7800 добавляем кусочек,который ста─ вит стек на адрес#5FCO, включает страницу 1 и переносит туда аласм длиной#4000, по─ сле этого сохраняем с адреса#7800 длиной #4100 под именемal.C. Далее грузим файл sts7.C на адрес #7900, исправляем кусочек,чтобы он включал страницу 7 для STS и переносил STS на ад─ рес #DBOO длиной #2500. Сохраняем файл sl.C с адреса#7800 длиной #2600. Загружаем исходник программыSV_HD и в нём меняем имя сохраняемого наal.C, ком─ пилируем и запускаем. Повторяем для файла sl.C. Теперь на винте есть эти файлики - но уже с расширениемRUN, и нам надо добавить в sh возможность их загрузки в память с последующим запуском. Исходник SH по-прежнему находится в па─ мяти в странице 6. Переходим на него и до─ бавляем после ENTER_Y кусочек, который сначала заносит в буфер 8 пробелов,а потом переносит в буфер введённые символы до тех пор, пока не встретит пробел, либо пока не перенесёт 8 символов - это длина имени фа─ йла. Далее вызывает функциюload на адрес #7800 файла с именем в буфере.И переход на #7800, если загружено без ошибок. При оши─ бке выводим на экран строкуload error. Теперь если в sh набратьal и нажать Enter - то с винта будет загружен и запу─ щен ALASM. А если набрать sl (и нажать Enter ),то с винта загрузится и запустится STS."al" и "sl" означают alasm load и sts load. Теперь надо научить sh сохранять и заг─ ружать исходники аласма. Добавляем команды s и l. По команде s на винт будет сохраняться содержимое стра─ ницы (например, 4 - та, которая указана в аласме по умолчанию), длиной #4000,имя для файла будем брать из этой же страницы - первые 9 символов типа"SH .H" и до─ бавляем еще 2 буквы расширения"SM", в ре─ зультате на винте получаем файлSH.HSM. По командеl SH будем загружать с винта файл с именемSH.HSM(или с другим именем, указанным через пробел после комманды l) и размещать его в странице.Но предварительно проверяем: если там (в этой странице) уже есть какой-нибудь файл-исходник - первые 8 символов должны быть большими буквами, а 9-й символ равен"H" - то выводим на экран "в страницу уже загружен файл" и его имя,и вопрос, загрузить туда файл с именем, ука─ занным послеl, и это имя. По нажатии y - загружаем. * * * Шматрица Проги 2-го типа Выбрасываем из проекта многозадачной оси (MATRIX - о нём см. ниже), всё лишнее, что стесняет "души прекрасные порывы" и получаем прогу,которая показывает на экра─ не иконки, панель задач и стрелочку (кото─ рую можно перемещать по экрану с помощью клавиш, джойстиков и мышки). Это будет Шматрица. На каждую иконку назначается имя проги, которая запускается при наведении стрелоч─ ки на иконку и нажатии соответствующей кнопки на клавиатуре/мышке. Также можно предусмотреть сразу (или по нажатии некоторой клавиши) показ окна, в котором печатать имена программ под Шматрицу (например, из каталога SHMATRIX/ PROGRAM - причем путь к отображаемому ка─ талогу сделать настраиваемым). И при наве─ дении стрелки на имя проги в этом окне и нажатии кнопки прогу можно запускать. Получаем некий минимум. Первой прогой в этом каталоге можно ра─ сположить(сначала сделать) некий универса─ льный бут, который запускает всё - начиная от прог под DNA, Шматрицу и Матрицу, и за─ канчивая бейсик-файлами (с дискет) и кодо─ выми блоками, расположенными где угодно (хоть на винте, хоть на рам-диске). В качестве "бальзама на душу" желающие добавляют в Шматрицу (т.е.в эту прогу) во─ зможность таскать иконки, окна, вызывать панель задач при подведении стрелки к краю экрана, устанавливать любую картинку в ка─ честве "обоев" для рабочего стола, скрин- сейвер, а также возможность подвешивать музыку на прерывания. Шматрица может пере─ давать запускаемым (под ней) прогам сооб─ щение: мол, если тебя, прога, не затруднит и не стеснит енто обстоятельство, то вот в странице 4 (например, можно настраивать) лежит так называемая ФОНОВАЯ ЗАДАЧА -по─ жалуйста, ВАШЕ ВЕЛИЧЕСТВО ПРОГРАММА, вызы─ вайте эту задачу каждое прерывание. А про─ га на своё усмотрение может игнорировать (и ничего страшного не произойдёт) или вы─ зывать - если ей не нужна эта страница, и быстродейтсвие для этой проги не особо играет роли (типа показывалка картинки). При этом вносимые изменения могут не влиять на остальные проги, или наоборот, увеличивать "порабощение" прог. Например, можно сказать прогам не очищать экран, а печатать своё окно поверх уже существующих окон. На винт сохранять изображение свое─ го окна в отдельном файлике и весь экран в другом файлике,а координаты окна и размеры окна в третьем файлике, и во время работы проги при нажатии, например,Caps Shift+ Symbol Shift сохранять в специальный ката─ лог (например,SHMATRIX/PROC) некий файл - в котором код и данные этой проги в момент перед нажатием, после чего прога делает ресет или будет сама запускать Шматрицу. А Шматрица на панели задач показывает имена "запущенных" прог (т.е. программ,со─ хранненых в папкеSHMATRIX/PROC). И после наведения стрелки на имя проги на панели задач и нажатии кнопки Шматрица загружает в память сохранённую прогу - типа переклю─ чается на эту прогу. Но это ещё не всё: вот те файлики, ко─ торые сохраняет прога - фон под её окно и весь экран - нужны для того, чтобы при на─ ведении стрелки на любое из окон, видимых на экране,и нажатии на них, Шматрица могла путём манипуляции с этими файликами выве─ сти нужное окно на экран поверх остальных окон и после этого загрузить сохраннённую прогу,которой принадлежит это окно,и запу─ стить её, попутно передавая ей сообщение - воздействие на окно,координаты воздействия от левого верхнего угла окна и тип воздей─ ствия (левая/правая кнопка мыши и т.д.). * * * MATRIX Проги 3-го типа Вот и добрались до многозадачности. Итак, Матрица - полное рабство для кодеров... Я хотел сказать - полноценная вытесняющая многозадачность на винте, с планировщиком задач,с возможностью динами─ ческого распределения приоритетов для дис─ ковых операций и графической подсистемы. То есть можно выбирать,что будет тормозить - прорисовка окон и графики/текста в них,с достаточно быстрым чтением/записью с/на винчестер - или наоборот. Со всеми вытекающими - проге вообще ни─ чего нельзя делать без разрешения Матрицы. Прога даёт запрос и ждёт, пока Матрица со─ изволит обратить на прогу внимание. И это касается всего - начиная от печати одной буквы на экране, загрузки куска файла (а перед этим надо ещё попросить память под это дело), и заканчивая тем, что для проги не существует никаких экранов (первый,вто─ рой),никакой гарантии быстродействия - так как любое ускорение программы изнывающим от безделья кодером сводится на нет сразу после того, как пользователь запустит ещё одну программу (или пару-тройку программ). Если с памятью дело обстоит не так пло─ хо - всё-таки относительно небольшое число прог (из всей массы) использует даже всю 128K память - а, например, довольствуются 64K+второй экран, то с процессорным време─ нем приходится надеяться на турбо-режим. [Конечно, это не касается программ, ко─ торые в основном ожидают действий юзера. Запустить компилятор параллельно с редак─ тированием текста всё-таки можно.] См. также проект структуры памяти и на─ бора функций системы: http://zx-pk.ru/showthread.php?t=10781
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября