|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * BeBox port specific stuff
5: *
6: * (c) 1996 Christian Bauer
7: * (c) 1996 Patrick Hanevold
8: */
9:
10: #define VersionStr "0.6.4"
11:
12: #include <AppKit.h>
13: #include <InterfaceKit.h>
14: #include <KernelKit.h>
15: #include <Record.h>
16: #include <File.h>
17:
18: #include <stdio.h>
19: #include <stdlib.h>
20: #include <string.h>
21: #define __STDC__ 1
22: #define __GNU_LIBRARY__
23: #include <getopt.h>
24: #undef __GNU_LIBRARY__
25: #undef __STDC__
26:
27: #ifndef __bebox__
28: #error Compiling bebox.cpp, but __bebox__ unset.
29: #endif
30:
31: #include "bebox.h"
32:
33: extern void deinit_sound(void);
34:
35:
36: /*
37: * Create application object and start it
38: */
39:
40: UAE *the_app;
41:
42: main()
43: {
44: the_app = new UAE();
45: the_app->Run();
46: delete the_app;
47:
48: return 0;
49: }
50:
51:
52: /*
53: * UAE Constructor: Initialize member variables
54: */
55:
56: UAE::UAE() : BApplication('UAEm')
57: {
58: the_bitmap = NULL;
59: the_emulator = NULL;
60: main_window = NULL;
61: window_open = FALSE;
62: // Init Key events
63: CurentEvent = (Event*)malloc(sizeof(Event));
64: LastEvent=CurentEvent;
65: CurentEvent->Age=0;
66: CurentEvent->Next=0;
67: }
68:
69: void UAE::ArgvReceived(int argc, char **argv)
70: {
71: parse_cmdline(argc,argv);
72: }
73:
74: /*
75: * Arguments processed, create and start emulation
76: */
77:
78: void UAE::ReadyToRun(void)
79: {
80: vsize = correct_aspect ? 2*numscrlines : numscrlines;
81: hsize = use_lores ? 400 : 800;
82: hpixels = use_lores ? 320 : 796;
83:
84: // Allocate bitmap
85: the_bitmap = new BBitmap(BRect(0, 0, hsize-1, vsize-1), B_COLOR_8_BIT);
86:
87: // Set up vidinfo
88: gfxvidinfo.bufmem = (char *)the_bitmap->Bits();
89: gfxvidinfo.rowbytes = the_bitmap->BytesPerRow();
90: gfxvidinfo.pixbytes = 1;
91: gfxvidinfo.maxblocklines = 100;
92: gfxvidinfo.maxlinetoscr = 0;
93: gfxvidinfo.x_adjust = 0;
94: gfxvidinfo.maxline = 100000; /* ??? */
95:
96: // Open window
97: main_window = new UAEWindow(BRect(0, 0, hpixels-1, vsize+B_MENU_BAR_HEIGHT), the_bitmap);
98:
99: // Initialize mouse and keyboard variables
100: buttonstate[0] = buttonstate[1] = buttonstate[2] = FALSE;
101: lastmx = lastmy = 0;
102: newmousecounters = FALSE;
103: inwindow = TRUE;
104:
105: // Start emulation
106: the_emulator = new Emulator;
107: the_emulator->Run();
108: }
109:
110:
111: /*
112: * Quit requested (either by menu or by closing the window)
113: */
114:
115: bool UAE::QuitRequested(void)
116: {
117: if (BApplication::QuitRequested()) {
118:
119: // Stop emulation
120: if (the_emulator) {
121: the_emulator->Quit();
122: delete the_emulator;
123: }
124:
125: // Deallocate bitmap
126: if (the_bitmap)
127: delete the_bitmap;
128:
129: return TRUE;
130: }
131: return FALSE;
132: }
133:
134:
135: /*
136: * Display "about" window
137: */
138:
139: void UAE::AboutRequested(void)
140: {
141: char str[256];
142:
143: sprintf(str, " Un*x Amiga Emulator V"VersionStr"\n"
144: " by Bernd Schmidt\n"
145: " BeBox port by Christian Bauer\n"
146: "Additional porting by Patrick Hanevold");
147: BAlert *the_alert = new BAlert("", str, "OK");
148: the_alert->Go();
149: }
150:
151: //void UAE::MessageReceived(BMessage *Msg)
152: //{
153: // switch(Msg->what)
154: // {
155: // default:
156: // BApplication::MessageReceived(Msg);
157: // }
158: //}
159:
160: char *DiskName[4];
161: char *FileName[4];
162: int FloppyN;
163:
164: void UAE::RefsReceived(BMessage *Msg)
165: {
166: ulong type;
167: long count;
168: BFile *File;
169: BDirectory *dir,*dir2;
170: char FileNm[256]; // = (char*)Msg->FindString("filename");
171: char Path1[512]="";
172: char Path2[512]="";
173: int err;
174:
175: Msg->GetInfo("refs",&type,&count);
176: for(long n=--count;n>=0;n--){
177: record_ref item = Msg->FindRef("refs",n);
178: if(item.database>=0 && item.record>=0){
179: if(does_ref_conform(item,"File")){
180: File = new BFile;
181: File->SetRef(item);
182: File->GetName(FileNm);
183: DiskName[FloppyN]=FileNm;
184: File->GetName(Path2);
185: dir = new BDirectory;
186: dir2 = new BDirectory;
187: err = File->GetParent(dir);
188: while(err == B_NO_ERROR)
189: {
190: dir->GetName(Path1);
191: if(strlen(Path2))
192: {
193: strcat(Path1,"/");
194: strcat(Path1,Path2);
195: }
196: strcpy(Path2,Path1);
197: err = dir->GetParent(dir2);
198: if(err==B_NO_ERROR) dir->SetRef(dir2->Record()->Ref());
199: }
200: strcpy(Path1,"/");
201: strcat(Path1,Path2);
202: // strcpy(FileName[FloppyN],Path1);
203: FileName[FloppyN]=Path1;
204: disk_eject(FloppyN);
205: disk_insert(FloppyN,Path1);
206: delete(dir);
207: delete(dir2);
208: delete(File);
209: }
210: //else BRecord *rec = new BRecord(item);
211: }
212: }
213: }
214:
215: void UAE::FilePanelClosed(BMessage *Msg)
216: {
217: }
218:
219: void UAE::RequestFile(char *Title,int Drive)
220: {
221: FloppyN=Drive;
222: RunFilePanel(Title,"Insert","Eject",FALSE,NULL);
223: }
224:
225: /*
226: * UAE Window constructor
227: */
228:
229: LEDView *PowerLED,*DriveLED;
230:
231: #define M_DF0 'MDF0'
232: #define M_DF1 'MDF1'
233: #define M_DF2 'MDF2'
234: #define M_DF3 'MDF3'
235: #define M_FR1 'MFR1'
236: #define M_FR2 'MFR2'
237: #define M_FR3 'MFR3'
238: #define M_FR4 'MFR4'
239: #define M_FR5 'MFR5'
240: #define M_FR6 'MFR6'
241: #define M_FR7 'MFR7'
242:
243: UAEWindow::UAEWindow(BRect frame, BBitmap *bitmap) : BWindow(frame,"UAE "VersionStr, B_TITLED_WINDOW, B_NOT_RESIZABLE|B_NOT_ZOOMABLE)
244: {
245: BRect MenuRect = Bounds();
246: BRect PowerRect = Bounds();
247: BRect DriveRect = Bounds();
248: BRect MeterRect = Bounds();
249: MenuRect.bottom = MenuRect.top + B_MENU_BAR_HEIGHT;
250: MenuRect.right -= 8;
251: DriveRect.bottom = MenuRect.bottom;
252: DriveRect.left = MenuRect.right+1;
253: DriveRect.right = DriveRect.left+3;
254: PowerRect.bottom = MenuRect.bottom;
255: PowerRect.left = DriveRect.right+1;
256: PowerRect.right = PowerRect.left+3;
257: MeterRect.left += 50;
258: MeterRect.right -= 15;
259: MeterRect.top += 5;
260: MeterRect.bottom = B_MENU_BAR_HEIGHT-5;
261:
262: BView *DriveView = new BView(DriveRect,"",B_FOLLOW_NONE, B_WILL_DRAW);
263:
264: BMenuBar *MenuBar = new BMenuBar(MenuRect,"MenuBar",B_FOLLOW_LEFT_RIGHT|B_FOLLOW_TOP, B_ITEMS_IN_ROW, FALSE);
265:
266: BMenu *Menu;
267: BMenu *SubMenu;
268: BMenuItem *DriveItem[4],*RateItem[7];
269:
270: DiskName[0]=df0;
271: DiskName[1]=df1;
272: DiskName[2]=df2;
273: DiskName[3]=df3;
274: Menu = new BMenu("Amiga", B_ITEMS_IN_COLUMN); MenuBar->AddItem(Menu);
275: SubMenu = new BMenu("Floppy", B_ITEMS_IN_COLUMN); Menu->AddItem(SubMenu);
276: DriveItem[0] = new BMenuItem(DiskName[0], new BMessage(M_DF0), NULL); SubMenu->AddItem(DriveItem[0]);
277: DriveItem[1] = new BMenuItem(DiskName[1], new BMessage(M_DF1), NULL); SubMenu->AddItem(DriveItem[1]);
278: DriveItem[2] = new BMenuItem(DiskName[2], new BMessage(M_DF2), NULL); SubMenu->AddItem(DriveItem[2]);
279: DriveItem[3] = new BMenuItem(DiskName[3], new BMessage(M_DF3), NULL); SubMenu->AddItem(DriveItem[3]);
280: SubMenu = new BMenu("Framerate", B_ITEMS_IN_COLUMN); Menu->AddItem(SubMenu);
281: SubMenu->SetRadioMode(TRUE);
282: RateItem[0] = new BMenuItem("1/1", new BMessage(M_FR1), NULL); SubMenu->AddItem(RateItem[0]);
283: RateItem[1] = new BMenuItem("1/2", new BMessage(M_FR2), NULL); SubMenu->AddItem(RateItem[1]);
284: RateItem[2] = new BMenuItem("1/3", new BMessage(M_FR3), NULL); SubMenu->AddItem(RateItem[2]);
285: RateItem[3] = new BMenuItem("1/4", new BMessage(M_FR4), NULL); SubMenu->AddItem(RateItem[3]);
286: RateItem[4] = new BMenuItem("1/5", new BMessage(M_FR5), NULL); SubMenu->AddItem(RateItem[4]);
287: RateItem[5] = new BMenuItem("1/6", new BMessage(M_FR6), NULL); SubMenu->AddItem(RateItem[5]);
288: RateItem[6] = new BMenuItem("1/7", new BMessage(M_FR7), NULL); SubMenu->AddItem(RateItem[6]);
289: RateItem[3]->SetMarked(TRUE);
290:
291: AddChild(MenuBar);
292: // AddChild(DriveView);
293: // Lock();
294: // DriveView->SetHighColor(0xff,0,0);
295: // DriveView->FillRect(DriveRect,B_SOLID_HIGH);
296: // Unlock();
297:
298: // SetPulseRate(500000.0/100.0);
299:
300: DriveLED = new LEDView(DriveRect,0xff,0x80,0,0x80,0x40,0);
301: AddChild(DriveLED);
302: PowerLED = new LEDView(PowerRect,0,0xe0,0,0,0xb0,0);
303: AddChild(PowerLED);
304: MeterView *Meter = new MeterView(MeterRect);
305: AddChild(Meter);
306:
307: int r, g, b, i;
308:
309: // Move window to right position
310: MoveTo(80, 60);
311:
312: // Create bitmap view
313: Lock();
314: frame.Set(0,B_MENU_BAR_HEIGHT+1,hsize-1,vsize+B_MENU_BAR_HEIGHT);
315: main_view = new BitmapView(frame, bitmap);
316: AddChild(main_view);
317: main_view->MakeFocus();
318: main_view->GetKeys(&old_key_info, FALSE);
319: Unlock();
320:
321: bitmap_view = main_view;
322: bitmap_window = this;
323:
324: // Initialize xcolors
325: i = 0;
326: for (r=0; r<16; r++) {
327: for (g=0; g<16; g++) {
328: for (b=0; b<16; b++)
329: xcolors[i++] = index_for_color(r<<4 | r, g<<4 | g, b<<4 | b);
330: }
331: }
332:
333: // Show window
334: Show();
335: window_open = TRUE;
336: }
337:
338: void UAEWindow::MessageReceived(BMessage *Msg)
339: {
340: switch(Msg->what)
341: {
342: case M_DF0:
343: the_app->RequestFile("Insert floppy in DF0:",0);
344: break;
345: case M_DF1:
346: the_app->RequestFile("Insert floppy in DF1:",1);
347: break;
348: case M_DF2:
349: the_app->RequestFile("Insert floppy in DF2:",2);
350: break;
351: case M_DF3:
352: the_app->RequestFile("Insert floppy in DF3:",3);
353: break;
354: case M_FR1:
355: framerate = 1;
356: break;
357: case M_FR2:
358: framerate = 2;
359: break;
360: case M_FR3:
361: framerate = 3;
362: break;
363: case M_FR4:
364: framerate = 4;
365: break;
366: case M_FR5:
367: framerate = 5;
368: break;
369: case M_FR6:
370: framerate = 6;
371: break;
372: case M_FR7:
373: framerate = 7;
374: break;
375: default:
376: printf("Err\n");
377: BWindow::MessageReceived(Msg);
378: }
379: }
380:
381: /*
382: * Closing the window quits UAE
383: */
384:
385: bool UAEWindow::QuitRequested(void)
386: {
387: window_open = FALSE;
388: be_app->PostMessage(B_QUIT_REQUESTED);
389: return TRUE;
390: }
391:
392:
393: /*
394: * Window was (de)activated
395: */
396:
397: void UAEWindow::WindowActivated(bool active)
398: {
399: inwindow = active;
400: }
401:
402: /*
403: * Bitmap view constructor
404: */
405:
406: BitmapView::BitmapView(BRect frame, BBitmap *bitmap) : BView(frame, "", B_FOLLOW_NONE, B_WILL_DRAW)
407: {
408: the_bitmap = bitmap;
409: }
410:
411:
412: /*
413: * Blit the bitmap
414: */
415:
416: void BitmapView::Draw(BRect update)
417: {
418: int xs = use_lores ? prev_max_diwstop - 328 : 0;
419: BRect from=update;
420: from.left+=xs;
421: from.right+=xs;
422: DrawBitmap(the_bitmap, from, update);
423: }
424:
425: void BitmapView::Draw(BRect from, BRect to)
426: {
427: DrawBitmap(the_bitmap, from, to);
428: }
429:
430: //char KeyState[256];
431: char RawKeys[128]={
432: // 0 1 2 3 4 5 6 7 8 9 A B C D E F
433: /* 00 */ 0, 0, 0, 0, 0, 0, 0, 0, AK_BS,AK_TAB,AK_RET,0, 0, 0, 0, 0,
434: /* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, AK_ESC, 0, 0, 0, 0,
435: /* 20 */ AK_SPC,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, AK_NPADD, 0, AK_NPSUB,0, 0,
436: /* 30 */ AK_0, AK_1,AK_2,AK_3,AK_4,AK_5,AK_6,AK_7,AK_8, AK_9, 0, AK_SEMICOLON,0, 0, 0, 0,
437: /* 40 */ 0, AK_A,AK_B,AK_C,AK_D,AK_E,AK_F,AK_G,AK_H, AK_I, AK_J, AK_K, AK_L, AK_M, AK_N,AK_O,
438: /* 50 */ AK_P, AK_Q,AK_R,AK_S,AK_T,AK_U,AK_V,AK_W,AK_X, AK_Y, AK_Z, 0, AK_BACKSLASH,0, 0, 0,
439: /* 60 */ 0, AK_A,AK_B,AK_C,AK_D,AK_E,AK_F,AK_G,AK_H, AK_I, AK_J, AK_K, AK_L, AK_M, AK_N,AK_O,
440: /* 70 */ AK_P, AK_Q,AK_R,AK_S,AK_T,AK_U,AK_V,AK_W,AK_X, AK_Y, AK_Z, 0, 0, 0, 0, AK_DEL};
441:
442: void BitmapView::KeyDown(ulong aChar)
443: {
444: // printf("$%x\n",aChar);
445: /*
446: Event *NewEvent=(Event*)malloc(sizeof(Event));
447: NewEvent->Next=0;
448: NewEvent->Age=3;
449: if((aChar>0x40)&&(aChar<0x5b)){
450: NewEvent->Key=AK_LSH;
451: LastEvent->Next=NewEvent;
452: LastEvent=NewEvent;
453: NewEvent=(Event*)malloc(sizeof(Event));
454: NewEvent->Next=0;
455: NewEvent->Age=3;
456: NewEvent->Key=RawKeys[aChar];
457: LastEvent->Next=NewEvent;
458: LastEvent=NewEvent;
459: NewEvent=(Event*)malloc(sizeof(Event));
460: NewEvent->Next=0;
461: NewEvent->Age=3;
462: NewEvent->Key=AK_LSH;
463: }else{
464: switch(aChar)
465: {
466: case 0x3a:
467: NewEvent->Key=AK_LSH;
468: LastEvent->Next=NewEvent;
469: LastEvent=NewEvent;
470: NewEvent=(Event*)malloc(sizeof(Event));
471: NewEvent->Next=0;
472: NewEvent->Age=3;
473: NewEvent->Key=AK_SEMICOLON;
474: LastEvent->Next=NewEvent;
475: LastEvent=NewEvent;
476: NewEvent=(Event*)malloc(sizeof(Event));
477: NewEvent->Next=0;
478: NewEvent->Age=3;
479: NewEvent->Key=AK_LSH;
480: break;
481: default:
482: NewEvent->Key=RawKeys[aChar];
483: }
484: }
485: LastEvent->Next=NewEvent;
486: LastEvent=NewEvent;
487: */
488: }
489:
490: /*
491: * LED
492: */
493:
494: LEDView::LEDView(BRect frame, int aR, int aG, int aB, int iR, int iG, int iB) : BView(frame,"", B_FOLLOW_NONE, B_WILL_DRAW)
495: {
496: ActiveColor.R=aR;
497: ActiveColor.G=aG;
498: ActiveColor.B=aB;
499: IdleColor.R=iR;
500: IdleColor.G=iG;
501: IdleColor.B=iB;
502: State = FALSE;
503: }
504:
505: void LEDView::AttachedToWindow(void)
506: {
507: bounds = Bounds();
508: }
509:
510: void LEDView::Draw(BRect update)
511: {
512: Refresh();
513: }
514:
515: void LEDView::SetState(bool NewState)
516: {
517: if(NewState!=State)
518: {
519: State = NewState;
520: Refresh();
521: }
522: }
523:
524: void LEDView::Refresh(void)
525: {
526: Window()->Lock();
527: if(State) SetHighColor(ActiveColor.R,ActiveColor.G,ActiveColor.B);
528: else SetHighColor(IdleColor.R,IdleColor.G,IdleColor.B);
529: FillRect(bounds);
530: Window()->Unlock();
531: }
532:
533: /*
534: * Meter
535: */
536:
537: MeterView::MeterView(BRect frame) : BView(frame,"", B_FOLLOW_NONE, B_WILL_DRAW|B_PULSE_NEEDED)
538: {
539: }
540:
541: void MeterView::AttachedToWindow(void)
542: {
543: bounds = Bounds();
544: }
545:
546: void MeterView::Draw(BRect)
547: {
548: Refresh();
549: }
550:
551: void MeterView::Pulse(void)
552: {
553: Refresh();
554: }
555:
556: void MeterView::Refresh(void)
557: {
558: ulong Speed=frametime/timeframes;
559: int Frames=Speed/20+1;
560: BRect Fine=bounds;
561: Fine.left=Fine.right-(bounds.right-bounds.left)/Frames;
562: Fine.right=Fine.left+(Speed-20*(Frames-1))*((bounds.right-bounds.left)/Frames)/20;
563: Window()->Lock();
564: SetHighColor(0,0,0);
565: FillRect(bounds);
566: SetHighColor(255,0,0);
567: FillRect(Fine);
568: int R=255-200/Frames;
569: for(int n=Frames-1; n; n--){
570: R-=200/Frames;
571: SetHighColor(R,0,0);
572: Fine.left=(n-1)*((bounds.right-bounds.left)/Frames);
573: Fine.right=n*((bounds.right-bounds.left)/Frames);
574: FillRect(Fine);
575: }
576: Window()->Unlock();
577: }
578:
579: /*
580: * Start main emulation thread
581: */
582:
583: void Emulator::Run(void)
584: {
585: // Initialize everything
586: produce_sound = TRUE;
587: init_sound();
588: gui_init();
589: init_joystick();
590: keybuf_init ();
591: memory_init();
592: custom_init();
593: DISK_init();
594: init_m68k();
595: MC68000_reset();
596:
597: // Start the emulation thread
598: the_thread = spawn_thread(thread_invoc, "UAE 68000", B_NORMAL_PRIORITY, this);
599: resume_thread(the_thread);
600: thread_running = TRUE;
601: }
602:
603:
604: /*
605: * Stop main emulation thread
606: */
607:
608: void Emulator::Quit(void)
609: {
610: // Kill the thread if it is running
611: if (thread_running) {
612: kill_thread(the_thread);
613: thread_running = FALSE;
614: }
615:
616: close_joystick();
617: deinit_sound();
618: }
619:
620:
621: /*
622: * The thread's main function
623: */
624:
625: long Emulator::thread_invoc(void *data) //Emulator *obj)
626: {
627: Emulator *obj = (Emulator*)data;
628: obj->thread_func();
629: return 0;
630: }
631:
632: void Emulator::thread_func(void)
633: {
634: // This jumps to MC68000_run() and executes the main loop
635: debug();
636: thread_running = FALSE;
637: }
638:
639:
640: /*
641: * Redraw a line
642: */
643:
644: void flush_line(int y)
645: {
646: if (window_open) {
647: bitmap_window->Lock();
648: bitmap_view->Draw(BRect(0, y, hpixels+-1, y));
649: bitmap_window->Unlock();
650: }
651: }
652:
653:
654: /*
655: * Redraw a block
656: */
657:
658: void flush_block(int ystart, int ystop)
659: {
660: int xs = use_lores ? prev_max_diwstop - 328 : 0;
661:
662: if (window_open) {
663: bitmap_window->Lock();
664: bitmap_view->Draw(BRect(xs, ystart, hpixels+xs-1, ystop), BRect(0, ystart, hpixels-1, ystop));
665: bitmap_window->Unlock();
666: }
667: }
668:
669:
670: /*
671: * Redraw the screen
672: */
673:
674: void flush_screen(int ystart, int ystop)
675: {
676: }
677:
678:
679: /*
680: * Poll mouse and keyboard
681: */
682:
683: void handle_events(void)
684: {
685: key_info the_key_info;
686: int be_code, be_byte, be_bit, amiga_code;
687: BPoint mouse_point;
688: ulong mouse_buttons;
689:
690: // Keyboard
691: if (window_open && inwindow) {
692: bitmap_window->Lock();
693: bitmap_view->GetKeys(&the_key_info, FALSE);
694: bitmap_window->Unlock();
695:
696: for (be_code=0; be_code<0x80; be_code++) {
697: be_byte = be_code >> 3;
698: be_bit = 1 << (~be_code & 7);
699:
700: // Key state changed?
701: if ((the_key_info.key_states[be_byte] & be_bit)
702: != (old_key_info.key_states[be_byte] & be_bit)) {
703:
704: amiga_code = keycode2amiga[be_code];
705: if (the_key_info.key_states[be_byte] & be_bit) {
706:
707: // Key pressed
708: if (amiga_code == AK_mousestuff)
709: togglemouse();
710: else
711: printf("Key\n");
712: record_key(amiga_code << 1);
713: } else {
714:
715: // Key released
716: record_key((amiga_code << 1) | 1);
717: }
718: }
719: }
720: old_key_info = the_key_info;
721:
722: // "Affengriff"
723: if ((the_key_info.key_states[0x5c >> 3] & (1 << (~0x5c & 7)))
724: && (the_key_info.key_states[0x5d >> 3] & (1 << (~0x5d & 7)))
725: && (the_key_info.key_states[0x5f >> 3] & (1 << (~0x5f & 7))))
726: MC68000_reset();
727:
728: // Scroll lock toggles inhibit_frame
729: inhibit_frame = the_key_info.key_states[0x0f >> 3] & (1 << (~0x0f & 7));
730: /*
731: static bool ShiftState=FALSE;
732: if(CurentEvent->Age){
733: if(CurentEvent->Key==AK_LSH){
734: CurentEvent->Age--;
735: if(CurentEvent->Age==2){
736: if(ShiftState) {record_key((AK_LSH<<1)|1); ShiftState=FALSE; printf("ShU\n");}
737: else {record_key(AK_LSH<<1); ShiftState=TRUE; printf("ShD\n");}
738: }
739: }else{
740: CurentEvent->Age--;
741: if(CurentEvent->Age==2) record_key(CurentEvent->Key<<1);
742: if(CurentEvent->Age==0) record_key((CurentEvent->Key<<1)|1);
743: }
744: }
745: else{
746: if(CurentEvent->Next)
747: {
748: Event *TrashEvent=CurentEvent;
749: CurentEvent=CurentEvent->Next;
750: free(TrashEvent);
751: }
752: }
753: */
754: }
755: // Mouse
756: if (window_open && inwindow) {
757: bitmap_window->Lock();
758: bitmap_view->GetMouse(&mouse_point, &mouse_buttons, FALSE);
759: bitmap_window->Unlock();
760: lastmx = mouse_point.x;
761: lastmy = mouse_point.y;
762:
763: if(lastmx>=0&&lastmy>=0&&lastmx<hsize&&lastmy<vsize){
764: buttonstate[0] = mouse_buttons & B_PRIMARY_MOUSE_BUTTON;
765: buttonstate[1] = mouse_buttons & B_TERTIARY_MOUSE_BUTTON;
766: buttonstate[2] = mouse_buttons & B_SECONDARY_MOUSE_BUTTON;
767: }
768: }
769: }
770:
771: int debuggable(void)
772: {
773: return TRUE;
774: }
775:
776: int needmousehack(void)
777: {
778: return TRUE;
779: }
780:
781: void LED(int on)
782: {
783: // printf("PowerLED: %d\n",on);
784: PowerLED->SetState((bool)~on);
785: }
786:
787: bool LEDs[4];
788:
789: void gui_led(int led, int on)
790: {
791: if(led<4)
792: {
793: LEDs[led]=on;
794: DriveLED->SetState(LEDs[0]|LEDs[1]|LEDs[2]|LEDs[3]);
795: // printf("DriveLeds: %d,%d,%d,%d\n",LEDs[0],LEDs[1],LEDs[2],LEDs[3]);
796: }
797: }
798:
799: void calc_adjustment(void)
800: {
801: gfxvidinfo.x_adjust = 0;
802: }
803:
804: void target_specific_usage(void)
805: {
806: }
807:
808: int quit_program;
809:
810: static void sigchldhandler(int foo)
811: {
812: }
813:
814: int gui_init(void)
815: {
816: LEDs[0]=LEDs[1]=LEDs[2]=LEDs[3]=FALSE;
817: quit_program = 0;
818: return 0;
819: }
820:
821: void gui_exit(void)
822: {
823: }
824:
825: //void gui_led(int led, int on)
826: //{
827: //}
828:
829: void gui_filename(int num, char *name)
830: {
831: }
832:
833: static void getline(char *p)
834: {
835: }
836:
837: void gui_handle_events(void)
838: {
839: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.