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