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