Annotation of uae/src/od-beos/beos.cpp, revision 1.1.1.1

1.1       root        1: /* 
                      2:  *  UAE - The Un*x Amiga Emulator
                      3:  *
                      4:  *  BeBox port specific stuff
                      5:  *
                      6:  *  (c) 1996-1998 Christian Bauer
                      7:  *  (c) 1996 Patrick Hanevold
                      8:  */
                      9: 
                     10: #include <AppKit.h>
                     11: #include <InterfaceKit.h>
                     12: #include <KernelKit.h>
                     13: #include <MediaKit.h>
                     14: #include <StorageKit.h>
                     15: #include <device/Joystick.h>
                     16: 
                     17: extern "C" {
                     18: #include "sysconfig.h"
                     19: #include "sysdeps.h"
                     20: #include "config.h"
                     21: #include "options.h"
                     22: #include "threaddep/penguin.h"
                     23: #include "uae.h"
                     24: #include "gensound.h"
                     25: #include "sounddep/sound.h"
                     26: #include "events.h"
                     27: #include "memory.h"
                     28: #include "custom.h"
                     29: #include "readcpu.h"
                     30: #include "newcpu.h"
                     31: #include "disk.h"
                     32: #include "gui.h"
                     33: #include "debug.h"
                     34: #include "xwin.h"
                     35: #include "joystick.h"
                     36: #include "keyboard.h"
                     37: #include "keybuf.h"
                     38: #include "gui.h"
                     39: #include "zfile.h"
                     40: #include "picasso96.h"
                     41: }
                     42: 
                     43: 
                     44: // Constants
                     45: const char APP_SIGNATURE[] = "application/x-vnd.cebix-UAE";
                     46: 
                     47: const uint32 MSG_INSERT_DF0 = 'idf0';  // Messages
                     48: const uint32 MSG_EJECT_DF0 = 'edf0';
                     49: const uint32 MSG_INSERT_DF1 = 'idf1';
                     50: const uint32 MSG_EJECT_DF1 = 'edf1';
                     51: const uint32 MSG_INSERT_DF2 = 'idf2';
                     52: const uint32 MSG_EJECT_DF2 = 'edf2';
                     53: const uint32 MSG_INSERT_DF3 = 'idf3';
                     54: const uint32 MSG_EJECT_DF3 = 'edf3';
                     55: const uint32 MSG_FLOPPY_PANEL_RETURNED = 'flpn';
                     56: const uint32 MSG_FR1 = 'mfr1';
                     57: const uint32 MSG_FR2 = 'mfr2';
                     58: const uint32 MSG_FR3 = 'mfr3';
                     59: const uint32 MSG_FR4 = 'mfr4';
                     60: const uint32 MSG_FR5 = 'mfr5';
                     61: const uint32 MSG_FR6 = 'mfr6';
                     62: const uint32 MSG_RESET = 'rset';
                     63: const uint32 MSG_DEBUG = 'dbug';
                     64: const uint32 MSG_REDRAW = 'draw';
                     65: const uint32 MSG_QUIT = 'quit';
                     66: const uint32 MSG_ABOUT = 'abut';
                     67: 
                     68: const rgb_color PowerDark = {0x40, 0x00, 0x00, 0};     // LED colors
                     69: const rgb_color PowerLight = {0xff, 0x00, 0x00, 0};
                     70: const rgb_color DriveDark = {0x00, 0x40, 0x00, 0};
                     71: const rgb_color DriveLight = {0x00, 0xff, 0x00, 0};
                     72: 
                     73: 
                     74: // Array for converting Be keycodes to Amiga keycodes
                     75: static const int keycode2amiga[128] = {
                     76:        -1, AK_ESC, AK_F1, AK_F2, AK_F3, AK_F4, AK_F5, AK_F6,
                     77:        AK_F7, AK_F8, AK_F9, AK_F10, -1, AK_mousestuff, -1, -1,
                     78: 
                     79:        -1, AK_BACKQUOTE, AK_1, AK_2, AK_3, AK_4, AK_5, AK_6,
                     80:        AK_7, AK_8, AK_9, AK_0, AK_MINUS, AK_EQUAL, AK_BS, AK_HELP,
                     81: 
                     82:        AK_NPLPAREN, AK_NPRPAREN, -1, AK_NPDIV, AK_NPMUL, AK_NPSUB, AK_TAB, AK_Q,
                     83:        AK_W, AK_E, AK_R, AK_T, AK_Y, AK_U, AK_I, AK_O,
                     84: 
                     85:        AK_P, AK_LBRACKET, AK_RBRACKET, AK_BACKSLASH, AK_DEL, AK_LALT, AK_RALT, AK_NP7,
                     86:        AK_NP8, AK_NP9, AK_NPADD, AK_CAPSLOCK, AK_A, AK_S, AK_D, AK_F,
                     87: 
                     88:        AK_G, AK_H, AK_J, AK_K, AK_L, AK_SEMICOLON, AK_QUOTE, AK_RET,
                     89:        AK_NP4, AK_NP5, AK_NP6, AK_LSH, AK_Z, AK_X, AK_C, AK_V,
                     90: 
                     91:        AK_B, AK_N, AK_M, AK_COMMA, AK_PERIOD, AK_SLASH, AK_RSH, AK_UP,
                     92:        AK_NP1, AK_NP2, AK_NP3, AK_ENT, AK_CTRL, AK_LAMI, AK_SPC, AK_RAMI,
                     93: 
                     94:        AK_RALT, AK_LF, AK_DN, AK_RT, AK_NP0, AK_NPDEL, AK_LALT, AK_RALT,
                     95:        AK_LTGT, -1, -1, -1, -1, -1, -1, -1,
                     96: 
                     97:        -1, -1, -1, -1, -1, -1, -1, -1,
                     98:        -1, -1, -1, -1, -1, -1, -1, -1
                     99: };
                    100: 
                    101: 
                    102: // Global variables
                    103: static bool reset_thyself = false;
                    104: 
                    105: static key_info old_key_info;
                    106: static bool window_open;
                    107: static bool LEDs[4];
                    108: 
                    109: static int the_argc;
                    110: static char **the_argv;
                    111: 
                    112: static BJoystick *joy;
                    113: 
                    114: 
                    115: /*
                    116:  *  A simple view class for blitting a bitmap on the screen
                    117:  */
                    118: 
                    119: class BitmapView : public BView {
                    120: public:
                    121:        BitmapView(BRect frame, BBitmap *bitmap);
                    122:        virtual void Draw(BRect update);
                    123:        virtual void MouseMoved(BPoint point, uint32 transit, const BMessage *message);
                    124:        void Draw(BRect from, BRect to);
                    125: 
                    126: private:
                    127:        BBitmap *the_bitmap;
                    128: };
                    129: 
                    130: static BitmapView *bitmap_view;
                    131: 
                    132: 
                    133: /*
                    134:  *  The window in which the Amiga graphics are displayed, handles I/O
                    135:  */
                    136: 
                    137: class UAEWindow : public BWindow {
                    138: public:
                    139:        UAEWindow(BRect frame, BBitmap *bitmap);
                    140:        virtual bool QuitRequested(void);
                    141:        virtual void MessageReceived(BMessage *msg);
                    142: 
                    143: private:
                    144:        BMessenger this_messenger;
                    145:        BitmapView *main_view;
                    146:        BFilePanel *floppy_panel;
                    147:        int panel_drive_num;
                    148: };
                    149: 
                    150: static UAEWindow *bitmap_window;
                    151: 
                    152: 
                    153: /*
                    154:  *  The BeOS application object
                    155:  */
                    156: 
                    157: class UAE : public BApplication {
                    158: public:
                    159:        UAE();
                    160:        virtual void ReadyToRun(void);
                    161:        virtual bool QuitRequested(void);
                    162: 
                    163:        int GraphicsInit(void);
                    164:        void GraphicsLeave(void);
                    165: 
                    166: private:
                    167:        static long thread_func(void *obj);
                    168: 
                    169:        BBitmap *the_bitmap;
                    170:        UAEWindow *main_window;
                    171:        thread_id the_thread;
                    172: };
                    173: 
                    174: static UAE *the_app;
                    175: 
                    176: 
                    177: /*
                    178:  *     LED
                    179:  */
                    180: 
                    181: class LEDView : public BView {
                    182: public:
                    183:        LEDView(BRect frame, rgb_color active, rgb_color idle);
                    184:        virtual void Draw(BRect update);
                    185:        void SetState(bool new_state);
                    186: 
                    187: private:
                    188:        BRect bounds;
                    189:        rgb_color active_color;
                    190:        rgb_color idle_color;
                    191:        bool state;
                    192: };
                    193: 
                    194: static LEDView *PowerLED, *DriveLED[4];
                    195: 
                    196: 
                    197: /*
                    198:  *  Create application object and start it
                    199:  */
                    200: 
                    201: int main(int argc, char **argv)
                    202: {
                    203:        // Copy command line arguments
                    204:        the_argc = argc;
                    205:        the_argv = new char *[argc];
                    206:        for (int i=0; i<argc; i++)
                    207:                the_argv[i] = strdup(argv[i]);
                    208: 
                    209:        the_app = new UAE();
                    210:        the_app->Run();
                    211:        delete the_app;
                    212:        return 0;
                    213: }
                    214: 
                    215: 
                    216: /*
                    217:  *  UAE Constructor: Initialize member variables
                    218:  */
                    219: 
                    220: UAE::UAE() : BApplication('UAEm')
                    221: {
                    222:        // Find application directory and cwd to it
                    223:        app_info the_info;
                    224:        GetAppInfo(&the_info);
                    225:        BEntry the_file(&the_info.ref);
                    226:        BEntry the_dir;
                    227:        the_file.GetParent(&the_dir);
                    228:        BPath the_path;
                    229:        the_dir.GetPath(&the_path);
                    230:        chdir(the_path.Path());
                    231: 
                    232:        // Initialize other variables
                    233:        the_bitmap = NULL;
                    234:        main_window = NULL;
                    235:        window_open = false;
                    236: }
                    237: 
                    238: 
                    239: /*
                    240:  *  Arguments processed, create and start emulation
                    241:  */
                    242: 
                    243: void UAE::ReadyToRun(void)
                    244: {
                    245:        // Start the emulation thread
                    246:        the_thread = spawn_thread(thread_func, "UAE 68000", B_NORMAL_PRIORITY, this);
                    247:        resume_thread(the_thread);
                    248: }
                    249: 
                    250: 
                    251: /*
                    252:  *  Quit requested (either by menu or by closing the window)
                    253:  */
                    254: 
                    255: bool UAE::QuitRequested(void)
                    256: {
                    257:        // Quit the thread
                    258:        uae_quit();
                    259:        status_t l;
                    260:        wait_for_thread(the_thread, &l);
                    261:        return true;
                    262: }
                    263: 
                    264: 
                    265: /*
                    266:  *  The thread's main function
                    267:  */
                    268: 
                    269: long UAE::thread_func(void *obj)
                    270: {
                    271:        real_main(the_argc, the_argv);
                    272:        return 0;
                    273: }
                    274: 
                    275: 
                    276: /*
                    277:  *  UAE Window constructor
                    278:  */
                    279: 
                    280: UAEWindow::UAEWindow(BRect frame, BBitmap *bitmap) : BWindow(frame,"UAE", B_TITLED_WINDOW, B_NOT_RESIZABLE|B_NOT_ZOOMABLE), this_messenger(this)
                    281: {
                    282:        int i;
                    283: 
                    284:        // Initialize xcolors
                    285:        {
                    286:                BScreen scr(this);
                    287:                i = 0;
                    288:                for (int r=0; r<16; r++) {
                    289:                        for (int g=0; g<16; g++) {
                    290:                                for (int b=0; b<16; b++)
                    291:                                        xcolors[i++] = scr.IndexForColor(r<<4 | r, g<<4 | g, b<<4 | b);
                    292:                        }
                    293:                }
                    294:        }
                    295: 
                    296:        // Move window to right position
                    297:        Lock();
                    298:        MoveTo(80, 80);
                    299: 
                    300:        // Set up menus
                    301:        BRect bounds = Bounds();
                    302:        bounds.OffsetBy(0, bounds.IntegerHeight() + 1);
                    303:        BMenuBar *bar = new BMenuBar(bounds, "menu");
                    304:        BMenu *menu = new BMenu("UAE");
                    305:        menu->AddItem(new BMenuItem("About UAE" B_UTF8_ELLIPSIS, new BMessage(MSG_ABOUT)));
                    306:        menu->AddItem(new BSeparatorItem);
                    307:        BMenu *submenu = new BMenu("Framerate");
                    308:        submenu->AddItem(new BMenuItem("1/1", new BMessage(MSG_FR1)));
                    309:        submenu->AddItem(new BMenuItem("1/2", new BMessage(MSG_FR2)));
                    310:        submenu->AddItem(new BMenuItem("1/3", new BMessage(MSG_FR3)));
                    311:        submenu->AddItem(new BMenuItem("1/4", new BMessage(MSG_FR4)));
                    312:        submenu->AddItem(new BMenuItem("1/5", new BMessage(MSG_FR5)));
                    313:        submenu->AddItem(new BMenuItem("1/6", new BMessage(MSG_FR6)));
                    314:        submenu->SetRadioMode(true);
                    315:        menu->AddItem(submenu);
                    316:        menu->AddItem(new BMenuItem("Reset", new BMessage(MSG_RESET)));
                    317:        menu->AddItem(new BMenuItem("Debugger", new BMessage(MSG_DEBUG)));
                    318:        menu->AddItem(new BSeparatorItem);
                    319:        menu->AddItem(new BMenuItem("Quit", new BMessage(MSG_QUIT)));
                    320:        bar->AddItem(menu);
                    321:        menu = new BMenu("Floppy");
                    322:        submenu = new BMenu("DF0");
                    323:        submenu->AddItem(new BMenuItem("Insert" B_UTF8_ELLIPSIS, new BMessage(MSG_INSERT_DF0)));
                    324:        submenu->AddItem(new BMenuItem("Eject", new BMessage(MSG_EJECT_DF0)));
                    325:        menu->AddItem(submenu);
                    326:        submenu = new BMenu("DF1");
                    327:        submenu->AddItem(new BMenuItem("Insert" B_UTF8_ELLIPSIS, new BMessage(MSG_INSERT_DF1)));
                    328:        submenu->AddItem(new BMenuItem("Eject", new BMessage(MSG_EJECT_DF1)));
                    329:        menu->AddItem(submenu);
                    330:        submenu = new BMenu("DF2");
                    331:        submenu->AddItem(new BMenuItem("Insert" B_UTF8_ELLIPSIS, new BMessage(MSG_INSERT_DF2)));
                    332:        submenu->AddItem(new BMenuItem("Eject", new BMessage(MSG_EJECT_DF2)));
                    333:        menu->AddItem(submenu);
                    334:        submenu = new BMenu("DF3");
                    335:        submenu->AddItem(new BMenuItem("Insert" B_UTF8_ELLIPSIS, new BMessage(MSG_INSERT_DF3)));
                    336:        submenu->AddItem(new BMenuItem("Eject", new BMessage(MSG_EJECT_DF3)));
                    337:        menu->AddItem(submenu);
                    338:        bar->AddItem(menu);
                    339:        AddChild(bar);
                    340:        bar->ResizeBy(-5*4, 0); // Make room for LEDs
                    341:        int mbar_height = bar->Frame().IntegerHeight() + 1;
                    342: 
                    343:        // Resize window to fit menu bar
                    344:        ResizeBy(0, mbar_height);
                    345: 
                    346:        // Create LEDs
                    347:        BRect PowerRect = bar->Frame();
                    348:        PowerRect.left = PowerRect.right+1;
                    349:        PowerRect.right = PowerRect.left+3;
                    350:        PowerLED = new LEDView(PowerRect, PowerLight, PowerDark);
                    351:        AddChild(PowerLED);
                    352: 
                    353:        BRect DriveRect = PowerRect;
                    354:        for (i=0; i<4; i++) {
                    355:                DriveRect.left += 4;
                    356:                DriveRect.right += 4;
                    357:                DriveLED[i] = new LEDView(DriveRect, DriveLight, DriveDark);
                    358:                AddChild(DriveLED[i]);
                    359:        }
                    360: 
                    361:        // Create bitmap view
                    362:        BRect BitmapRect = frame;
                    363:        main_view = new BitmapView(BitmapRect, bitmap);
                    364:        AddChild(main_view);
                    365:        main_view->MakeFocus();
                    366:        get_key_info(&old_key_info);
                    367: 
                    368:        bitmap_view = main_view;
                    369:        bitmap_window = this;
                    370: 
                    371:        // Create file panel
                    372:        floppy_panel = new BFilePanel(B_OPEN_PANEL, &this_messenger, NULL, 0, false, new BMessage(MSG_FLOPPY_PANEL_RETURNED));
                    373:        panel_drive_num = 0;
                    374: 
                    375:        // Show window
                    376:        Unlock();
                    377:        Show();
                    378:        window_open = true;
                    379: }
                    380: 
                    381: 
                    382: /*
                    383:  *  Message received
                    384:  */
                    385: 
                    386: void UAEWindow::MessageReceived(BMessage *msg)
                    387: {
                    388:        BMessage *msg2;
                    389: 
                    390:        switch(msg->what) {
                    391:                case MSG_INSERT_DF0:
                    392:                        panel_drive_num = 0;
                    393:                        floppy_panel->Hide();
                    394:                        floppy_panel->Window()->SetTitle("UAE: Insert floppy in DF0:");
                    395:                        floppy_panel->Show();
                    396:                        break;
                    397: 
                    398:                case MSG_EJECT_DF0:
                    399:                        disk_eject(0);
                    400:                        break;
                    401: 
                    402:                case MSG_INSERT_DF1:
                    403:                        panel_drive_num = 1;
                    404:                        floppy_panel->Hide();
                    405:                        floppy_panel->Window()->SetTitle("UAE: Insert floppy in DF1:");
                    406:                        floppy_panel->Show();
                    407:                        break;
                    408: 
                    409:                case MSG_EJECT_DF1:
                    410:                        disk_eject(1);
                    411:                        break;
                    412: 
                    413:                case MSG_INSERT_DF2:
                    414:                        panel_drive_num = 2;
                    415:                        floppy_panel->Hide();
                    416:                        floppy_panel->Window()->SetTitle("UAE: Insert floppy in DF2:");
                    417:                        floppy_panel->Show();
                    418:                        break;
                    419: 
                    420:                case MSG_EJECT_DF2:
                    421:                        disk_eject(2);
                    422:                        break;
                    423: 
                    424:                case MSG_INSERT_DF3:
                    425:                        panel_drive_num = 3;
                    426:                        floppy_panel->Hide();
                    427:                        floppy_panel->Window()->SetTitle("UAE: Insert floppy in DF3:");
                    428:                        floppy_panel->Show();
                    429:                        break;
                    430: 
                    431:                case MSG_EJECT_DF3:
                    432:                        disk_eject(3);
                    433:                        break;
                    434: 
                    435:                case MSG_FLOPPY_PANEL_RETURNED: {
                    436:                        entry_ref the_ref;
                    437:                        BEntry the_entry;
                    438:                        if (msg->FindRef("refs", &the_ref) == B_NO_ERROR)
                    439:                                if (the_entry.SetTo(&the_ref) == B_NO_ERROR) {
                    440:                                        BPath the_path;
                    441:                                        the_entry.GetPath(&the_path);
                    442:                                        disk_eject(panel_drive_num);
                    443:                                        disk_insert(panel_drive_num, the_path.Path());
                    444:                                }
                    445:                        break;
                    446:                }
                    447: 
                    448:                case MSG_FR1:
                    449:                        currprefs.framerate = 1;
                    450:                        break;
                    451:                case MSG_FR2:
                    452:                        currprefs.framerate = 2;
                    453:                        break;
                    454:                case MSG_FR3:
                    455:                        currprefs.framerate = 3;
                    456:                        break;
                    457:                case MSG_FR4:
                    458:                        currprefs.framerate = 4;
                    459:                        break;
                    460:                case MSG_FR5:
                    461:                        currprefs.framerate = 5;
                    462:                        break;
                    463:                case MSG_FR6:
                    464:                        currprefs.framerate = 6;
                    465:                        break;
                    466: 
                    467:                case MSG_RESET:
                    468:                        reset_thyself = true;
                    469:                        break;
                    470: 
                    471:                case MSG_DEBUG:
                    472:                        activate_debugger();
                    473:                        break;
                    474: 
                    475:                case MSG_QUIT:
                    476:                        be_app->PostMessage(B_QUIT_REQUESTED);
                    477:                        break;
                    478: 
                    479:                case MSG_ABOUT: {
                    480:                        char str[256];
                    481:                        sprintf(str, "     Un*x Amiga Emulator V%d.%d.%d\n"
                    482:                                        "          by Bernd Schmidt\n"
                    483:                                        "    BeBox port by Christian Bauer\n"
                    484:                                        "Additional porting by Patrick Hanevold", UAEMAJOR, UAEMINOR, UAEURSAMINOR);
                    485:                        BAlert *the_alert = new BAlert("", str, "OK");
                    486:                        the_alert->Go();
                    487:                        break;
                    488:                }
                    489: 
                    490:                case MSG_REDRAW:
                    491:                        MessageQueue()->Lock();
                    492:                        while ((msg2 = MessageQueue()->FindMessage(MSG_REDRAW, 0)) != NULL) {
                    493:                                MessageQueue()->RemoveMessage(msg2);
                    494:                                delete msg2;
                    495:                        }
                    496:                        MessageQueue()->Unlock();
                    497:                        Lock();
                    498:                        main_view->Draw(BRect(0, 0, currprefs.gfx_width-1, currprefs.gfx_height-1));
                    499:                        Unlock();
                    500:                        break;
                    501: 
                    502:                default:
                    503:                        BWindow::MessageReceived(msg);
                    504:                        break;
                    505:        }
                    506: }
                    507: 
                    508: 
                    509: /*
                    510:  *  Closing the window quits UAE
                    511:  */
                    512: 
                    513: bool UAEWindow::QuitRequested(void)
                    514: {
                    515:        window_open = false;
                    516:        be_app->PostMessage(B_QUIT_REQUESTED);
                    517:        return false;
                    518: }
                    519: 
                    520: 
                    521: /*
                    522:  *  Bitmap view constructor
                    523:  */
                    524: 
                    525: BitmapView::BitmapView(BRect frame, BBitmap *bitmap) : BView(frame, "", B_FOLLOW_NONE, B_WILL_DRAW)
                    526: {
                    527:        the_bitmap = bitmap;
                    528: }
                    529: 
                    530: 
                    531: /*
                    532:  *  Blit the bitmap
                    533:  */
                    534: 
                    535: void BitmapView::Draw(BRect update)
                    536: {
                    537:        DrawBitmap(the_bitmap, update, update);
                    538: }
                    539: 
                    540: void BitmapView::Draw(BRect from, BRect to)
                    541: {
                    542:        DrawBitmap(the_bitmap, from, to);
                    543: }
                    544: 
                    545: 
                    546: /*
                    547:  *  Mouse moved
                    548:  */
                    549: 
                    550: void BitmapView::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
                    551: {
                    552:        newmousecounters = 0;
                    553:        switch (transit) {
                    554:                case B_ENTERED_VIEW:
                    555:                        newmousecounters = 1;
                    556:                        lastmx = point.x;
                    557:                        lastmy = point.y;
                    558:                        break;
                    559:                case B_EXITED_VIEW:
                    560:                        break;
                    561:                case B_INSIDE_VIEW:
                    562:                        lastmx = point.x;
                    563:                        lastmy = point.y;
                    564:                        break;
                    565:        }
                    566: }
                    567: 
                    568: 
                    569: /*
                    570:  *  LED
                    571:  */
                    572: 
                    573: LEDView::LEDView(BRect frame, rgb_color active, rgb_color idle) : BView(frame, "", B_FOLLOW_NONE, B_WILL_DRAW)
                    574: {
                    575:        active_color = active;
                    576:        idle_color = idle;
                    577:        state = false;
                    578:        SetViewColor(idle_color);
                    579:        SetHighColor(idle_color);
                    580:        bounds = Bounds();
                    581: }
                    582: 
                    583: void LEDView::Draw(BRect update)
                    584: {
                    585:        FillRect(bounds);
                    586: }
                    587: 
                    588: void LEDView::SetState(bool new_state)
                    589: {
                    590:        if (new_state != state) {
                    591:                state = new_state;
                    592:                Window()->Lock();
                    593:                if (state) {
                    594:                        SetViewColor(active_color);
                    595:                        SetHighColor(active_color);
                    596:                } else {
                    597:                        SetViewColor(idle_color);
                    598:                        SetHighColor(idle_color);
                    599:                }
                    600:                Draw(bounds);
                    601:                Window()->Unlock();
                    602:        }
                    603: }
                    604: 
                    605: 
                    606: /*
                    607:  *  Redraw a line
                    608:  */
                    609: 
                    610: void flush_line(int y)
                    611: {
                    612:        if (window_open) {
                    613:                bitmap_window->Lock();
                    614:                bitmap_view->Draw(BRect(0, y, currprefs.gfx_width-1, y));
                    615:                bitmap_window->Unlock();
                    616:        }
                    617: }
                    618: 
                    619: 
                    620: /*
                    621:  *  Redraw a block
                    622:  */
                    623: 
                    624: void flush_block(int ystart, int ystop)
                    625: {
                    626: }
                    627: 
                    628: 
                    629: /*
                    630:  *  Redraw the screen
                    631:  */
                    632: 
                    633: void flush_screen(int ystart, int ystop)
                    634: {
                    635:        if (window_open)
                    636:                bitmap_window->PostMessage(new BMessage(MSG_REDRAW));
                    637: }
                    638: 
                    639: 
                    640: /*
                    641:  *  Init graphics
                    642:  */
                    643: 
                    644: int graphics_setup(void)
                    645: {
                    646:        return 1;
                    647: }
                    648: 
                    649: int graphics_init(void)
                    650: {
                    651:        return the_app->GraphicsInit();
                    652: }
                    653: 
                    654: int UAE::GraphicsInit(void)
                    655: {
                    656:        if (currprefs.color_mode > 5)
                    657:                fprintf(stderr, "Bad color mode selected. Using default.\n"), currprefs.color_mode = 0;
                    658: 
                    659:        if (currprefs.gfx_width < 320)
                    660:                currprefs.gfx_width = 320;
                    661:        if (currprefs.gfx_height < 200)
                    662:                currprefs.gfx_height = 200;
                    663:        if (currprefs.gfx_height > 300 && ! currprefs.gfx_linedbl)
                    664:                currprefs.gfx_height = 300;
                    665:        if (currprefs.gfx_height > 600)
                    666:                currprefs.gfx_height = 600;
                    667: 
                    668:        gfxvidinfo.width = currprefs.gfx_width;
                    669:        gfxvidinfo.height = currprefs.gfx_height;
                    670:        gfxvidinfo.can_double = 1;
                    671: 
                    672:        // Allocate bitmap
                    673:        the_bitmap = new BBitmap(BRect(0, 0, currprefs.gfx_width-1, currprefs.gfx_height-1), B_COLOR_8_BIT);
                    674: 
                    675:        // Set up vidinfo
                    676:        gfxvidinfo.pixbytes = 1;
                    677:        gfxvidinfo.rowbytes = the_bitmap->BytesPerRow();
                    678:        gfxvidinfo.bufmem = (char *)the_bitmap->Bits();
                    679:        gfxvidinfo.linemem = NULL;
                    680:        gfxvidinfo.maxblocklines = 100; /* whatever... */
                    681: 
                    682:        // Open window
                    683:        main_window = new UAEWindow(BRect(0, 0, currprefs.gfx_width-1, currprefs.gfx_height-1), the_bitmap);
                    684: 
                    685:        // Initialize mouse and keyboard variables
                    686:        buttonstate[0] = buttonstate[1] = buttonstate[2] = 0;
                    687:        lastmx = lastmy = 0;
                    688:        newmousecounters = 0;
                    689: 
                    690:        return true;
                    691: }
                    692: 
                    693: 
                    694: /*
                    695:  * Exit graphics
                    696:  */
                    697: 
                    698: void graphics_leave(void)
                    699: {
                    700:        the_app->GraphicsLeave();
                    701: }
                    702: 
                    703: void UAE::GraphicsLeave(void)
                    704: {
                    705:        // Deallocate bitmap
                    706:        delete the_bitmap;
                    707: }
                    708: 
                    709: 
                    710: /*
                    711:  *  Poll mouse and keyboard
                    712:  */
                    713: 
                    714: void handle_events(void)
                    715: {
                    716:        key_info the_key_info;
                    717:        int be_code, be_byte, be_bit, amiga_code;
                    718:        BPoint mouse_point;
                    719:        uint32 mouse_buttons;
                    720: 
                    721:        if (reset_thyself) {
                    722:                uae_reset();
                    723:                reset_thyself = false;
                    724:        }
                    725: 
                    726:        // Redraw drive LEDs
                    727:        for (int i=0; i<4; i++)
                    728:                DriveLED[i]->SetState(LEDs[i]);
                    729: 
                    730:        if (window_open && bitmap_window->IsActive()) {
                    731: 
                    732:                get_key_info(&the_key_info);
                    733:                bitmap_window->Lock();
                    734:                bitmap_view->GetMouse(&mouse_point, &mouse_buttons, false);
                    735:                bitmap_window->Unlock();
                    736: 
                    737:                // Keyboard
                    738:                if (memcmp(the_key_info.key_states, old_key_info.key_states, sizeof(the_key_info.key_states))) {
                    739:                        for (be_code=0; be_code<0x80; be_code++) {
                    740:                                be_byte = be_code >> 3;
                    741:                                be_bit = 1 << (~be_code & 7);
                    742: 
                    743:                                // Key state changed?
                    744:                                if ((the_key_info.key_states[be_byte] & be_bit)
                    745:                                     != (old_key_info.key_states[be_byte] & be_bit)) {
                    746: 
                    747:                                        amiga_code = keycode2amiga[be_code];
                    748:                                        if (the_key_info.key_states[be_byte] & be_bit) {
                    749: 
                    750:                                                // Key pressed
                    751:                                                if (amiga_code == AK_mousestuff)
                    752:                                                        togglemouse();
                    753:                                                else
                    754:                                                        record_key(amiga_code << 1);
                    755:                                        } else {
                    756: 
                    757:                                                // Key released
                    758:                                                record_key((amiga_code << 1) | 1);
                    759:                                        }
                    760:                                }
                    761:                        }               
                    762:                        old_key_info = the_key_info;
                    763:                }
                    764: 
                    765:                // "Affengriff"
                    766:                if ((the_key_info.key_states[0x5c >> 3] & (1 << (~0x5c & 7)))
                    767:                 && (the_key_info.key_states[0x5d >> 3] & (1 << (~0x5d & 7)))
                    768:                 && (the_key_info.key_states[0x5f >> 3] & (1 << (~0x5f & 7))))
                    769:                        m68k_reset();
                    770: 
                    771:                // Scroll lock toggles inhibit_frame
                    772:                if (inhibit_frame != 2)
                    773:                        inhibit_frame = the_key_info.key_states[0x0f >> 3] & (1 << (~0x0f & 7));
                    774: 
                    775:                // Mouse buttons
                    776:                if (mouse_point.x >= 0 && mouse_point.y >= 0 && mouse_point.x < currprefs.gfx_width && mouse_point.y < currprefs.gfx_height) {
                    777:                        buttonstate[0] = mouse_buttons & B_PRIMARY_MOUSE_BUTTON;
                    778:                        buttonstate[1] = mouse_buttons & B_TERTIARY_MOUSE_BUTTON;
                    779:                        buttonstate[2] = mouse_buttons & B_SECONDARY_MOUSE_BUTTON;
                    780:                }
                    781:        }
                    782: }
                    783: 
                    784: 
                    785: /*
                    786:  *  Joystick routines
                    787:  */
                    788: 
                    789: extern "C" {
                    790: void init_joystick(void);
                    791: void close_joystick(void);
                    792: void read_joystick(int nr, unsigned int *dir, int *button);
                    793: };
                    794: 
                    795: int nr_joysticks;
                    796: 
                    797: void read_joystick(int nr, unsigned int *dir, int *button)
                    798: {
                    799:        static int joy_minx = 32767, joy_maxx = 0,
                    800:                           joy_miny = 32767, joy_maxy = 0;
                    801:        int left = 0, right = 0, top = 0, bot = 0;
                    802: 
                    803:        *dir = 0;
                    804:        *button = 0;
                    805: 
                    806:        if (nr >= nr_joysticks)
                    807:                return;
                    808: 
                    809:        if (joy->Update() != B_ERROR) {
                    810:                if (joy->horizontal > joy_maxx)
                    811:                        joy_maxx = joy->horizontal;
                    812:                if (joy->horizontal < joy_minx)
                    813:                        joy_minx = joy->horizontal;
                    814:                if (joy->vertical > joy_maxy)
                    815:                        joy_maxy = joy->vertical;
                    816:                if (joy->vertical < joy_miny)
                    817:                        joy_miny = joy->vertical;
                    818: 
                    819:                if (joy_maxx-joy_minx < 100 || joy_maxy-joy_miny < 100)
                    820:                        return;
                    821: 
                    822:                if (joy->horizontal < (joy_minx + (joy_maxx-joy_minx)/3))
                    823:                        right = 1;
                    824:                else if (joy->horizontal > (joy_minx + 2*(joy_maxx-joy_minx)/3))
                    825:                        left = 1;
                    826: 
                    827:                if (joy->vertical < (joy_miny + (joy_maxy-joy_miny)/3))
                    828:                        bot = 1;
                    829:                else if (joy->vertical > (joy_miny + 2*(joy_maxy-joy_miny)/3))
                    830:                        top = 1;
                    831: 
                    832:                if (left) top = !top;
                    833:                if (right) bot = !bot;
                    834:            *dir = bot | (right << 1) | (top << 8) | (left << 9);
                    835:            *button = !joy->button1;
                    836:        }
                    837: }
                    838: 
                    839: void init_joystick(void)
                    840: {
                    841:        joy = new BJoystick();
                    842:        joy->Open("joystick1");
                    843:        nr_joysticks = 1;
                    844: }
                    845: 
                    846: void close_joystick(void)
                    847: {
                    848:        joy->Close();
                    849:        delete joy;
                    850: }
                    851: 
                    852: 
                    853: /*
                    854:  *  Sound routines
                    855:  */
                    856: 
                    857: extern "C" {
                    858: extern int sound_available;
                    859: extern int smplcnt;
                    860: extern int init_sound(void);
                    861: extern int setup_sound(void);
                    862: extern void flush_sound_buffer(void);
                    863: extern void init_sound_table16(void);
                    864: extern void sample16_handler(void);
                    865: };
                    866: 
                    867: uae_u16 *sndbuffer;
                    868: uae_u16 *sndbufpt;
                    869: int sndbufsize;
                    870: 
                    871: static uint8 *buffers[2] = {NULL, NULL};
                    872: static int buf_num;
                    873: static BDACStream *the_stream;
                    874: static BSubscriber *the_sub;
                    875: static bool sound_ready = false;
                    876: static sem_id sound_sync_sem;
                    877: 
                    878: bool stream_func(void *arg, char *buf, size_t count, void *header);
                    879: 
                    880: int init_sound(void)
                    881: {
                    882:        sound_sync_sem = create_sem(0, "UAE Sound Sync Semaphore");
                    883:        the_stream = new BDACStream();
                    884:        the_sub = new BSubscriber("UAE DAC subscriber");
                    885: 
                    886:        if (!currprefs.produce_sound)
                    887:                return 0;
                    888:        sound_ready = the_sub->Subscribe(the_stream) == B_NO_ERROR;
                    889:        if (!sound_ready)
                    890:                return 0;
                    891: 
                    892:        sndbufsize = 44100 / 8 * 4;
                    893:        buffers[0] = new uint8[sndbufsize];
                    894:        buffers[1] = new uint8[sndbufsize];
                    895:        memset(buffers[0], 0, sndbufsize);
                    896:        memset(buffers[1], 0, sndbufsize);
                    897:        buf_num = 0;
                    898:        sndbufpt = sndbuffer = (uae_u16 *)buffers[buf_num];
                    899: 
                    900:        init_sound_table16();
                    901:        eventtab[ev_sample].handler = sample16_handler;
                    902:        sample_evtime = (long)maxhpos * maxvpos * 50 / 44100;
                    903: 
                    904:        sound_available = 1;
                    905:        the_stream->SetSamplingRate(44100);
                    906:        the_stream->SetStreamBuffers(sndbufsize, 4);
                    907:        the_sub->EnterStream(NULL, true, NULL, stream_func, NULL, true);
                    908:        return 1;
                    909: }
                    910: 
                    911: int setup_sound(void)
                    912: {
                    913:        sound_available = 1;
                    914:        return 1;
                    915: }
                    916: 
                    917: void close_sound(void)
                    918: {
                    919:        if (sound_ready) {
                    920:                the_sub->ExitStream(true);
                    921:                the_stream->SetStreamBuffers(4096, 8);
                    922:                the_sub->Unsubscribe();
                    923:                sound_ready = false;
                    924:        }
                    925:        delete the_sub;
                    926:        delete the_stream;
                    927: 
                    928:        delete_sem(sound_sync_sem);
                    929: 
                    930:        delete buffers[0];
                    931:        delete buffers[1];
                    932: }
                    933: 
                    934: void flush_sound_buffer(void)
                    935: {
                    936:        if (sound_ready) {
                    937:                long l;
                    938:                get_sem_count(sound_sync_sem, &l);
                    939:                if (l > 0)
                    940:                        acquire_sem_etc(sound_sync_sem, l+1, 0, 0);
                    941:                else
                    942:                        acquire_sem(sound_sync_sem);
                    943:        }
                    944: 
                    945:        sndbufpt = sndbuffer = (uae_u16 *)buffers[buf_num];
                    946:        buf_num ^= 1;
                    947: }
                    948: 
                    949: bool stream_func(void *arg, char *buf, size_t count, void *header)
                    950: {
                    951:        memcpy(buf, buffers[buf_num], count);
                    952:        release_sem(sound_sync_sem);
                    953:        return true;
                    954: }
                    955: 
                    956: 
                    957: /*
                    958:  *  Misc routines
                    959:  */
                    960: 
                    961: int debuggable(void)
                    962: {
                    963:     return true;
                    964: }
                    965: 
                    966: int needmousehack(void)
                    967: {
                    968:     return true;
                    969: }
                    970: 
                    971: void LED(int on)
                    972: {
                    973:        PowerLED->SetState(!on);
                    974: }
                    975: 
                    976: void setup_brkhandler(void)
                    977: {
                    978: }
                    979: 
                    980: void gui_changesettings(void)
                    981: {
                    982: }
                    983: 
                    984: void gui_led(int led, int on)
                    985: {
                    986:        if (led > 0 && led < 5)
                    987:                LEDs[led-1] = on;
                    988: }
                    989: 
                    990: int gui_init(void)
                    991: {
                    992:        LEDs[0] = LEDs[1] = LEDs[2] = LEDs[3] = false;
                    993:        quit_program = 0;
                    994:        return 0;
                    995: }
                    996: 
                    997: void gui_exit(void)
                    998: {
                    999: }
                   1000: 
                   1001: int gui_update(void)
                   1002: {
                   1003:        return 0;
                   1004: }
                   1005: 
                   1006: void gui_filename(int num, const char *name)
                   1007: {
                   1008: }
                   1009: 
                   1010: static void getline(char *p)
                   1011: {
                   1012: }
                   1013: 
                   1014: void gui_handle_events(void)
                   1015: {
                   1016: }
                   1017: 
                   1018: void write_log (const char *buf)
                   1019: {
                   1020:     fprintf (stderr, buf);
                   1021: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.