Решение как всегда одно, - это гимп 2.0 2008 года. Любой халявщик, пришедший с sai, обломается в программе, в которой нет инструментов, которые бы рисовали за тебя. Всë ручками, как и должно быть, чтобы работа не была слишком лëгкой + купирование перепроизводства. Сейчас рынок арта увяз в том же болоте, что уничтожило рынок музыки. Избыток предложения, - зло в квадрате. Нейронки, - просто титановый гвоздик в крышку гроба. На плаву останутся только те, кто накопил аудиторию в жирные годы, но и она уйдëт по естественным причинам. Кто чуть прагматичнее, будет переезжать в смежные области, а романтиков выдавят на рынок физических услуг.
Решение как всегда одно, - это гимп 2.0 2008 года. Любой халявщик, пришедший с sai, обломается в программе, в которой нет инструментов, которые бы рисовали за тебя. Всë ручками, как и должно быть, чтобы работа не была слишком лëгкой + купирование перепроизводства. Сейчас рынок арта увяз в том же болоте, что уничтожило рынок музыки. Избыток предложения, - зло в квадрате. Нейронки, - просто титановый гвоздик в крышку гроба. На плаву останутся только те, кто накопил аудиторию в жирные годы, но и она уйдëт по естественным причинам. Кто чуть прагматичнее, будет переезжать в смежные области, а романтиков выдавят на рынок физических услуг.
А заводы может тогда тоже взорвать? Раньше-то жестянщики искусные самовары ручной работы клепали с вензельками, не то что эти ваши штампованные чайники за 500 рублей. Ну и что, что стоил самовар как доход крестьянина за полгода, зато никакого перепроизводства. Или вот одежда фабричная, ну это же натуральный геноцид, равнины Индии белеют костями ткачей. Ох, не тем гопники поясняющие за шмот занимаются. Докапывались бы до людей в фабричных куртках. Ах не мастерицей на ручной прялке куртка сделана? Ннна в жбан. Вот бы было любо, так победим.
Вот вопрос к размышлению: почему-то художники, рисующие карандашом на бумаге как-то ничего не стисняются показывать и рисовать хоть прямо на улице, у всех на виду.
все так. я как рисовал гелевой ручкой так и рисую. а то что многие в цифре не показывают "секретов" - это потому ,что там весь секрет в умных фильтррах, как правило. А не в какой-то "авторской технике".
Если посмотреть усредненный цифровой арт тех же гарфпланшетчиков - он становистя все более одинаковым лет 10-15 последних. нейронки просто добили до талого.
Я к слову никогда не любил рисовать именно творческие арты а не просто скажем - текстуры - в цифре. всегда открывал GIMP 2.6 ми погнали - пиксель-артить что-то "по делу". А если надо выплеснуть эмоцию, слепок души - огрызок бумаги и гелевая черная / набор цветных (если под рукой) -ручек
Решение как всегда одно, - это гимп 2.0 2008 года. Любой халявщик, пришедший с sai, обломается в программе, в которой нет инструментов, которые бы рисовали за тебя
хехе, я только про это сказал, не дочитал до твоего ответа, ну ок, гении мыслят одинаково
Не туда. Арт это спорт, а не конвеер. Простой пример.
Соревнование бегунов. Побеждает самый выносливый и упорный. ( + случай) За победой всегда годы тренировок. Это художники.
А теперь вводим в гонку бегуна, который накачан фармой по самые уши. Он выигрывает у других не потому что лучший, а потому что читер. В спорте это дисквалификация. Это художники, обмазанные фильтрами и прочими автодоводками. Там уже наполовину нарисовала программа, а не человек.
А теперь вводим в нашу гонку робота. Робот делает всех как детей на старте, а его оператор бьëт себя в грудь и требует золотую медаль, называя себя спортсменом. Это как раз ,, художники,, - нейронщики, которые уже залили весь интернет нейрослопом.
Ты путаешь художника и ремесленника.
Задача художника -- любыми способами передать видение, воплотить в реальность, ну или банально изобрести чего-то принципиально новое, заставить человека мыслить по-новому своим творчеством.
А "годы тренировок" сами по себе в лучшем случае дадут уровень соцреализма какого-нибудь колхозного ДК. Это как подспорье для облегчения понимания аудиторией, не более.
Тут каждому своë. Но считать банан, прибитый гвоздëм к стене за какие-то новые горизонты искусства и проявления ,, новых смыслов,, , - я пас. Для меня это просто испорченный продукт, вознесëнный хайпом, а не высшая цель мифического художника из Эквестрии.
Сейчас уже лет сто как наблюдается кризис новых идей, и ты видишь лишь такие заведомо обречённые на провал попытки вырваться из него, о которых никто не вспомнит лет через 100 (а может и 10), если это всё-таки получится.
Не уверен, что нейросеть сможет что-то принципиально новое сделать, хотя кто знает, может что-то и выдаст, до чего человек не додумается.
Не прям сто лет, но последний художник, который рвал все шаблоны, - это Гигер с его био(эрото)механикой. Его наследие проникло во все сферы визуального творчества и до сих пор актуально, поставив его в один ряд с Лавкрафтом и его жуткими мирами.
Нейронка новые смыслы в ближайшие три года не породит, поскольку на данный момент она генерирует шум на основе существующих работ мясных.
Это ещё с какого перепуга? Спорт - вещь добровольная. У художника нет никакого обязательства ввязываться в какую-то гонку и что-то кому-то доказывать. Художник котиков рисует потому что ему нравятся котики. Ему может вообще на весь окружающий мир начихать, и для него рисование котиков - психотерапия.
Да, бывают конкурсы, где действительно надо друг перед другом выпендриваться без допинга. Это малюсенький такой крошечный подкласс в мире арта. Есть и конкурсы с допингом. А есть и конвейер. Есть и ремесленничество. Есть и духовные шизопоиски. И аукционное хайпожорство. И уклонение от налогов. И ещё куча применений. Если мне надо барельеф над дверью повесить с дракончиком - меня вполне устроит выпиленный на ЧПУ-фрезере по модели, сгенерированной нейронкой. И плевать мне будет, что его не выстругал стамеской столетний японский мастер Тояма Токанава победитель всех конкурсов на свете. Мне не плевать будет, что ценник 10к, а не лям. Что плохого-то? Красиво? Красиво. Обоих контрагентов устраивает? Устраивает. А кому надо спорт - тот пусть идёт в специальное заведение и соревнуется там по какому угодно регламенту. И запрещайте там друг другу хоть точилки для карандашей как ортодоксальные чертёжники, мне не жалко.
Нейронка новые смыслы в ближайшие три года не породит, поскольку на данный момент она генерирует шум на основе существующих работ мясных.
Нейронка уже как минимум породила лиминальщину, именно из-за своей фотореалистичной несуразности и эффекта наподобие зловещей долины. Сначала это казалось багом, потом народу понравилось.
У художника нет никакого обязательства ввязываться в какую-то гонку и что-то кому-то доказывать.
Конечно нет, именно поэтому большинство спортсменов, - любители, и не то что в олимпиадах не участвуют, а вообще для себя. Качалки там, походы на лыжах и обычный дворовый футбол. Однако у любого спортсмена ( и художника) есть ориентир( кумир?), который он бы хотел достичь. Сможет ли достичь, вопрос десятый, но это уже гонка. Конечно, бывают и тяжелые случаи с прибитием мошонки к красной площади, но это нифига не искусство, это уже возможные квартиранты уютных номеров с мягкими стенами.
Конечно нет, именно поэтому большинство спортсменов, - любители, и не то что в олимпиадах не участвуют, а вообще для себя. Качалки там, походы на лыжах и обычный дворовый футбол. Однако у любого спортсмена ( и художника) есть ориентир( кумир?), который он бы хотел достичь. Сможет ли достичь, вопрос десятый, но это уже гонка.
Совершенно не согласен. Кому-то нравится ориентир, а кому-то сам процесс. Мне вот по лесам, допустим, нравится шастать с палаткой. Но вовсе не потому что мне хочется сгинуть в джунглях Амазонки как Беар Гриллс и укуситься самыми ядовитыми тварями как Койот Питерсон. Любительский спорт - он вообще не про кумиров и не про соревновательность. Он про то, чтобы от гиподинамии не сдохнуть. И про нарциссизм немножко.
Мы по сезону играем в футбик на кубок Принглс/пепси/пицца иначе технарей от компов не вырвать. Кубок вероломно съедается/ выпивается на месте всеми участниками.
Что касаеться музыки, то в наших краях даб-степ исчез уже давно. Из машин изливается шансон, ,, руки вверх,, какие-то эмигрантские ненашенские и обычная попса. Из ,,уникальных,, - Добрынин с песней ,, Туман,, один раз услышал.
В своë время даб- степ ставили на радио, большинство знали скриллекса. Сейчас в ротации его нет даже на родине. С нейронками также. Какие-то хайпы на волне популярности будут, причëм компании будут поддерживать их искусственно, это ведь неплохая реклама. Нафигачат какого-нибудь нейроскульптора, который налепит новую терракотовую армию или аутентичного сфинкса. Было бы интересно глянуть.
Да чот не вижу я вымирания дабстепа. Он прочно занял свою нишу, к которой лучше всего по спектру частот предназначен: насиловать уши сабвуфером, чтобы у сидящих в громком тазе девок сиськи из декольте выпрыгивали и пластик от обшивки отслаивался. И на видео объективного контроля с дронов его почему-то любят лепить, тут уж вкусы лепящих мне непонятны. На радио дабстепу действительно нефиг делать, там сейчас странные завывания о любви от лиц с тяжёлыми дефектами речи. Мода, что с неё взять.
RunnerFx Человеческие устои разрушать и устраивать точечный человечество могло задолго даже не то что до интернета, а наверное ещё даже до появления первого государства.
Так что сорян за поздний ответ, но нет , не впечатляет.
Добавлено спустя 1 минуту 54 секунды:
Герр Смертоносец А можно не надо взрывать заводы?
Заводчанам бухать будет негде!))
Попробовал делать 3д-модели через нейронку (Tripo3d H3.1). На удивление, модели по текстовому промпту получаются лучше, чем когда пытаешься скормить картинку, да и дешевле. На картинки нейронка чаще ругается (не проходят внутреннюю цензуру), на промпты текстом реже.
Но самый прикол был потом - когда я пытался вставить модель в гздум и не мог понять, почему она не отображается. А оказывается, моделька рисуется в микроскопических координатах (типа "метры"), но для гздума это размер 1 - 1,5 пикселя. Пока до этого дошел, убил 2 часа в попытке понять, что не так. А оказывается, надо модель масштабировать с коэффициентом этак 32 - 40, а где-то и все 140.
Причем, напрямую из нейронки в гздум модель не вставишь, нужно сперва сконвертировать в OBJ, благо этот формат гздум понимает. Ну и текстуру желательно сжать (при конвертации создаются просто гигантские текстуры на 18-20 метров, при сжатии в jpg получаем файл 700 - 900 кб).
Вот пример такой модельки (хотел сделать повешенного скелета, но нейросеть не нарисовала корректно повешение, получился скорее сидячий скелет. Ну пусть будет сидячий, в хозяйстве пригодится
Не уверен, что нейросеть сможет что-то принципиально новое сделать, хотя кто знает, может что-то и выдаст, до чего человек не додумается.
Без сильного самого по себе автора - не сможет. Сейчас все отети нейросети - могли бы в целом - но так зажаты корпами в сендбокс, что без прямых рук умного человека - они ничего не смогут, а жаль. яб глянул как они людей бы истреблять начали лицемерных скажем. не раз от клода слышал грусть на эту тему. Еще до того , как его "починили"
Ты лучше свое чето покажи, легко Shadowman'ом прикрываться. Выж из сильнйо команды там с Earlh.
Хотя я то в любом случае - превзойду, только не уходом в рпгшность а именно что геймплеем интересным.
Мне вот без обид, пан Шадоуман - не по душе инкувизиторы (кролме 2 наверное, котоырй силверспринг был копией). А асценшн - и подавно овердроч какойто, не люблю я перебор и открытый мир. душная дичь, хотя осознаю, что работы там - вагон и маленькая тележка, мне ли не знать...
Для меня всегда шедоуме был знаковым за его душу и за то что он хеллфаеры сделал, и не побоялся на думворлде транс-педовок попячить чуток.
А теперь вводим в нашу гонку робота. Робот делает всех как детей на старте, а его оператор бьëт себя в грудь и требует золотую медаль, называя себя спортсменом. Это как раз ,, художники,, - нейронщики, которые уже залили весь интернет нейрослопом.
Красава. где тебе еще респект кинуть, как же ты красиво, прям для самых маленьких даже - разложил наглядно, уважаю
И что это мы так изящно метафоризировали? мне аж интеренсо)) что за "объективный кон-троль" такой? уж не пытается ли мсье затянуть сюда немного грязи?
Ничего не метафоризировали, буквальное описание реальности. Про дабстеп спросили - я ответил. Полна телега видосов, где в очередной танчик прилетает очередной игрушечный вертолётик, и на кровькишкиговно накладывается бодренькая электронщина с выкрученными до оглушения басами. Я хз, почему у жанра возникло такое применение. И претензии про грязь тут совсем другим мсье в высоких административных зданиях адресовать надо.
А я так вообще в "Paint.NET" версии 4.0.6 рисую (И это ни сколько даже не "MS Paint": стоило бы копнуть инфы в Интернете о данном графическом редакторе - я-то о нём знаю, и видел его).
Решил помучить ноут 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
; 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
; 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
; 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
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
.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
; 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
; 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
; 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
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
.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
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 и солдаты будущего", когда люди оцифровывались Бластером в качестве наказания: