1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
/* -*- c -*- ------------------------------------------------------------- *
*
* Copyright 2004-2005 Murali Krishnan Ganapathy - All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, Inc., 53 Temple Place Ste 330,
* Boston MA 02111-1307, USA; either version 2 of the License, or
* (at your option) any later version; incorporated herein by reference.
*
* ----------------------------------------------------------------------- */
#include <string.h>
#include <com32.h>
#include "com32io.h"
#include "syslnx.h"
com32sys_t inreg,outreg; // Global register sets for use
/* Print character and attribute at cursor */
void cprint(char chr,char attr,unsigned int times,char disppage)
{
REG_AH(inreg) = 0x09;
REG_AL(inreg) = chr;
REG_BH(inreg) = disppage;
REG_BL(inreg) = attr;
REG_CX(inreg) = times;
__intcall(0x10,&inreg,&outreg);
}
void setdisppage(char num) // Set the display page to specified number
{
REG_AH(inreg) = 0x05;
REG_AL(inreg) = num;
__intcall(0x10,&inreg,&outreg);
}
char getdisppage() // Get current display page
{
REG_AH(inreg) = 0x0f;
__intcall(0x10,&inreg,&outreg);
return REG_BH(outreg);
}
void getpos(char * row, char * col, char page)
{
REG_AH(inreg) = 0x03;
REG_BH(inreg) = page;
__intcall(0x10,&inreg,&outreg);
*row = REG_DH(outreg);
*col = REG_DL(outreg);
}
void gotoxy(char row,char col, char page)
{
REG_AH(inreg) = 0x02;
REG_BH(inreg) = page;
REG_DX(inreg) = (row << 8)+col;
__intcall(0x10,&inreg,&outreg);
}
unsigned char sleep(unsigned int msec)
{
unsigned long micro = 1000*msec;
REG_AH(inreg) = 0x86;
REG_CX(inreg) = (micro >> 16);
REG_DX(inreg) = (micro & 0xFFFF);
__intcall(0x15,&inreg,&outreg);
return REG_AH(outreg);
}
void beep()
{
REG_AH(inreg) = 0x0E;
REG_AL(inreg) = 0x07;
REG_BH(inreg) = 0;
__intcall(0x10,&inreg,&outreg);
}
void scrollupwindow(char top, char left, char bot, char right, char attr,char numlines)
{
REG_AH(inreg) = 0x06;
REG_AL(inreg) = numlines;
REG_BH(inreg) = attr; // Attribute to write blanks lines
REG_DX(inreg) = (bot << 8) + right; // BOT RIGHT corner of window
REG_CX(inreg) = (top << 8) + left; // TOP LEFT of window
__intcall(0x10,&inreg,&outreg);
}
char inputc(char * scancode)
{
syslinux_idle(); /* So syslinux can perform periodic activity */
REG_AH(inreg) = 0x10;
__intcall(0x16,&inreg,&outreg);
if (scancode) *scancode = REG_AH(outreg);
return REG_AL(outreg);
}
void getcursorshape(char *start, char *end)
{
char page = getdisppage();
REG_AH(inreg) = 0x03;
REG_BH(inreg) = page;
__intcall(0x10,&inreg,&outreg);
*start = REG_CH(outreg);
*end = REG_CL(outreg);
}
void setcursorshape(char start, char end)
{
REG_AH(inreg) = 0x01;
REG_CH(inreg) = start;
REG_CL(inreg) = end;
__intcall(0x10,&inreg,&outreg);
}
char getchar(void)
{
REG_AH(inreg) = 0x08;
__intcall(0x21,&inreg,&outreg);
return REG_AL(outreg);
}
void setvideomode(char mode)
{
REG_AH(inreg) = 0x00;
REG_AL(inreg) = mode;
__intcall(0x10,&inreg,&outreg);
}
unsigned char checkkbdbuf()
{
REG_AH(inreg) = 0x11;
__intcall(0x16,&inreg,&outreg);
return !(outreg.eflags.l & EFLAGS_ZF);
}
// Get char displayed at current position
unsigned char getcharat(char page)
{
REG_AH(inreg) = 0x08;
REG_BH(inreg) = page;
__intcall(0x16,&inreg,&outreg);
return REG_AL(outreg);
}
|