#define printf class TKlbrGraphDraw : public TBaseGraphDraw { unsigned long cur_color; int quit; typedef TBaseGraphDraw 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)); } }