Помогите плиз разобраться (только "на пальцах" если можно):
1. Программа СОМ не может превышать 65535 байт из-за размера страниц по 65к - здесь все понятно
2. Как выглядит карта памяти при ЕХЕ-проге размером 40кб и как при 510Кб? А если данных завались и сегмента данных не хватит, что произойдет тогда? Какой объем сегмента данных?
2.1. Почему-то в описаниях все сухо и сжато и не говорится от том, что если текстовый редактор в 500кб, причем все 400кб - код, остальное для текста, то как это все увязывается в ОЗУ? Видимо одна часть программы следит за клавишами и сидит в одном сегменте, а вывод текста в другом, а сохранение файла в третьем, а если сама процедура превышает 65к, то что получается, происходит JP в другой сегмент и счастье продолжается? А если 16-битный регистр может обращаться только к области RAM до 65535, то 32-битный наверное к 4Гб, правильно? (типа как мне переместить 10 Мегабайт данных с точки адреса памяти 1024576 в 2048000?).
2.2. Вообще-то, если бы в IBM-PC было не 10 банок по 65к, а больше, то теоретически, можно было бы создать драйвер непрерывной памяти в 4Гб (65535_банка *65535_16 битный регистр сегмента = 4.294.836.225 байт)
Но, скорее всего я не понимаю карту памяти IBM-PC и принцип работы программ.
3. Как включить режим 640*480&256 цветов (VGA), например в Турбо Паскале стандартно режим 640*480&16 и в хэлпе ни слова как получить 256
3.1. Не могли бы Вы кто-нить пожертвовать асм-код, для того, чтобы врубить этот режим и ессно вернуть прежний (если Паскаль умеет по выходу возвращать свой текстовый режим, то плиз отключения не надо)
3.1.1. Хочу в Паскале вывести 256-цветную картинку, но в 16 цв. понятно, что все за пределами 16 выводится коряво
4. Включается какой-то сегмент и после этого, если в оперативку посылать значения, то байты рисуются точками на экране. Как это понимать, часть ОЗУ компьютера отдано под видео, т.е. там не размещается код программы?
5. Последнее У меня 2048 байт находится по адресу 9000DEC их надо перекинуть в 2000DEC, есть ли команда, которая делает это одним махом?
Блин, наверное я не так выражаюсь, но кто юзал Z80 это будет примерно так:
LD HL, 9000
LD DE,2000
LD BC,2048
LDIR
RET
Вот хочу теперь все это "кроссассемблировать" на IBM-PC.
))))))))))))))
nonpascaler, давай договоримся, что все вопросы по Паскалю ты будешь задавать в соответствующем форуме (и, естественно, после того, как воспользуешься поиском). А то, что ты поиском не пользовался - очевидно. Иначе вопрос 3.1.1 у тебя просто не возник бы:
http://forum.pascal.net.ru/index.php?s=&showtopic=2273&view=findpost&p=19186
(сами драйвера лежат здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=3921&view=findpost&p=34522)
Здесь тоже покопайся:
http://forum.pascal.net.ru/index.php?showtopic=5256
А вот еще вопрос:
режим 320x200 & 16
Адрес $A000, это экран да? И вот программа находится у меня в каком-то одном сегменте, а данные спрайта в другом. Какой будет маинный код, перемещающий байт из одного сегмента в графический, экранный?
Загрузил несколько картинок в память (они влезли в банку 65535), теперь хочу любую из них выкинуть на экран, что-то вроде мультфильма. Это наверное надо включить один сегмент(где спрайты), взять из переменной адрес, затем по этому адресу в АХ загрузить первый байт, потом переключиться в сегмент экрана, найти адрес и из АХ загружаю байт в память экрана и так группу байт. Потом, вероятно вторую линию введу (расчитав адрес ровно под первой линией) и так прямоугольный рисунок по идее должен появиться на экране.
Напишите пожалуйсто исходник, будьте добры. Потом хочу использовать его как движок, выводя в игрухе спрайты, ну и продумаю сохранение фона под ним, это естесссно.
Плииииз.
И еще, какие сегменты в ДОС можно использовать для своих нужд, (для программ, для данных)?
Скриншот из игрухи.
Вот выводится этот текст хуже чем ужасно, думаю закинув свой шрифт 2048 байт в оперативку, смогу ассемблером выводить быстрее. Поверьте, привело меня сюда не просто какое-то желание поболтать, засоряя форум. Асма для ПЦ не знаю, начинать с почти нуля ради какого-то фрагмента кода желания особо нет.
Плииииз.
Эскизы прикрепленных изображений
Возвращаясь к посту о перемещении больших блоков данных.
Порылся в справочнике асма. Либо это команда
MOVS - Move String (Byte or Word)
Usage: MOVS dest,src
MOVSB
MOVSW
MOVSD (386+)
Modifies flags: None
Copies data from addressed by DS:SI (even if operands are given) to
the location ES:DI destination and updates SI and DI based on the
size of the operand or instruction used. SI and DI are incremented
when the Direction Flag is cleared and decremented when the Direction
либо
REP - Repeat String Operation
Usage: REP
Modifies flags: None
Repeats execution of string instructions while CX != 0. After
each string operation, CX is decremented and the Zero Flag is
tested. The combination of a repeat prefix and a segment override
on CPU's before the 386 may result in errors if an interrupt occurs
before CX=0. The following code shows code that is susceptible to
this and how to avoid it:
again: rep movs byte ptr ES:[DI],ES:[SI] ; vulnerable instr.
jcxz next ; continue if REP successful
loop again ; interrupt goofed count
next:
Clocks Size
Operands 808x 286 386 486 Bytes
none 2 2 2 1
В последнем примере очень похоже на то, что байт взят из области 1, перемещен в область 2, адреса в источнике и получателе увеличились на байт, а счетчик (CX) уменьшился. Все повторяется автоматом до тех пор, пока в счетчике не будет ноль. Еще бы расшифровать "ptr ES:[DI],ES:[SI]" ;-(
Практическое применение: Можно рисовать в граф_редакторе на видимом экране и сохраняться в любом выбранном заранее свободном сегменте. По команде "отмена" прежде сохраненное изображение моментально восстанавливается из UNDO-сегмента в видимый экран. Если определить число свободных сегментов в системе, то можно устроить своеобразный RAM-диск для картинок.