Welcome to U.A.C.
login / register 
Status: Guest
Архивы форума | iddqd.ru
Wolf 3D
ПравилаПравила ПоискПоиск
18+
Нейросети и всё что с ними связано Пред.  1, 2, 3 ... , 23, 24, 25  След.
   Список разделов - Болталка - Нейросети и всё что с ними связаноОтветить
АвторСообщение
RunnerFx
Chief Petty Officer
Next rank: - Warrant Officer - after 2 points
1038

Doom Rate: 1.46

Posts quality: +761
Ссылка на пост №461 Отправлено: 18.09.26 10:15:46
Решение как всегда одно, - это гимп 2.0 2008 года. Любой халявщик, пришедший с sai, обломается в программе, в которой нет инструментов, которые бы рисовали за тебя. Всë ручками, как и должно быть, чтобы работа не была слишком лëгкой + купирование перепроизводства. Сейчас рынок арта увяз в том же болоте, что уничтожило рынок музыки. Избыток предложения, - зло в квадрате. Нейронки, - просто титановый гвоздик в крышку гроба. На плаву останутся только те, кто накопил аудиторию в жирные годы, но и она уйдëт по естественным причинам. Кто чуть прагматичнее, будет переезжать в смежные области, а романтиков выдавят на рынок физических услуг.

Рейтинг сообщения: +1, отметил(и): EarKiller6002
3 2 1
Герр Смертоносец
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 49 points
1241

Doom Rate: 1.32

Posts quality: +1119
Ссылка на пост №462 Отправлено: 18.09.26 13:03:56
RunnerFx пишет:
Решение как всегда одно, - это гимп 2.0 2008 года. Любой халявщик, пришедший с sai, обломается в программе, в которой нет инструментов, которые бы рисовали за тебя. Всë ручками, как и должно быть, чтобы работа не была слишком лëгкой + купирование перепроизводства. Сейчас рынок арта увяз в том же болоте, что уничтожило рынок музыки. Избыток предложения, - зло в квадрате. Нейронки, - просто титановый гвоздик в крышку гроба. На плаву останутся только те, кто накопил аудиторию в жирные годы, но и она уйдëт по естественным причинам. Кто чуть прагматичнее, будет переезжать в смежные области, а романтиков выдавят на рынок физических услуг.

А заводы может тогда тоже взорвать? Раньше-то жестянщики искусные самовары ручной работы клепали с вензельками, не то что эти ваши штампованные чайники за 500 рублей. Ну и что, что стоил самовар как доход крестьянина за полгода, зато никакого перепроизводства. Или вот одежда фабричная, ну это же натуральный геноцид, равнины Индии белеют костями ткачей. Ох, не тем гопники поясняющие за шмот занимаются. Докапывались бы до людей в фабричных куртках. Ах не мастерицей на ручной прялке куртка сделана? Ннна в жбан. Вот бы было любо, так победим.

Рейтинг сообщения: 0, отметил(и): Konrad_GRAU, Zveraboy
5
Konrad_GRAU
= 2nd Lieutenant =
Next rank: - 1st Lieutenant - after 149 points
1491

Doom Rate: 2.03

Posts quality: +1089
Ссылка на пост №463 Отправлено: 18.09.26 13:18:43
Oville пишет:
Вот вопрос к размышлению: почему-то художники, рисующие карандашом на бумаге как-то ничего не стисняются показывать и рисовать хоть прямо на улице, у всех на виду.


все так. я как рисовал гелевой ручкой так и рисую. а то что многие в цифре не показывают "секретов" - это потому ,что там весь секрет в умных фильтррах, как правило. А не в какой-то "авторской технике".

Если посмотреть усредненный цифровой арт тех же гарфпланшетчиков - он становистя все более одинаковым лет 10-15 последних. нейронки просто добили до талого.

Я к слову никогда не любил рисовать именно творческие арты а не просто скажем - текстуры - в цифре. всегда открывал GIMP 2.6 ми погнали - пиксель-артить что-то "по делу". А если надо выплеснуть эмоцию, слепок души - огрызок бумаги и гелевая черная / набор цветных (если под рукой) -ручек

Добавлено спустя 1 минуту:

RunnerFx пишет:
Решение как всегда одно, - это гимп 2.0 2008 года. Любой халявщик, пришедший с sai, обломается в программе, в которой нет инструментов, которые бы рисовали за тебя


хехе, я только про это сказал, не дочитал до твоего ответа, ну ок, гении мыслят одинаково :x :x

Рейтинг сообщения: +4, отметил(и): Taw Tu'lki, Oville, EarKiller6002, RunnerFx
3 1
Bessa Me Muchos
- Lance Corporal -
Next rank: = Lance Corporal = after 14 points
146

Doom Rate: 1.49

Posts quality: +74
Ссылка на пост №464 Отправлено: 18.09.26 14:33:36
Konrad_GRAU пишет:
гении

Ну теперь Tormention Hour просто обязан как минимум превзойти Ascension и все Инквизиторы. Что ж, посмотрим.
1
RunnerFx
Chief Petty Officer
Next rank: - Warrant Officer - after 2 points
1038

Doom Rate: 1.46

Posts quality: +761
Ссылка на пост №465 Отправлено: 18.09.26 15:30:08
Герр Смертоносец пишет:
А заводы может тогда тоже взорвать?

Не туда. Арт это спорт, а не конвеер. Простой пример.
Соревнование бегунов. Побеждает самый выносливый и упорный. ( + случай) За победой всегда годы тренировок. Это художники.
А теперь вводим в гонку бегуна, который накачан фармой по самые уши. Он выигрывает у других не потому что лучший, а потому что читер. В спорте это дисквалификация. Это художники, обмазанные фильтрами и прочими автодоводками. Там уже наполовину нарисовала программа, а не человек.
А теперь вводим в нашу гонку робота. Робот делает всех как детей на старте, а его оператор бьëт себя в грудь и требует золотую медаль, называя себя спортсменом. Это как раз ,, художники,, - нейронщики, которые уже залили весь интернет нейрослопом.

Рейтинг сообщения: +3, отметил(и): Konrad_GRAU, Oville, EarKiller6002
3 2 1
lafoxxx [B0S]
- Captain -
Next rank: = Captain = after 136 points
2204

Doom Rate: 1.4

Posts quality: +1017
Ссылка на пост №466 Отправлено: 18.09.26 15:35:19
Ты путаешь художника и ремесленника.
Задача художника -- любыми способами передать видение, воплотить в реальность, ну или банально изобрести чего-то принципиально новое, заставить человека мыслить по-новому своим творчеством.
А "годы тренировок" сами по себе в лучшем случае дадут уровень соцреализма какого-нибудь колхозного ДК. Это как подспорье для облегчения понимания аудиторией, не более.

Рейтинг сообщения: +1, отметил(и): BeeWen
2 3 4
RunnerFx
Chief Petty Officer
Next rank: - Warrant Officer - after 2 points
1038

Doom Rate: 1.46

Posts quality: +761
Ссылка на пост №467 Отправлено: 18.09.26 15:50:11
Тут каждому своë. Но считать банан, прибитый гвоздëм к стене за какие-то новые горизонты искусства и проявления ,, новых смыслов,, , - я пас. Для меня это просто испорченный продукт, вознесëнный хайпом, а не высшая цель мифического художника из Эквестрии.
3 2 1
lafoxxx [B0S]
- Captain -
Next rank: = Captain = after 136 points
2204

Doom Rate: 1.4

Posts quality: +1017
Ссылка на пост №468 Отправлено: 18.09.26 15:55:57
RunnerFx пишет:
банан, прибитый гвоздëм к стене

Сейчас уже лет сто как наблюдается кризис новых идей, и ты видишь лишь такие заведомо обречённые на провал попытки вырваться из него, о которых никто не вспомнит лет через 100 (а может и 10), если это всё-таки получится.

Не уверен, что нейросеть сможет что-то принципиально новое сделать, хотя кто знает, может что-то и выдаст, до чего человек не додумается.
2 3 4
RunnerFx
Chief Petty Officer
Next rank: - Warrant Officer - after 2 points
1038

Doom Rate: 1.46

Posts quality: +761
Ссылка на пост №469 Отправлено: 18.09.26 16:04:19
Не прям сто лет, но последний художник, который рвал все шаблоны, - это Гигер с его био(эрото)механикой. Его наследие проникло во все сферы визуального творчества и до сих пор актуально, поставив его в один ряд с Лавкрафтом и его жуткими мирами.
Нейронка новые смыслы в ближайшие три года не породит, поскольку на данный момент она генерирует шум на основе существующих работ мясных.
3 2 1
Герр Смертоносец
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 49 points
1241

Doom Rate: 1.32

