home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 June / PCWorld_1999-06_cd.bin / software / temacd / basilisk / TECH < prev    next >
Text File  |  1999-04-15  |  28KB  |  508 lines

  1. BASILISK II TECHNICAL MANUAL
  2. ============================
  3.  
  4. 0. Table of Contents
  5. --------------------
  6.  
  7.   1. Introduction
  8.   2. Modes of operation
  9.   3. Memory access
  10.   4. Calling native routines from 68k mode and vice-versa
  11.   5. Interrupts
  12.   6. Parts of Basilisk II
  13.   7. Porting Basilisk II
  14.  
  15. 1. Introduction
  16. ---------------
  17.  
  18. Basilisk II emulates a Mac II series computer ("Mac II series" here means all
  19. 68020/30/40 based Macs with 32-bit clean ROMs (this excludes the original
  20. Mac II, the IIx/IIcx and the SE/030), except PowerBooks; in the following,
  21. "Mac II" is used as an abbreviation of "Mac II series computer", as defined
  22. above).
  23.  
  24. More precisely spoken, MacOS under Basilisk II behaves like on a Mac II
  25. because, apart from the CPU, the RAM and the ROM, absolutely no Mac hardware
  26. is emulated. Rather, Basilisk II provides replacements (usually in the form
  27. of MacOS drivers) for the parts of MacOS that access hardware. As there are
  28. practically no Mac applications that access hardware directly (this is also
  29. due to the fact that the hardware of different Mac models is sometimes as
  30. different as, say, the hardware of an Atari ST and an Amiga 500), both the
  31. compatibility and speed of this approach are very high.
  32.  
  33. 2. Modes of operation
  34. ---------------------
  35.  
  36. Basilisk II is designed to run on many different hardware platforms and on
  37. many different operating systems. To provide optimal performance under all
  38. environments, it can run in three different modes, depending on the features
  39. of the underlying environment (the modes are selected with the REAL_ADDRESSING
  40. and EMULATED_68K defines in "sysdeps.h"):
  41.  
  42. 1. Emulated CPU, "virtual" addressing (EMULATED_68K = 1, REAL_ADDRESSING = 0):
  43.    This mode is designed for non-68k or little-endian systems or systems that
  44.    don't allow accessing RAM at 0x0000..0x1fff. The 68k processor is emulated
  45.    with the UAE CPU engine and two memory areas are allocated for Mac RAM and
  46.    ROM. The memory map seen by the emulated CPU and the host CPU are different.
  47.    Mac RAM starts at address 0 for the emulated 68k, but it may start at a
  48.    different address for the host CPU. All memory accesses of the CPU emulation
  49.    go through memory access functions (do_get_mem_long() etc.) that translate
  50.    addresses. This slows down the emulator, of course.
  51.  
  52. 2. Emulated CPU, "real" addressing (EMULATED_68K = 1, REAL_ADDRESSING = 0):
  53.    This mode is intended for big-endian non-68k systems that do allow access to
  54.    RAM at 0x0000..0x1fff. As in the virtual addressing mode, the 68k processor
  55.    is emulated with the UAE CPU engine and two areas are set up for RAM and ROM
  56.    but the emulated CPU lives in the same address space as the host CPU.
  57.    This means that if something is located at a certain address for the 68k,
  58.    it is located at the exact same address for the host CPU. Mac addresses
  59.    and host addresses are the same. The memory accesses of the CPU emulation
  60.    still go through access functions but the address translation is no longer
  61.    needed, and if the host CPU uses big-endian data layout and can handle
  62.    unaligned accesses like the 68k, the memory access functions are replaced
  63.    by direct, inlined memory accesses, making for the fastest possible speed
  64.    of the emulator.
  65.    A usual consequence of the real addressing mode is that the Mac RAM doesn't
  66.    any longer begin at address 0 for the Mac and that the Mac ROM also is not
  67.    located where it usually is on a real Mac. But as the Mac ROM is relocatable
  68.    and the available RAM is defined for MacOS by the start of the system zone
  69.    (which is relocated to the start of the allocated RAM area) and the MemTop
  70.    variable (which is also set correctly) this is not a problem. There is,
  71.    however, one RAM area that must lie in a certain address range. This area
  72.    contains the Mac "Low Memory Globals" which (on a Mac II) are located at
  73.    0x0000..0x1fff and which cannot be moved to a different address range.
  74.    The Low Memory Globals constitute of many important MacOS and application
  75.    global variables (e.g. the above mentioned "MemTop" variable which is
  76.    located at 0x0108). For the real addressing mode to work, the host CPU
  77.    needs access to 0x0000..0x1fff. Under most operating systems, this is a
  78.    big problem. On some systems, patches (like PrepareEmul on the Amiga or
  79.    the sheep_driver under BeOS) can be installed to "open up" this area. On
  80.    other systems, it might be possible to use access exception handlers to
  81.    emulate accesses to this area. But if the Low Memory Globals area cannot
  82.    be made available, using the real addressing mode is not possible.
  83.  
  84. 3. Native CPU (EMULATED_68K = 0, this also requires REAL_ADDRESSING = 1)
  85.    This mode is designed for systems that use a 68k (68020 or better) processor
  86.    as host CPU and is the technically most difficult mode to handle. The Mac
  87.    CPU is no longer emulated (the UAE CPU emulation is no longer needed) but
  88.    MacOS and Mac applications run natively on the existing 68k CPU. This means
  89.    that the emulator has its maximum possible speed (very close to that of
  90.    a real Mac with the same CPU). As there is no control over the memory
  91.    accesses of the CPU, real addressing mode is implied, and so the Low Memory
  92.    area must be accessible (an MMU might be used to set up different address
  93.    spaces for the Mac and the host, but this is not implemented in Basilisk II).
  94.    The native CPU mode has some possible pitfalls that might make its
  95.    implementation difficult on some systems:
  96.      a) Implied real addressing (this also means that Mac programs that go out
  97.         of control can crash the emulator or the whole system)
  98.      b) MacOS and Mac applications assume that they always run in supervisor
  99.         mode (more precisely, they assume that they can safely use certain
  100.         priviledged instructions, mostly for interrupt control). So either
  101.         the whole emulator has to be run in supervisor mode (which usually is
  102.         not possible on multitasking systems) or priviledged instructions have
  103.         to be trapped and emulated. The Amiga version of Basilisk II uses the
  104.         latter approach (it is possible to run supervisor mode tasks under
  105.         the AmigaOS multitasking kernel (ShapeShifter does this) but it
  106.         requires modifying the task switcher and makes the emulator more
  107.         unstable).
  108.      c) On multitasking systems, interrupts can usually not be handled as on
  109.         a real Mac (or with the UAE CPU). The interrupt levels of the host
  110.         will not be the same as on a Mac, and the operating systems might not
  111.         allow installing hardware interrupt handlers or the interrupt handlers
  112.         might have different stack frames and run-time environments than 68k
  113.         hardware interrupts. The usual solution is to use some sort of software
  114.         interrupts or signals to interrupt the main emulation process and to
  115.         manually call the Mac 68k interrupt handler with a faked stack frame.
  116.      d) 68060 systems are a small problem because there is no Mac that ever
  117.         used the 68060 and MacOS doesn't know about this processor. Basilisk II
  118.         reports the 68060 as being a 68040 to the MacOS and patches some places
  119.         where MacOS makes use of certain 68040-specific features such as the
  120.         FPU state frame layout or the PTEST instruction. Also, Basilisk II
  121.         requires that all of the Motorola support software for the 68060 to
  122.         emulate missing FPU and integer instructions and addressing modes is
  123.         provided by the host operating system (this also applies to the 68040).
  124.      e) The "EMUL_OP" mechanism described below requires the interception and
  125.         handling of certain emulator-defined instructions.
  126.  
  127. 3. Memory access
  128. ----------------
  129.  
  130. There is often a need to access Mac RAM and ROM inside the emulator. As
  131. Basilisk II may run in "real" or "virtual" addressing mode on many different
  132. architectures, big-endian or little-endian, certain platform-independent
  133. data types and functions are provided:
  134.  
  135.   a) "sysdeps.h" defines the types int8, uint8, int16, uint16, int32 and uint32
  136.      for numeric quantities of a certain signedness and bit length
  137.   b) "cpu_emulation.h" defines the ReadMacInt*() and WriteMacInt*() functions
  138.      which should always be used to read from or write to Mac RAM or ROM
  139.   c) "cpu_emulation.h" also defines the Mac2HostAddr() function that translates
  140.      a Mac memory address to a (uint8 *) in host address space. This allows you
  141.      to access larger chunks of Mac memory directly, without going through the
  142.      read/write functions for every access. But doing so you have to perform
  143.      any needed endianess conversion of the data yourself by using the ntohs()
  144.      etc. macros which are available on most systems or defined in "sysdeps.h".
  145.  
  146. 4. Calling native routines from 68k mode and vice-versa
  147. -------------------------------------------------------
  148.  
  149. An emulator like Basilisk II requires two kinds of cross-platform function
  150. calls:
  151.  
  152.   a) Calling a native routine from the Mac 68k context
  153.   b) Calling a Mac 68k routine from the native context
  154.  
  155. Situation a) arises in nearly all Basilisk drivers and system patches while
  156. case b) is needed for the invocation of Mac call-back or interrupt routines.
  157. Basilisk II tries to solve both problems in a way that provides the same
  158. interface whether it is running on a 68k or a non-68k system.
  159.  
  160. 4.1. The EMUL_OP mechanism
  161. --------------------------
  162.  
  163. Calling native routines from the Mac 68k context requires breaking out of the
  164. 68k emulator or interrupting the current instruction flow and is done via
  165. unimplemented 68k opcodes (called "EMUL_OP" opcodes). Basilisk II uses opcodes
  166. of the form 0x71xx (these are invalid MOVEQ opcodes) which are defined in
  167. "emul_op.h". When such an opcode is encountered, whether by the emulated CPU
  168. or a real 68k, the execution is interrupted, all CPU registers saved and the
  169. EmulOp() function from "emul_op.cpp" is called. EmulOp() decides which opcode
  170. caused the interrupt and performs the required actions (mostly by calling other
  171. emulator routines). The EMUL_OP handler routines have access to nearly all of
  172. the 68k user mode registers (exceptions being the PC, A7 and SR). So the
  173. EMUL_OP opcodes can be thought of as extensions to the 68k instruction set.
  174. Some of these opcodes are used to implement ROM or resource patches because
  175. they only occupy 2 bytes and there is sometimes not more room for a patch.
  176.  
  177. 4.2. Execute68k()
  178. -----------------
  179.  
  180. "cpu_emulation.h" declares the functions Execute68k() and Execute68kTrap() to
  181. call Mac 68k routines or MacOS system traps from inside an EMUL_OP handler
  182. routine. They allow setting all 68k user mode registers (except PC and SR)
  183. before the call and examining all register contents after the call has
  184. returned. EMUL_OP and Execute68k() may be nested, i.e. a routine called with
  185. Execute68k() may contain EMUL_OP opcodes and the EMUL_OP handlers may in turn
  186. call Execute68k() again.
  187.  
  188. 5. Interrupts
  189. -------------
  190.  
  191. Various parts of Basilisk II (such as the Time Manager and the serial driver)
  192. need an interrupt facility to trigger asynchronous events. The MacOS uses
  193. different 68k interrupt levels for different events, but for simplicity
  194. Basilisk II only uses level 1 and does it's own interrupt dispatching. The
  195. "InterruptFlags" contains a bit mask of the pending interrupts. These are the
  196. currently defined interrupt sources (see main.h):
  197.  
  198.   INTFLAG_60HZ    - MacOS 60Hz interrupt (unlike a real Mac, we also handle
  199.                     VBL interrupts, ADB events and the Time Manager here)
  200.   INTFLAG_SERIAL  - Interrupt for serial driver I/O completion
  201.   INTFLAG_ETHER   - Interrupt for Ethernet driver I/O completion and packet
  202.                     reception
  203.  
  204. An interrupt is triggered by calling SetInterruptFlag() with the desired
  205. interrupt flag constant and then TriggerInterrupt(). When the UAE 68k
  206. emulator is used, this will signal a hardware interrupt to the emulated 680x0.
  207. On a native 68k machine, some other method for interrupting the MacOS thread
  208. has to be used (e.g. on AmigaOS, a signal exception is used). Care has to be
  209. taken because with the UAE CPU, the interrupt will only occur when Basilisk II
  210. is executing MacOS code while on a native 68k machine, the interrupt could
  211. occur at any time (e.g. inside an EMUL_OP handler routine). In any case, the
  212. MacOS thread will eventually end up in the level 1 interrupt handler which
  213. contains an M68K_EMUL_OP_IRQ opcode. The opcode handler in emul_op.cpp will
  214. then look at InterruptFlags and decide which routines to call.
  215.  
  216. 6. Parts of Basilisk II
  217. -----------------------
  218.  
  219. The conception of Basilisk II is quite modular and consists of many parts
  220. which are relatively independent from each other:
  221.  
  222.  - UAE CPU engine ("uae_cpu/*", not needed on all systems)
  223.  - ROM patches ("rom_patches.cpp", "slot_rom.cpp" and "emul_op.cpp")
  224.  - resource patches ("rsrc_patches.cpp" and "emul_op.cpp")
  225.  - PRAM Utilities replacement ("xpram.cpp")
  226.  - ADB Manager replacement ("adb.cpp")
  227.  - Time Manager replacement ("timer.cpp")
  228.  - SCSI Manager replacement ("scsi.cpp")
  229.  - video driver ("video.cpp")
  230.  - floppy driver ("sony.cpp")
  231.  - disk driver ("disk.cpp")
  232.  - CD-ROM driver ("cdrom.cpp")
  233.  - serial drivers ("serial.cpp")
  234.  - Ethernet driver ("ether.cpp")
  235.  - system-dependant device access ("sys_*.cpp")
  236.  - user interface strings ("user_strings.cpp")
  237.  - preferences management ("prefs.cpp")
  238.  
  239. Most modules consist of a platform-independant part (such as video.cpp) and a
  240. platform-dependant part (such as video_beos.cpp).
  241.  
  242. 6.1. UAE CPU engine
  243. -------------------
  244.  
  245. All files relating to the UAE 680x0 emulation are kept in the "uae_cpu"
  246. directory. The "cpu_emulation.h" header file defines the link between the
  247. UAE CPU and the rest of Basilisk II, and "basilisk_glue.cpp" implements the
  248. link. It should be possible to replace the UAE CPU with a different 680x0
  249. emulation by creating a new "xxx_cpu" directory with an appropriate
  250. "cpu_emulation.h" header file (for the inlined memory access functions) and
  251. writing glue code between the functions declared in "cpu_emulation.h" and
  252. those provided by the 680x0 emulator.
  253.  
  254. 6.2. ROM and resource patches
  255. -----------------------------
  256.  
  257. As described above, instead of emulating custom Mac hardware, Basilisk II
  258. provides replacements for certain parts of MacOS to redirect input, output
  259. and system control functions of the Mac hardware to the underlying operating
  260. systems. This is done by applying patches to the Mac ROM ("ROM patches") and
  261. the MacOS system file ("resource patches", because nearly all system software
  262. is contained in MacOS resources). Unless resources are written back to disk,
  263. the system file patches are not permanent (it would cause many problems if
  264. they were permanent, because some of the patches vary with different
  265. versions of Basilisk II or even every time the emulator is launched).
  266.  
  267. ROM patches are contained in "rom_patches.cpp" and resource patches are
  268. contained in "rsrc_patches.cpp". The ROM patches are far more numerous because
  269. nearly all the software needed to run MacOS is contained in the Mac ROM (the
  270. system file itself consists mainly of ROM patches, in addition to graphics and
  271. text). One part of the ROM patches involves the construction of a NuBus slot
  272. declaration ROM (in "slot_rom.cpp") which is used to add the video and Ethernet
  273. drivers. Apart from the CPU emulation, the ROM and resource patches contain
  274. most of the "logic" of the emulator.
  275.  
  276. 6.3. PRAM Utilities
  277. -------------------
  278.  
  279. MacOS stores certain nonvolatile system parameters in a 256 byte battery
  280. backed-up CMOS RAM area called "Parameter RAM", "PRAM" or "XPRAM" (which refers
  281. to "Extended PRAM" because the earliest Mac models only had 20 bytes of PRAM).
  282. Basilisk II patches the ClkNoMem() MacOS trap which is used to access the XPRAM
  283. (apart from some routines which are only used early during system startup)
  284. and the real-time clock. The XPRAM is emulated in a 256 byte array which is
  285. saved to disk to preserve the contents for the next time Basilisk is launched.
  286.  
  287. 6.4. ADB Manager
  288. ----------------
  289.  
  290. For emulating a mouse and a keyboard, Basilisk II patches the ADBOp() MacOS
  291. trap. Platform-dependant code reports mouse and keyboard events with the
  292. ADBMouseDown() etc. functions which are queued and sent to MacOS inside the
  293. ADBInterrupt() function (which is called as a part of the 60Hz interrupt
  294. handler) by calling the ADB mouse and keyboard handlers with Execute68k().
  295.  
  296. 6.5. Time Manager
  297. -----------------
  298.  
  299. Basilisk II completely replaces the Time Manager (InsTime(), RmvTime(),
  300. PrimeTime() and Microseconds() traps). A "TMDesc" structure is associated with
  301. each Time Manager task, that contains additional data. The tasks are executed
  302. in the TimerInterrupt() function which is currently called inside the 60Hz
  303. interrupt handler, thus limiting the resolution of the Time Manager to 16.6ms.
  304.  
  305. 6.6. SCSI Manager
  306. -----------------
  307.  
  308. The (old-style) SCSI Manager is also completely replaced and the MacOS
  309. SCSIDispatch() trap redirected to the routines in "scsi.cpp". Under the MacOS,
  310. programs have to issue multiple calls for all the different phases of a
  311. SCSI bus interaction (arbitration, selection, command transfer etc.).
  312. Basilisk II maps this API to an atomic API which is used by most modern
  313. operating systems. All action is deferred until the call to SCSIComplete().
  314. The TIB (Transfer Instruction Block) mini-programs used by the MacOS are
  315. translated into a scatter/gather list of data blocks. Operating systems that
  316. don't support scatter/gather SCSI I/O will have to use buffering if more than
  317. one data block is being transmitted. Some more advanced (but rarely used)
  318. aspects of the SCSI Manager (like messaging and compare operations) are not
  319. emulated.
  320.  
  321. 6.7. Video driver
  322. -----------------
  323.  
  324. The NuBus slot declaration ROM constructed in "slot_rom.cpp" contains a driver
  325. definition for a video driver. The Control and Status calls of this driver are
  326. implemented in "video.cpp". Run-time video mode and depth switching are
  327. currently not supported.
  328.  
  329. The host-side initialization of the video system is done in VideoInit().
  330. This function must provide access to a frame buffer for MacOS and supply
  331. its address, resolution and color depth in a video_desc structure (there
  332. is currently only one video_desc structure, called VideoMonitor; this is
  333. going to change once multiple displays are supported). In real addressing
  334. mode, this frame buffer must be in a MacOS compatible layout (big-endian
  335. and 1, 2, 4 or 8 bits paletted chunky pixels, RGB 5:5:5 or xRGB 8:8:8:8).
  336. In virtual addressing mode, the frame buffer is located at address
  337. 0xa0000000 on the Mac side and you have to supply the host address, size
  338. and layout (BasiliskII will do an automatic pixel format conversion) in
  339. the variables MacFrameBaseHost, MacFrameSize and MacFrameLayout.
  340.  
  341. 6.8. Floppy, disk and CD-ROM drivers
  342. ------------------------------------
  343.  
  344. Basilisk II contains three MacOS drivers that implement floppy, disk and CD-ROM
  345. access ("sony.cpp", "disk.cpp" and "cdrom.cpp"). They rely heavily on the
  346. functionality provided by the "sys_*.cpp" module. BTW, the name ".Sony" of the
  347. MacOS floppy driver comes from the fact that the 3.5" floppy drive in the first
  348. Mac models was custom-built for Apple by Sony (this was one of the first
  349. applications of the 3.5" floppy format which was also invented by Sony).
  350.  
  351. 6.9. Serial drivers
  352. -------------------
  353.  
  354. Similar to the disk drivers, Basilisk II contains replacement serial drivers
  355. for the emulation of Mac modem and printer ports. To avoid duplicating code,
  356. both ports are handled by the same set of routines. The SerialPrime() etc.
  357. functions are mostly wrappers that determine which port is being accessed.
  358. All the real work is done by the "SERDPort" class which is subclassed by the
  359. platform-dependant code. There are two instances (for port A and B) of the
  360. subclasses.
  361.  
  362. Unlike the disk drivers, the serial driver must be able to handle asynchronous
  363. operations. Calls to SerialPrime() will usually not actually transmit or receive
  364. data but delegate the action to an independant thread. SerialPrime() then
  365. returns "1" to indicate that the I/O operation is not yet completed. The
  366. completion of the I/O request is signalled by calling the MacOS trap "IODone".
  367. However, this can't be done by the I/O thread because it's not in the right
  368. run-time environment to call MacOS functions. Therefore it will trigger the
  369. INTFLAG_SERIAL interrupt which causes the MacOS thread to eventually call
  370. SerialInterrupt(). SerialInterrupt(), in turn, will not call IODone either but
  371. install a Deferred Task to do the job. The Deferred Task will be called by
  372. MacOS when it returns to interrupt level 0. This mechanism sounds complicated
  373. but is necessary to ensure stable operation of the serial driver.
  374.  
  375. 6.10. Ethernet driver
  376. ---------------------
  377.  
  378. A driver for Ethernet networking is also contained in the NuBus slot ROM.
  379. Only one ethernet card can be handled by Basilisk II. For Ethernet to work,
  380. Basilisk II must be able to send and receive raw Ethernet packets, including
  381. the 14-byte header (destination and source address and type/length field),
  382. but not including the 4-byte CRC. This may not be possible on all platforms
  383. or it may require writing special net drivers or add-ons or running with
  384. superuser priviledges to get access to the raw packets.
  385.  
  386. Writing packets works as in the serial drivers. The ether_write() routine may
  387. choose to send the packet immediately (e.g. under BeOS) and return noErr or to
  388. delegate the sending to a separate thread (e.g. under AmigaOS) and return "1" to
  389. indicate that the operation is still in progress. For the latter case, a
  390. Deferred Task structure is provided in the ether_data area to call IODone from
  391. EtherInterrupt() when the packet write is complete (see above for a description
  392. of the mechanism).
  393.  
  394. Packet reception is a different story. First of all, there are two methods
  395. provided by the MacOS Ethernet driver API to read packets, one of which (ERead/
  396. ERdCancel) is not supported by Basilisk II. Basilisk II only supports reading
  397. packets by attaching protocol handlers. This shouldn't be a problem because
  398. the only network code I've seen so far that uses ERead is some Apple sample
  399. code. AppleTalk, MacTCP, MacIPX, OpenTransport etc. all use protocol handlers.
  400. By attaching a protocol handler, the user of the Ethernet driver supplies a
  401. handler routine that should be called by the driver upon reception of Ethernet
  402. packets of a certain type. 802.2 packets (type/length field of 0..1500 in the
  403. packet header) are a bit special: there can be only one protocol handler attached
  404. for 802.2 packets (by specifying a packet type of "0"). The MacOS LAP Manager
  405. will attach a 802.2 handler upon startup and handle the distribution of 802.2
  406. packets to sub-protocol handlers, but the Basilisk II Ethernet driver is not
  407. concerned with this.
  408.  
  409. When the driver receives a packet, it has to look up the protocol handler
  410. installed for the respective packet type (if any has been installed at all)
  411. and call the packet handler routine. This must be done with Execute68k() from
  412. the MacOS thread, so an interrupt (INTFLAG_ETHER) is triggered upon reception
  413. of a packet so the EtherInterrupt() routine can call the protocol handler.
  414. Before calling the handler, the Ethernet packet header has to be copied to
  415. MacOS RAM (the "ed_RHA" field of the ether_data structure is provided for this).
  416. The protocol handler will read the packet data by means of the ReadPacket/ReadRest
  417. routines supplied by the Ethernet driver. Both routines will eventually end up
  418. in EtherReadPacket() which copies the data to Mac address space. EtherReadPacket()
  419. requires the host address and length of the packet to be loaded to a0 and d1
  420. before calling the protocol handler.
  421.  
  422. Does this sound complicated? You are probably right. Here is another description
  423. of what happens upon reception of a packet:
  424.   1. Ethernet card receives packet and notifies some platform-dependant entity
  425.      inside Basilisk II
  426.   2. This entity will store the packet in some safe place and trigger the
  427.      INTFLAG_ETHER interrupt
  428.   3. The MacOS thread will execute the EtherInterrupt() routine and look for
  429.      received packets
  430.   4. If a packet was received of a type to which a protocol handler had been
  431.      attached, the packet header is copied to ed_RHA, a0/d1 are loaded with
  432.      the host address and length of the packet data, a3 is loaded with the
  433.      Mac address of the first byte behing ed_RHA and a4 is loaded with the
  434.      Mac address of the ed_ReadPacket code inside ether_data, and the protocol
  435.      handler is called with Execute68k()
  436.   5. The protocol handler will eventually try to read the packet data with
  437.      a "jsr (a4)" or "jsr 2(a4)"
  438.   6. This will execute an M68K_EMUL_OP_ETHER_READ_PACKET opcode
  439.   7. The EtherReadPacket() opcode handling routine will copy the requested
  440.      part of the packet data to Mac RAM using the pointer and length which are
  441.      still in a0/d1
  442.  
  443. For a more detailed description of the Ethernet driver, see "Inside AppleTalk".
  444.  
  445. 6.11. System-dependant device access
  446. ------------------------------------
  447.  
  448. The method for accessing floppy drives, hard disks, CD-ROM drives and files
  449. vary greatly between different operating systems. To make Basilisk II easily
  450. portable, all device I/O is made via the functions declared in "sys.h" and
  451. implemented by the (system-dependant) "sys_*.cpp" modules which provides a
  452. standard, Unix-like interface to all kinds of devices.
  453.  
  454. 6.12. User interface strings
  455. ----------------------------
  456.  
  457. To aid in localization, all user interface strings of Basilisk II are collected
  458. in "user_strings.cpp" and accessed via the GetString() function. This way,
  459. Basilisk II may be easily translated to different languages.
  460.  
  461. 6.13. Preferences management
  462. ----------------------------
  463.  
  464. The module "prefs.cpp" handles user preferences in a system-independant way.
  465. Preferences items are accessed with the PrefsAdd*(), PrefsReplace*() and
  466. PrefsFind*() functions and stored in human-readable and editable text files
  467. on disk. There are two lists of available preferences items. The first one,
  468. common_prefs_items, defines the items which are available on all systems.
  469. The second one, platform_prefs_items, is defined in prefs_*.cpp and lists
  470. the prefs items which are specific to a certain platform.
  471.  
  472. 7. Porting Basilisk II
  473. ----------------------
  474.  
  475. Porting Basilisk II to a new platform should not be hard. These are the steps
  476. involved in the process:
  477.  
  478. 1. Create a new directory inside the "src" directory for your platform. If
  479.    your platform comes in several "flavours" that require adapted files, you
  480.    should create subdirectories inside the platform directory. All files
  481.    needed for your port must be placed inside the new directory. Don't
  482.    scatter platform-dependant files across the "src" hierarchy.
  483. 2. Decide in which mode (virtual addressing, real addressing or native CPU)
  484.    Basilisk II will run.
  485. 3. Create a "sysdeps.h" file which defines the mode and system-dependant
  486.    data types and memory access functions. Things which are used in Basilisk
  487.    but missing on your platform (such as endianess macros) should also be
  488.    defined here.
  489. 4. Implement the system-specific parts of Basilisk:
  490.      main_*.cpp, sys_*.cpp, prefs_*.cpp, xpram_*.cpp, timer_*.cpp,
  491.      video_*.cpp, serial_*.cpp, scsi_*.cpp and clip_*.cpp
  492.    You may want to look at the implementation for other platforms before
  493.    writing your own.
  494. 5. Important things to remember:
  495.      - Use the ReadMacInt*() and WriteMacInt*() functions from "cpu_emulation.h"
  496.        to access Mac memory
  497.      - Use the ntohs() etc. macros to convert endianess when accessing Mac
  498.        memory directly
  499.      - Don't modify any source files outside of your platform directory unless
  500.        you really, really have to. Instead of adding "#ifdef PLATFORM" blocks
  501.        to one of the platform-independant source files, you should contact me
  502.        so that we may find a more elegant and more portable solution.
  503. 6. Coding style: indent -kr -ts4
  504.  
  505.  
  506. Christian Bauer
  507. <cbauer@iphcip1.physik.uni-mainz.de>
  508.