Другие языки программирования и технологии
ассемблер, Как сделать мигание разными цветами?
model small .data mes db 'assembler_miganie$' .code start: mov ax,@data mov ds,ax mov ah,0 ;видео режим mov al,3 int 10h mov AH,09 ;Функция вывода mov BH,00 ;Страница 0 mov BL,4 ;Мигание, инверсия mov CX,11;11 раз m1: int 10h ;Вызвать bios loop m1 lea dx,mes int 21h mov ah,1 int 21h mov ah,4ch int 21h end start
Чёрт, невнимательно прочитал вопрос и написал про мигание лампочками клавиатуры.. . извиняюсь за оффтоп, но овтет оставлю, вдруг кому пригодится =)
А ассемблерщики знают толк в извращениях! =)
Нужно всего лишь работать с user32.dll, на шарпе это выглядит так (надеюсь, разберётесь, раз уж на асме пишите) :
private const byte VK_SCROLL = 0x91;
private const byte VK_NUMLOCK = 0x90;
private const byte VK_CAPITAL = 0x14;
private const uint KEYEVENTF_KEYUP = 0x2;
[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
[DllImport("user32.dll", EntryPoint = "GetKeyState", SetLastError = true)]
static extern short GetKeyState(uint nVirtKey);
//-------------------------------------------------------Scroll
public static void SetScrollLockKey(bool newState)
{
bool scrollLockSet = GetKeyState(VK_SCROLL) != 0;
if (scrollLockSet != newState)
{
keybd_event(VK_SCROLL, 0, 0, 0);
keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0);
}
}
public static bool GetScrollLockState()
{
return GetKeyState(VK_SCROLL) != 0;
}
//-------------------------------------------------------NUM
public static void SetNumLockKey(bool newState)
{
bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0;
if (scrollLockSet != newState)
{
keybd_event(VK_NUMLOCK, 0, 0, 0);
keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0);
}
}
public static bool GetNumLockState()
{
return GetKeyState(VK_NUMLOCK) != 0;
}
//-------------------------------------------------------Caps
public static void SetCapsLockKey(bool newState)
{
bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0;
if (scrollLockSet != newState)
{
keybd_event(VK_CAPITAL, 0, 0, 0);
keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);
}
}
public static bool GetCapsLockState()
{
return GetKeyState(VK_CAPITAL) != 0;
}
А включать/выключать вот так:
//__________________OFF_____________________
SetNumLockKey(false); //NumLock OFF
SetCapsLockKey(false); //CapsLock OFF
SetScrollLockKey(false); //ScrollLock OFF
//__________________ON_____________________
SetScrollLockKey(true); //ScrollLock ON
SetCapsLockKey(true); //CapsLOck ON
SetScrollLockKey(true); //ScrollLock ON
А ассемблерщики знают толк в извращениях! =)
Нужно всего лишь работать с user32.dll, на шарпе это выглядит так (надеюсь, разберётесь, раз уж на асме пишите) :
private const byte VK_SCROLL = 0x91;
private const byte VK_NUMLOCK = 0x90;
private const byte VK_CAPITAL = 0x14;
private const uint KEYEVENTF_KEYUP = 0x2;
[DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
[DllImport("user32.dll", EntryPoint = "GetKeyState", SetLastError = true)]
static extern short GetKeyState(uint nVirtKey);
//-------------------------------------------------------Scroll
public static void SetScrollLockKey(bool newState)
{
bool scrollLockSet = GetKeyState(VK_SCROLL) != 0;
if (scrollLockSet != newState)
{
keybd_event(VK_SCROLL, 0, 0, 0);
keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0);
}
}
public static bool GetScrollLockState()
{
return GetKeyState(VK_SCROLL) != 0;
}
//-------------------------------------------------------NUM
public static void SetNumLockKey(bool newState)
{
bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0;
if (scrollLockSet != newState)
{
keybd_event(VK_NUMLOCK, 0, 0, 0);
keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0);
}
}
public static bool GetNumLockState()
{
return GetKeyState(VK_NUMLOCK) != 0;
}
//-------------------------------------------------------Caps
public static void SetCapsLockKey(bool newState)
{
bool scrollLockSet = GetKeyState(VK_NUMLOCK) != 0;
if (scrollLockSet != newState)
{
keybd_event(VK_CAPITAL, 0, 0, 0);
keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);
}
}
public static bool GetCapsLockState()
{
return GetKeyState(VK_CAPITAL) != 0;
}
А включать/выключать вот так:
//__________________OFF_____________________
SetNumLockKey(false); //NumLock OFF
SetCapsLockKey(false); //CapsLock OFF
SetScrollLockKey(false); //ScrollLock OFF
//__________________ON_____________________
SetScrollLockKey(true); //ScrollLock ON
SetCapsLockKey(true); //CapsLOck ON
SetScrollLockKey(true); //ScrollLock ON
в младшем байте регистра В для функции 09 как раз и задается цвет:
биты:
7 - мигание = 1/норма = 0
6,5,4 - цвет фона (биты соответственно - красный, зеленый, синий)
3 - яркость (1= яркий символ/0 - обычный) . Для задания 16 цветов у символов
2,1,0 - цвет символа (биты соответственно - красный, зеленый, синий)
биты:
7 - мигание = 1/норма = 0
6,5,4 - цвет фона (биты соответственно - красный, зеленый, синий)
3 - яркость (1= яркий символ/0 - обычный) . Для задания 16 цветов у символов
2,1,0 - цвет символа (биты соответственно - красный, зеленый, синий)
Кадырбек Балмагамбетов
а можна пример показать!
Похожие вопросы
- Почему вечно выдаёт "false"( разный цвет)?
- Хотели бы вы новую операционку на ассемблере, чтоб сделана Российскими программистами, при поддержке государства?
- Подскажите пожалуйста как сделать так чтобы цвета на мониторе соответствовали цветам при печати , а то в Кореле
- Как сделать текст двойного цвета? (желательно в паинт или gimp)
- Что может ассемблер?
- Почему многие программисты ненавидят ассемблер?Ведь у него куча плюсов!Он позволяет максимально задействовать
- Ассемблер. Как задать цвет пикселя, если номер цвета не помещается в регистр?
- Вопрос по изучению языка Ассемблера под MS DOS. (Нужны советы по программному обеспечению/программированию)
- С помощью команд fpu вычислить площадь круга, исходя из введѐнного диаметра. Ассемблер...
- Ассемблер сегодня и завтра.