Annotation of uae/src/uaelib.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * UAE - The U*nix Amiga Emulator
                      3:  * 
                      4:  * UAE Library v0.1
                      5:  * 
                      6:  * (c) 1996 Tauno Taipaleenmaki <[email protected]>
                      7:  *
                      8:  * Change UAE parameters and other stuff from inside the emulation. Creates
                      9:  * a library called "uae.library" before the boot-up. To check if emulation
                     10:  * is running we simply try to open the library. 
                     11:  * 
                     12:  * NOTE: The VERY FIRST attempt to open the library will actually create
                     13:  *       it, so you should always try to open it twice.
                     14:  * 
                     15:  * Functions:            Offset  Purpose                      Arguments
                     16:  * ----------
                     17:  * D0 = GetVersion()      -0x1E Returns UAE version               -
                     18:  * D0 = GetUaeConfig(A0)  -0x24 Get UAE Configuration       Pointer to memory
                     19:  *                                                          block with the size
                     20:  *                                                          of sizeof(UaeCfg)
                     21:  *!D0 = SetUaeConfig(A0)  -0x2A Sets UAE Configuration      Pointer to struct
                     22:  *                                                          UAE_CONFIG
                     23:  *!D0 = HardReset()       -0x30 Resets the Amiga                  - 
                     24:  *!D0 = Reset()           -0x36  -- "" --                         -
                     25:  * D0 = EjectDisk(D0)     -0x3C Ejects a disk               D0 = Drive Number
                     26:  * D0 = InsertDisk(A0,D0) -0x42 Inserts a disk              D0 = drive number,
                     27:  *                                                          A0 = ptr to name
                     28:  * D0 = EnableSound()     -0x48 Enables SOUND (if it was          -
                     29:  *                              compiled in)      
                     30:  * D0 = DisableSound()    -0x4E Disables SOUND                    -
                     31:  * D0 = EnableJoystick()  -0x54 Enables FAKE_JOYSTICK             -
                     32:  * D0 = DisableJoystick() -0x5A Disables FAKE_JOYSTICK            -
                     33:  * D0 = SetFrameRate(D0)  -0x60 Changes frame rate          D0 = Framerate
                     34:  *!D0 = ChgCMemSize(D0)   -0x66 Changes ChipMemSize         D0 = New Mem Size
                     35:  *                              (DOES A HARD RESET!)
                     36:  *!D0 = ChgSMemSize(D0)   -0x6C Changes SlowMemSize         D0 = New Mem Size
                     37:  *                              (DOES A HARD RESET!)
                     38:  *!D0 = ChgFMemSize(D0)   -0x72 Changes FastmemSize         D0 = New Mem Size
                     39:  *                              (DOES A HARD RESET!)
                     40:  * D0 = ChangeLanguage(D0)-0x78 Changes kbd lang.           D0 = Language 
                     41:  * D0 = ExitEmu()         -0x7E Exits the emulator                -
                     42:  * D0 = GetDisk(D0,A0)    -0x84 Gets the disks name         D0 = Drive
                     43:  *                                                          A0 = Space for name
                     44:  * D0 = Debug()           -0x8A Enters internal debugger          -
                     45:  * ! means not implemented yet 
                     46:  */
                     47: 
                     48: #include "sysconfig.h"
                     49: #include "sysdeps.h"
                     50: 
                     51: #include <assert.h>
                     52: #include <string.h>
                     53: 
                     54: #include "config.h"
                     55: #include "options.h"
                     56: #include "memory.h"
                     57: #include "custom.h"
                     58: #include "newcpu.h"
                     59: #include "xwin.h"
                     60: #include "autoconf.h"
                     61: #include "disk.h"
                     62: #include "os.h"
                     63: 
                     64: extern int quit_program;
                     65: 
                     66: static ULONG LibBase;
                     67: 
                     68: static ULONG opencount=0;
                     69: static ULONG emulibname, functable,resname,resid, datatable;
                     70: static CPTR GetVersion,HardReset,Reset,EnableSound,DisableSound,
                     71:             EnableJoystick,DisableJoystick,SetFrameRate,ChangeLanguage,
                     72:             ChgCMemSize,ChgSMemSize,ChgFMemSize,EjectDisk,InsertDisk,
                     73:             ExitEmu, GetUaeConfig, SetUaeConfig,Open,Close,Expunge,Null,
                     74:             GetDisk,FakeInit,segList,DebugFunc;
                     75: 
                     76: /*
                     77:  * Library "open"
                     78:  */
                     79: static ULONG emulib_Open(void)
                     80: {
                     81:        opencount++;
                     82:        put_word( LibBase + 32, get_word( LibBase + 32) + 1 );
                     83:        return LibBase;
                     84: }
                     85: 
                     86: static ULONG emulib_Close(void)
                     87: {
                     88:        if (opencount <= 1)
                     89:         return 0;
                     90:        else {
                     91:              opencount--;
                     92:              put_word( LibBase + 32, get_word( LibBase + 32) - 1 );
                     93:              return 0;
                     94:        }
                     95: }
                     96: static ULONG emulib_Expunge(void)
                     97: {
                     98:        return 0;
                     99: }
                    100: 
                    101: static ULONG emulib_Null(void)
                    102: {
                    103:        return 0;
                    104: }
                    105: 
                    106: /*
                    107:  * Returns UAE Version
                    108:  */
                    109: static ULONG emulib_GetVersion(void)
                    110: {
                    111:        return version;
                    112: }
                    113: 
                    114: /*
                    115:  * Resets your amiga
                    116:  * 
                    117:  * DOES NOT WORK YET ! It obviously crashes when this routine returns().. ?
                    118:  */
                    119: static ULONG emulib_HardReset(void)
                    120: {
                    121:        m68k_reset();
                    122:        return 0;
                    123: }
                    124: 
                    125: static ULONG emulib_Reset(void)
                    126: {
                    127:        m68k_reset();
                    128:        return 0;
                    129: }
                    130: 
                    131: /*
                    132:  * Enables SOUND
                    133:  */
                    134: static ULONG emulib_EnableSound(void)
                    135: {
                    136:     if (!sound_available || produce_sound == 2)
                    137:        return 0;
                    138: 
                    139:     produce_sound = 2;
                    140:     return 1;
                    141: }
                    142: 
                    143: /*
                    144:  * Disables SOUND
                    145:  */
                    146: static ULONG emulib_DisableSound(void)
                    147: {
                    148:     produce_sound = 1;
                    149:     return 1;
                    150: }
                    151: 
                    152: /*
                    153:  * Enables FAKE JOYSTICK
                    154:  */
                    155: static ULONG emulib_EnableJoystick(void)
                    156: {
                    157:     fake_joystick = 1;
                    158:     return 1;
                    159: }
                    160: 
                    161: /*
                    162:  * Disables FAKE JOYSTICK
                    163:  */
                    164: static ULONG emulib_DisableJoystick(void)
                    165: {
                    166:        fake_joystick = 0;
                    167:        return 1;
                    168: }
                    169: 
                    170: /*
                    171:  * Sets the framerate
                    172:  */
                    173: static ULONG emulib_SetFrameRate(void)
                    174: {
                    175:     if (regs.d[0] == 0)
                    176:        return 0;
                    177:     else if (regs.d[0] > 20)
                    178:        return 0;
                    179:     else {
                    180:        framerate = regs.d[0];
                    181:        return 1;
                    182:     }
                    183: }
                    184: 
                    185: /*
                    186:  * Changes keyboard language settings
                    187:  */
                    188: static ULONG emulib_ChangeLanguage(void)
                    189: {
                    190:     if (regs.d[0] > 5)
                    191:        return 0;
                    192:     else {
                    193:        switch( regs.d[0] ) {
                    194:         case 0:
                    195:            keyboard_lang = KBD_LANG_US;
                    196:            break;
                    197:         case 1:
                    198:            keyboard_lang = KBD_LANG_DE;
                    199:            break;
                    200:         case 2:
                    201:            keyboard_lang = KBD_LANG_SE;
                    202:            break;
                    203:         case 3:
                    204:            keyboard_lang = KBD_LANG_FR;
                    205:            break;
                    206:         case 4:
                    207:            keyboard_lang = KBD_LANG_IT;
                    208:            break;
                    209:         default:
                    210:            break;
                    211:        }
                    212:        return 1;
                    213:     }
                    214: }
                    215: 
                    216: /*
                    217:  * Changes CHIPMEMORY Size
                    218:  *  (reboots)
                    219:  * 
                    220:  * DOES NOT WORK YET !  - The m68k_reset does not work from here
                    221:  */
                    222: static ULONG emulib_ChgCMemSize(void)
                    223: {
                    224:     ULONG memsize = regs.d[0];
                    225:        
                    226:     if (memsize != 0x80000 && memsize != 0x100000 && 
                    227:        memsize != 0x200000) {
                    228:        memsize = 0x200000;
                    229:        fprintf(stderr, "Unsupported chipmem size!\n");
                    230:     }
                    231:     regs.d[0] = 0;
                    232:     
                    233:     chipmem_size = memsize;
                    234:     m68k_reset();
                    235:     return 1;
                    236: }
                    237: 
                    238: /*
                    239:  * Changes SLOWMEMORY Size
                    240:  *  (reboots)
                    241:  * 
                    242:  * DOES NOT WORK YET! - the m68k_reset does not work from here
                    243:  */
                    244: static ULONG emulib_ChgSMemSize(void)
                    245: {
                    246:        ULONG memsize = regs.d[0];
                    247:        
                    248:        if (memsize != 0x80000 && memsize != 0x100000 &&
                    249:           memsize != 0x180000 && memsize != 0x1C0000) {
                    250:              memsize = 0;
                    251:              fprintf(stderr, "Unsupported bogomem size!\n");
                    252:        }
                    253:        
                    254:        regs.d[0] = 0;
                    255:        bogomem_size = memsize;
                    256:        m68k_reset();
                    257:        return 1;
                    258: }
                    259: 
                    260: /* 
                    261:  * Changes FASTMEMORY Size
                    262:  *  (reboots)
                    263:  * 
                    264:  * DOES NOT WORK YET! - the m68k_reset() does not work from here
                    265:  */
                    266: static ULONG emulib_ChgFMemSize(void)
                    267: {
                    268:        ULONG memsize = regs.d[0];
                    269:        
                    270:        if (memsize != 0x100000 && memsize != 0x200000 &&
                    271:           memsize != 0x400000 && memsize != 0x800000) {
                    272:              memsize = 0;
                    273:              fprintf(stderr, "Unsupported fastmem size!\n");
                    274:        }
                    275:        regs.d[0] = 0;
                    276:        fastmem_size = memsize;
                    277:        m68k_reset();
                    278:        return 0;
                    279: }
                    280: 
                    281: /*
                    282:  * Ejects a disk
                    283:  */
                    284: static ULONG emulib_EjectDisk(void)
                    285: {
                    286:     ULONG drive = regs.d[0];
                    287:        
                    288:     if (drive > 3)
                    289:        return 0;
                    290:     
                    291:     disk_eject( drive );
                    292:     return 1;
                    293: }
                    294: 
                    295: /*
                    296:  * Inserts a disk
                    297:  */
                    298: static ULONG emulib_InsertDisk(void)
                    299: {
                    300:     int    quit = 0,i=0,j;
                    301:     char   real_name[256];
                    302:     UBYTE  abyte;
                    303:     ULONG drive = regs.d[0];
                    304:     CPTR  name = regs.a[0];
                    305:     FILE   *file;
                    306:        
                    307:     if (drive > 3)
                    308:        return 0;
                    309: 
                    310:     if  (!disk_empty( drive )) {
                    311:        disk_eject( drive );
                    312:     }
                    313:        
                    314:     while( quit == 0 ) {
                    315:        abyte = get_byte(name + i);
                    316:        if (abyte == '\0') {
                    317:            real_name[i++] = '\0';
                    318:            quit = 1;
                    319:        } else {
                    320:            real_name[i++] = abyte;
                    321:        }
                    322:     }
                    323:     j = strlen( real_name );
                    324:     if (j <= 0 || j > 255)
                    325:        return 0;
                    326: 
                    327:     if (!(file = fopen(real_name, "r")))
                    328:        return 0;
                    329: 
                    330:     fclose(file);
                    331:     disk_insert(drive, real_name);
                    332:     return 1;
                    333: 
                    334: }
                    335: 
                    336: /*
                    337:  * Exits the emulator
                    338:  */
                    339: static ULONG emulib_ExitEmu(void)
                    340: {
                    341:        broken_in = 1;
                    342:        regs.spcflags |= SPCFLAG_BRK;
                    343:        quit_program = 1;
                    344:        return 1;
                    345: }
                    346: 
                    347: /*
                    348:  * Gets UAE Configuration
                    349:  */
                    350: static ULONG emulib_GetUaeConfig(void)
                    351: {
                    352:        int i,j;
                    353:        CPTR place = regs.a[0];
                    354: 
                    355:        put_long(place     , version);
                    356:        put_long(place +  4, chipmem_size);
                    357:        put_long(place +  8, bogomem_size);
                    358:        put_long(place + 12, fastmem_size);
                    359:        put_long(place + 16, framerate);
                    360:        put_long(place + 20, produce_sound);
                    361:        put_long(place + 24, fake_joystick);
                    362:        put_long(place + 28, keyboard_lang);
                    363:        if (disk_empty(0))
                    364:         put_byte(place + 32, 0);
                    365:        else
                    366:         put_byte(place + 32, 1);
                    367:        if (disk_empty(1))
                    368:         put_byte(place + 33, 0);
                    369:        else
                    370:         put_byte(place + 33, 1);
                    371:        if (disk_empty(2))
                    372:         put_byte(place + 34, 0);
                    373:        else
                    374:         put_byte(place + 34, 1);
                    375:        if (disk_empty(3))
                    376:         put_byte(place + 35, 0);
                    377:        else
                    378:         put_byte(place + 35, 1);
                    379:        
                    380:        for(i=0;i<256;i++) {
                    381:              put_byte((place + 36 + i), df0[i]);
                    382:              put_byte((place + 36 + i + 256), df1[i]);
                    383:              put_byte((place + 36 + i + 512), df2[i]);
                    384:              put_byte((place + 36 + i + 768), df3[i]);
                    385:        }
                    386:        return 1;
                    387: }
                    388: 
                    389: /*
                    390:  * Sets UAE Configuration
                    391:  * 
                    392:  * NOT IMPLEMENTED YET
                    393:  */
                    394: static ULONG emulib_SetUaeConfig(void)
                    395: {
                    396:        return 1;
                    397: }
                    398: 
                    399: /*
                    400:  * Gets the name of the disk in the given drive
                    401:  */
                    402: static ULONG emulib_GetDisk(void)
                    403: {
                    404:     int i;
                    405:     if (regs.d[0] > 3) 
                    406:        return 0;
                    407: 
                    408:     switch( regs.d[0] ) {
                    409:      case 0:
                    410:        for(i=0;i<256;i++) {
                    411:            put_byte( regs.a[0] + i, df0[i] );
                    412:        }
                    413:        break;
                    414:      case 1:
                    415:        for(i=0;i<256;i++) {
                    416:            put_byte( regs.a[0] + i, df1[i] );
                    417:        }
                    418:        break;
                    419:      case 2:
                    420:        for(i=0;i<256;i++) {
                    421:            put_byte( regs.a[0] + i, df2[i] );
                    422:        }
                    423:        break;
                    424:      case 3:
                    425:        for(i=0;i<256;i++) {
                    426:            put_byte( regs.a[0] + i, df3[i] );
                    427:        }
                    428:        break;
                    429:      default:
                    430:        break;
                    431:     }
                    432:     return 1;
                    433: }
                    434: 
                    435: /*
                    436:  * Enter debugging state
                    437:  */
                    438: static ULONG emulib_Debug(void)
                    439: {
                    440:     broken_in = 1;
                    441:     regs.spcflags |= SPCFLAG_BRK;
                    442:     return 1;
                    443: }
                    444: 
                    445: static ULONG emulib_FakeInit(void)
                    446: {
                    447:     segList = regs.a[0];
                    448:     return regs.d[0];
                    449: }
                    450: 
                    451: /*
                    452:  * Creates the UAE.library in memory
                    453:  */
                    454: static ULONG emulib_Init(void)
                    455: {
                    456:     ULONG tmp1, quit,i;
                    457:     UBYTE bitti;
                    458:     ULONG dosbase;
                    459: 
                    460:     if (LibBase != 0)
                    461:        return 0;
                    462:        
                    463:     regs.a[0] = functable;
                    464:     regs.a[1] = datatable;
                    465:     regs.a[2] = FakeInit;
                    466:     regs.d[0] = 1024;
                    467:     regs.d[1] = 0;
                    468:     tmp1 = CallLib(regs.a[6], -0x54);
                    469:     if (tmp1 == 0) {
                    470:        fprintf(stderr, "Cannot create UAE.library! ");
                    471:        return 0;
                    472:     }
                    473:     regs.a[1] = tmp1;
                    474:     CallLib(regs.a[6], -0x18c);
                    475:     LibBase = tmp1;
                    476: #if 0
                    477:     regs.a[1] = ds("dos.library");
                    478:     regs.d[0] = 0;
                    479:     dosbase = CallLib(regs.a[6], -552);
                    480:     printf("%08lx\n", dosbase);
                    481: #endif
                    482:     regs.d[0] = 1;
                    483:     return 0;
                    484: }
                    485: 
                    486: 
                    487: /*
                    488:  * Installs the UAE LIBRARY
                    489:  */
                    490: void emulib_install(void)
                    491: {
                    492:     ULONG begin, end, inittable, initroutine;
                    493:     ULONG jotain, func_place, data_place, init_place;
                    494:        
                    495:     resname = ds("uae.library");
                    496:     resid = ds("UAE library 0.1");
                    497:        
                    498:     begin = here();
                    499:     dw(0x4AFC);
                    500:     dl(begin);
                    501:     dl(0);
                    502:     dw(0x8001);
                    503:     dw(0x0988);
                    504:     dl(resname);
                    505:     dl(resid);
                    506:     dl(here() + 4);
                    507: 
                    508:     dl(1024);
                    509:     func_place = here();
                    510:     dl(0);
                    511:     data_place = here();
                    512:     dl(0);
                    513:     init_place = here();
                    514:     dl(0);
                    515:  
                    516: /* Code to set up our library */
                    517: 
                    518:     initroutine = here();
                    519:     calltrap(deftrap(emulib_Init));
                    520:     dw(RTS);
                    521:        
                    522:     /* Function table */
                    523:     Open = here();
                    524:     calltrap(deftrap(emulib_Open));
                    525:     dw(RTS);
                    526:        
                    527:     Close = here();
                    528:     calltrap(deftrap(emulib_Close));
                    529:     dw(RTS);
                    530:        
                    531:     Expunge = here();
                    532:     calltrap(deftrap(emulib_Expunge));
                    533:     dw(RTS);
                    534:        
                    535:     Null = here();
                    536:     dw(0x203c); dl(1);
                    537:     dw(RTS);
                    538: 
                    539:     GetVersion = here();
                    540:     calltrap(deftrap(emulib_GetVersion));
                    541:     dw(RTS);
                    542:        
                    543:     GetUaeConfig = here();
                    544:     calltrap(deftrap(emulib_GetUaeConfig));
                    545:     dw(RTS);
                    546:        
                    547:     SetUaeConfig = here();
                    548:     calltrap(deftrap(emulib_SetUaeConfig));
                    549:     dw(RTS);
                    550: 
                    551:     HardReset = here();
                    552:     calltrap(deftrap(emulib_HardReset));
                    553:     dw(RTS);
                    554:        
                    555:     Reset = here();
                    556:     calltrap(deftrap(emulib_Reset));
                    557:     dw(RTS);
                    558:        
                    559:     EjectDisk = here();
                    560:     calltrap(deftrap(emulib_EjectDisk));
                    561:     dw(RTS);
                    562:        
                    563:     InsertDisk = here();
                    564:     calltrap(deftrap(emulib_InsertDisk));
                    565:     dw(RTS);
                    566:        
                    567:     EnableSound = here();
                    568:     calltrap(deftrap(emulib_EnableSound));
                    569:     dw(RTS);
                    570:        
                    571:     DisableSound = here();
                    572:     calltrap(deftrap(emulib_DisableSound));
                    573:     dw(RTS);
                    574:        
                    575:     EnableJoystick = here();
                    576:     calltrap(deftrap(emulib_EnableJoystick));
                    577:     dw(RTS);
                    578: 
                    579:     DisableJoystick = here();
                    580:     calltrap(deftrap(emulib_DisableJoystick));
                    581:     dw(RTS);
                    582:        
                    583:     SetFrameRate = here();
                    584:     calltrap(deftrap(emulib_SetFrameRate));
                    585:     dw(RTS);
                    586:        
                    587:     ChgCMemSize = here();
                    588:     calltrap(deftrap(emulib_ChgCMemSize));
                    589:     dw(RTS);
                    590:        
                    591:     ChgSMemSize = here();
                    592:     calltrap(deftrap(emulib_ChgSMemSize));
                    593:     dw(RTS);
                    594:        
                    595:     ChgFMemSize = here();
                    596:     calltrap(deftrap(emulib_ChgFMemSize));
                    597:     dw(RTS);
                    598:        
                    599:     ChangeLanguage = here();
                    600:     calltrap(deftrap(emulib_ChangeLanguage));
                    601:     dw(RTS);
                    602: 
                    603:     ExitEmu = here();
                    604:     calltrap(deftrap(emulib_ExitEmu));
                    605:     dw(RTS);
                    606: 
                    607:     GetDisk = here();
                    608:     calltrap(deftrap(emulib_GetDisk));
                    609:     dw(RTS);
                    610: 
                    611:     DebugFunc = here();
                    612:     calltrap(deftrap(emulib_Debug));
                    613:     dw(RTS);
                    614:        
                    615:     FakeInit = here();
                    616:     calltrap(deftrap(emulib_FakeInit));
                    617:     dw(RTS);
                    618:        
                    619:     functable = here();
                    620:     dl(Open);
                    621:     dl(Close);
                    622:     dl(Expunge);
                    623:     dl(Null);
                    624:     dl(GetVersion);
                    625:     dl(GetUaeConfig);
                    626:     dl(SetUaeConfig);
                    627:     dl(HardReset);
                    628:     dl(Reset);
                    629:     dl(EjectDisk);
                    630:     dl(InsertDisk);
                    631:     dl(EnableSound);
                    632:     dl(DisableSound);
                    633:     dl(EnableJoystick);
                    634:     dl(DisableJoystick);
                    635:     dl(SetFrameRate);
                    636:     dl(ChgCMemSize);
                    637:     dl(ChgSMemSize);
                    638:     dl(ChgFMemSize);
                    639:     dl(ChangeLanguage);
                    640:     dl(ExitEmu);
                    641:     dl(GetDisk);
                    642:     dl(DebugFunc);
                    643:     dl(0xFFFFFFFF);
                    644: 
                    645:     datatable = here();
                    646:     dw(0xE000);
                    647:     dw(0x0008);
                    648:     dw(0x0900);
                    649:     dw(0xC000);
                    650:     dw(0x000A);
                    651:     dl(resname);
                    652:     dw(0xE000);
                    653:     dw(0x000E);
                    654:     dw(0x0600);
                    655:     dw(0xD000);
                    656:     dw(0x0014);
                    657:     dw(0x0001);
                    658:     dw(0xD000);
                    659:     dw(0x0000);
                    660:     dw(0x0000);
                    661:     dw(0xC000);
                    662:     dw(0x0018);
                    663:     dl(resid);
                    664:     dl(0x00000000);
                    665:     
                    666:     end = here();
                    667: 
                    668:     org(begin + 6);           /* Load END value */
                    669:     dl(end);
                    670: 
                    671:     org(data_place);
                    672:     dl(datatable);
                    673:        
                    674:     org(func_place);
                    675:     dl(functable);
                    676: 
                    677:     org(init_place);
                    678:     dl(initroutine);
                    679:        
                    680:     org(end);
                    681: }

unix.superglobalmegacorp.com

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