|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.