NoName Так включи страничную адресацию. Замени првый мегобайт вторым и включи виртуальный режим с разрешеными портами и перенаправленнымипрерываниями. Сделать это легко.
Что-то я тебя не понимаю: *.com файл это просто образ памяти - код, данные и будущий стек вместе взятые, помещённые в один сегмент. Запускается он простой загрузкой в память и передачей управления в начало кода (файла). Дос "подклеивает" *.com после специального блока psp, размером 0x100, место под который резервируется заранее ORG_100h. Т.е. код идёт с начала файла, а то что после загрузки произойдёт смещение на 0x100, держим в уме.
NoName Интересная постановка задачи - ты столько писал что собираешся затереть ДОС своим кодом за ненадобностью и вдруг: ) Я собственно предлагаю вообще не бороться с ДОС: Код (Text): // запись word за пределы 1Мб void outHiMemW(unsigned long addr, unsigned int data){ __asm { _emit 0x66 // 32битные данные mov si, word ptr [addr] // это: mov esi, dword ptr [addr] mov ax, [data] _emit 0x65 // GS _emit 0x67 // 32битный адрес mov [si], ax // это: mov gs:[esi], ax } } // чтение word за пределами 1Мб unsigned int inHiMemW(unsigned long addr){ __asm { _emit 0x66 // 32битные данные mov si, word ptr [addr] // это: mov esi, dword ptr [addr] _emit 0x65 // GS _emit 0x67 // 32битный адрес mov ax, [si] // это: mov ax, gs:[esi] } } Это пример, как можно унреально обращаться за пределы 1Мб, хотя вариаций на эту тему можно много напридумывать ) ЗЫ: 16 битного компилятора под рукой нету, так что может быть придётся что-нибудь подправить в коде по мелочи чтобы заработало
ConstZ Я грузил просто tasm .com файл (в 0xFFFF:0100). Все нормально работало без гемора с псп. Большая часть кода загрузчика написана на си в bc45 и он видимо что то хочет от псп. Я же хочу чтобы файлов было меньше, т.е. чтобы программа грузила сама себя. Нужно что то делать с ним. Я пробовал 55h и 50h и т.п. Эффект от зависания до простого непонятного выхода обратно в консоль. Pavia спасибо, читаю. Y_Mur проверка файлов происходит перед их использованием Потом дос уже ненужен. Насчет страничной адресации и unreal mode (итак юзаю для копирования из старших мегабайтов вниз) - тот вариант что вы предлагаете к сожалению мне неподходит по разным причинам.
и еще один вопрос. Как ускорить копирование данных из верхних мегабайтов в нижний с помощью унриал моде? Я бы с радостью сделал rep movsd но сегмент es для этой команды нельзя переназначить. Его не перегрузить потому что я юзаю дос вызовы и вообще си компилятор. Копировать двордами это как то несерьезно.
NoName Ну во первых копирование двордами невыравненных двордов существенно быстрее чем rep movsd ) с выравненнными соизмеримо по скорости , а во вторых что мешает добавить push\pop es ? http://www.wasm.ru/forum/viewtopic.php?pid=86928#p86928 http://www.wasm.ru/forum/viewtopic.php?pid=219558#p219558
с памятью HMA я разобрался просто и гениально Единственный ньюанс что bochs не поддерживает в должной мере эту область (например при запись в нее происходит зависание).
Y_Mur Как скопировать теневой регистр из fs в es? Помойму это невозможно без перевхода в защищенный режим, а оно занимает много тактов процессора.
NoName В той статье про унреал: Так что можешь не обращать внимания на теневую часть регистра, которая в твоей задаче совершенно не нужна, а оперировать сегментными регистрами как обычно в дос. Это не позволит перенести начало сегмента за пределы 1Мб, ну и ничего страшного ты же и так можешь адресовать 4Гб + 1Мб ЗЫ: я уже плохо помню свои опусы в унреале, но вроде бы так тогда и делал.
Гружу правильно (начиная с адреса FFFF:0100) com подпрограмму в HMA (64кб сверху). Она состовляет основную программу, я просто копирую одну процедуру, т.к. она базо независима. Передаю управление, она выполняется корректно (звуковой цикл, типо мелодии). Управление ей передаю с помощью Код (Text): push FFFFh push 100 retf Затем из нее передаю управление в другой модуль с помощью Код (Text): push edx retf Управление передается, но модуль функционирует неправильно. Происходит либо перезагрузка либо жесткое зависание. Тогда я делаю в подпрограмме вызов: Код (Text): org 100h ... push 0FFFFh push offset go_beep retf "go_beep Near DGROUP:012C" И она виснет!!! Винт отключен, флешка отключена. Загрузка происходит из внутренней памяти. После записи подпрограммы происходит проверка правильно ли она записана, так что искажение кода тут врятли. Видимо при каких то условиях переходы перестают работать. Пробовал не грузить в сегментные регистры ss,ds,es последний сегмент, эффект остается. Это из за загрузки в cs? Можно ли это как то победить? Не думал что так получится В доках на gx1 слово hma вообще не встречается.
Когда я давно игрался с унреалом у меня даже инета не было и действовал методом научного тыка - нельзя, но очень хочется - щас попробую - ура получилось ) И только потом я узнал, что это был подарок от моего bios который после post выходил в unreal. Теперь у меня bios таких подарков не делает, но пошаманив над кодом из той статьи вроде удалось получить практически тоже самое - сегментные регистры ds, es, fs, gs можно свободно менять как обычно в dos, при этом их унреальная функциональность полностью сохраняется, а любое значение занесённое в них как и положено *16 и прибавляется к смещению не зависимо от того 16 или 32 битное это смещение. Единственная тонкость - таблицу GDT нельзя затирать, поэтому если разделить переход в унреал и его использование по разным программам, то придётся позаботиться об её сохранности (или пусть каждая программа создаёт и регистрирует свою GDT, тогда затирание чужой уже не вредит унреалу . Прога (на tasm) переходит в унреал, заливает экран через LFB синим цветом, используя rep stosd, затем es восстанавливается из стека и продолжает использоваться как обычно в dos ЗЫ: кто ещё захочет поэкспериментировать - не забываем что унреал любит настоящее железо, а не эмулированное, особенно виндой )
Все почти работает. У меня есть старый загрузчик которым я гружу такой же автономный модуль что и новым. Старый не использует HMA. Я добавляю в него для проверки очистку всех регистров кроме sp,bp,ss,ds,cs. Грузится нормально. Я включаю в нем a20, грузится нормально (там довольно сложная система в загружаемом коде). Как только я делаю стек в hma с теми же параметрами то ловлю красный экран с мигающими линиями. При передаче управления с помощью Код (Text): db 09ah offset dw ?; жестко прописанные segment dw ?;адреса Точка входа индентична точке входа которую показывает старый загрузчик. Параметры передаются гарантированно правильно (есть проверочный мини модуль который отрабатывает передачу управления нормально, показывает все параметры и делает возврат обратно, там звуковой сигнал в hma, он тоже отрабатывает; он только меньше по размеру и функциональности). Результат передачи управления новым загрузчиком - зависон (есть индикация что управление передалось но где то в самом начале работы произошло нечто необъяснимое). Буду рад за идеи. Мне сложно понять в чем дело.
Код (Text): in al,92h or al,2 out 92h,al mov ax,0xFFFF mov ss,ax mov sp,0FFF0h mov bp,sp Естественно прерывания запрещены. Также я делаю стек в новом загрузчике перед передачей управления в hma. Во втором загрузчике правда a20 открывается гораздо раньше.
вот еще забыл написать. Если я вызываю новым загрузчиком его подпрограмму запуска в hma и делаю там сразу retf то потом происходит возврат в дос и с ним все нормально внешне, т.е. команды выполняет, все работает.