|
|
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.