ОС на AssemblerФорум программистов и сисадминов Киберфорум > Форум программистов > Низкоуровневое программирование > Assembler, MASM, TASM > ОС на Assembler Как нарисовать пиксель?вопрос:Здравствуйте, делаю мега-примитивную OC, скажите пожалуйста, как правильно закрасить пиксель каким нибудь цветом, под словом "правильно", я подразумеваю, что как лучше в видеобуффер загружать каким-то образом пиксель или вообще сделать универсальный мини-драйвер, и куда тогда лучше смотреть ? ответ:Как-то занимался я регистрами видеокарты. Щас надо поднимать старый исходник. Почитай Роберта Джордейна он рассказывает как это работает. И второе поищи инфу о стандарте ultra vbe 2.0 на картах с этим стандартом можно рисовать в svga без драйверов(почти все современные поддерживают этот стандарт).ps: Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT
random: push cx push dx push di mov dx, word [seed] or dx, dx jnz @f rdtsc mov dx, ax@@: mov ax, word [seed2] or ax, ax jnz @f in ax, 40h@@: mul dx inc ax mov word [seed], dx mov word [seed2], ax xor dx, dx sub di, si inc di div di mov ax, dx add ax, si pop di pop dx pop cx ret
А, зачем нам фрибейсик, когда мы знаем ассемблер? Пусть мы на год дольше попишем код, зато быстро-то как будет!
Зато будет жесткая привязка к железу.
Const screenWidth = 1600Const screenHeight = 900ScreenRes screenWidth, screenHeight, 32,2Dim As Integer w, h, depth, frames, fps, x, y, randDim As String driver, sDim As Double tt = TimerScreeninfo w,h,depth,,,,driver?? " "& w & " x " & h & " x " & depth?? " Using driver " & driver?? " Press any key"SleepScreenSet 1, 0Dim As Ulong Ptr p = Screenptr, destDo dest = p Screenlock For x = 0 To screenWidth-1 For y = 0 To screenHeight-1 rand = Rnd *dest = Iif (rand=1,&hffffffff,0) dest += 1 Next y Next x Screenunlock Pcopy 1,0 s = "fps: " & fps Windowtitle s If Int(t) <> Int(Timer) Then t = Timer fps = frames frames = 0 End If frames += 1 Sleep 1,1Loop until inkey=Chr(27)End
#define OLC_PGE_APPLICATION#include "olcPixelGameEngine.h"class Example : public olc::PixelGameEngine{public: Example() { sAppName = "Example"; }public: bool OnUserCreate() override { // Called once at the start, so create things here return true; } bool OnUserUpdate(float fElapsedTime) override { // called once per frame for (int x = 0; x < ScreenWidth(); x++) for (int y = 0; y < ScreenHeight(); y++) //Draw(x, y, olc::Pixel(rand() % 255, rand() % 255, rand() % 255)); if (rand() % 2) Draw(x, y, olc::Pixel(olc::BLACK)); else Draw(x, y, olc::Pixel(olc::WHITE)); return true; }};int main(){ Example demo; if (demo.Construct(1600, 900, 1, 1)) demo.Start(); return 0;}
Продолжаю вести наблюдения, держу вас в курсе.
#define OLC_PGE_APPLICATION#include "olcPixelGameEngine.h"class Example : public olc::PixelGameEngine{public: Example() { sAppName = "White Noise"; }public: bool OnUserCreate() override { // Called once at the start, so create things here return true; } bool OnUserUpdate(float fElapsedTime) override { // called once per frame for (int x = 0; x < ScreenWidth(); x++) for (int y = 0; y < ScreenHeight(); y++) { bool bBlWt = false; bBlWt = rnd() % 2; Draw(x, y, bBlWt ? olc::Pixel(olc::BLACK) : olc::Pixel(olc::WHITE)); } return true; }private: uint32_t nProcGen = 0; uint32_t rnd() //fast random alg Lehmer { nProcGen += 0xe120fc15; uint64_t tmp; tmp = (uint64_t)nProcGen * 0x4a39b70d; uint32_t m1 = (tmp >> 32) ^ tmp; tmp = (uint64_t)m1 * 0x12fad5c9; uint32_t m2 = (tmp >> 32) ^ tmp; return m2; }};int main(){ Example demo; if (demo.Construct(1600, 900, 1, 1)) demo.Start(); return 0;}
#define OLC_PGE_APPLICATION#include "olcPixelGameEngine.h"class Example : public olc::PixelGameEngine{public: Example() { sAppName = "White Noise"; }public: bool OnUserCreate() override { sprDemo = new olc::Sprite(ScreenWidth(), ScreenHeight()); decDemo = new olc::Decal(sprDemo); return true; } bool OnUserUpdate(float fElapsedTime) override { for (int x = 0; x < ScreenWidth(); x++) for (int y = 0; y < ScreenHeight(); y++) { sprDemo->SetPixel(x, y, rnd() % 2 ? olc::Pixel(olc::BLACK) : olc::Pixel(olc::WHITE)); } decDemo->Update(); DrawDecal({ 0, 0 }, decDemo); return true; }private: olc::Sprite* sprDemo = nullptr; olc::Decal* decDemo = nullptr; uint32_t nProcGen = 0; uint32_t rnd() //fast random alg Lehmer { nProcGen += 0xe120fc15; uint64_t tmp; tmp = (uint64_t)nProcGen * 0x4a39b70d; uint32_t m1 = (tmp >> 32) ^ tmp; tmp = (uint64_t)m1 * 0x12fad5c9; uint32_t m2 = (tmp >> 32) ^ tmp; return m2; }};int main(){ Example demo; if (demo.Construct(1600, 900, 1, 1)) demo.Start(); return 0;}