diff options
author | Eugene Sandulenko | 2011-12-26 17:32:59 +0000 |
---|---|---|
committer | Strangerke | 2012-04-06 08:18:14 +0200 |
commit | e6a0c23d2c57461305906cb4c62b2b6962915264 (patch) | |
tree | e3300420f52afca4ec48c54a6d3b83b6b6a67697 /engines/mortevielle/mouse.cpp | |
parent | 9b6a4264dcaa26d87fa099c0a0dadbb8e37a6241 (diff) | |
download | scummvm-rg350-e6a0c23d2c57461305906cb4c62b2b6962915264.tar.gz scummvm-rg350-e6a0c23d2c57461305906cb4c62b2b6962915264.tar.bz2 scummvm-rg350-e6a0c23d2c57461305906cb4c62b2b6962915264.zip |
MORTEVIELLE: Rename *.h -> *.cpp where they really belong
Diffstat (limited to 'engines/mortevielle/mouse.cpp')
-rw-r--r-- | engines/mortevielle/mouse.cpp | 459 |
1 files changed, 459 insertions, 0 deletions
diff --git a/engines/mortevielle/mouse.cpp b/engines/mortevielle/mouse.cpp new file mode 100644 index 0000000000..d1de4b79d2 --- /dev/null +++ b/engines/mortevielle/mouse.cpp @@ -0,0 +1,459 @@ +const integer m_arrow = 0; +const integer m_point_hand = 1; + +boolean int_m, + clic; + +integer m_show, + x_s, + y_s, + p_o_s, + mouse_shwn; + +matrix<0, 5, 0, 11, integer> s_s; + + +void init_mouse() { + integer i, j; + registres reg; + + mouse_shwn = 0; + x_s = 0; + y_s = 0; + p_o_s = 0; + /*int_m:= False;*/ + clic = false; + m_show = m_arrow; + if ((memw[0xcc] == 0) && (memw[0xce] == 0)) int_m = false; + if (int_m) { + reg.ax = 0; + intr(0x33, reg); + int_m = (reg.ax == -1); + if (int_m) { + { + reg.ax = 4; + reg.cx = 0; + reg.dx = 0; + } + intr(0x33, reg); + } + } +} + +/*procedure change_mouse( t : integer ); +begin + m_show:= t; +end;*/ + +/*procedure dessine_souris(xf,yf:integer); + var x, xx, y :integer; +begin + case m_show of + m_arrow : begin + affput(2,Gd,xf,yf,0,0); + end; + end; +end; */ + +void hide_mouse() { + integer i, j, k, ps, ds; + boolean imp; + + mouse_shwn = pred(integer, mouse_shwn); + if (mouse_shwn == 0) { + imp = odd(y_s); + j = p_o_s; + switch (gd) { + case cga : { + k = 0; + j = ((cardinal)y_s >> 1) * 80 + ((cardinal)x_s >> 2); + do { + memw[0xb000 + j] = s_s[0][k]; + memw[0xb800 + j + 2] = s_s[1][k]; + memw[0xba00 + j] = s_s[2][k]; + memw[0xba00 + j + 2] = s_s[3][k]; + j = j + 80; + k = succ(integer, k); + } while (!(k >= 5)); + } + break; + case ams : { + for (i = 0; i <= 3; i ++) { + port[0x3dd] = 1 << i; + k = 0; + j = p_o_s; + do { + if (imp) { + memw[0xb800 + j] = s_s[i][k]; + j = j + 80 - 0x2000; + } else { + memw[0xb800 + j] = s_s[i][k]; + j = j + 0x2000; + } + imp = ! imp; + k = succ(integer, k); + } while (!(k >= 8)); + } + } + break; + case ega : { + port[0x3c4] = 2; + port[0x3ce] = 8; + port[0x3cf] = 255; + i = 0; + do { + port[0x3c5] = 1 << i; + k = 0; + j = p_o_s; + do { + ps = mem[0xa000 + j]; + mem[0xa000 + j] = lo(s_s[i][k]); + ps = mem[0xa000 + j + 1]; + mem[0xa000 + j + 1] = hi(s_s[i][k]); + j = j + 80; + k = succ(integer, k); + } while (!(k >= 8)); + i = i + 1; + } while (!(i == 4)); + } + break; + case her : { + j = ((cardinal)y_s >> 1) * 80 + ((cardinal)x_s >> 3); + for (i = 0; i <= 5; i ++) { + for (k = 0; k <= 3; k ++) memw[0xb000 + k * 0x200 + j] = s_s[i][k]; + j = j + 80; + } + } + break; + case tan : { + j = ((cardinal)y_s >> 2) * 160 + ((cardinal)x_s >> 1); + k = 0; + do { + for (i = 0; i <= 3; i ++) { + memw[0xb800 + 0x200 * i + j] = s_s[k][i + (k << 2)]; + memw[0xb800 + 0x200 * i + j + 2] = s_s[k + 3][i + (k << 2)]; + } + j = j + 160; + k = succ(integer, k); + } while (!(k == 3)); + } + break; + + } /* case Gd */ + } +} + +void show_mouse() { + integer i, j, k, l, + ps, ds; + boolean imp; + char c; + + mouse_shwn = mouse_shwn + 1; + if (mouse_shwn != 1) return; + j = p_o_s; + imp = odd(y_s); + i = x_s & 7; + switch (gd) { + case cga : { + k = 0; + j = ((cardinal)y_s >> 1) * 80 + ((cardinal)x_s >> 2); + do { + s_s[0][k] = memw[0xb800 + j]; + s_s[1][k] = memw[0xb800 + j + 2]; + s_s[2][k] = memw[0xba00 + j]; + s_s[3][k] = memw[0xba00 + j + 2]; + j = j + 80; + k = succ(integer, k); + } while (!(k >= 5)); + } + break; + case ams : { + for (i = 0; i <= 3; i ++) { + j = p_o_s; + imp = odd(y_s); + port[0x3de] = i; + k = 0; + do { + if (imp) { + s_s[i][k] = memw[0xb800 + j]; + j = j + 80 - 0x2000; + } else { + s_s[i][k] = memw[0xb800 + j]; + j = j + 0x2000; + } + imp = ! imp; + k = succ(integer, k); + } while (!(k >= 8)); + } + } + break; + case ega : { + port[0x3ce] = 4; + l = 0; + do { + port[0x3cf] = l; + k = 0; + j = p_o_s; + do { + s_s[l][k] = mem[0xa000 + j] + (mem[0xa000 + succ(integer, j)] << 8); + j = j + 80; + k = succ(integer, k); + } while (!(k >= 8)); + l = l + 1; + } while (!(l == 4)); + } + break; + case her : { + j = ((cardinal)y_s >> 1) * 80 + ((cardinal)x_s >> 3); + for (i = 0; i <= 5; i ++) { + for (k = 0; k <= 3; k ++) s_s[i][k] = memw[0xb000 + k * 0x200 + j]; + j = j + 80; + } + } + break; + case tan : { + j = ((cardinal)y_s >> 2) * 160 + ((cardinal)x_s >> 1); + k = 0; + do { + for (i = 0; i <= 3; i ++) { + s_s[k][i + (k << 2)] = memw[0xb800 + 0x200 * i + j]; + s_s[k + 3][i + (k << 2)] = memw[0xb800 + 0x200 * i + j + 2]; + } + j = j + 160; + k = succ(integer, k); + } while (!(k == 3)); + } + break; + } /* case Gd */ + affput(2, gd, x_s, y_s, 0, 0); +} + +void pos_mouse(integer x, integer y) { + registres reg; + + if (x > 314 * res) x = 314 * res; + else if (x < 0) x = 0; + if (y > 199) y = 199; + else if (y < 0) y = 0; + if ((x == x_s) && (y == y_s)) return; + if (int_m) { + { + reg.ax = 4; + reg.cx = x; + reg.dx = y; + } + intr(0x33, reg); + } + hide_mouse(); + x_s = x; + y_s = y; + switch (gd) { + case ams : { + p_o_s = ((cardinal)y_s >> 1) * 80 + ((cardinal)x_s >> 3) + (y_s & 1) * 0x2000; + } + break; + /*cga : begin + P_O_S:=(Y_S shr 1)*80+X_S shr 2+(Y_S and 1)*$2000; + end;*/ + case ega : { + p_o_s = y_s * 80 + ((cardinal)x_s >> 3); + } + break; + } /* case Gd */ + show_mouse(); +} + +void read_pos_mouse(integer &x, integer &y, integer &c) { + registres reg; + + if (int_m) { + reg.ax = 3; + intr(0x33, reg); + x = reg.cx; + y = reg.dx; + c = reg.bx; + } else { + c = 0; + x = x_s; + y = y_s; + } +} + +void mov_mouse(boolean &funct, char &key) { + boolean p_key; + char in1, in2; + integer x, y, cx, cy, cd; + registres reg; + + if (int_m) { + reg.ax = 3; + intr(0x33, reg); + x = reg.cx; + y = reg.dx; + cd = reg.bx; + pos_mouse(x, y); + if (cd != 0) { + clic = true; + return; + } + } + funct = false; + key = '\377'; + p_key = keypressed(); + while (p_key) { + input >> kbd >> in1; + read_pos_mouse(cx, cy, cd); + switch (upcase(in1)) { + case '4' : + cx = cx - 8; + break; + case '2' : + cy = cy + 8; + break; + case '6' : + cx = cx + 8; + break; + case '8' : + cy = cy - 8; + break; + case '7' : { + cy = 1; + cx = 1; + } + break; + case '1' : { + cx = 1; + cy = 190; + } + break; + case '9' : { + cx = 315 * res; + cy = 1; + } + break; + case '3' : { + cy = 190; + cx = 315 * res; + } + break; + case '5' : { + cy = 100; + cx = 155 * res; + } + break; + case ' ': + case '\15' : { + clic = true; + return; + } + break; + case '\33' : { + p_key = keypressed(); + if (p_key) { + input >> kbd >> in2; + switch (in2) { + case 'K' : + cx = pred(integer, cx); + break; + case 'P' : + cy = succ(integer, cy); + break; + case 'M' : + cx = cx + 2; + break; + case 'H' : + cy = pred(integer, cy); + break; + case RANGE_10(';', 'D') : { + funct = true; + key = in2; + return; + } + break; + case 'G' : { + cx = cx - 1; + cy = cy - 1; + } + break; + case 'I' : { + cx = cx + 1; + cy = cy - 1; + } + break; + case 'O' : { + cx = cx - 1; + cy = cy + 1; + } + break; + case 'Q' : { + cx = cx + 1; + cy = cy + 1; + } + break; + } /* case */ + } + } + break; + case 'I' : { + cx = res * 32; + cy = 8; + } + break; + case 'D' : { + cx = 80 * res; + cy = 8; + } + break; + case 'A' : { + cx = 126 * res; + cy = 8; + } + break; + case 'S' : { + cx = 174 * res; + cy = 8; + } + break; + case 'P' : { + cx = 222 * res; + cy = 8; + } + break; + case 'F' : { + cx = res * 270; + cy = 8; + } + break; + case '\23' : { + sonoff = ! sonoff; + return; + } + break; + case '\26' : { + zuul = true; + return; + } + break; + case '\24' : { /* ^T => mode tandy */ + funct = true; + key = '\11'; + } + break; + case '\10' : { /* ^H => mode Hercule */ + funct = true; + key = '\7'; + } + break; + case '\1': + case '\3': + case '\5' : { + funct = true; + key = in1; + } + break; + } + pos_mouse(cx, cy); + p_key = keypressed(); + } +} |