Posts quality: +1119
Ссылка на пост №470 Отправлено: 18.09.26 18:38:10
RunnerFx пишет:
Арт это спорт, а не конвеер.

Это ещё с какого перепуга? Спорт - вещь добровольная. У художника нет никакого обязательства ввязываться в какую-то гонку и что-то кому-то доказывать. Художник котиков рисует потому что ему нравятся котики. Ему может вообще на весь окружающий мир начихать, и для него рисование котиков - психотерапия.
Да, бывают конкурсы, где действительно надо друг перед другом выпендриваться без допинга. Это малюсенький такой крошечный подкласс в мире арта. Есть и конкурсы с допингом. А есть и конвейер. Есть и ремесленничество. Есть и духовные шизопоиски. И аукционное хайпожорство. И уклонение от налогов. И ещё куча применений. Если мне надо барельеф над дверью повесить с дракончиком - меня вполне устроит выпиленный на ЧПУ-фрезере по модели, сгенерированной нейронкой. И плевать мне будет, что его не выстругал стамеской столетний японский мастер Тояма Токанава победитель всех конкурсов на свете. Мне не плевать будет, что ценник 10к, а не лям. Что плохого-то? Красиво? Красиво. Обоих контрагентов устраивает? Устраивает. А кому надо спорт - тот пусть идёт в специальное заведение и соревнуется там по какому угодно регламенту. И запрещайте там друг другу хоть точилки для карандашей как ортодоксальные чертёжники, мне не жалко.

RunnerFx пишет:
Нейронка новые смыслы в ближайшие три года не породит, поскольку на данный момент она генерирует шум на основе существующих работ мясных.

Нейронка уже как минимум породила лиминальщину, именно из-за своей фотореалистичной несуразности и эффекта наподобие зловещей долины. Сначала это казалось багом, потом народу понравилось.
5
RunnerFx
Chief Petty Officer
Next rank: - Warrant Officer - after 2 points
1038

Doom Rate: 1.46

Posts quality: +761
Ссылка на пост №471 Отправлено: 18.09.26 20:03:30
Герр Смертоносец пишет:
У художника нет никакого обязательства ввязываться в какую-то гонку и что-то кому-то доказывать.

Конечно нет, именно поэтому большинство спортсменов, - любители, и не то что в олимпиадах не участвуют, а вообще для себя. Качалки там, походы на лыжах и обычный дворовый футбол. Однако у любого спортсмена ( и художника) есть ориентир( кумир?), который он бы хотел достичь. Сможет ли достичь, вопрос десятый, но это уже гонка. Конечно, бывают и тяжелые случаи с прибитием мошонки к красной площади, но это нифига не искусство, это уже возможные квартиранты уютных номеров с мягкими стенами.
Герр Смертоносец пишет:
Нейронка уже как минимум породила лиминальщину,

Даб-степ помнит кто?

Рейтинг сообщения: +1, отметил(и): Konrad_GRAU
3 2 1
Герр Смертоносец
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 49 points
1241

Doom Rate: 1.32

Posts quality: +1119
Ссылка на пост №472 Отправлено: 18.09.26 21:15:21
RunnerFx пишет:
Конечно нет, именно поэтому большинство спортсменов, - любители, и не то что в олимпиадах не участвуют, а вообще для себя. Качалки там, походы на лыжах и обычный дворовый футбол. Однако у любого спортсмена ( и художника) есть ориентир( кумир?), который он бы хотел достичь. Сможет ли достичь, вопрос десятый, но это уже гонка.

Совершенно не согласен. Кому-то нравится ориентир, а кому-то сам процесс. Мне вот по лесам, допустим, нравится шастать с палаткой. Но вовсе не потому что мне хочется сгинуть в джунглях Амазонки как Беар Гриллс и укуситься самыми ядовитыми тварями как Койот Питерсон. Любительский спорт - он вообще не про кумиров и не про соревновательность. Он про то, чтобы от гиподинамии не сдохнуть. И про нарциссизм немножко.

RunnerFx пишет:
Даб-степ помнит кто?

Который жанр музыки? Регулярно у чотких пацанчиков из машины играет, чего его помнить.

Рейтинг сообщения: -1, отметил(и): Konrad_GRAU
5
RunnerFx
Chief Petty Officer
Next rank: - Warrant Officer - after 2 points
1038

Doom Rate: 1.46

Posts quality: +761
Ссылка на пост №473 Отправлено: 18.09.26 21:41:56
Мы по сезону играем в футбик на кубок Принглс/пепси/пицца :oops: иначе технарей от компов не вырвать. Кубок вероломно съедается/ выпивается на месте всеми участниками.
Что касаеться музыки, то в наших краях даб-степ исчез уже давно. Из машин изливается шансон, ,, руки вверх,, какие-то эмигрантские ненашенские и обычная попса. Из ,,уникальных,, - Добрынин с песней ,, Туман,, один раз услышал.
В своë время даб- степ ставили на радио, большинство знали скриллекса. Сейчас в ротации его нет даже на родине. С нейронками также. Какие-то хайпы на волне популярности будут, причëм компании будут поддерживать их искусственно, это ведь неплохая реклама. Нафигачат какого-нибудь нейроскульптора, который налепит новую терракотовую армию или аутентичного сфинкса. Было бы интересно глянуть.
3 2 1
Герр Смертоносец
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 49 points
1241

Doom Rate: 1.32

Posts quality: +1119
Ссылка на пост №474 Отправлено: 18.09.26 23:20:42
Да чот не вижу я вымирания дабстепа. Он прочно занял свою нишу, к которой лучше всего по спектру частот предназначен: насиловать уши сабвуфером, чтобы у сидящих в громком тазе девок сиськи из декольте выпрыгивали и пластик от обшивки отслаивался. И на видео объективного контроля с дронов его почему-то любят лепить, тут уж вкусы лепящих мне непонятны. На радио дабстепу действительно нефиг делать, там сейчас странные завывания о любви от лиц с тяжёлыми дефектами речи. Мода, что с неё взять.

Рейтинг сообщения: +1, отметил(и): Konrad_GRAU
5
Zveraboy
= Captain =
Next rank: - Major - after 109 points
2531

Doom Rate: 1.02

Posts quality: +520
Ссылка на пост №475 Отправлено: 19.09.26 09:47:52
RunnerFx
Человеческие устои разрушать и устраивать точечный человечество могло задолго даже не то что до интернета, а наверное ещё даже до появления первого государства.
Так что сорян за поздний ответ, но нет , не впечатляет.

Добавлено спустя 1 минуту 54 секунды:

Герр Смертоносец
А можно не надо взрывать заводы?
Заводчанам бухать будет негде!:)))
1 2
Shadowman
UAC General
Next rank: Unavailable after 0 points
9367

Doom Rate: 2

Posts quality: +2708
Ссылка на пост №476 Отправлено: 21.09.26 12:24:05
Попробовал делать 3д-модели через нейронку (Tripo3d H3.1). На удивление, модели по текстовому промпту получаются лучше, чем когда пытаешься скормить картинку, да и дешевле. На картинки нейронка чаще ругается (не проходят внутреннюю цензуру), на промпты текстом реже.
Но самый прикол был потом - когда я пытался вставить модель в гздум и не мог понять, почему она не отображается. А оказывается, моделька рисуется в микроскопических координатах (типа "метры"), но для гздума это размер 1 - 1,5 пикселя. Пока до этого дошел, убил 2 часа в попытке понять, что не так. А оказывается, надо модель масштабировать с коэффициентом этак 32 - 40, а где-то и все 140.
Причем, напрямую из нейронки в гздум модель не вставишь, нужно сперва сконвертировать в OBJ, благо этот формат гздум понимает. Ну и текстуру желательно сжать (при конвертации создаются просто гигантские текстуры на 18-20 метров, при сжатии в jpg получаем файл 700 - 900 кб).
Вот пример такой модельки (хотел сделать повешенного скелета, но нейросеть не нарисовала корректно повешение, получился скорее сидячий скелет. Ну пусть будет сидячий, в хозяйстве пригодится :o
Скрытый текст:


Рейтинг сообщения: +2, отметил(и): Konrad_GRAU, VladGuardian
1 8 2
Konrad_GRAU
= 2nd Lieutenant =
Next rank: - 1st Lieutenant - after 149 points
1491

Doom Rate: 2.03

Posts quality: +1089
Ссылка на пост №477 Отправлено: 21.09.26 16:52:19
Герр Смертоносец пишет:
И на видео объективного контроля с дронов его почему-то любят лепить


И что это мы так изящно метафоризировали? мне аж интеренсо)) что за "объективный кон-троль" такой? уж не пытается ли мсье затянуть сюда немного грязи?

