home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / uaexfr86.zip / README.PROGRAMMERS < prev    next >
Text File  |  1996-06-12  |  9KB  |  156 lines

  1. You can help to make this program better. If you fix bugs or implement new
  2. features, I'd be grateful if you send me patches. For a list of interesting
  3. projects, and for a brief summary on how UAE works, see below.
  4.  
  5. A few guidelines for anyone who wants to help:
  6. - Please contact me first before you implement major new features. Someone 
  7.   else might be doing the same thing already. This has already happened :-(
  8.   Even if no one else is working on this feature, there might be alternative
  9.   and better/easier/more elegant ways to do it.
  10. - Some coding guidelines.
  11.   * Avoid GNU C extensions by all means. They make your code non-portable.
  12.   * Avoid GNU indentation style by all means. It makes your code unreadable.
  13.   * Try to indent your code nicely. There are editors like JED, which is
  14.     available from space.mit.edu:/pub/davis and highly recommendable, that do
  15.     this for you automatically.
  16.   * Use eight space tabs, four space tabs make a mess of the code.
  17. - If you have access to more than one Unix system, try compiling/running your
  18.   code on all of these. Remember, UAE is supposed to run on the DEC Alpha: so
  19.   don't assume sizeof(char*) == sizeof(int) == sizeof(long)
  20. - If you have more than one Kickstart, try your code with each one.
  21. - Patches are welcome in any form, but diff -u or diff -c output is preferred.
  22.   If I get whole source files, the first thing I do is to run diff on it. You 
  23.   can save me some work here (and make my mailbox smaller).
  24.  
  25. Some possible projects, in order of estimated difficulty:
  26. - Someone with a 68000 data sheet might check whether all opcodes are
  27.   decoded correctly and whether all instructions really do what they are 
  28.   supposed to do (I'm pretty sure it's OK by now, but you never know...).
  29. - Modify UAE to run in two threads for systems that have more than one CPU.
  30.   I've thought of a way how to do it, but I don't have a multiprocessor board
  31.   to try this. Here's how it works: Start with smart update method #1. This
  32.   method nicely bundles all the data necessary for drawing a scanline into two
  33.   structures: linedescr and line_data. Instead of actually drawing the line
  34.   in the main task, signal the second one to use that information. Synchronize
  35.   the two at the end of a frame to avoid lossage.
  36.   If I haven't overlooked a big problem, it should be trivial.
  37.   Sound output could also be moved into a separate task, but the gain will be
  38.   much smaller.
  39. - Implement all 68020 instructions/addressing modes. 
  40. - Improve the Kickstart replacement to boot more demos.
  41. - Write an Amiga program that communicates with UAE and provides a user-
  42.   interface similar to the X Windows one, but from within the emulation.
  43. - Calculating the flags after each instruction is time consuming and usually
  44.   completely unnecessary. Modify gencpu to generate instructions that don't
  45.   set the flags, and have some code in the central loop to decide which
  46.   set of instructions to use. This means additional overhead, of course,
  47.   which might eat any improvements. [Tried it, hardly a difference, but 
  48.   maybe I did it in a stupid way]
  49. - Translate Kickstart ROM (or any software) to C code with a slightly
  50.   modified gencpu, and link it to the rest of the emulator. Definitely 
  51.   possible, maybe illegal. Better don't do that for now.
  52. - Make a modified gencpu that can generate x86 assembly instead of C. This
  53.   might give a nice speedup. However, the CPU emulation already is the
  54.   fastest part in UAE - screen updates are much more time consuming.
  55.   [Partly done, some __asm__ magic for flag calculations. Bad for performance
  56.   are all the unnecessary register push/pops that the compiler generates.]
  57. - Improve sound emulation (Find bugs).
  58. - Snapshots as in CPE. Will need to collect all the variables containing
  59.   important information. Fairly easy, but boring. (Use core dumps instead :-)
  60. - Find out why uae.device doesn't work with Kick 1.3. Not really important,
  61.   no one in his right mind uses it anyway now there is the unixfs.device
  62. - Make unixfs.device bootable.
  63. - The playfield hardware is the only important part of the Amiga that is 
  64.   not really well documented in the HRM. Write some test programs that
  65.   do all sorts of weird things with the copper (like turning off bitplane 
  66.   DMA during a line, and turning it directly on again: VERY interesting
  67.   result) and try to emulate this perfectly.
  68. - Figure out a diskfile format that supports every possible non-standard
  69.   format.
  70. - Translate basic blocks of m68k instructions to intermediate code that is 
  71.   interpreted instead of the actual code. Optimize it of course.
  72.   (Not sure whether it would really be faster. But ARDI's Executor does
  73.   a splendid job on translation. This should really help even if the target
  74.   code isn't native).
  75. - Implement 68551 MMU. I have docs now. Not among the most necessary things.
  76. - Implement 68882 FPU. Not among the most necessary items, either. (Some docs)
  77. - Implement AGA support. Maybe some easy parts can be tried first (like 8
  78.   bitplane support). I have sufficient documentation by now.
  79. - Reimplement Amiga OS. (Well-behaved) Amiga programs could then be made
  80.   to use the X Window System as a "public screen". Of course, not all the
  81.   OS would have to be re-done, only Intuition/GFX. [Started, look at gfxlib.c]
  82. - Translate instructions on the fly to native code, like Executor does.
  83.   I'll NEVER try that one myself.
  84. - Find some extremely clever ways to optimize the smart update methods. Maybe
  85.   try to support scrolling. Maybe find a way to update only parts of a line
  86.   (similar to LOW_BANDWIDTH). All such methods would probably be terribly
  87.   complicated, and not easy to get right without sacrificing compatibility.
  88.   Maybe it's not such a good idea.
  89. - Port it to Java
  90. - A formal proof of correctness would be nice.
  91.  
  92. Things I don't really want to do:
  93. - Full ECS support, with braindamage like Productivity and SuperHires.
  94.  
  95. How it works
  96.  
  97. Let's start with the memory emulation. All addressable memory is split into
  98. banks of 64K each. Each bank can define custom routines accessing bytes, 
  99. words, and longwords. All banks that really represent physical memory just 
  100. define these routines to write/read the specified amount of data to a chunk 
  101. of memory. This memory area is organized as an array of WORDs, which means 
  102. that those parts of the emulator that want to access memory in a linear 
  103. fashion can get a (WORD *) pointer and use it to circumvent the overhead of
  104. the put_word() and get_word() calls. That is done, for example, in the
  105. pfield_doline() function which handles screen refreshes.
  106. Memory banks that represent hardware registers (such as the custom chip bank
  107. at 0xDF0000) can trap reads/writes and take any necessary actions.
  108. In some places, this scheme is abused: The uae.device and unixfs.device are
  109. stored in a segment at 0xF00000 containing a ROMtag structure, so it is
  110. recognized at bootup. Since this is a ROM area, writes shouldn't occur
  111. normally and are therefore used to trap into emulation routines for these
  112. devices.
  113.  
  114. To provide a good emulation of graphical effects, only one thing is vital:
  115. Copper and playfield emulation have to be kept absolutely synchronous. If the
  116. copper writes to (say) a color register in a specific cycle, the playfield 
  117. hardware needs to use the new information in the next word of data it 
  118. processes.
  119. UAE 0.1 used to call routines like do_pfield() and do_copper() each time the
  120. CPU emulator had finished an instruction. That was one of the reasons why it
  121. was so slow. Recent versions try to draw complete scanlines in one piece. This
  122. is possible if the copper does not write to any registers affecting the
  123. display during that scanline. Therefore, drawing the line is deferred until
  124. the last cycle of the line. If the copper writes to a hardware register before
  125. that, the function pfield_may_need_update() is called and this one determines
  126. whether it should fall back to the cycle-for-cycle approach. This is very
  127. rarely needed, mainly for copper-plasma effects and such, and the general case
  128. is much faster.
  129.  
  130. The CPU emulator no longer has to call all sorts of functions after each
  131. instruction. Instead, it keeps a list of events that are scheduled (timer
  132. interrupts, hsync and vsync events) and their "arrival time". Only the time
  133. for the next event is checked after each CPU instruction. If it's higher than
  134. the current cycle counter, the CPU can continue to execute.
  135.  
  136.  
  137. Portability
  138.  
  139. The main thing you need to worry about when porting UAE to a new platform is
  140. the OS dependent source file handling all the graphics output. Currently,
  141. there are xwin.c, svga.c, mac.c, dos-grx.c, dos-null.c, bebox.cpp and
  142. NeXTwin.m. Rewriting one of these to use the features of your operating
  143. system should be fairly easy.
  144. You might need to worry a little about datatypes. UAE requires that your C
  145. compiler supports 8 bit, 16 bit and 32 bit integers, otherwise a MC68000
  146. emulation would be not very easy to get right. Some typedefs to hide the
  147. actual types used can be found in amiga.h. The CPU emulation is not the only
  148. place that makes some potentially non-portable assumptions: The graphics
  149. code in custom.c, mainly the pfield_doline() function and its friends, may
  150. need some work if you have a really weird architecture.
  151. The only thing that's left are some Unixoid assumptions, mainly in
  152. filesys.c, but also in debug.c. Put in a few #ifdefs and modify the Makefile
  153. if necessary/possible, or make up a dummy unixfs-null.c file that contains 
  154. stubs.
  155. Apart from all that, it's fairly portable...
  156.