Annotation of uae/src/bebox.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 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: }

unix.superglobalmegacorp.com

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