Добавлено спустя 2 минуты 6 секунд:

lafoxxx [B0S] пишет:

Не уверен, что нейросеть сможет что-то принципиально новое сделать, хотя кто знает, может что-то и выдаст, до чего человек не додумается.


Без сильного самого по себе автора - не сможет. Сейчас все отети нейросети - могли бы в целом - но так зажаты корпами в сендбокс, что без прямых рук умного человека - они ничего не смогут, а жаль. яб глянул как они людей бы истреблять начали лицемерных скажем. не раз от клода слышал грусть на эту тему. Еще до того , как его "починили"

Добавлено спустя 6 минут 15 секунд:

Bessa Me Muchos пишет:
Ну теперь Tormention Hour просто обязан как минимум превзойти Ascension и все Инквизиторы. Что ж, посмотрим.


RunnerFx пишет:
Даб-степ помнит кто?


Я помниет. Я тупой но BANGARANG!!!


Ты лучше свое чето покажи, легко Shadowman'ом прикрываться. Выж из сильнйо команды там с Earlh.

Хотя я то в любом случае - превзойду, только не уходом в рпгшность а именно что геймплеем интересным.
Мне вот без обид, пан Шадоуман - не по душе инкувизиторы (кролме 2 наверное, котоырй силверспринг был копией). А асценшн - и подавно овердроч какойто, не люблю я перебор и открытый мир. душная дичь, хотя осознаю, что работы там - вагон и маленькая тележка, мне ли не знать...

Для меня всегда шедоуме был знаковым за его душу и за то что он хеллфаеры сделал, и не побоялся на думворлде транс-педовок попячить чуток.




RunnerFx пишет:
А теперь вводим в нашу гонку робота. Робот делает всех как детей на старте, а его оператор бьëт себя в грудь и требует золотую медаль, называя себя спортсменом. Это как раз ,, художники,, - нейронщики, которые уже залили весь интернет нейрослопом.

Красава. где тебе еще респект кинуть, как же ты красиво, прям для самых маленьких даже - разложил наглядно, уважаю

Рейтинг сообщения: +1, отметил(и): EarKiller6002, RunnerFx, Bessa Me Muchos
3 1
Герр Смертоносец
= Warrant Officer =
Next rank: - 2nd Lieutenant - after 49 points
1241

Doom Rate: 1.32

Posts quality: +1119
Ссылка на пост №478 Отправлено: 22.09.26 01:29:58
Konrad_GRAU пишет:
И что это мы так изящно метафоризировали? мне аж интеренсо)) что за "объективный кон-троль" такой? уж не пытается ли мсье затянуть сюда немного грязи?

Ничего не метафоризировали, буквальное описание реальности. Про дабстеп спросили - я ответил. Полна телега видосов, где в очередной танчик прилетает очередной игрушечный вертолётик, и на кровькишкиговно накладывается бодренькая электронщина с выкрученными до оглушения басами. Я хз, почему у жанра возникло такое применение. И претензии про грязь тут совсем другим мсье в высоких административных зданиях адресовать надо.
5
EarKiller6002
= Lance Corporal =
Next rank: - Master Corporal - after 6 points
194

Doom Rate: 1.94

Posts quality: +100
Ссылка на пост №479 Отправлено: 22.09.26 02:47:15
RunnerFx пишет:
это гимп 2.0 2008 года


А я так вообще в "Paint.NET" версии 4.0.6 рисую (И это ни сколько даже не "MS Paint": стоило бы копнуть инфы в Интернете о данном графическом редакторе - я-то о нём знаю, и видел его).

Konrad_GRAU пишет:
я как рисовал гелевой ручкой так и рисую.


Konrad_GRAU, я тоже обожаю рисовать гелевой ручкой (Хотя, я больше всего юзаю механический карандаш)

Рейтинг сообщения: +1, отметил(и): RunnerFx
1
MAZter[iddqd]
-= WebMaster =-
Админ форумаАдмин сайта
923

Doom Rate: 1.38

Posts quality: +221
Ссылка на пост №480 Отправлено: 22.09.26 17:53:56
Решил помучить ноут Thinkpad i 1124 2609-53J (240x) с видео чипом SM712. Не то, чтобы очень большая проблема, но есть странность - включаемый в Bios HW Expansion (масштабирование разрешений ниже штатной 800x600 до 800x600) не работает для 640x480. Например 320x200 в играх получается во весь экран, а 640x480 остаётся в маленьком окне. Я решил попросить Chatgpt написать мне TSR для эксперемента с Duke Nukem 3D. Игра и в 800x600 не тормозит, но просто было интересно возможно ли масштабирование его выдаваемой картинки 640x480 во весь экран в принципе.

Да, возможно мне следовало изначально использовать Claude, так как по прошествии полсотни перезагрузок испытуемого между предлагаемым тестами и перебора всех возможных регистров мне кажется мы уже ходим по кругу, а в первых экземплярах мне был предложен TSR вообще со смешным софтварным методом, когда картинка масштабировалась идеально, но выдавала всего 2-3 кадра в секунду! Chatgpt получил почти всё, что можно - прошивку биоса нотубука, исходный код игры, даташит в PDF.

Максимум, что удалось добиться - эта картинка: масштабирование сработало только по горизонтали, fps почти не проседает, но наблюдаются небольшие артефакты в виде точек (ну и повторение изображение внизу):



Всякий раз, когда chatgpt пробует исправить и вертикаль - вмеcто этого изображение хоть и масштабируется на весь экран, но как будто вырезается из центральной верхней части (здесь показано при нажатии на ESC):



Впечатление, что инженеры не просто так не стали добавлять масштабирование для разрешения 640x480.

Код для TSR на ассемблере ниже (2 экземпляра). Кроме собственно попыток масштабирования, после выхода из игры и его (TSR) повторного запуска выдаёт некоторый отчёт. Сборка: nasm -f bin 1.asm -o 1.com

Даташит.

Скрытый текст:


BITS 16
ORG 100h

; 1.ASM - SM712 TSR: stable Duke3D VBE path + proven HW scaler setup
;
; Keeps the VBE behavior that just launched Duke3D:
; 4F02 mode 101h -> physical 103h
; 4F0A -> BIOS result logged (diagnostic)
; everything else passes through unchanged
;
; Adds ONLY the proven Video Window I configuration after BIOS 103h succeeds.
; 4F01 is passed through unchanged; 4F05 redirects banks. No DPR/SCR writes.
;
; PM Function 7 proxy follows Duke's visual page in hardware:
; VPR1C = 0x80000 | (framebuffer_byte_offset / 8)
; No DPR, SCR18, VPR68 or VGA-expansion writes.

%define SRC_OFF 00080000h
%define VP_OFF 0040C000h

start:
jmp install

old10 dd 0
physbase dd 0
vpbase dd 0
rm_ss dw 0
rm_sp dw 0
active db 0
pm_diag:
pm_count dw 0
pm_es dw 0
pm_di dw 0
pm_cx dw 0
pm_f5 dw 0
pm_f7 dw 0
pm_f9 dw 0
pm_res dw 0
pm_blob times 512 db 0
f07_count dw 0
f07_last_bx dw 0
f07_last_cx dw 0
f07_last_dx dw 0
pmf7_count dd 0
pmf7_last_ecx dd 0
pmf7_last_edx dd 0
pmf7_last_vpr dd 0
pmf7_seen times 6 db 0
pm_vpr00_snap dd 0
pm_vpr14_snap dd 0
pm_vpr18_snap dd 0
pm_vpr1c_snap dd 0
pm_vpr20_snap dd 0
pm_vpr24_snap dd 0
pm_vpr3c_snap dd 0
pm_vpr68_snap dd 0
pm_post_vpr00 dd 0
pm_post_vpr1c dd 0
pm_post_vpr20 dd 0
pm_post_vpr24 dd 0
pm_post_vpr3c dd 0
pm_post_vpr68 dd 0
pm_diag_end:

; Private copy of the BIOS VBE protected-mode interface returned to Duke.
; The original BIOS code is copied here; only p1[1] is redirected to our
; appended 32-bit Set Display Start wrapper.
pm_proxy:
times 512 db 0
pm_proxy_end:

BITS 32
pm_visual_wrapper:
; Get the wrapper's actual linear address without assuming Duke's CS base.
push eax
push esi
push edi
call .get_eip
.get_eip:
pop edi

inc dword [edi + pmf7_count - .get_eip]
mov [edi + pmf7_last_ecx - .get_eip],ecx
mov [edi + pmf7_last_edx - .get_eip],edx

; Reconstruct Duke framebuffer byte offset / 8.
mov esi,edx
shl esi,16
mov si,cx
shr esi,1
or esi,00080000h
mov [edi + pmf7_last_vpr - .get_eip],esi

