1 /*
2 * UAE - The Un*x Amiga Emulator
3 *
4 * RiscPC Interface.
5 *
6 * (c) 1995 Bernd Schmidt
7 * (c) 1996 Gustavo Goedert
8 */
9
10 #include "sysconfig.h"
11 #include "sysdeps.h"
12
13 #include "options.h"
14 #include "threaddep/thread.h"
15 #include "memory.h"
16 #include "custom.h"
17 #include "keyboard.h"
18 #include "xwin.h"
19 #include "keybuf.h"
20 #include "gui.h"
21
22 typedef char flagtype;
23
24 extern struct regstruct
25 {
26 ULONG regs[16];
27 CPTR usp,isp,msp;
28 UWORD sr;
29 flagtype t1;
30 flagtype t0;
31 flagtype s;
32 flagtype m;
33 flagtype x;
34 flagtype stopped;
35 int intmask;
36 ULONG pc;
37 #ifdef USE_POINTER
38 UBYTE *pc_p;
39 UBYTE *pc_oldp;
40 #endif
41
42 ULONG vbr,sfc,dfc;
43
44 double fp[8];
45 ULONG fpcr,fpsr,fpiar;
46 ULONG spcflags;
47 ULONG kick_mask;
48 } regs;
49
50
51 #include "OS:wimp.h"
52 #include "OS:font.h"
53 #include "OS:os.h"
54 #include "OS:osbyte.h"
55 #include "OS:osword.h"
56 #include "OS:sound.h"
57
58
59 void gui_process(void);
60
61
62 #define A_base 0x300000
63 #define A_switch (A_base+0)
64 #define A_disk (A_base+1)
65 #define A_sonst (A_base+5)
66 #define A_hf (A_base+6)
67 #define A_mount (A_base+7)
68 #define A_rom (A_base+10)
69 #define A_uaeask (A_base+11)
70
71 int quit_program;
72 int uae_running;
73 int uae_startedup;
74
75 wimp_MESSAGE_LIST(13) messages=
76 {A_switch, A_disk, A_disk+1, A_disk+2, A_disk+3, A_sonst, A_rom, A_mount,
77 A_mount+1, A_mount+2, A_uaeask, message_PREQUIT, 0};
78
79 wimp_t taskhandle;
80 wimp_t frontendhandle;
81 wimp_block block;
82 wimp_message mblock;
83 int pollword;
84
85 os_MODE_SELECTOR(3) uaemode={1,0,0,0,-1,0,128,3,255,-1,0};
86 os_MODE_SELECTOR(3) wimpmode;
87
88 extern void datavox_type(int channel, int type);
89 extern void datavox_timed(int channel, int timed);
90 extern void datavox_pitch(int channel, int pitch);
91 extern void datavox_set_memory(int channel, char *start, char *end);
92 extern void datavox_set_repeat(int channel, char *start, char *end);
93 extern int datavox_allocate_channel(int key);
94 extern void datavox_de_allocate_channel(int channel, int key);
95
96 int sratecode;
97 char sbuffer[44100];
98 int deskvoice, uaechannel;
99
100 extern int uaedevfd, numtracks;
101
102 char mountpoint[64];
103 char mountdir[256];
104
105 char *scr;
106 int screenrowbytes,screenrows;
107
108 char pressed[128];
109 char translate[128]=
110 { 255, 255, 255, AK_LSH, AK_CTRL, AK_LALT, AK_RSH, AK_CTRL, //0
111 AK_RALT, 255, 255, 255, 255, 255, 255, 255, //8
112 AK_Q, AK_3, AK_4, AK_5, AK_F4, AK_8, AK_F7, AK_MINUS, //16
113 255, AK_LF, AK_NP6, AK_NP7, 255, 255, AK_F10, 255, //24
114 255, AK_W, AK_E, AK_T, AK_7, AK_I, AK_9, AK_0, //32
115 255, AK_DN, AK_NP8, AK_NP9, 255,AK_BACKQUOTE, AK_LTGT, AK_BS, //40
116 AK_1, AK_2, AK_D, AK_R, AK_6, AK_U, AK_O, AK_P, //48
117 AK_LBRACKET, AK_UP,AK_NPADD,AK_NPSUB, AK_ENT, 255, 255, AK_RAMI, //56
118 AK_CAPSLOCK, AK_A, AK_X, AK_F, AK_Y, AK_J, AK_K, 255, //64
119 255, AK_RET,AK_NPDIV, 255,AK_NPDEL, 255, AK_LAMI, AK_QUOTE, //72
120 255, AK_S, AK_C, AK_G, AK_H, AK_N, AK_L,AK_SEMICOLON, //80
121 AK_RBRACKET, AK_DEL, 255,AK_NPMUL, 255, AK_EQUAL, AK_LTGT, 255, //88
122 AK_TAB, AK_Z, AK_SPC, AK_V, AK_B, AK_M,AK_COMMA, AK_PERIOD, //96
123 AK_SLASH,AK_HELP, AK_NP0, AK_NP1, AK_NP3, 255, 255, 255, //104
124 255, AK_F1, AK_F2, AK_F3, AK_F5, AK_F6, AK_F8, AK_F9, //112
125 AK_BACKSLASH, AK_RT, AK_NP4, AK_NP5, AK_NP2, 255, 255, 255};//120
126
127 char dn0[256], dn1[256], dn2[256], dn3[256];
128 int dc0=0, dc1=0, dc2=0, dc3=0;
129
130 /***************************************************************************/
131
132
setup_brkhandler(void)133 void setup_brkhandler(void)
134 {
135 }
136
flush_line(int y)137 void flush_line(int y)
138 {
139 }
140
flush_block(int a,int b)141 void flush_block(int a, int b)
142 {
143 }
144
flush_screen(int a,int b)145 void flush_screen(int a, int b)
146 {
147 }
148
calc_adjustment(void)149 void calc_adjustment(void)
150 {
151 }
152
153
154 static int colors_allocated;
155
get_color(int r,int g,int b,xcolnr * cnp)156 static int get_color(int r, int g, int b, xcolnr *cnp)
157 {
158 if (colors_allocated == 256)
159 return -1;
160 *cnp = colors_allocated;
161
162 os_writec(19);
163 os_writec(colors_allocated);
164 os_writec(16);
165 os_writec(r+(r<<4));
166 os_writec(g+(g<<4));
167 os_writec(b+(b<<4));
168 colors_allocated++;
169
170 return 1;
171 }
172
init_colors(void)173 static void init_colors(void)
174 {
175 int rw = 5, gw = 5, bw = 5;
176 colors_allocated = 0;
177
178 if (gfxvidinfo.pixbytes == 2)
179 alloc_colors64k(rw, gw, bw, 0, rw, rw+gw);
180 else
181 alloc_colors256(get_color);
182 }
183
sound_output(char * b,int l)184 void sound_output(char *b, int l)
185 {
186 memcpy(sbuffer, b, l);
187 datavox_set_memory(uaechannel, sbuffer, sbuffer+l);
188 datavox_set_repeat(uaechannel, sbuffer, sbuffer+l);
189 datavox_type(uaechannel, 1);
190 datavox_pitch(uaechannel, sratecode);
191 sound_control(uaechannel, 256+127, 0, 255);
192 }
193
init_mouse(void)194 void init_mouse(void)
195 {
196 oswordpointer_bbox_block bbox;
197
198 bbox.op=oswordpointer_OP_SET_BBOX;
199 bbox.x0=-32768;
200 bbox.y0=-32768;
201 bbox.x1=32767;
202 bbox.y1=32767;
203 oswordpointer_set_bbox(&bbox);
204 }
205
setwimpmode(void)206 void setwimpmode(void)
207 {
208 wimp_set_mode(&wimpmode);
209 while(osbyte2(145,0,0)!=0);
210 }
211
setuaemode(void)212 void setuaemode(void)
213 {
214 os_vdu_var_list varlist[2]={149,-1};
215 int valuelist[1];
216 os_mode m;
217
218 m=osscreenmode_current();
219 memcpy(&wimpmode, m, os_SIZEOF_MODE_SELECTOR(3));
220
221 osscreenmode_select(&uaemode);
222 os_read_vdu_variables(varlist, valuelist);
223 scr=(void *)valuelist[0];
224 gfxvidinfo.bufmem=scr;
225
226 os_remove_cursors();
227
228 init_colors();
229 init_mouse();
230
231 flush_block(0, numscrlines-1);
232 }
233
setwimpsound(void)234 void setwimpsound(void)
235 {
236 int s,t;
237
238 sound_attach_voice(uaechannel, deskvoice, &s, &t);
239 datavox_de_allocate_channel(uaechannel, taskhandle);
240 }
241
setuaesound(void)242 void setuaesound(void)
243 {
244 int s;
245
246 sound_volume(127);
247 uaechannel=datavox_allocate_channel(taskhandle);
248 printf("%d\n", uaechannel);
249 sound_attach_voice(uaechannel, 0, &s, &deskvoice);
250 sound_attach_named_voice(uaechannel, "DataVox-Voice");
251 }
252
graphics_init(void)253 int graphics_init(void)
254 {
255 __uname_control=6;
256
257 switch(color_mode)
258 {
259 case 1:
260 case 2:
261 case 5:
262 uaemode.log2_bpp=4;
263 gfxvidinfo.pixbytes=2;
264 break;
265 default:
266 uaemode.log2_bpp=3;
267 gfxvidinfo.pixbytes=1;
268 break;
269 }
270
271 uaemode.xres=gfx_requested_width;
272 uaemode.yres=gfx_requested_height;
273
274 gfxvidinfo.rowbytes=gfx_requested_width*gfxvidinfo.pixbytes;
275 gfxvidinfo.maxlinetoscr=gfx_requested_width;
276 gfxvidinfo.maxline=gfx_requested_height;
277 gfxvidinfo.maxblocklines=0;
278
279 setuaemode();
280 setuaesound();
281
282 return 1;
283 }
284
graphics_leave(void)285 void graphics_leave(void)
286 {
287 }
288
289
readmouse(void)290 void readmouse(void)
291 {
292 int x,y;
293 bits buttons;
294 os_t t;
295
296 os_mouse(&x, &y, &buttons, &t);
297 lastmx=x>>1;
298 lastmy=gfx_requested_height-(y>>1);
299 buttonstate[0]=(buttons & 4)>>2;
300 buttonstate[1]=(buttons & 2)>>1;
301 buttonstate[2]=buttons & 1;
302 newmousecounters=0;
303 }
304
305
processkey(char k,char release)306 void processkey(char k, char release)
307 {
308 if(k==29 && release==1)
309 {
310 uae_running=0;
311 setwimpmode();
312 setwimpsound();
313 }
314
315 if(translate[k]!=255)
316 record_key((translate[k]<<1)+release);
317 }
318
319
readkeyboard(void)320 void readkeyboard(void)
321 {
322 char c,l,k,q;
323
324 for(l=0, k=osbyte1(121, 0, 0), q=0; !q; l=k+1, k=osbyte1(121, l, 0))
325 {
326 if(k==0xff)
327 {
328 k=128;
329 q=1;
330 }
331 else
332 {
333 if(pressed[k]==0)
334 {
335 if (translate[k]!=0)
336 processkey(k, 0);
337 pressed[k]=1;
338 }
339 }
340 for(c=l; c<k; c++)
341 {
342 if(pressed[c]!=0)
343 {
344 if (translate[c]!=0)
345 processkey(c, 1);
346 pressed[c]=0;
347 }
348 }
349 }
350 }
351
handle_events(void)352 void handle_events(void)
353 {
354 readmouse();
355 readkeyboard();
356
357 if(dc0==1)
358 {
359 dc0=0;
360 disk_insert(0, dn0);
361 strncpy(df0, dn0, 255);
362 }
363
364 if(dc1==1)
365 {
366 dc1=0;
367 disk_insert(1, dn1);
368 strncpy(df1, dn1, 255);
369 }
370
371 if(dc2==1)
372 {
373 dc2=0;
374 disk_insert(2, dn2);
375 strncpy(df2, dn2, 255);
376 }
377
378 if(dc3==1)
379 {
380 dc3=0;
381 disk_insert(3, dn3);
382 strncpy(df3, dn3, 255);
383 }
384
385 if(dc0>1) dc0--;
386 if(dc1>1) dc1--;
387 if(dc2>1) dc2--;
388 if(dc3>1) dc3--;
389
390 if (uae_running==0)
391 gui_process();
392 }
393
debuggable(void)394 int debuggable(void)
395 {
396 return 0;
397 }
398
needmousehack(void)399 int needmousehack(void)
400 {
401 return 0;
402 }
403
LED(int on)404 void LED(int on)
405 {
406 }
407
sigchldhandler(int foo)408 static void sigchldhandler(int foo)
409 {
410 }
411
412
413 /***************************************************************************/
414
415
gui_init(void)416 int gui_init(void)
417 {
418 int vout;
419
420 quit_program=0;
421 uae_running=0;
422 uae_startedup=0;
423
424 taskhandle=wimp_initialise(wimp_VERSION_RO35, "UAE", &messages, &vout);
425 gui_process();
426
427 return 0;
428 }
429
changedisk(int n,char * f)430 void changedisk(int n, char *f)
431 {
432 if(uae_startedup)
433 {
434 switch(n)
435 {
436 case 0:
437 if(strcmp(df0, f)!=0)
438 {
439 strncpy(dn0, f, 255);
440 dc0=3;
441 disk_eject(0);
442 strncpy(df0, "", 255);
443 }
444 break;
445 case 1:
446 if(strcmp(df1, f)!=0)
447 {
448 strncpy(dn1, f, 255);
449 dc1=3;
450 disk_eject(1);
451 strncpy(df1, "", 255);
452 }
453 break;
454 case 2:
455 if(strcmp(df2, f)!=0)
456 {
457 strncpy(dn2, f, 255);
458 dc2=3;
459 disk_eject(2);
460 strncpy(df2, "", 255);
461 }
462 break;
463 case 3:
464 if(strcmp(df3, f)!=0)
465 {
466 strncpy(dn3, f, 255);
467 dc3=3;
468 disk_eject(3);
469 strncpy(df3, "", 255);
470 }
471 break;
472 }
473 }
474 else
475 {
476 switch(n)
477 {
478 case 0:
479 strncpy(df0, f, 255);
480 break;
481 case 1:
482 strncpy(df1, f, 255);
483 break;
484 case 2:
485 strncpy(df2, f, 255);
486 break;
487 case 3:
488 strncpy(df3, f, 255);
489 break;
490 }
491 }
492 }
493
setsonst(int * reserved)494 void setsonst(int *reserved)
495 {
496 if(!uae_startedup)
497 {
498 gfx_requested_width=reserved[0];
499 gfx_requested_xcenter=reserved[1];
500 gfx_requested_lores=reserved[2];
501 gfx_requested_height=reserved[3];
502 gfx_requested_ycenter=reserved[4];
503 gfx_requested_linedbl=reserved[5];
504 gfx_requested_correct_aspect=reserved[6];
505 switch(reserved[7])
506 {
507 case 256:
508 color_mode=0;
509 break;
510 case 32768:
511 color_mode=1;
512 break;
513 }
514 framerate=reserved[8];
515 emul_accuracy=reserved[9];
516 blits_32bit_enabled=reserved[10];
517 immediate_blits=reserved[11];
518 fake_joystick=reserved[12];
519 bogomem_size=reserved[14];
520 chipmem_size=reserved[15];
521 fastmem_size=reserved[16];
522 produce_sound=reserved[17];
523 sound_desired_freq=reserved[18];
524 sound_desired_bsiz=reserved[19];
525 }
526 }
527
sendtofront(int * reserved)528 void sendtofront(int *reserved)
529 {
530 int *words=mblock.data.reserved;
531
532 mblock.size=256;
533 mblock.sender=taskhandle;
534 mblock.my_ref=778;
535 mblock.your_ref=777;
536 switch(*reserved)
537 {
538 case 0:
539 mblock.action=A_disk;
540 if(dc0==0)
541 strncpy(words, df0, 235);
542 else
543 strncpy(words, dn0, 235);
544 break;
545 case 1:
546 mblock.action=A_disk+1;
547 if(dc0==0)
548 strncpy(words, df1, 235);
549 else
550 strncpy(words, dn1, 235);
551 break;
552 case 2:
553 mblock.action=A_disk+2;
554 if(dc0==0)
555 strncpy(words, df2, 235);
556 else
557 strncpy(words, dn2, 235);
558 break;
559 case 3:
560 mblock.action=A_disk+3;
561 if(dc0==0)
562 strncpy(words, df3, 235);
563 else
564 strncpy(words, dn3, 235);
565 break;
566 }
567 wimp_send_message(wimp_USER_MESSAGE, &mblock, frontendhandle);
568 }
569
gui_messagereceive(void)570 void gui_messagereceive(void)
571 {
572 switch(block.message.action)
573 {
574 case message_QUIT:
575 if(uae_startedup)
576 {
577 set_special (SPCFLAG_BRK);
578 quit_program=1;
579 uae_running=1;
580 }
581 else
582 {
583 if(uaedevfd!=-1)
584 {
585 close(uaedevfd);
586 }
587 wimp_close_down(taskhandle);
588 }
589 break;
590 case A_switch:
591 if(uae_startedup)
592 {
593 uae_running=1;
594 setuaemode();
595 setuaesound();
596 }
597 else
598 {
599 frontendhandle=block.message.sender;
600 uae_startedup=1;
601 uae_running=1;
602 }
603 break;
604 case A_disk:
605 changedisk(0, block.message.data.reserved);
606 break;
607 case A_disk+1:
608 changedisk(1, block.message.data.reserved);
609 break;
610 case A_disk+2:
611 changedisk(2, block.message.data.reserved);
612 break;
613 case A_disk+3:
614 changedisk(3, block.message.data.reserved);
615 break;
616 case A_sonst:
617 setsonst(block.message.data.reserved);
618 break;
619 case A_rom:
620 strncpy(romfile, block.message.data.reserved, 235);
621 break;
622 case A_mount:
623 strncpy(mountpoint, block.message.data.reserved, 63);
624 break;
625 case A_mount+1:
626 strncpy(mountdir, block.message.data.reserved, 235);
627 add_filesys_unit(mountpoint, mountdir, 0);
628 break;
629 case A_mount+2:
630 strncpy(mountdir, block.message.data.reserved, 235);
631 add_filesys_unit(mountpoint, mountdir, 1);
632 break;
633 case A_uaeask:
634 sendtofront(block.message.data.reserved);
635 break;
636 }
637 }
638
gui_process(void)639 void gui_process(void)
640 {
641 wimp_event_no event;
642
643 while(uae_running==0)
644 {
645 event=wimp_poll(wimp_MASK_NULL, &block, 0);
646
647 switch(event)
648 {
649 case wimp_USER_MESSAGE:
650 case wimp_USER_MESSAGE_RECORDED:
651 gui_messagereceive();
652 break;
653 }
654 }
655 }
656
gui_exit(void)657 void gui_exit(void)
658 {
659 }
660
gui_led(int led,int on)661 void gui_led(int led, int on)
662 {
663 }
664
gui_filename(int num,char * name)665 void gui_filename(int num, char *name)
666 {
667 }
668
gui_handle_events(void)669 void gui_handle_events(void)
670 {
671 }
672
gui_update(void)673 int gui_update(void)
674 {
675 }
676
677