0,0 → 1,148 |
#define printf |
class TKlbrGraphDraw : public TBaseGraphDraw<TKlbrGraphDraw> |
{ |
unsigned long cur_color; |
int quit; |
typedef TBaseGraphDraw<TKlbrGraphDraw> TGraphDraw; |
public: |
TKlbrGraphDraw(const char *s = 0) : TGraphDraw(s) {} |
int GetStatus() {return 1;} |
int Run(int evmask = 0, int w = INT_MIN, int h = INT_MIN); |
int SetColor(unsigned long c) {cur_color=c;return 1;} |
int DrawLine(int x0, int y0, int x1, int y1); |
int DrawText(int x0, int y0, char* text); |
int IsDraw(void) {return 1;} |
int DrawClear(); |
unsigned long CreateColor(unsigned short red, |
unsigned short green, unsigned short blue); |
void GetSize(int &w, int &h); |
int GetTextH(const char *s) {return 10;} |
int GetTextW(const char *s) {return 6 * strlen(s);} |
void Quit(int q = 1) {quit = q;} |
}; |
int TKlbrGraphDraw::DrawLine(int x0, int y0, int x1, int y1) |
{ |
__asm__ __volatile__("int $0x40" :: "a"(38), "b"((x0 << 16) + x1), "c"((y0 << 16) + y1), "d"(cur_color)); |
return 1; |
} |
int TKlbrGraphDraw::DrawText(int x0, int y0, char* text) |
{ |
__asm__ __volatile__("int $0x40" :: "a"(4), "b"((x0 << 16) + y0), "c"(cur_color | 0xC0000000), "d"(text), "D"(0xFFFFFF)); |
return 1; |
} |
int TKlbrGraphDraw::DrawClear(void) |
{ |
int w,h; |
GetSize(w,h); |
__asm__ __volatile__("int $0x40" :: "a"(13), "b"(w), "c"(h), "d"(0xFFFFFF)); |
return 1; |
} |
unsigned long TKlbrGraphDraw::CreateColor(unsigned short red, |
unsigned short green, unsigned short blue) |
{ |
return (unsigned long)(blue >> 8) + ((unsigned long)(green >> 8) << 8) + |
((unsigned long)(red >> 8) << 16); |
} |
void TKlbrGraphDraw::GetSize(int &w, int &h) |
{ |
char buffer[1024]; |
__asm__ __volatile__("int $0x40" :: "a"(9), "b"(buffer), "c"(-1)); |
w = *(int*)(buffer + 62); |
h = *(int*)(buffer + 66); |
} |
#define XK_Left 0xB0 |
#define XK_Right 0xB3 |
#define XK_Up 0xB2 |
#define XK_Down 0xB1 |
#define XK_Return 0x0D |
#define XK_space 0x20 |
#define XK_Escape 0x1B |
#define XK_less '<' |
#define XK_comma ',' |
#define XK_period '.' |
#define XK_greater '>' |
#define XK_minus '-' |
#define XK_equal '=' |
#define XK_underscore '_' |
#define XK_plus '+' |
#define XK_Delete 0xB6 |
#define XK_F8 0x39 |
#define XK_l 'l' |
#define XK_L 'L' |
#define XK_F2 0x33 |
#define XK_s 's' |
#define XK_S 'S' |
#define XK_slash '/' |
#define XK_question '?' |
#define XK_n 'n' |
#define XK_N 'N' |
#define XK_t 't' |
#define XK_T 'T' |
#define XK_r 'r' |
#define XK_R 'R' |
#define XK_b 'b' |
#define XK_B 'B' |
#define XK_f 'f' |
#define XK_F 'F' |
int TKlbrGraphDraw::Run(int evmask, int w, int h) |
{ |
__asm__ __volatile__("int $0x40" :: "a"(40), "b"(0x27)); // enable mouse events |
quit = 0; |
char buffer[1024]; |
int event = 1; |
int skinHeight; |
int prev_mouse_btn = 0; |
for (;;) { |
switch (event) { |
case 1: |
__asm__ __volatile__("int $0x40" :: "a"(12), "b"(1)); |
__asm__ __volatile__("int $0x40" : "=a"(skinHeight) : "a"(48), "b"(4)); |
__asm__ __volatile__("int $0x40" :: "a"(0), "b"(w+9), "c"(h+skinHeight+4), "d"(0x33FFFFFF), "S"(0), "D"(title)); |
{ |
TGraphDraw::event ev; |
ev.type = TGraphDraw::event::draw; |
ev.any.drw = this; |
evfunc(ev); |
} |
__asm__ __volatile__("int $0x40" :: "a"(12), "b"(2)); |
break; |
case 2: |
{ |
int keyCode; |
__asm__ __volatile__("int $0x40" : "=a"(keyCode) : "a"(2)); |
if (!(keyCode & 0xFF)) { |
TGraphDraw::event ev; |
ev.type = TGraphDraw::event::key_down; |
ev.any.drw = this; |
ev.key.k = (keyCode >> 8) & 0xFF; |
evfunc(ev); |
} |
} |
break; |
case 3: |
return 0; |
case 6: |
{ |
int mouse_btn; |
int mouse_pos; |
__asm__ __volatile__("int $0x40" : "=a"(mouse_btn) : "a"(37), "b"(2)); |
mouse_btn &= 1; |
if (prev_mouse_btn == mouse_btn) |
break; |
prev_mouse_btn = mouse_btn; |
__asm__ __volatile__("int $0x40" : "=a"(mouse_pos) : "a"(37), "b"(1)); |
TGraphDraw::event ev; |
ev.type = mouse_btn ? TGraphDraw::event::button_down : TGraphDraw::event::button_up; |
ev.any.drw = this; |
ev.button.n = 1; |
ev.button.x = mouse_pos >> 16; |
ev.button.y = (short)mouse_pos; |
evfunc(ev); |
} |
break; |
} |
if (quit) |
return quit; |
__asm__ __volatile__("int $0x40" : "=a"(event) : "a"(10)); |
} |
} |