Здравствуйте Не знаю ответит ли кто в 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 буду признателен дальше сам допру как их по очереди покрасить.
Другие языки программирования и технологии
Ассемблер SVGA VESA вывести пиксель
Хочешь сделать хорошо сделай это сам :
программа палитра :
.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
программа палитра :
.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
Я не уверен, что VESA можно подключить к современному монитору. Это был очень древний стандарт, который не прижился и просуществовал очень коротко. Вангую, что у тебя там обычная карточка SVGA/PCI.
Вот, у каждого устройства PCI есть прерывание и адрес DMA. Через эти ресурсы осуществляется управление картой. Как конкретно это делается - надо смотреть в даташите конкретной карты. Поэтому никаких универсальных советов тут быть не может, и поэтому же не работают и твои примеры из интернета. А 320х200 работает потому, что это был примитивный режим ремаппинга видеопамяти, одинаковый для всех карт времен царя Гороха.
Нафига во времена DirectX заниматься подобными извращениями - тоже большой вопрос, конечно...
Вот, у каждого устройства PCI есть прерывание и адрес DMA. Через эти ресурсы осуществляется управление картой. Как конкретно это делается - надо смотреть в даташите конкретной карты. Поэтому никаких универсальных советов тут быть не может, и поэтому же не работают и твои примеры из интернета. А 320х200 работает потому, что это был примитивный режим ремаппинга видеопамяти, одинаковый для всех карт времен царя Гороха.
Нафига во времена DirectX заниматься подобными извращениями - тоже большой вопрос, конечно...
Пример кода на ассемблере, который позволяет установить значение пикселя в режиме 640x480:
Однако, если вы хотите работать с SVGA и VESA в современных операционных системах, таких как Windows или Linux, вам необходимо использовать другие методы, такие как DirectDraw (для Windows) или X Window System (для Linux). Эти методы позволяют работать с графическими режимами и выводить пиксели на экран в современных операционных системах. Они также предоставляют более высокий уровень абстракции и удобства для программиста. Я рекомендую вам изучить эти технологии, если вы хотите работать с графикой в современных операционных системах.
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, спасибо я поищу после работы эти методы и попытаюсь понять.
Похожие вопросы
- Ассемблер. Как задать цвет пикселя, если номер цвета не помещается в регистр?
- Как работают устройства ввода-вывода или как вывести пиксель на экран, не задействуя WinAPI и пр.?
- Что может ассемблер?
- Почему многие программисты ненавидят ассемблер?Ведь у него куча плюсов!Он позволяет максимально задействовать
- Вопрос по изучению языка Ассемблера под MS DOS. (Нужны советы по программному обеспечению/программированию)
- С помощью команд fpu вычислить площадь круга, исходя из введѐнного диаметра. Ассемблер...
- Ассемблер сегодня и завтра.
- Вопрос по Ассемблеру - Ввести с клавы 3 слова и вывести их на экран лесенкой Tasm
- написать программу на ассемблере: найти (в строке) и вывести слово, у которого код первого символа наибольший
- Верстка. Пиксель в пиксель?
можно ли написать код который будет рисовать пиксели в виндовс 10 8 7 XP ?
[прерывание даташит адрес DMA ] других вариантов рисования нет ?
есть рекомендации где можно это почитать научится найти и чтоб код работал ?