搜尋此網誌

顯示具有 Assembler 標籤的文章。 顯示所有文章
顯示具有 Assembler 標籤的文章。 顯示所有文章

2012年8月22日 星期三

BIOS - KEYBOARD(Check/Get Keystroke, Get Shift Flags)



/*******************************************/
KEYBOARD - GET KEYSTROKE
Input:
AH = 00h
INT 16h
Return: 
AH = BIOS scan code
AL = ASCII character
/*******************************************/
KEYBOARD - CHECK FOR KEYSTROKE
Input:
AH = 01h
INT 16h
Return: 
ZF set if no keystroke available
ZF clear if keystroke available
   AH = BIOS scan code
   AL = ASCII character
/*******************************************/
KEYBOARD - GET SHIFT FLAGS
Input:
AH = 02h
INT 16h
Return:
AL = shift flags

Bitfields for keyboard shift flags:
Bit(s) Description
 7   Insert active
 6 CapsLock active
 5 NumLock active
 4 ScrollLock active
 3 Alt key pressed (either Alt on 101/102-key keyboards)
 2 Ctrl key pressed (either Ctrl on 101/102-key keyboards)
 1 left shift key pressed
 0 right shift key pressed
/*******************************************/

Example:

typedef struct _Key_Info{
u8 ScanCode;
u8 ASCiiCode;
u8 StatusCode;
u8 Reserved;
} Key_Info;

u8 wait_for_input(Key_Info *pKeyInfo)
{
u8 Scan = 0;
u8 ASCii = 0;
u8 Status = 0;
u8 key_press = 0;
__asm {
pusha
mov bl, 0x00

clearbuf:
mov ah, 0x01
int 16h
jz exit1

mov ah, 0x00
int 16h
mov Scan, ah
mov ASCii, al

mov ah, 0x02
int 16h
mov Status, al
mov bl, 0x01
jmp clearbuf

exit1:
mov key_press, bl
popa
}
pKeyInfo->ScanCode = Scan;
pKeyInfo->ASCiiCode = ASCii;
pKeyInfo->StatusCode = Status;
return key_press;
}

BIOS - Get System time by seconds from 1970


/*The example would use in/out port to get system time(year/month/day/hour/minute/second), and transfer them into seconds from 1970.*/

u32 get_system_time(void)
{
       u16 year = 0, mon = 0, day = 0, hour = 0, min = 0, sec = 0;
       u16 year0, mon0;
       u16 tmp = 10;
       u32 total;

   __asm{
        pusha
        mov al, 00h
        out 70h, al
        in al, 71h
        mov bl, al
        and bl, 0Fh
        shr al, 4
        mov ah, 00h
        mul tmp
        add al, bl
        mov sec, ax

        mov al, 02h
        out 70h, al
        in al, 71h
        mov bl, al
        and bl, 0Fh
        shr al, 4
        mov ah, 00h
        mul tmp
        add al, bl
        mov min, ax

        mov al, 04h
        out 70h, al
        in al, 71h
        mov bl, al
        and bl, 0Fh
        shr al, 4
        mov ah, 00h
        mul tmp
        add al, bl
        mov hour, ax

        mov al, 07h
        out 70h, al
        in al, 71h
        mov bl, al
        and bl, 0Fh
        shr al, 4
        mov ah, 00h
        mul tmp
        add al, bl
        mov day, ax

        mov al, 08h
        out 70h, al
        in al, 71h
        mov bl, al
        and bl, 0Fh
        shr al, 4
        mov ah, 00h
        mul tmp
        add al, bl
        mov mon, ax

        mov al, 09h
        out 70h, al
        in al, 71h
        mov bl, al
        and bl, 0Fh
        shr al, 4
        mov ah, 00h
        mul tmp
        add al, bl
        mov bx, ax
        add bx, 2000
        mov year, bx

        popa
    }

    mon0 = mon;
    year0 = year;

    /* 1..12 -> 11,12,1..10 */
    if (0 >= (int) (mon -= 2)) {
mon += 12; /* Puts Feb last since it has leap day */
year -= 1;
    }

    total = (u32)((u32)((u32)((u32)
        (year / 4 - year / 100 + year/400 + 367 * mon / 12 + day) +
        (u32)year * 365 - (u32)719499
            )*24 + hour /* now have hours */
            )*60 + min /* now have minutes */
        )*60 + sec; /* finally seconds */

    return total;
}