Другие языки программирования и технологии

Ассемблер SVGA VESA вывести пиксель

Здравствуйте Не знаю ответит ли кто в 2023 году но пишу (как письмо дедушке морозу), пожалуйста дайте мне пример кода в котором будет работать SVGA (Super vga) мне нужно вывести точку-пиксель на экране в видеорежиме VESA , было бы хорошо с объяснениями.
SVGA это когда надо на дисплее 1600*900 или 1280*1024 выводить пиксели.
Я могу вывести пиксели на 320*200, но попробуй разберись с SVGA,
я пробовал примеры с учебников искал на ютьюбе и в интернете \ они либо не работают, либо не делается вообще ни чего (я не забывал просить пользователя что то нажать (стоп)), либо рисуется 320*200 может больше раза в два ,
но мне нужно научится отображать пиксели на современных мониторах, я пробую в основном на 95 винде или мс дос \\ но могу перейти на Линукс Лиж бы код работал !!!
компилирую и линкую на Wasm иногда на Masm ,
догрызу Зубкова С. В. Assembler. Для DOS, Windows и Unix 2017 . Если не узнаю , пойду грызть Англо язычные форумы и учебники.
За максимально простое объяснение отображения пикселя в 1280*1024 буду признателен дальше сам допру как их по очереди покрасить.
Хочешь сделать хорошо сделай это сам :

программа палитра :
.model tiny
.code
.386
org 100h
start:
mov ax,4F02h

mov bx,105h ; здесь указываешь код видеорежима
int 10h ; здесь вошел в видеорежим
mov si,0
mov al,0
mov cx,500
mov dx,0
next_cvet1:

mov bx,cx
mov ah,0ch
inc al

mov bp,0
mov cx,500
next_cvet2:
mov di,cx

inc bp
mov cx,bp
int 10h :рисуешь
mov cx,di
loop next_cvet2

inc dx
int 10h ; рисуешь
mov cx,bx
loop next_cvet1
mov ah,10h ; код функции ожидания клавиши
int 16h ; прерывание


mov ax,0003h ; возвращаешься в текст режим
int 10h
mov ax,4c00h
int 21h

int 20h



end start



работает на мс досе (может заработает в фрии досе)

этот код чтобы заткнуть умников и танцоров с бубном.

скажу по секрету: я тот кто задавал этот вопрос под другим аккаунтом.
На русском хорошего понятных объяснений на ассемблере мало да ? если ты это читаешь значит тоже учишься программировать на ассемблере. я бы начинал учится на твоем месте с Ассемблер – это просто. Учимся программировать 2011 Олег Калашников и дополнял Зубкова С. В. Assembler. Для DOS, Windows и Unix 2017
Алексей Реутов
Алексей Реутов
119
Лучший ответ
Я не уверен, что VESA можно подключить к современному монитору. Это был очень древний стандарт, который не прижился и просуществовал очень коротко. Вангую, что у тебя там обычная карточка SVGA/PCI.
Вот, у каждого устройства PCI есть прерывание и адрес DMA. Через эти ресурсы осуществляется управление картой. Как конкретно это делается - надо смотреть в даташите конкретной карты. Поэтому никаких универсальных советов тут быть не может, и поэтому же не работают и твои примеры из интернета. А 320х200 работает потому, что это был примитивный режим ремаппинга видеопамяти, одинаковый для всех карт времен царя Гороха.
Нафига во времена DirectX заниматься подобными извращениями - тоже большой вопрос, конечно...
Suiunduk ®Axmanovv
Suiunduk ®Axmanovv
71 422
Даниил Пискунов Ясно спасибо я новенький в ассемблере, то есть если я хочу на мониторе 1600 900 попиксельно отобразить картинку мне нужно лезть в прерывание и Адреса DMA , и что для каждой видеокарты в зависимости от даташита писать надо по разному ?
можно ли написать код который будет рисовать пиксели в виндовс 10 8 7 XP ?
[прерывание даташит адрес DMA ] других вариантов рисования нет ?
есть рекомендации где можно это почитать научится найти и чтоб код работал ?
Пример кода на ассемблере, который позволяет установить значение пикселя в режиме 640x480:
 BytesPerLine EQU 80 ; число байт в одной гор.линии 
VideoBufferSeg EQU 0A000h

PixelAddr PROC near
mov cl,bl ; CL := младший байт x
push dx ; сохраним DX
mov dx, BytesPerLine ; AX := y * BytesPerLine
mul dx
pop dx
shr bx,1
shr bx,1
shr bx,1 ; BX := x/8
add bx,ax ; BX := y*BytesPerLine + x/8
; BX - смещение байта в видеобуфере
mov ax, VideoBufferSeg
mov es,ax ; ES:BX := адрес байта пикселя
and cl,7 ; CL := x & 7
xor cl,7 ; CL := число сдвигов для сдвига маски влево
mov ah,1 ; AH := несдвинутая маска
ret
PixelAddr ENDP

RMWbits EQU 0 ; read-modify-write bits

SetPixel PROC ARGx:word, ARGy:word, ARGn:word uses cx, dx, bx, es
mov ax, ARGy ; AX := y
mov bx, ARGx ; BX := x
call PixelAddr ; AH := битовая маска
; ES:BX -> буфер
; CL := число сдвигов

; установка регистра битовой маски графического контроллера (GC)
shl ah,cl ; AH := битовая маска в соответствующей позиции
mov dx,3CEh ; порт регистра адреса GC
mov al,8 ; AL := номер регистра битовой маски
out dx,ax

; установка регистра режима GC
mov ax,0005h ; AL := номер регистра режима
; AH := режим записи 0 (биты 0,1)
; режим чтения 0 (бит 3)
out dx,ax

; установка регистра выбора вращения/функции
mov ah, RMWbits ; AH := биты Read-Modify-Write (=0)
mov al,3 ; AL := регистр выбора Data Rotate/Function
out dx,ax

; установка регистров установки/сброса и разрешения установки/сброса
mov ah,byte ptr ARGn; AH := цвет пикселя
mov al,0 ; AL := регистр установки/сброса
out dx,ax

mov ax,0F01h ; AH := разрешаем все цветовые слои
; AL := регистр разрешения установки/сброса
out dx,ax

; установка значения пикселя
or es:[bx],al; загрузка в защелки во время чтения
; и установка во время записи

; восстановим значения по-умолчанию
mov ax,0FF08h; маска битов
out dx,ax
mov ax,0005; регистр режима
out dx,ax
mov ax,0003; выбор функции
out dx,ax
mov ax,0001; разрешение установки/сброса
out dx,ax

ret
SetPixel ENDP
Этот код использует прямой доступ к видеопамяти для вывода пикселя на экран. Он работает только в текстовом видеорежиме DOS и не будет работать под Windows или Linux. Если вы хотите использовать этот код под DOS или Windows 95 (в текстовом видеорежиме), вы можете скомпилировать его с помощью MASM или WASM и запустить в командной строке.

Однако, если вы хотите работать с SVGA и VESA в современных операционных системах, таких как Windows или Linux, вам необходимо использовать другие методы, такие как DirectDraw (для Windows) или X Window System (для Linux). Эти методы позволяют работать с графическими режимами и выводить пиксели на экран в современных операционных системах. Они также предоставляют более высокий уровень абстракции и удобства для программиста. Я рекомендую вам изучить эти технологии, если вы хотите работать с графикой в современных операционных системах.
Даниил Пискунов эмм, я уже разобрался как с этим разрешением рисовать, меня интересует 1600*900 или 1280*1024, спасибо я поищу после работы эти методы и попытаюсь понять.