; Read-only snapshot of Video Processor state while Duke is actively
; calling the protected-mode Set Display Start entry point.
; EDI still holds our EIP anchor. EAX becomes VP_Base temporarily.
mov eax,[edi + pm_vpr1c_imm - .get_eip]
sub eax,1Ch
push edx
mov edx,[eax+00h]
mov [edi + pm_vpr00_snap - .get_eip],edx
mov edx,[eax+14h]
mov [edi + pm_vpr14_snap - .get_eip],edx
mov edx,[eax+18h]
mov [edi + pm_vpr18_snap - .get_eip],edx
mov edx,[eax+1Ch]
mov [edi + pm_vpr1c_snap - .get_eip],edx
mov edx,[eax+20h]
mov [edi + pm_vpr20_snap - .get_eip],edx
mov edx,[eax+24h]
mov [edi + pm_vpr24_snap - .get_eip],edx
mov edx,[eax+3Ch]
mov [edi + pm_vpr3c_snap - .get_eip],edx
mov edx,[eax+68h]
mov [edi + pm_vpr68_snap - .get_eip],edx
pop edx

; Record which expected 640x480x8 pages were actually observed.
mov eax,esi
and eax,0007FFFFh
cmp eax,00000000h
jne .p1
mov byte [edi + pmf7_seen + 0 - .get_eip],1
jmp .marked
.p1:
cmp eax,00009600h
jne .p2
mov byte [edi + pmf7_seen + 1 - .get_eip],1
jmp .marked
.p2:
cmp eax,00012C00h
jne .p3
mov byte [edi + pmf7_seen + 2 - .get_eip],1
jmp .marked
.p3:
cmp eax,0001C200h
jne .p4
mov byte [edi + pmf7_seen + 3 - .get_eip],1
jmp .marked
.p4:
cmp eax,00025800h
jne .p5
mov byte [edi + pmf7_seen + 4 - .get_eip],1
jmp .marked
.p5:
cmp eax,0002EE00h
jne .marked
mov byte [edi + pmf7_seen + 5 - .get_eip],1
.marked:

; Update only the already-proven Video Window source register.
mov eax,esi
db 0BFh
pm_vpr1c_imm:
dd 0
mov [edi],eax

pop edi
pop esi
pop eax

; TEST: do NOT call the original BIOS PM Set Display Start here.
; Duke's requested visual page is followed only through VPR1C.
; Physical VBE103 display start therefore remains unchanged.
; call pm_proxy + 0035h

; Read-only snapshot after our VPR1C update.
; Re-acquire our position-independent anchor and VP base.
push eax
push edx
push edi
call .post_eip
.post_eip:
pop edi
mov eax,[edi + pm_vpr1c_imm - .post_eip]
sub eax,1Ch
mov edx,[eax+00h]
mov [edi + pm_post_vpr00 - .post_eip],edx
mov edx,[eax+1Ch]
mov [edi + pm_post_vpr1c - .post_eip],edx
mov edx,[eax+20h]
mov [edi + pm_post_vpr20 - .post_eip],edx
mov edx,[eax+24h]
mov [edi + pm_post_vpr24 - .post_eip],edx
mov edx,[eax+3Ch]
mov [edi + pm_post_vpr3c - .post_eip],edx
mov edx,[eax+68h]
mov [edi + pm_post_vpr68 - .post_eip],edx
pop edi
pop edx
pop eax
ret
pm_visual_wrapper_end:
BITS 16

int10_handler:
cmp ax,0FEE1h
je .pm_query
cmp ax,4F02h
je .setmode
cmp ax,4F07h
jne .not_f07
inc word [cs:f07_count]
mov [cs:f07_last_bx],bx
mov [cs:f07_last_cx],cx
mov [cs:f07_last_dx],dx
.not_f07:
cmp ax,4F0Ah
je .pmiface
cmp ax,4F05h
je .bank
.chain:
jmp far [cs:old10]

.display_start:
; Safe rollback: never enter protected mode/MMIO from inside INT 10h.
jmp far [cs:old10]

.bank:
; Safe baseline: do not redirect VBE banks.
jmp .chain

.setmode:
push ax
mov ax,bx
and ax,01FFh
cmp ax,0101h
pop ax
je .is101
mov byte [cs:active],0
jmp .chain
.is101:

; Exact baseline behavior that allowed Duke3D to launch.
and bx,0FE00h
or bx,0103h

pushf
call far [cs:old10]
cmp ax,004Fh
jne .done
mov byte [cs:active],1

; Save handler stack and run the short, already-proven PM/MMIO setup.
push ax
push bx
push cx
push dx
push si
push di
push ds
push es

push cs
pop ds
mov [rm_ss],ss
mov [rm_sp],sp

cli
lgdt [gdtr]
mov eax,cr0
or eax,1
mov cr0,eax
jmp 08h:pm_entry

.rm_back:
mov ax,[cs:rm_ss]
mov ss,ax
mov sp,[cs:rm_sp]
sti


pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax

.done:
iret

.pmiface:
; Ask the real BIOS for its protected-mode interface first.
pushf
call far [cs:old10]
pushf
cmp ax,004Fh
jne .pm_restore_flags

inc word [cs:pm_count]
mov [cs:pm_es],es
mov [cs:pm_di],di
mov [cs:pm_cx],cx

; Save original offsets for diagnostics.
push ax
push bx
push ds
mov ax,es
mov ds,ax
mov bx,di
mov ax,[bx+0]
mov [cs:pm_f5],ax
mov ax,[bx+2]
mov [cs:pm_f7],ax
mov ax,[bx+4]
mov [cs:pm_f9],ax
mov ax,[bx+6]
mov [cs:pm_res],ax
pop ds
pop bx
pop ax

; Copy BIOS PMInfoBlock twice:
; pm_blob = untouched diagnostic copy
; pm_proxy = executable private copy returned to Duke.
push ax
push bx
push cx
push si
push di
push ds
push es

mov bx,cx
cmp bx,512
jbe .pm_len_ok
mov bx,512
.pm_len_ok:
mov ax,es
mov ds,ax
mov si,di
push cs
pop es
mov di,pm_blob
mov cx,bx
cld
rep movsb

; Copy from our diagnostic copy into executable proxy.
push cs
pop ds
mov si,pm_blob
mov di,pm_proxy
mov cx,bx
rep movsb

; Redirect only protected-mode Function 7.
mov word [pm_proxy+2],pm_visual_wrapper-pm_proxy

pop es
pop ds
pop di
pop si
pop cx
pop bx
pop ax

; Return CS:pm_proxy instead of the BIOS block. Duke converts ES:DI
; directly to a linear address and calls p1[1] from 32-bit protected mode.
push cs
pop es
mov di,pm_proxy

.pm_restore_flags:
popf
iret

.pm_query:
; Private query: caller supplies ES:DI -> 16-byte buffer.
; Copy the resident diagnostic record there.
push ax
push cx
push si
push ds
push es
pop ds
push cs
pop es
mov si,pm_diag
mov cx,(pm_diag_end-pm_diag)/2
.qcopy:
mov ax,[es:si]
mov [ds:di],ax
add si,2
add di,2
loop .qcopy
pop ds
pop si
pop cx
pop ax
mov ax,534Dh
iret

; ------------------------------------------------------------
; Protected mode: configure exactly the successful scaler block.
; ------------------------------------------------------------
pm_entry:
mov ax,10h
mov ds,ax
mov es,ax
mov ss,ax
mov ax,18h
mov fs,ax

mov ebx,[vpbase]

; Window OFF while parameters are loaded.
mov eax,[fs:ebx+00h]
and eax,0FFDFFFF7h
mov [fs:ebx+00h],eax

; Destination 800x600.
mov dword [fs:ebx+14h],00000000h
mov dword [fs:ebx+18h],02580320h

; DIAGNOSTIC: exact 640-byte source line in both documented fields.
; 640 / 8 = 80 = 50h 64-bit segments.
; Only VPR20[25:16] changed versus the previous stable test:
; 52h -> 50h
; VPR20[9:0] remains 50h.
mov dword [fs:ebx+20h],00500050h

; Proven horizontal expansion only; vertical remains 1:1.
mov dword [fs:ebx+24h],0000CD00h

; Safe fixed source: VRAM +0, with SB bit set.
mov dword [fs:ebx+1Ch],00080000h

; Enable VIE + Video Window I.
mov eax,[fs:ebx+00h]
and eax,0FFAFF0F0h
or eax,00200008h
mov [fs:ebx+00h],eax

; Back to real mode.
mov eax,cr0
and eax,0FFFFFFFEh
mov cr0,eax
jmp far [rm_jump]

BITS 16

rm_resume:
jmp int10_handler.rm_back

; ------------------------------------------------------------
; Installer
; ------------------------------------------------------------
read_seq1718:
; Read-only: Silicon Motion sequencer registers 17h and 18h.
; Returns AL=SEQ17, AH=SEQ18.
push dx
push bx

mov dx,03C4h
mov al,17h
out dx,al
inc dx
in al,dx
mov bl,al

dec dx
mov al,18h
out dx,al
inc dx
in al,dx
mov ah,al
mov al,bl

pop bx
pop dx
ret

read_ac00c:
; Read DWORD at physical 000AC00Ch = A000:C00C.
; Read-only diagnostic.
push ds
push bx
mov ax,0A000h
mov ds,ax
mov bx,0C00Ch
mov eax,[bx]
pop bx
pop ds
ret

print_hex8:
; AL = byte. Preserve original value explicitly across DOS output calls.
push ax
push bx
push dx
mov bl,al

mov dl,bl
shr dl,1
shr dl,1
shr dl,1
shr dl,1
and dl,0Fh
cmp dl,9
jbe .hi_digit
add dl,7
.hi_digit:
add dl,'0'
mov ah,02h
int 21h

mov dl,bl
and dl,0Fh
cmp dl,9
jbe .lo_digit
add dl,7
.lo_digit:
add dl,'0'
mov ah,02h
int 21h

pop dx
pop bx
pop ax
ret

print_hex32:
; EAX = DWORD, print as 8 hex digits.
push eax
push ebx
mov ebx,eax
shr eax,16
call print_hex16
mov ax,bx
call print_hex16
pop ebx
pop eax
ret

print_hex16:
push ax
push bx
push cx
push dx
mov bx,ax
mov cx,4
.ph:
rol bx,4
mov dl,bl
and dl,0Fh
cmp dl,9
jbe .digit
add dl,7
.digit:
add dl,'0'
mov ah,02h
int 21h
loop .ph
pop dx
pop cx
pop bx
pop ax
ret

query_buf times (16+512+8+22+32+24) db 0
msg_f07 db 13,10,'VBE 4F07 calls=', '$'
msg_f07_bx db ' last BX=', '$'
msg_f07_cx db ' CX=', '$'
msg_f07_dx db ' DX=', '$'
msg_report1 db 13,10,'VBE 4F0A calls=', '$'
msg_report2 db ' ES:DI=', '$'
msg_report3 db ' CX=', '$'
msg_report4 db 13,10,'F5/F7/F9/RES=', '$'
msg_space db ' $'
msg_seq db 13,10,'SEQ17 = ','$'
msg_seq18 db ' SEQ18 = ','$'
msg_ac00c db 13,10,'DWORD at physical 000AC00C = ','$'
msg_pmf7 db 13,10,'PM F7 calls=', '$'
msg_pmf7ecx db ' last ECX=', '$'
msg_pmf7edx db ' last EDX=', '$'
msg_pmf7vpr db ' last VPR1C=', '$'
msg_seen db 13,10,'pages seen 0..5: ', '$'
msg_vprsnap db 13,10,'Duke PM VPR snapshot:',13,10,'$'
msg_vpr00 db 'VPR00=', '$'
msg_vpr14 db ' VPR14=', '$'
msg_vpr18 db ' VPR18=', '$'
msg_vpr1c db ' VPR1C=', '$'
msg_vpr20 db 13,10,'VPR20=', '$'
msg_vpr24 db ' VPR24=', '$'
msg_vpr3c db ' VPR3C=', '$'
msg_vpr68 db ' VPR68=', '$'
msg_post db 13,10,'After VPR1C update (BIOS F7 skipped):',13,10,'$'
msg_post00 db 'VPR00=', '$'
msg_post1c db ' VPR1C=', '$'
msg_post20 db 13,10,'VPR20=', '$'
msg_post24 db ' VPR24=', '$'
msg_post3c db ' VPR3C=', '$'
msg_post68 db ' VPR68=', '$'
msg_full db 13,10,'Complete VBE PMInfoBlock:',13,10,'$'
msg_crlf db 13,10,'$'

install:
push cs
pop es
mov di,query_buf
mov ax,0FEE1h
int 10h
cmp ax,534Dh
jne .fresh_install

push cs
pop ds
mov dx,msg_report1
mov ah,09h
int 21h
mov ax,[query_buf+0]
call print_hex16
mov dx,msg_report2
mov ah,09h
int 21h
mov ax,[query_buf+2]
call print_hex16
mov dl,':'
mov ah,02h
int 21h
mov ax,[query_buf+4]
call print_hex16
mov dx,msg_report3
mov ah,09h
int 21h
mov ax,[query_buf+6]
call print_hex16
mov dx,msg_report4
mov ah,09h
int 21h
mov ax,[query_buf+8]
call print_hex16
mov dl,'/'
mov ah,02h
int 21h
mov ax,[query_buf+10]
call print_hex16
mov dl,'/'
mov ah,02h
int 21h
mov ax,[query_buf+12]
call print_hex16
mov dl,'/'
mov ah,02h
int 21h
mov ax,[query_buf+14]
call print_hex16
mov dx,msg_seq
mov ah,09h
int 21h
call read_seq1718
push ax
mov al,al
call print_hex8
mov dx,msg_seq18
mov ah,09h
int 21h
pop ax
mov al,ah
call print_hex8
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_ac00c
mov ah,09h
int 21h
call read_ac00c
call print_hex32
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_f07
mov ah,09h
int 21h
mov ax,[query_buf+528]
call print_hex16
mov dx,msg_f07_bx
mov ah,09h
int 21h
mov ax,[query_buf+530]
call print_hex16
mov dx,msg_f07_cx
mov ah,09h
int 21h
mov ax,[query_buf+532]
call print_hex16
mov dx,msg_f07_dx
mov ah,09h
int 21h
mov ax,[query_buf+534]
call print_hex16
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_pmf7
mov ah,09h
int 21h
mov eax,[query_buf+536]
call print_hex32
mov dx,msg_pmf7ecx
mov ah,09h
int 21h
mov eax,[query_buf+540]
call print_hex32
mov dx,msg_pmf7edx
mov ah,09h
int 21h
mov eax,[query_buf+544]
call print_hex32
mov dx,msg_pmf7vpr
mov ah,09h
int 21h
mov eax,[query_buf+548]
call print_hex32

mov dx,msg_seen
mov ah,09h
int 21h
mov si,query_buf+552
mov cx,6
.pseen:
mov al,[si]
add al,'0'
mov dl,al
mov ah,02h
int 21h
mov dl,' '
int 21h
inc si
loop .pseen
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_vprsnap
mov ah,09h
int 21h
mov dx,msg_vpr00
mov ah,09h
int 21h
mov eax,[query_buf+558]
call print_hex32
mov dx,msg_vpr14
mov ah,09h
int 21h
mov eax,[query_buf+562]
call print_hex32
mov dx,msg_vpr18
mov ah,09h
int 21h
mov eax,[query_buf+566]
call print_hex32
mov dx,msg_vpr1c
mov ah,09h
int 21h
mov eax,[query_buf+570]
call print_hex32
mov dx,msg_vpr20
mov ah,09h
int 21h
mov eax,[query_buf+574]
call print_hex32
mov dx,msg_vpr24
mov ah,09h
int 21h
mov eax,[query_buf+578]
call print_hex32
mov dx,msg_vpr3c
mov ah,09h
int 21h
mov eax,[query_buf+582]
call print_hex32
mov dx,msg_vpr68
mov ah,09h
int 21h
mov eax,[query_buf+586]
call print_hex32
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_post
mov ah,09h
int 21h
mov dx,msg_post00
mov ah,09h
int 21h
mov eax,[query_buf+590]
call print_hex32
mov dx,msg_post1c
mov ah,09h
int 21h
mov eax,[query_buf+594]
call print_hex32
mov dx,msg_post20
mov ah,09h
int 21h
mov eax,[query_buf+598]
call print_hex32
mov dx,msg_post24
mov ah,09h
int 21h
mov eax,[query_buf+602]
call print_hex32
mov dx,msg_post3c
mov ah,09h
int 21h
mov eax,[query_buf+606]
call print_hex32
mov dx,msg_post68
mov ah,09h
int 21h
mov eax,[query_buf+610]
call print_hex32
mov dx,msg_crlf
mov ah,09h
int 21h

; Dump the complete PMInfoBlock captured at 4F0A time.
; query_buf+6 = returned CX (block size).
; query_buf+16 = saved block bytes.
mov dx,msg_full
mov ah,09h
int 21h

mov si,query_buf+16
mov cx,[query_buf+6]
xor bp,bp

