1 /*
2     TiMidity++ -- MIDI to WAVE converter and player
3     Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
4     Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 
20 */
21 
22 /*
23  * WRD Tracer for vt100 control terminal
24  * Written by Takanori Watanabe <takawata@shidahara1.planet.kobe-u.ac.jp>
25  */
26 /*
27  * WRD Tracer for Win32GUI
28  * modified for Windows console by Daisuke Aoki <dai@y7.net>
29  */
30 
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif /* HAVE_CONFIG_H */
34 #include <stdio.h>
35 #include <stdlib.h>
36 #ifndef NO_STRING_H
37 #include <string.h>
38 #else
39 #include <strings.h>
40 #endif
41 
42 #include "timidity.h"
43 #include "common.h"
44 #include "instrum.h"
45 #include "playmidi.h"
46 #include "readmidi.h"
47 #include "controls.h"
48 #include "wrd.h"
49 
50 #ifdef __POCC__
51 #ifdef RC_NONE
52 #undef RC_NONE
53 #endif
54 #include <windows.h>
55 #ifdef RC_NONE
56 #undef RC_NONE
57 #define RC_NONE 0
58 #endif
59 #else
60 #include <windows.h>
61 #endif
62 #include "w32g_dib.h"
63 #include "w32g_wrd.h"
64 
65 static int wrdt_open(char *dummy);
66 static void wrdt_apply(int cmd, int wrd_argc, int wrd_args[]);
67 static void wrdt_update_events(void);
68 static void wrdt_end(void);
69 static void wrdt_close(void);
70 #define NO_GRAPHIC_SUPPORT
71 #define wrdt w32g_wrdt_mode
72 #define COLOR_REMAP(k) ((k)>16)&&((k)<30)?(k)+14:k
73 
74 WRDTracer wrdt =
75 {
76     "Windows Console WRD tracer", 'w',
77     0,
78     wrdt_open,
79     wrdt_apply,
80     NULL,
81     wrdt_update_events,
82     NULL,
83     wrdt_end,
84     wrdt_close
85 };
86 
87 static int wrd_argc;
88 static int wrd_args[WRD_MAXPARAM];
89 static int inkey_flag;
90 
putstring(char * str)91 static void putstring(char *str)
92 {
93 	WrdWndPutString(str,TRUE);
94 }
95 
putstringn(char * str,int n)96 static void putstringn(char *str, int n)
97 {
98 	WrdWndPutStringN(str,n,TRUE);
99 }
100 
101 /* Escape sequence */
102 
esc_index(void)103 static void esc_index(void)
104 {
105 	w32g_wrd_wnd.curposy++;
106 	if ( w32g_wrd_wnd.curposy >= w32g_wrd_wnd.col ) {
107 		WrdWndScrollUp(TRUE);
108 		w32g_wrd_wnd.curposy = w32g_wrd_wnd.col - 1;
109 	}
110 }
111 
esc_nextline(void)112 void esc_nextline(void)
113 {
114 	w32g_wrd_wnd.curposx = 0;
115 	w32g_wrd_wnd.curposy++;
116 	if ( w32g_wrd_wnd.curposy >= w32g_wrd_wnd.col ) {
117 		WrdWndScrollUp(TRUE);
118 		w32g_wrd_wnd.curposy = w32g_wrd_wnd.col - 1;
119 	}
120 }
121 
esc_reverseindex(void)122 void esc_reverseindex(void)
123 {
124 	w32g_wrd_wnd.curposy--;
125 	if ( w32g_wrd_wnd.curposy < 0 ) {
126 		WrdWndScrollDown(TRUE);
127 	}
128 }
129 
esc_clearscreen(void)130 void esc_clearscreen(void)
131 {
132 	WrdWndClear(TRUE);
133 }
134 
esc_directcursoraddressing(int x,int y)135 void esc_directcursoraddressing(int x, int y)
136 {
137 	WrdWndGoto( x-1, y-1 );
138 }
139 
esc_cursorup(int n)140 void esc_cursorup(int n)
141 {
142 	if(n < 1) n = 1;
143 	WrdWndGoto( w32g_wrd_wnd.curposx, w32g_wrd_wnd.curposy - n );
144 }
145 
esc_cursordown(int n)146 void esc_cursordown(int n)
147 {
148 	if(n < 1) n = 1;
149 	WrdWndGoto( w32g_wrd_wnd.curposx, w32g_wrd_wnd.curposy + n );
150 }
151 
esc_cursorforward(int n)152 void esc_cursorforward(int n)
153 {
154 	if(n < 1) n = 1;
155 	WrdWndGoto( w32g_wrd_wnd.curposx - n , w32g_wrd_wnd.curposy );
156 }
157 
esc_cursorbackward(int n)158 void esc_cursorbackward(int n)
159 {
160 	if(n < 1) n = 1;
161 	WrdWndGoto( w32g_wrd_wnd.curposx + n , w32g_wrd_wnd.curposy );
162 }
163 
esc_clearfromcursortoendofscreen(void)164 void esc_clearfromcursortoendofscreen(void)
165 {
166 	WrdWndLineClearFrom(FALSE, TRUE);
167 	WrdWndClearLineFromTo(w32g_wrd_wnd.curposy + 1, w32g_wrd_wnd.col - 1, TRUE);
168 }
169 
esc_clearfrombeginningofscreentocursor(void)170 void esc_clearfrombeginningofscreentocursor(void)
171 {
172 	WrdWndClearLineFromTo(0,w32g_wrd_wnd.curposy - 1, TRUE);
173 	WrdWndLineClearFrom(TRUE, TRUE);
174 }
175 
esc_clearfromcursortoendofline(void)176 void esc_clearfromcursortoendofline(void)
177 {
178 	WrdWndLineClearFrom(FALSE, TRUE);
179 }
180 
esc_clearfrombeginningoflinetocursor(void)181 void esc_clearfrombeginningoflinetocursor(void)
182 {
183 	WrdWndLineClearFrom(TRUE, TRUE);
184 }
185 
esc_clearentirelinecontainingcursor(void)186 void esc_clearentirelinecontainingcursor(void)
187 {
188 	WrdWndClearLineFromTo( w32g_wrd_wnd.curposy, w32g_wrd_wnd.curposy, TRUE );
189 }
190 
esc_deleteline(int n)191 void esc_deleteline(int n)
192 {
193 	int i;
194 	if(n < 1) n = 1;
195 	if( w32g_wrd_wnd.curposy + n >= w32g_wrd_wnd.col )
196 		n = w32g_wrd_wnd.col - 1 - w32g_wrd_wnd.curposy;
197 
198 	for( i = w32g_wrd_wnd.curposy; i < w32g_wrd_wnd.curposy + n; i++ ) {
199 		WrdWndMoveLine(i+n,i,TRUE);
200 	}
201 	WrdWndClearLineFromTo(w32g_wrd_wnd.col - n, w32g_wrd_wnd.col - 1, TRUE);
202 	w32g_wrd_wnd.curposx = 0;
203 }
204 
esc_insertline(int n)205 void esc_insertline(int n)
206 {
207 	int i;
208 	if(n < 1) n = 1;
209 	if( w32g_wrd_wnd.curposy + n >= w32g_wrd_wnd.col )
210 		n = w32g_wrd_wnd.col - 1 - w32g_wrd_wnd.curposy;
211 
212 	for( i = w32g_wrd_wnd.col - n - 1; i >= w32g_wrd_wnd.curposy; i-- ) {
213 		WrdWndMoveLine(i,i+n,TRUE);
214 	}
215 	w32g_wrd_wnd.curposx = 0;
216 }
217 
218 static volatile int saved_x;
219 static volatile int saved_y;
220 static volatile int saved_attr;
esc_savecursorposition(void)221 void esc_savecursorposition(void)
222 {
223 	WrdWndCurStateSaveAndRestore(1);
224 	return;
225 }
226 
esc_setcursorposition(void)227 void esc_setcursorposition(void)
228 {
229 	WrdWndCurStateSaveAndRestore(0);
230 	return;
231 }
232 
esc_enablecursordisplay(void)233 void esc_enablecursordisplay(void)
234 {
235 	return;
236 }
237 
esc_disablecursordisplay(void)238 void esc_disablecursordisplay(void)
239 {
240 	return;
241 }
242 
esc_characterattribute(int n)243 void esc_characterattribute(int n)
244 {
245 	WrdWndSetAttr98(n);
246 }
247 
248 /* return figures */
getdigit(char * str,int * num)249 static int getdigit(char *str,int *num)
250 {
251 	int i;
252 	char local[20];
253 	for(i=0;i<=10;i++)
254 		if(str[i] < '0' || str[i] > '9'){
255 			if(i<1)
256 				return 0;
257 			else
258 				break;
259 		}
260 	strncpy(local,str,i);
261 	local[i] = '\0';
262 	*num = atoi(local);
263 	return i;
264 }
265 
266 extern int gdi_lock(void);
267 extern int gdi_unlock(void);
putstring_with_esc(char * str)268 static void putstring_with_esc(char *str)
269 {
270   char *p;
271   while(*str)
272   {
273     p = str;
274 	for(;;)
275 	{
276 	  if((unsigned char)*p >= 0x20){
277 	    p++;
278 		continue;
279 	  }
280 	  if(p-str > 0){
281 		WrdWndPutStringN(str,p-str,TRUE);
282 		str = p;
283 		break;
284 	  }
285 	  if(*p == '\0')
286 		break;
287 		if(*p == '\n') {
288 			esc_nextline();
289 			str = p + 1;
290 			break;
291 		}
292 		if(*p == '\r' && *(p+1) == '\n') {
293 			esc_nextline();
294 			str = p + 2;
295 			break;
296 		}
297 		if(*p == '\t') {
298 			WrdWndPutStringN ( "        ", 8, TRUE );
299 			str = p + 1;
300 			break;
301 		}
302 	  if(*p != 0x1b){
303 			str = p + 1;
304 			break;
305 		}
306 	  if(*p == 0x1b){
307 		int res, n[1024], n_max = 0;
308 		char *oldp = p;
309 		p++;
310 		if(*p == '['){
311 			p++;
312 			for(;;){
313 				res = getdigit(p,&(n[n_max+1]));
314 				if(res>0){
315 					n_max++;
316 					p += res;
317 				}
318 				if(*p != ';')
319 					break;
320 				else
321 					p++;
322 			}
323 		} else if(*p == 'D'){
324 			esc_index();
325 			p++;
326 			str = p;
327 			break;
328 		} else if(*p == 'E'){
329 			esc_nextline();
330 			p++;
331 			str = p;
332 			break;
333 		} else if(*p == 'M'){
334 			esc_reverseindex();
335 			p++;
336 			str = p;
337 			break;
338 		} else if(*p == '*'){
339 			esc_clearscreen();
340 			p++;
341 			str = p;
342 			break;
343 		} else {
344 			p = oldp;
345 		    if(p-str > 0){
346 				WrdWndPutStringN(str,p-str,TRUE);
347 					str = p;
348 				break;
349 			}
350 		}
351 
352 		if(n_max == 2 && (*p == 'H' || *p == 'f')){
353 			esc_directcursoraddressing(n[2],n[1]);
354 			p++;
355 			str = p;
356 			break;
357 		}
358 		if((n_max == 1 && *p == 'A') || (n_max == 0 && *p == 'A')){
359 			if(n_max == 0)
360 				n[1] = 1;
361 			esc_cursorup(n[1]);
362 			p++;
363 			str = p;
364 			break;
365 		}
366 		if((n_max == 1 && *p == 'B') || (n_max == 0 && *p == 'B')){
367 			if(n_max == 0)
368 				n[1] = 1;
369 			esc_cursordown(n[1]);
370 			p++;
371 			str = p;
372 			break;
373 		}
374 		if((n_max == 1 && *p == 'C') || (n_max == 0 && *p == 'C')){
375 			if(n_max == 0)
376 				n[1] = 1;
377 			esc_cursorforward(n[1]);
378 			p++;
379 			str = p;
380 			break;
381 		}
382 		if((n_max == 1 && *p == 'D') || (n_max == 0 && *p == 'D')){
383 			if(n_max == 0)
384 				n[1] = 1;
385 			esc_cursorbackward(n[1]);
386 			p++;
387 			str = p;
388 			break;
389 		}
390 		if((n_max == 1 && *p == 'J') || (n_max == 0 && *p == 'J')){
391 			if(n_max == 0 || n[1] == 0)
392 				esc_clearfromcursortoendofscreen();
393 			else if(n[1] == 1)
394 				esc_clearfrombeginningofscreentocursor();
395 			else if(n[1] == 2)
396 				esc_clearscreen();
397 			p++;
398 			str = p;
399 			break;
400 		}
401 		if((n_max == 1 && *p == 'K') || (n_max == 0 && *p == 'K')){
402 			if(n_max == 0 || n[1] == 0)
403 				esc_clearfromcursortoendofline();
404 			else if(n[1] == 1)
405 				esc_clearfrombeginningoflinetocursor();
406 			else if(n[1] == 2)
407 				esc_clearentirelinecontainingcursor();
408 			p++;
409 			str = p;
410 			break;
411 		}
412 		if((n_max == 1 && *p == 'M') || (n_max == 0 && *p == 'M')){
413 			if(n_max == 0)
414 				n[1] = 1;
415 			esc_deleteline(n[1]);
416 			p++;
417 			str = p;
418 			break;
419 		}
420 		if((n_max == 1 && *p == 'L') || (n_max == 0 && *p == 'L')){
421 			if(n_max == 0)
422 				n[1] = 1;
423 			esc_insertline(n[1]);
424 			p++;
425 			str = p;
426 			break;
427 		}
428 		if(n_max == 0 && *p == 's'){
429 			esc_savecursorposition();
430 			p++;
431 			str = p;
432 			break;
433 		}
434 		if(n_max == 0 && *p == 'u'){
435 			esc_setcursorposition();
436 			p++;
437 			str = p;
438 			break;
439 		}
440 		if(!strncmp(p,">5l",3)){
441 			esc_enablecursordisplay();
442 			p += 3;
443 			str = p;
444 			break;
445 		}
446 		if(!strncmp(p,">5h",3)){
447 			esc_disablecursordisplay();
448 			p += 3;
449 			str = p;
450 			break;
451 		}
452 		if(!strncmp(p,">1h",3)){
453 		/* Enabel bottom line */
454 			p += 3;
455 			str = p;
456 			break;
457 		}
458 		if(!strncmp(p,">1l",3)){
459 		/* Disabel bottom line */
460 			p += 3;
461 			str = p;
462 			break;
463 		}
464 		if(!strncmp(p,">3h",3)){
465 		/* Select 31 line mode */
466 			p += 3;
467 			str = p;
468 			break;
469 		}
470 		if(!strncmp(p,">3l",3)){
471 		/* Select 25 line mode */
472 			p += 3;
473 			str = p;
474 			break;
475 		}
476 		if(*p == 'm'){
477 			int i;
478 			for(i=1;i<=n_max;i++)
479 				esc_characterattribute(n[i]);
480 			p++;
481 			str = p;
482 			break;
483 		}
484 		p = oldp;
485 		WrdWndPutStringN(p,1,TRUE);
486 		p++;
487 		str = p;
488 		break;
489 		}
490 	}
491   }
492 }
493 
494 
wrdt_open(char * dummy)495 static int wrdt_open(char *dummy)
496 {
497      wrdt.opened = 1;
498     inkey_flag = 0;
499 	WrdWndReset();
500     return 0;
501 }
502 
wrdt_update_events(void)503 static void wrdt_update_events(void)
504 {
505 }
506 
wrdt_end(void)507 static void wrdt_end(void)
508 {
509 	esc_enablecursordisplay();
510     inkey_flag = 0;
511 }
512 
wrdt_close(void)513 static void wrdt_close(void)
514 {
515     wrdt.opened = 0;
516     inkey_flag = 0;
517 }
518 
wrd_event2string(int id)519 static char *wrd_event2string(int id)
520 {
521     char *name;
522 
523     name = event2string(id);
524     if(name != NULL)
525 	return name + 1;
526     return "";
527 }
528 
529 #define SEIKIX(x) { \
530 	if ( x < 1 ) x = 1; \
531 	if ( x > w32g_wrd_wnd.row ) x = w32g_wrd_wnd.row; \
532 }
533 #define SEIKIY(y) { \
534 	if ( y < 1 ) y = 1; \
535 	if ( y > w32g_wrd_wnd.col ) y = w32g_wrd_wnd.col; \
536 }
537 
borlandc_esc(char * str)538 static void borlandc_esc(char *str)
539 {
540 	char local[201];
541 	local[0] = '\033';
542 	local[1] = '[';
543 	strncpy(local+2,str,sizeof(local)-3);
544 	local[200] = '\0';
545 	putstring_with_esc(local);
546 }
547 
548 extern void wrd_graphic_ginit ( void );
549 extern void wrd_graphic_gcls ( int sw );
550 extern void wrd_graphic_gscreen ( int active, int display );
551 extern void wrd_graphic_gon ( int sw );
552 extern void wrd_graphic_gline ( int x1, int y1, int x2, int y2, int p1, int sw, int p2 );
553 extern void wrd_graphic_gcircle ( int x, int y, int r, int p1, int sw, int p2 );
554 extern void wrd_graphic_pload ( char *path );
555 extern void wrd_graphic_pal_g4r4b4 ( int p, int *g4r4b4, int max );
556 extern void wrd_graphic_palrev ( int p );
557 extern void wrd_graphic_apply_pal ( int p );
558 extern void wrd_graphic_fade ( int p1, int p2, int speed );
559 extern void wrd_graphic_fadestep ( int v );
560 extern void wrd_graphic_gmode ( int sw );
561 extern void wrd_graphic_gmove ( int x1, int y1, int x2, int y2, int xd, int yd, int vs, int vd, int sw );
562 extern void wrd_graphic_mag ( char *path, int x, int y, int s, int p );
563 extern void wrd_text_ton ( int sw );
564 extern void wrd_text_scroll ( int x1, int y1, int x2, int y2, int mode, int color, int c );
565 extern void wrd_start_skip ( void );
566 extern void wrd_end_skip ( void );
567 extern void wrd_graphic_xcopy ( int sx1, int sy1, int sx2, int sy2, int tx, int ty, int ss, int ts, int method,
568 	 int opt1, int opt2, int opt3, int opt4, int opt5 );
569 
570 // #define WRD_VERBOSE
wrdt_apply(int cmd,int wrd_argc,int wrd_args[])571 static void wrdt_apply(int cmd, int wrd_argc, int wrd_args[])
572 {
573     char *p;
574     char *text;
575     int i, len;
576     static txtclr_preserve=0;
577 
578 	if ( !w32g_wrd_wnd.active ) return;
579 
580     switch(cmd)
581     {
582       case WRD_LYRIC:
583 	p = wrd_event2string(wrd_args[0]);
584 	len = strlen(p);
585 	text = (char *)new_segment(&tmpbuffer, SAFE_CONVERT_LENGTH(len));
586 
587 	/*This must be not good thing,but as far as I know no wrd file
588 	  written in EUC-JP code found*/
589 
590 	strcpy(text,p);
591 #ifdef WRD_VERBOSE
592 //	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
593 //		  "[WRD_LYRIC]\n%s", text );
594 #endif
595 	putstring_with_esc(text);
596 	reuse_mblock(&tmpbuffer);
597 	break;
598       case WRD_NL: /* Newline (Ignored) */
599 		esc_nextline();
600 //			 putchar('\n');
601 	break;
602       case WRD_COLOR:
603 /*Compatibility Hack,This remaps color(17-29 color seems
604 to be ignored in kterm)*/
605 	esc_characterattribute(wrd_args[0]);
606 	break;
607       case WRD_END: /* Never call */
608 	break;
609       case WRD_ESC:
610 	borlandc_esc(wrd_event2string(wrd_args[0]));
611 	break;
612       case WRD_EXEC:
613 	/*I don't spaun another program*/
614 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
615 		  "@EXEC(%s)", wrd_event2string(wrd_args[0]));
616 	break;
617       case WRD_FADE:
618 		  wrd_graphic_fade ( wrd_args[0], wrd_args[1], wrd_args[2] );
619 #ifdef WRD_VERBOSE
620 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
621 		  "@FADE(%d,%d,%d)", wrd_args[0], wrd_args[1], wrd_args[2]);
622 #endif
623 	break;
624       case WRD_FADESTEP:
625 		 wrd_graphic_fadestep ( wrd_args[0] );
626 #ifdef WRD_VERBOSE
627 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
628 		  "@FADESTEP(%d/%d)", wrd_args[0], WRD_MAXFADESTEP);
629 #endif
630 	break;
631       case WRD_GCIRCLE:
632 		wrd_graphic_gcircle ( wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
633 		  wrd_args[4], wrd_args[5] );
634 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
635 		  "@GCIRCLE(%d,%d,%d,%d,%d,%d)",
636 		  wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
637 		  wrd_args[4], wrd_args[5]);
638 	break;
639       case WRD_GCLS:
640 		wrd_graphic_gcls ( wrd_args[0] );
641 #ifdef WRD_VERBOSE
642 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
643 		  "@GCLS(%d)", wrd_args[0]);
644 #endif
645 	break;
646       case WRD_GINIT:
647 		wrd_graphic_ginit ();
648 #ifdef WRD_VERBOSE
649 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@GINIT()");
650 #endif
651 	break;
652       case WRD_GLINE:
653 		wrd_graphic_gline ( wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],
654 	       wrd_args[5], wrd_args[6] );
655 #ifdef WRD_VERBOSE
656 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
657 		  "@GLINE(%d,%d,%d,%d,%d,%d,%d)",
658 	       wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],
659 	       wrd_args[5], wrd_args[6]);
660 #endif
661 	break;
662       case WRD_GMODE:
663 		  wrd_graphic_gmode ( wrd_args[0] );
664 #ifdef WRD_VERBOSE
665 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
666 		  "@GMODE(%d)", wrd_args[0]);
667 #endif
668 	break;
669       case WRD_GMOVE:
670 		  wrd_graphic_gmove ( wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],
671 	       wrd_args[5], wrd_args[6], wrd_args[7], wrd_args[8] );
672 #ifdef WRD_VERBOSE
673 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
674 		  "@GMOVE(%d,%d,%d,%d,%d,%d,%d)",
675 	       wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4],
676 	       wrd_args[5], wrd_args[6], wrd_args[7], wrd_args[8]);
677 #endif
678 	break;
679       case WRD_GON:
680 		wrd_graphic_gon ( wrd_args[0] );
681 #ifdef WRD_VERBOSE
682 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
683 		  "@GON(%d)", wrd_args[0]);
684 #endif
685 	break;
686       case WRD_GSCREEN:
687 		wrd_graphic_gscreen ( wrd_args[0], wrd_args[1] );
688 #ifdef WRD_VERBOSE
689 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
690 		  "@GSCREEN(%d,%d)", wrd_args[0], wrd_args[1]);
691 #endif
692 	break;
693       case WRD_INKEY:
694 	inkey_flag = 1;
695 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@INKEY - begin");
696 	break;
697       case WRD_OUTKEY:
698 	inkey_flag = 0;
699 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@INKEY - end");
700 	break;
701       case WRD_LOCATE:
702 	{
703 	int x = wrd_args[0], y = wrd_args[1];
704 	WrdWndGoto(x-1, y-1);
705 	}
706 	break;
707       case WRD_LOOP: /* Never call */
708 	break;
709       case WRD_MAG:
710 		wrd_graphic_mag ( wrd_event2string(wrd_args[0]), wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4]);
711 #ifdef WRD_VERBOSE
712 	p = (char *)new_segment(&tmpbuffer, MIN_MBLOCK_SIZE);
713         snprintf(p, MIN_MBLOCK_SIZE-1, "@MAG(%s", wrd_event2string(wrd_args[0]));
714         p[MIN_MBLOCK_SIZE-1] = '\0'; /* fail safe */
715 	for(i = 1; i < 5; i++)
716 	{
717 	    if(wrd_args[i] == WRD_NOARG)
718 		strncat(p, ",*", MIN_MBLOCK_SIZE - strlen(p) - 1);
719 	    else {
720 		char q[CHAR_BIT*sizeof(int)];
721 		snprintf(q, sizeof(q)-1, ",%d", wrd_args[i]);
722 		strncat(p, q, MIN_MBLOCK_SIZE - strlen(p) - 1);
723             }
724 	}
725         strncat(p, ")", MIN_MBLOCK_SIZE - strlen(p) - 1);
726 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "%s", p);
727 	reuse_mblock(&tmpbuffer);
728 #endif
729 	break;
730       case WRD_MIDI: /* Never call */
731 	break;
732       case WRD_OFFSET: /* Never call */
733 	break;
734       case WRD_PAL:
735 		wrd_graphic_pal_g4r4b4 (wrd_args[0], wrd_args + 1, 16 );
736 #ifdef WRD_VERBOSE
737 	p = (char *)new_segment(&tmpbuffer, MIN_MBLOCK_SIZE);
738 	snprintf(p, MIN_MBLOCK_SIZE, "@PAL(%03x", wrd_args[0]);
739 	for(i = 1; i < 17; i++) {
740 	    char q[5];
741 	    snprintf(q, sizeof(q)-1, ",%03x", wrd_args[i]);
742 	    strncat(p, q, MIN_MBLOCK_SIZE - strlen(p) - 1);
743 	}
744 	strncat(p, ")", MIN_MBLOCK_SIZE - strlen(p) - 1);
745 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "%s", p);
746 	reuse_mblock(&tmpbuffer);
747 #endif
748 	break;
749       case WRD_PALCHG:
750 		wrd_graphic_apply_pal ( wrd_args[0] );
751 #ifdef WRD_VERBOSE
752 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
753 		  "@PALCHG(%s)", wrd_event2string(wrd_args[0]));
754 #endif
755 	break;
756       case WRD_PALREV:
757 		wrd_graphic_palrev ( wrd_args[0] );
758 #ifdef WRD_VERBOSE
759 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
760 		  "@PALREV(%d)", wrd_args[0]);
761 #endif
762 	break;
763       case WRD_PATH:
764 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
765 		  "@PATH(%s)", wrd_event2string(wrd_args[0]));
766 	break;
767       case WRD_PLOAD:
768 		wrd_graphic_pload ( wrd_event2string(wrd_args[0]) );
769 #ifdef WRD_VERBOSE
770 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
771 		  "@PLOAD(%s)", wrd_event2string(wrd_args[0]));
772 #endif
773 	break;
774       case WRD_REM:
775 	p = wrd_event2string(wrd_args[0]);
776 	len = strlen(p);
777 	text = (char *)new_segment(&tmpbuffer, SAFE_CONVERT_LENGTH(len));
778 	code_convert(p, text, SAFE_CONVERT_LENGTH(len), NULL, NULL);
779 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE, "@REM %s", text);
780 	reuse_mblock(&tmpbuffer);
781 	break;
782       case WRD_REMARK:
783 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
784 		  "@REMARK(%s)", wrd_event2string(wrd_args[0]));
785 	break;
786       case WRD_REST: /* Never call */
787 	break;
788       case WRD_SCREEN: /* Not supported */
789 	break;
790       case WRD_SCROLL:
791 		wrd_text_scroll (wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
792 		  wrd_args[4], wrd_args[5], wrd_args[6]);
793 #ifdef WRD_VERBOSE
794 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
795 		  "@SCROLL(%d,%d,%d,%d,%d,%d,%d)",
796 		  wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3],
797 		  wrd_args[4], wrd_args[5], wrd_args[6]);
798 #endif
799 	break;
800       case WRD_STARTUP:
801 		  WrdWndReset ();
802 	inkey_flag = 0;
803 #ifdef WRD_VERBOSE
804 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
805 		  "@STARTUP(%d)", wrd_args[0]);
806 #endif
807 	esc_clearscreen();
808 	break;
809       case WRD_STOP: /* Never call */
810 	break;
811 
812       case WRD_TCLS:
813 	{
814 	  char fillbuf[1024];
815 	{
816 	int left = wrd_args[0], right = wrd_args[2];
817 	int top = wrd_args[1], bottom = wrd_args[3];
818 
819 	SEIKIX(left);
820 	SEIKIX(right);
821 	SEIKIY(top);
822 	SEIKIY(bottom);
823 	if(left>right) right = left;
824 	if(top>bottom) bottom = top;
825 	memset(fillbuf,wrd_args[5],right-left);/*X2-X1*/
826 	fillbuf[right-left]=0;
827 //	borlandc_con_save_attr();
828 	esc_characterattribute(wrd_args[4]);
829 	for(i=top;i<=bottom;i++)/*Y1 to Y2*/ {
830 	  WrdWndGoto(left-1,i-1);
831 	  putstring(fillbuf);
832 	}
833 //	borlandc_con_restore_attr();
834 	}
835 	}
836 	break;
837       case WRD_TON:
838 		wrd_text_ton ( wrd_args[0] );
839 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
840 		  "@TON(%d)", wrd_args[0]);
841 	break;
842       case WRD_WAIT: /* Never call */
843 	break;
844       case WRD_WMODE: /* Never call */
845 	break;
846 
847 	/* Ensyutsukun */
848       case WRD_eFONTM:
849 	print_ecmd("FONTM", wrd_args, 1);
850 	break;
851       case WRD_eFONTP:
852 	print_ecmd("FONTP", wrd_args, 4);
853 	break;
854       case WRD_eFONTR:
855 	print_ecmd("FONTR", wrd_args, 17);
856 	break;
857       case WRD_eGSC:
858 	print_ecmd("GSC", wrd_args, 1);
859 	break;
860       case WRD_eLINE:
861 	print_ecmd("LINE", wrd_args, 1);
862 	break;
863       case WRD_ePAL:
864 	print_ecmd("PAL", wrd_args, 2);
865 	break;
866       case WRD_eREGSAVE:
867 	print_ecmd("REGSAVE", wrd_args, 17);
868 	break;
869       case WRD_eSCROLL:
870 	print_ecmd("SCROLL",wrd_args, 2);
871 	break;
872       case WRD_eTEXTDOT:
873 	print_ecmd("TEXTDOT", wrd_args, 1);
874 	break;
875       case WRD_eTMODE:
876 	print_ecmd("TMODE", wrd_args, 1);
877 	break;
878       case WRD_eTSCRL:
879 	print_ecmd("TSCRL", wrd_args, 0);
880 	break;
881       case WRD_eVCOPY:
882 	print_ecmd("VCOPY", wrd_args, 9);
883 	break;
884       case WRD_eVSGET:
885 	print_ecmd("VSGE", wrd_args, 4);
886 	break;
887       case WRD_eVSRES:
888 	print_ecmd("VSRES", wrd_args, 0);
889 	break;
890       case WRD_eXCOPY:
891 		wrd_graphic_xcopy ( wrd_args[0], wrd_args[1], wrd_args[2], wrd_args[3], wrd_args[4], wrd_args[5], wrd_args[6],
892 			 wrd_args[7], wrd_args[8], wrd_args[9], wrd_args[10], wrd_args[11], wrd_args[12], wrd_args[13] );
893 	print_ecmd("XCOPY", wrd_args, 14);
894 	break;
895 	case WRD_START_SKIP:
896 		wrd_start_skip ();
897 #ifdef WRD_VERBOSE
898 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
899 		  "WRD_START_SKIP");
900 #endif
901 		break;
902 	case WRD_END_SKIP:
903 		wrd_end_skip ();
904 #ifdef WRD_VERBOSE
905 	ctl->cmsg(CMSG_INFO, VERB_VERBOSE,
906 		  "WRD_END_SKIP");
907 #endif
908 		break;
909 
910 	/* Extensionals */
911     }
912 }
913