Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5125 | clevermous | 1 | #define printf |
2 | class TKlbrGraphDraw : public TBaseGraphDraw |
||
3 | { |
||
4 | unsigned long cur_color; |
||
5 | int quit; |
||
6 | typedef TBaseGraphDraw |
||
7 | public: |
||
8 | TKlbrGraphDraw(const char *s = 0) : TGraphDraw(s) {} |
||
9 | int GetStatus() {return 1;} |
||
10 | int Run(int evmask = 0, int w = INT_MIN, int h = INT_MIN); |
||
11 | int SetColor(unsigned long c) {cur_color=c;return 1;} |
||
12 | int DrawLine(int x0, int y0, int x1, int y1); |
||
13 | int DrawText(int x0, int y0, char* text); |
||
14 | int IsDraw(void) {return 1;} |
||
15 | int DrawClear(); |
||
16 | unsigned long CreateColor(unsigned short red, |
||
17 | unsigned short green, unsigned short blue); |
||
18 | void GetSize(int &w, int &h); |
||
19 | int GetTextH(const char *s) {return 10;} |
||
20 | int GetTextW(const char *s) {return 6 * strlen(s);} |
||
21 | void Quit(int q = 1) {quit = q;} |
||
22 | }; |
||
23 | int TKlbrGraphDraw::DrawLine(int x0, int y0, int x1, int y1) |
||
24 | { |
||
25 | __asm__ __volatile__("int $0x40" :: "a"(38), "b"((x0 << 16) + x1), "c"((y0 << 16) + y1), "d"(cur_color)); |
||
26 | return 1; |
||
27 | } |
||
28 | int TKlbrGraphDraw::DrawText(int x0, int y0, char* text) |
||
29 | { |
||
30 | __asm__ __volatile__("int $0x40" :: "a"(4), "b"((x0 << 16) + y0), "c"(cur_color | 0xC0000000), "d"(text), "D"(0xFFFFFF)); |
||
31 | return 1; |
||
32 | } |
||
33 | int TKlbrGraphDraw::DrawClear(void) |
||
34 | { |
||
35 | int w,h; |
||
36 | GetSize(w,h); |
||
37 | __asm__ __volatile__("int $0x40" :: "a"(13), "b"(w), "c"(h), "d"(0xFFFFFF)); |
||
38 | return 1; |
||
39 | } |
||
40 | unsigned long TKlbrGraphDraw::CreateColor(unsigned short red, |
||
41 | unsigned short green, unsigned short blue) |
||
42 | { |
||
43 | return (unsigned long)(blue >> 8) + ((unsigned long)(green >> 8) << 8) + |
||
44 | ((unsigned long)(red >> 8) << 16); |
||
45 | } |
||
46 | void TKlbrGraphDraw::GetSize(int &w, int &h) |
||
47 | { |
||
48 | char buffer[1024]; |
||
49 | __asm__ __volatile__("int $0x40" :: "a"(9), "b"(buffer), "c"(-1)); |
||
50 | w = *(int*)(buffer + 62); |
||
51 | h = *(int*)(buffer + 66); |
||
52 | } |
||
53 | #define XK_Left 0xB0 |
||
54 | #define XK_Right 0xB3 |
||
55 | #define XK_Up 0xB2 |
||
56 | #define XK_Down 0xB1 |
||
57 | #define XK_Return 0x0D |
||
58 | #define XK_space 0x20 |
||
59 | #define XK_Escape 0x1B |
||
60 | #define XK_less '<' |
||
61 | #define XK_comma ',' |
||
62 | #define XK_period '.' |
||
63 | #define XK_greater '>' |
||
64 | #define XK_minus '-' |
||
65 | #define XK_equal '=' |
||
66 | #define XK_underscore '_' |
||
67 | #define XK_plus '+' |
||
68 | #define XK_Delete 0xB6 |
||
69 | #define XK_F8 0x39 |
||
70 | #define XK_l 'l' |
||
71 | #define XK_L 'L' |
||
72 | #define XK_F2 0x33 |
||
73 | #define XK_s 's' |
||
74 | #define XK_S 'S' |
||
75 | #define XK_slash '/' |
||
76 | #define XK_question '?' |
||
77 | #define XK_n 'n' |
||
78 | #define XK_N 'N' |
||
79 | #define XK_t 't' |
||
80 | #define XK_T 'T' |
||
81 | #define XK_r 'r' |
||
82 | #define XK_R 'R' |
||
83 | #define XK_b 'b' |
||
84 | #define XK_B 'B' |
||
85 | #define XK_f 'f' |
||
86 | #define XK_F 'F' |
||
87 | int TKlbrGraphDraw::Run(int evmask, int w, int h) |
||
88 | { |
||
89 | __asm__ __volatile__("int $0x40" :: "a"(40), "b"(0x27)); // enable mouse events |
||
90 | quit = 0; |
||
91 | char buffer[1024]; |
||
92 | int event = 1; |
||
93 | int skinHeight; |
||
94 | int prev_mouse_btn = 0; |
||
95 | for (;;) { |
||
96 | switch (event) { |
||
97 | case 1: |
||
98 | __asm__ __volatile__("int $0x40" :: "a"(12), "b"(1)); |
||
99 | __asm__ __volatile__("int $0x40" : "=a"(skinHeight) : "a"(48), "b"(4)); |
||
100 | __asm__ __volatile__("int $0x40" :: "a"(0), "b"(w+9), "c"(h+skinHeight+4), "d"(0x33FFFFFF), "S"(0), "D"(title)); |
||
101 | { |
||
102 | TGraphDraw::event ev; |
||
103 | ev.type = TGraphDraw::event::draw; |
||
104 | ev.any.drw = this; |
||
105 | evfunc(ev); |
||
106 | } |
||
107 | __asm__ __volatile__("int $0x40" :: "a"(12), "b"(2)); |
||
108 | break; |
||
109 | case 2: |
||
110 | { |
||
111 | int keyCode; |
||
112 | __asm__ __volatile__("int $0x40" : "=a"(keyCode) : "a"(2)); |
||
113 | if (!(keyCode & 0xFF)) { |
||
114 | TGraphDraw::event ev; |
||
115 | ev.type = TGraphDraw::event::key_down; |
||
116 | ev.any.drw = this; |
||
117 | ev.key.k = (keyCode >> 8) & 0xFF; |
||
118 | evfunc(ev); |
||
119 | } |
||
120 | } |
||
121 | break; |
||
122 | case 3: |
||
123 | return 0; |
||
124 | case 6: |
||
125 | { |
||
126 | int mouse_btn; |
||
127 | int mouse_pos; |
||
128 | __asm__ __volatile__("int $0x40" : "=a"(mouse_btn) : "a"(37), "b"(2)); |
||
129 | mouse_btn &= 1; |
||
130 | if (prev_mouse_btn == mouse_btn) |
||
131 | break; |
||
132 | prev_mouse_btn = mouse_btn; |
||
133 | __asm__ __volatile__("int $0x40" : "=a"(mouse_pos) : "a"(37), "b"(1)); |
||
134 | TGraphDraw::event ev; |
||
135 | ev.type = mouse_btn ? TGraphDraw::event::button_down : TGraphDraw::event::button_up; |
||
136 | ev.any.drw = this; |
||
137 | ev.button.n = 1; |
||
138 | ev.button.x = mouse_pos >> 16; |
||
139 | ev.button.y = (short)mouse_pos; |
||
140 | evfunc(ev); |
||
141 | } |
||
142 | break; |
||
143 | } |
||
144 | if (quit) |
||
145 | return quit; |
||
146 | __asm__ __volatile__("int $0x40" : "=a"(event) : "a"(10)); |
||
147 | } |
||
148 | }' |