.full_line:
; Print 4-digit offset at the start of every 16-byte line.
test bp,000Fh
jnz .full_byte
mov ax,bp
call print_hex16
mov dl,':'
mov ah,02h
int 21h
mov dl,' '
int 21h

.full_byte:
mov al,[si]
call print_hex8
mov dl,' '
mov ah,02h
int 21h
inc si
inc bp
dec cx
jz .full_done

test bp,000Fh
jnz .full_line
mov dx,msg_crlf
mov ah,09h
int 21h
jmp .full_line

.full_done:
mov dx,msg_crlf
mov ah,09h
int 21h
mov ax,4C00h
int 21h

.fresh_install:
push cs
pop ds
push cs
pop es

; Get actual framebuffer base from BIOS.
mov di,modeinfo
mov cx,0101h
mov ax,4F01h
int 10h
cmp ax,004Fh
jne fail

mov eax,[modeinfo+40]
mov [physbase],eax
add eax,VP_OFF
mov [vpbase],eax
add eax,1Ch
mov [pm_vpr1c_imm],eax


; Save old INT 10h.
mov ax,3510h
int 21h
mov word [old10],bx
mov word [old10+2],es

; Build GDT exactly as in the successful standalone scaler test.
xor eax,eax
mov ax,cs
shl eax,4
mov ebx,eax
add eax,gdt
mov [gdtr+2],eax

mov eax,ebx
mov word [gdt_code+2],ax
mov word [gdt_data+2],ax
shr eax,16
mov byte [gdt_code+4],al
mov byte [gdt_data+4],al
mov byte [gdt_code+7],ah
mov byte [gdt_data+7],ah

mov ax,cs
mov [rm_seg],ax

; Install hook.
mov dx,int10_handler
mov ax,2510h
int 21h

mov dx,msg
mov ah,09h
int 21h

mov dx,end_resident
add dx,15
mov cl,4
shr dx,cl
mov ax,3100h
int 21h

fail:
mov dx,msg_fail
mov ah,09h
int 21h
mov ax,4C01h
int 21h

msg db 'SM712 TSR: Duke PM page-follow + Video Window HW scaler installed.',13,10,'$'
msg_fail db 'SM712 TSR: VBE101 unavailable.',13,10,'$'

rm_jump:
dw rm_resume
rm_seg:
dw 0

align 8
gdt:
dq 0
gdt_code:
dw 0FFFFh,0
db 0,09Ah,00h,0
gdt_data:
dw 0FFFFh,0
db 0,092h,00h,0
gdt_flat:
dw 0FFFFh,0000h
db 00h,092h,0CFh,00h
gdt_end:
gdtr:
dw gdt_end-gdt-1
dd 0

align 16
modeinfo times 256 db 0


end_resident:


Скрытый текст:


BITS 16
ORG 100h

; 1.ASM - SM712 TSR: stable Duke3D VBE path + proven HW scaler setup
;
; Keeps the VBE behavior that just launched Duke3D:
; 4F02 mode 101h -> physical 103h
; 4F0A -> BIOS result logged (diagnostic)
; everything else passes through unchanged
;
; Adds ONLY the proven Video Window I configuration after BIOS 103h succeeds.
; 4F01 is passed through unchanged; 4F05 redirects banks. No DPR/SCR writes.
;
; PM Function 7 proxy follows Duke's visual page in hardware:
; VPR1C = 0x80000 | (framebuffer_byte_offset / 8)
; No DPR, SCR18, VPR68 or VGA-expansion writes.

%define SRC_OFF 00080000h
%define VP_OFF 0040C000h

start:
jmp install

old10 dd 0
physbase dd 0
vpbase dd 0
rm_ss dw 0
rm_sp dw 0
active db 0
pm_diag:
pm_count dw 0
pm_es dw 0
pm_di dw 0
pm_cx dw 0
pm_f5 dw 0
pm_f7 dw 0
pm_f9 dw 0
pm_res dw 0
pm_blob times 512 db 0
f07_count dw 0
f07_last_bx dw 0
f07_last_cx dw 0
f07_last_dx dw 0
pmf7_count dd 0
pmf7_last_ecx dd 0
pmf7_last_edx dd 0
pmf7_last_vpr dd 0
pmf7_seen times 6 db 0
pm_vpr00_snap dd 0
pm_vpr14_snap dd 0
pm_vpr18_snap dd 0
pm_vpr1c_snap dd 0
pm_vpr20_snap dd 0
pm_vpr24_snap dd 0
pm_vpr3c_snap dd 0
pm_vpr68_snap dd 0
pm_post_vpr00 dd 0
pm_post_vpr1c dd 0
pm_post_vpr20 dd 0
pm_post_vpr24 dd 0
pm_post_vpr3c dd 0
pm_post_vpr68 dd 0
pm_diag_end:

; Private copy of the BIOS VBE protected-mode interface returned to Duke.
; The original BIOS code is copied here; only p1[1] is redirected to our
; appended 32-bit Set Display Start wrapper.
pm_proxy:
times 512 db 0
pm_proxy_end:

BITS 32
pm_visual_wrapper:
; Get the wrapper's actual linear address without assuming Duke's CS base.
push eax
push esi
push edi
call .get_eip
.get_eip:
pop edi

inc dword [edi + pmf7_count - .get_eip]
mov [edi + pmf7_last_ecx - .get_eip],ecx
mov [edi + pmf7_last_edx - .get_eip],edx

; Reconstruct Duke framebuffer byte offset / 8.
mov esi,edx
shl esi,16
mov si,cx
shr esi,1
or esi,00080000h
mov [edi + pmf7_last_vpr - .get_eip],esi

; Read-only snapshot of Video Processor state while Duke is actively
; calling the protected-mode Set Display Start entry point.
; EDI still holds our EIP anchor. EAX becomes VP_Base temporarily.
mov eax,[edi + pm_vpr1c_imm - .get_eip]
sub eax,1Ch
push edx
mov edx,[eax+00h]
mov [edi + pm_vpr00_snap - .get_eip],edx
mov edx,[eax+14h]
mov [edi + pm_vpr14_snap - .get_eip],edx
mov edx,[eax+18h]
mov [edi + pm_vpr18_snap - .get_eip],edx
mov edx,[eax+1Ch]
mov [edi + pm_vpr1c_snap - .get_eip],edx
mov edx,[eax+20h]
mov [edi + pm_vpr20_snap - .get_eip],edx
mov edx,[eax+24h]
mov [edi + pm_vpr24_snap - .get_eip],edx
mov edx,[eax+3Ch]
mov [edi + pm_vpr3c_snap - .get_eip],edx
mov edx,[eax+68h]
mov [edi + pm_vpr68_snap - .get_eip],edx
pop edx

; Record which expected 640x480x8 pages were actually observed.
mov eax,esi
and eax,0007FFFFh
cmp eax,00000000h
jne .p1
mov byte [edi + pmf7_seen + 0 - .get_eip],1
jmp .marked
.p1:
cmp eax,00009600h
jne .p2
mov byte [edi + pmf7_seen + 1 - .get_eip],1
jmp .marked
.p2:
cmp eax,00012C00h
jne .p3
mov byte [edi + pmf7_seen + 2 - .get_eip],1
jmp .marked
.p3:
cmp eax,0001C200h
jne .p4
mov byte [edi + pmf7_seen + 3 - .get_eip],1
jmp .marked
.p4:
cmp eax,00025800h
jne .p5
mov byte [edi + pmf7_seen + 4 - .get_eip],1
jmp .marked
.p5:
cmp eax,0002EE00h
jne .marked
mov byte [edi + pmf7_seen + 5 - .get_eip],1
.marked:

; Update only the already-proven Video Window source register.
mov eax,esi
db 0BFh
pm_vpr1c_imm:
dd 0
mov [edi],eax

pop edi
pop esi
pop eax

; TEST: do NOT call the original BIOS PM Set Display Start here.
; Duke's requested visual page is followed only through VPR1C.
; Physical VBE103 display start therefore remains unchanged.
; call pm_proxy + 0035h

; Read-only snapshot after our VPR1C update.
; Re-acquire our position-independent anchor and VP base.
push eax
push edx
push edi
call .post_eip
.post_eip:
pop edi
mov eax,[edi + pm_vpr1c_imm - .post_eip]
sub eax,1Ch
mov edx,[eax+00h]
mov [edi + pm_post_vpr00 - .post_eip],edx
mov edx,[eax+1Ch]
mov [edi + pm_post_vpr1c - .post_eip],edx
mov edx,[eax+20h]
mov [edi + pm_post_vpr20 - .post_eip],edx
mov edx,[eax+24h]
mov [edi + pm_post_vpr24 - .post_eip],edx
mov edx,[eax+3Ch]
mov [edi + pm_post_vpr3c - .post_eip],edx
mov edx,[eax+68h]
mov [edi + pm_post_vpr68 - .post_eip],edx
pop edi
pop edx
pop eax
ret
pm_visual_wrapper_end:
BITS 16

