OSDN Git Service

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