Раз уж ты изучаешь как расставить пиксели на экране в режиме int 10h, #3, чтобы они образовали окружность, то полагаю что вскоре ты захочешь раскрасить эти пиксели по своему усмотрению.
И тут тебе на помощь придут VGA порты: 3C8h, 3C9h.
В этом режиме, в ДОСБОКСЕ, одновременно можно отобразить всего 256 цветов из 262144 возможных. Но в чистом ДОСе и в этом видеорежиме одновременно можно замутить до 64000 уникальных цветов, но это уже прибегая к некоторым хитростям.
Итак, цвета программируются последовательно, а значения RGB лучше задавать заранее (подготовить палитру) в памяти и в нужный момент программировать их через порт 3C9, туда через этот порт можно отправить до 768 байт.
Порт 3C8h — индексный, т.е. в него ты записываешь адрес от 0 до 255, начиная с которого нужно начинать записывать байты через порт 3C9h.
Вся прелесть в том, что тебе не нужно заморачиваться с инкрементом индекса в 3C8h, как только ты запишешь значение в 3C9h, в 3C8h автоматически произойдёт инкремент индекса. Поэтому если ты укажешь начальный адрес — 0 (из 256 возможных), то можешь последовательно отправлять в порт 3C9 все 768 байт.
Каждый адрес принимает последовательно три байта (R,G,B).
768 байт — это 256×3 ячеек, т.е. 256 для R, 256 для G, 256 для B. И программируются , цвета поочерёдно: (R,G,B),(R,G,B),(R,G,B)...
Каждый цвет программируется тремя значениями RGB, каждое из этих значений лежит в диапазоне от 0 до 3Fh, отсюда и ограничения на количество цветов 64^3=262144.
А поскольку ячеек 768, то 768/3=256 цветов.
А вот пример программирования VGA через эти порты:
mov dx, 3C8h
xor al, al
out dx, al — будем шить с самого начала.
inc dx — 3C9h
mov cx, 300h — 768 байт
mov si, — адрес палитры из 768 байт
rep outsb — зашить последовательно все 768 байт
В итоге каждый цвет пикселя будет определяться значением от 0 до FFh.
Вот вчитываюсь, и родился вопрос, когда уже палитру залил значит в видеокарту, потом надо достать цветную точку и нарисовать ее в видеопамять, вот типа такого механизм?
mov ax, 3c8h
in ax,10 ;сместиться на 16 индекс палитры
mov cx, 3 ; установим счетчик на 3 цикла считывания байтов
rgbread:
mov dl, 3c9h ;скопировать в dl адрес порта
out bl, dl; скопировать тек знач. в порте 3c9h (r,g или b цвета пикселя) в регистр bl (при этом в порте 3с8h должно что-то инкрементироваться, чтобы след. итерацией считался байт следующего из трех цветов)?
mov di, vid_mem_addr; установить di на адрес нужного пикселя на экране
mov [di], bl; записать один из трех байтов в область видеопамяти
inc byte di; увеличить на байт адрес di
loop rgbread
drawtoscreen:
..
а потом как то вывести видеопамять на экран, учитывая частоту развертки и обратный ход луча :)) или это уже должно быть на экране?
типа такого?
прошу не судить строго, это родил мозг человека без доступа к компьютеру и никогда ничего подобного не делавшего :))