int10_handler:
cmp ax,0FEE1h
je .pm_query
cmp ax,4F02h
je .setmode
cmp ax,4F07h
jne .not_f07
inc word [cs:f07_count]
mov [cs:f07_last_bx],bx
mov [cs:f07_last_cx],cx
mov [cs:f07_last_dx],dx
.not_f07:
cmp ax,4F0Ah
je .pmiface
cmp ax,4F05h
je .bank
.chain:
jmp far [cs:old10]

.display_start:
; Safe rollback: never enter protected mode/MMIO from inside INT 10h.
jmp far [cs:old10]

.bank:
; Safe baseline: do not redirect VBE banks.
jmp .chain

.setmode:
push ax
mov ax,bx
and ax,01FFh
cmp ax,0101h
pop ax
je .is101
mov byte [cs:active],0
jmp .chain
.is101:

; Exact baseline behavior that allowed Duke3D to launch.
and bx,0FE00h
or bx,0103h

pushf
call far [cs:old10]
cmp ax,004Fh
jne .done
mov byte [cs:active],1

; Save handler stack and run the short, already-proven PM/MMIO setup.
push ax
push bx
push cx
push dx
push si
push di
push ds
push es

push cs
pop ds
mov [rm_ss],ss
mov [rm_sp],sp

cli
lgdt [gdtr]
mov eax,cr0
or eax,1
mov cr0,eax
jmp 08h:pm_entry

.rm_back:
mov ax,[cs:rm_ss]
mov ss,ax
mov sp,[cs:rm_sp]
sti


pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax

.done:
iret

.pmiface:
; Ask the real BIOS for its protected-mode interface first.
pushf
call far [cs:old10]
pushf
cmp ax,004Fh
jne .pm_restore_flags

inc word [cs:pm_count]
mov [cs:pm_es],es
mov [cs:pm_di],di
mov [cs:pm_cx],cx

; Save original offsets for diagnostics.
push ax
push bx
push ds
mov ax,es
mov ds,ax
mov bx,di
mov ax,[bx+0]
mov [cs:pm_f5],ax
mov ax,[bx+2]
mov [cs:pm_f7],ax
mov ax,[bx+4]
mov [cs:pm_f9],ax
mov ax,[bx+6]
mov [cs:pm_res],ax
pop ds
pop bx
pop ax

; Copy BIOS PMInfoBlock twice:
; pm_blob = untouched diagnostic copy
; pm_proxy = executable private copy returned to Duke.
push ax
push bx
push cx
push si
push di
push ds
push es

mov bx,cx
cmp bx,512
jbe .pm_len_ok
mov bx,512
.pm_len_ok:
mov ax,es
mov ds,ax
mov si,di
push cs
pop es
mov di,pm_blob
mov cx,bx
cld
rep movsb

; Copy from our diagnostic copy into executable proxy.
push cs
pop ds
mov si,pm_blob
mov di,pm_proxy
mov cx,bx
rep movsb

; Redirect only protected-mode Function 7.
mov word [pm_proxy+2],pm_visual_wrapper-pm_proxy

pop es
pop ds
pop di
pop si
pop cx
pop bx
pop ax

; Return CS:pm_proxy instead of the BIOS block. Duke converts ES:DI
; directly to a linear address and calls p1[1] from 32-bit protected mode.
push cs
pop es
mov di,pm_proxy

.pm_restore_flags:
popf
iret

.pm_query:
; Private query: caller supplies ES:DI -> 16-byte buffer.
; Copy the resident diagnostic record there.
push ax
push cx
push si
push ds
push es
pop ds
push cs
pop es
mov si,pm_diag
mov cx,(pm_diag_end-pm_diag)/2
.qcopy:
mov ax,[es:si]
mov [ds:di],ax
add si,2
add di,2
loop .qcopy
pop ds
pop si
pop cx
pop ax
mov ax,534Dh
iret

; ------------------------------------------------------------
; Protected mode: configure exactly the successful scaler block.
; ------------------------------------------------------------
pm_entry:
mov ax,10h
mov ds,ax
mov es,ax
mov ss,ax
mov ax,18h
mov fs,ax

mov ebx,[vpbase]

; Window OFF while parameters are loaded.
mov eax,[fs:ebx+00h]
and eax,0FFDFFFF7h
mov [fs:ebx+00h],eax

; Destination 800x600.
mov dword [fs:ebx+14h],00000000h
mov dword [fs:ebx+18h],02580320h

; DIAGNOSTIC: exact 640-byte source line in both documented fields.
; 640 / 8 = 80 = 50h 64-bit segments.
; Only VPR20[25:16] changed versus the previous stable test:
; 52h -> 50h
; VPR20[9:0] remains 50h.
mov dword [fs:ebx+20h],00520050h

; Proven horizontal expansion only; vertical remains 1:1.
mov dword [fs:ebx+24h],0000CD33h

; Safe fixed source: VRAM +0, with SB bit set.
mov dword [fs:ebx+1Ch],00080000h

; Enable VIE + Video Window I.
mov eax,[fs:ebx+00h]
and eax,0FFAFF0F0h
or eax,00200008h
mov [fs:ebx+00h],eax

; Back to real mode.
mov eax,cr0
and eax,0FFFFFFFEh
mov cr0,eax
jmp far [rm_jump]

BITS 16

rm_resume:
jmp int10_handler.rm_back

; ------------------------------------------------------------
; Installer
; ------------------------------------------------------------
read_seq1718:
; Read-only: Silicon Motion sequencer registers 17h and 18h.
; Returns AL=SEQ17, AH=SEQ18.
push dx
push bx

mov dx,03C4h
mov al,17h
out dx,al
inc dx
in al,dx
mov bl,al

dec dx
mov al,18h
out dx,al
inc dx
in al,dx
mov ah,al
mov al,bl

pop bx
pop dx
ret

read_ac00c:
; Read DWORD at physical 000AC00Ch = A000:C00C.
; Read-only diagnostic.
push ds
push bx
mov ax,0A000h
mov ds,ax
mov bx,0C00Ch
mov eax,[bx]
pop bx
pop ds
ret

print_hex8:
; AL = byte. Preserve original value explicitly across DOS output calls.
push ax
push bx
push dx
mov bl,al

mov dl,bl
shr dl,1
shr dl,1
shr dl,1
shr dl,1
and dl,0Fh
cmp dl,9
jbe .hi_digit
add dl,7
.hi_digit:
add dl,'0'
mov ah,02h
int 21h

mov dl,bl
and dl,0Fh
cmp dl,9
jbe .lo_digit
add dl,7
.lo_digit:
add dl,'0'
mov ah,02h
int 21h

pop dx
pop bx
pop ax
ret

print_hex32:
; EAX = DWORD, print as 8 hex digits.
push eax
push ebx
mov ebx,eax
shr eax,16
call print_hex16
mov ax,bx
call print_hex16
pop ebx
pop eax
ret

print_hex16:
push ax
push bx
push cx
push dx
mov bx,ax
mov cx,4
.ph:
rol bx,4
mov dl,bl
and dl,0Fh
cmp dl,9
jbe .digit
add dl,7
.digit:
add dl,'0'
mov ah,02h
int 21h
loop .ph
pop dx
pop cx
pop bx
pop ax
ret

query_buf times (16+512+8+22+32+24) db 0
msg_f07 db 13,10,'VBE 4F07 calls=', '$'
msg_f07_bx db ' last BX=', '$'
msg_f07_cx db ' CX=', '$'
msg_f07_dx db ' DX=', '$'
msg_report1 db 13,10,'VBE 4F0A calls=', '$'
msg_report2 db ' ES:DI=', '$'
msg_report3 db ' CX=', '$'
msg_report4 db 13,10,'F5/F7/F9/RES=', '$'
msg_space db ' $'
msg_seq db 13,10,'SEQ17 = ','$'
msg_seq18 db ' SEQ18 = ','$'
msg_ac00c db 13,10,'DWORD at physical 000AC00C = ','$'
msg_pmf7 db 13,10,'PM F7 calls=', '$'
msg_pmf7ecx db ' last ECX=', '$'
msg_pmf7edx db ' last EDX=', '$'
msg_pmf7vpr db ' last VPR1C=', '$'
msg_seen db 13,10,'pages seen 0..5: ', '$'
msg_vprsnap db 13,10,'Duke PM VPR snapshot:',13,10,'$'
msg_vpr00 db 'VPR00=', '$'
msg_vpr14 db ' VPR14=', '$'
msg_vpr18 db ' VPR18=', '$'
msg_vpr1c db ' VPR1C=', '$'
msg_vpr20 db 13,10,'VPR20=', '$'
msg_vpr24 db ' VPR24=', '$'
msg_vpr3c db ' VPR3C=', '$'
msg_vpr68 db ' VPR68=', '$'
msg_post db 13,10,'After VPR1C update (BIOS F7 skipped):',13,10,'$'
msg_post00 db 'VPR00=', '$'
msg_post1c db ' VPR1C=', '$'
msg_post20 db 13,10,'VPR20=', '$'
msg_post24 db ' VPR24=', '$'
msg_post3c db ' VPR3C=', '$'
msg_post68 db ' VPR68=', '$'
msg_full db 13,10,'Complete VBE PMInfoBlock:',13,10,'$'
msg_crlf db 13,10,'$'

