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