install:
push cs
pop es
mov di,query_buf
mov ax,0FEE1h
int 10h
cmp ax,534Dh
jne .fresh_install

push cs
pop ds
mov dx,msg_report1
mov ah,09h
int 21h
mov ax,[query_buf+0]
call print_hex16
mov dx,msg_report2
mov ah,09h
int 21h
mov ax,[query_buf+2]
call print_hex16
mov dl,':'
mov ah,02h
int 21h
mov ax,[query_buf+4]
call print_hex16
mov dx,msg_report3
mov ah,09h
int 21h
mov ax,[query_buf+6]
call print_hex16
mov dx,msg_report4
mov ah,09h
int 21h
mov ax,[query_buf+8]
call print_hex16
mov dl,'/'
mov ah,02h
int 21h
mov ax,[query_buf+10]
call print_hex16
mov dl,'/'
mov ah,02h
int 21h
mov ax,[query_buf+12]
call print_hex16
mov dl,'/'
mov ah,02h
int 21h
mov ax,[query_buf+14]
call print_hex16
mov dx,msg_seq
mov ah,09h
int 21h
call read_seq1718
push ax
mov al,al
call print_hex8
mov dx,msg_seq18
mov ah,09h
int 21h
pop ax
mov al,ah
call print_hex8
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_ac00c
mov ah,09h
int 21h
call read_ac00c
call print_hex32
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_f07
mov ah,09h
int 21h
mov ax,[query_buf+528]
call print_hex16
mov dx,msg_f07_bx
mov ah,09h
int 21h
mov ax,[query_buf+530]
call print_hex16
mov dx,msg_f07_cx
mov ah,09h
int 21h
mov ax,[query_buf+532]
call print_hex16
mov dx,msg_f07_dx
mov ah,09h
int 21h
mov ax,[query_buf+534]
call print_hex16
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_pmf7
mov ah,09h
int 21h
mov eax,[query_buf+536]
call print_hex32
mov dx,msg_pmf7ecx
mov ah,09h
int 21h
mov eax,[query_buf+540]
call print_hex32
mov dx,msg_pmf7edx
mov ah,09h
int 21h
mov eax,[query_buf+544]
call print_hex32
mov dx,msg_pmf7vpr
mov ah,09h
int 21h
mov eax,[query_buf+548]
call print_hex32

mov dx,msg_seen
mov ah,09h
int 21h
mov si,query_buf+552
mov cx,6
.pseen:
mov al,[si]
add al,'0'
mov dl,al
mov ah,02h
int 21h
mov dl,' '
int 21h
inc si
loop .pseen
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_vprsnap
mov ah,09h
int 21h
mov dx,msg_vpr00
mov ah,09h
int 21h
mov eax,[query_buf+558]
call print_hex32
mov dx,msg_vpr14
mov ah,09h
int 21h
mov eax,[query_buf+562]
call print_hex32
mov dx,msg_vpr18
mov ah,09h
int 21h
mov eax,[query_buf+566]
call print_hex32
mov dx,msg_vpr1c
mov ah,09h
int 21h
mov eax,[query_buf+570]
call print_hex32
mov dx,msg_vpr20
mov ah,09h
int 21h
mov eax,[query_buf+574]
call print_hex32
mov dx,msg_vpr24
mov ah,09h
int 21h
mov eax,[query_buf+578]
call print_hex32
mov dx,msg_vpr3c
mov ah,09h
int 21h
mov eax,[query_buf+582]
call print_hex32
mov dx,msg_vpr68
mov ah,09h
int 21h
mov eax,[query_buf+586]
call print_hex32
mov dx,msg_crlf
mov ah,09h
int 21h

mov dx,msg_post
mov ah,09h
int 21h
mov dx,msg_post00
mov ah,09h
int 21h
mov eax,[query_buf+590]
call print_hex32
mov dx,msg_post1c
mov ah,09h
int 21h
mov eax,[query_buf+594]
call print_hex32
mov dx,msg_post20
mov ah,09h
int 21h
mov eax,[query_buf+598]
call print_hex32
mov dx,msg_post24
mov ah,09h
int 21h
mov eax,[query_buf+602]
call print_hex32
mov dx,msg_post3c
mov ah,09h
int 21h
mov eax,[query_buf+606]
call print_hex32
mov dx,msg_post68
mov ah,09h
int 21h
mov eax,[query_buf+610]
call print_hex32
mov dx,msg_crlf
mov ah,09h
int 21h

; Dump the complete PMInfoBlock captured at 4F0A time.
; query_buf+6 = returned CX (block size).
; query_buf+16 = saved block bytes.
mov dx,msg_full
mov ah,09h
int 21h

mov si,query_buf+16
mov cx,[query_buf+6]
xor bp,bp

.full_line:
; Print 4-digit offset at the start of every 16-byte line.
test bp,000Fh
jnz .full_byte
mov ax,bp
call print_hex16
mov dl,':'
mov ah,02h
int 21h
mov dl,' '
int 21h

.full_byte:
mov al,[si]
call print_hex8
mov dl,' '
mov ah,02h
int 21h
inc si
inc bp
dec cx
jz .full_done

test bp,000Fh
jnz .full_line
mov dx,msg_crlf
mov ah,09h
int 21h
jmp .full_line

.full_done:
mov dx,msg_crlf
mov ah,09h
int 21h
mov ax,4C00h
int 21h

.fresh_install:
push cs
pop ds
push cs
pop es

; Get actual framebuffer base from BIOS.
mov di,modeinfo
mov cx,0101h
mov ax,4F01h
int 10h
cmp ax,004Fh
jne fail

mov eax,[modeinfo+40]
mov [physbase],eax
add eax,VP_OFF
mov [vpbase],eax
add eax,1Ch
mov [pm_vpr1c_imm],eax


; Save old INT 10h.
mov ax,3510h
int 21h
mov word [old10],bx
mov word [old10+2],es

; Build GDT exactly as in the successful standalone scaler test.
xor eax,eax
mov ax,cs
shl eax,4
mov ebx,eax
add eax,gdt
mov [gdtr+2],eax

mov eax,ebx
mov word [gdt_code+2],ax
mov word [gdt_data+2],ax
shr eax,16
mov byte [gdt_code+4],al
mov byte [gdt_data+4],al
mov byte [gdt_code+7],ah
mov byte [gdt_data+7],ah

mov ax,cs
mov [rm_seg],ax

; Install hook.
mov dx,int10_handler
mov ax,2510h
int 21h

mov dx,msg
mov ah,09h
int 21h

mov dx,end_resident
add dx,15
mov cl,4
shr dx,cl
mov ax,3100h
int 21h

fail:
mov dx,msg_fail
mov ah,09h
int 21h
mov ax,4C01h
int 21h

msg db 'SM712 TSR: Duke PM page-follow + Video Window HW scaler installed.',13,10,'$'
msg_fail db 'SM712 TSR: VBE101 unavailable.',13,10,'$'

rm_jump:
dw rm_resume
rm_seg:
dw 0

align 8
gdt:
dq 0
gdt_code:
dw 0FFFFh,0
db 0,09Ah,00h,0
gdt_data:
dw 0FFFFh,0
db 0,092h,00h,0
gdt_flat:
dw 0FFFFh,0000h
db 00h,092h,0CFh,00h
gdt_end:
gdtr:
dw gdt_end-gdt-1
dd 0

align 16
modeinfo times 256 db 0


end_resident:



Что касается непосредственно темы ИИ, я считаю, что оцифровка всего и вся с последующей обработкой и манипуляцией была очень хорошо предсказана в сериале "Капитан Power и солдаты будущего", когда люди оцифровывались Бластером в качестве наказания:


Рейтинг сообщения: +2, отметил(и): Oville, raspad
2 2 1
Страница 24 из 25Перейти наверх Пред.  1, 2, 3 ... , 23, 24, 25  След.
   Список разделов - Болталка - Нейросети и всё что с ними связано