home *** CD-ROM | disk | FTP | other *** search
/ Amiga Developer CD 2.1 / Amiga Developer CD v2.1.iso / CD32 / CD32_Support / notes / AppDeveloper.spec < prev    next >
Encoding:
Text File  |  1993-10-18  |  26.3 KB  |  640 lines

  1.  
  2.                      Tips For Developing An AmigaCD Title
  3.                      ------------------------------------
  4.  
  5. Last Revised: $Date: 93/05/07 11:10:13 $ $Revision: 40.7 $
  6.  
  7.  
  8. This document presents many issues relevant to developers creating titles for
  9. the AmigaCD console. Additional documentation can be found in the autodocs and
  10. include files for the standard Amiga system software, and AmigaCD-specific
  11. extensions.
  12.  
  13.  
  14. CDTV Compatibility
  15. ------------------
  16.  
  17. Although the AmigaCD console can run most CDTV titles, we recommend you do not
  18. use any of the old CDTV-specific system modules. These modules were only
  19. slightly modified in order to make existing CDTV titles work on AmigaCD. There
  20. are some known bugs and limitations in these modules when dealing with the new
  21. hardware of the AmigaCD.
  22.  
  23. Another good reason to avoid using CDTV-specific system modules is that in the
  24. future, our intent is to support running AmigaCD titles from a properly
  25. configured Amiga computer. On these systems, CDTV-specific modules will not
  26. exist, and therefore any titles relying on them will not function.
  27.  
  28. These are the CDTV-specific modules you should avoid using in any AmigaCD title:
  29.  
  30.     - cdtv.device
  31.  
  32.     - playerprefs.library
  33.  
  34.     - bookmark.device
  35.  
  36.     - cardmark.device
  37.  
  38.     - debox.library
  39.  
  40.     - rmtm
  41.  
  42.     - CDTVPrefs
  43.  
  44. Five special system modules were created for the AmigaCD console:
  45.  
  46.     - lowlevel.library
  47.  
  48.     - nonvolatile.library
  49.  
  50.     - freeanim.library
  51.  
  52.     - cd.device
  53.  
  54.     - CD-ROM file system
  55.  
  56. You can use these modules with confidence. lowlevel.library,
  57. nonvolatile.library and the CD-ROM file system will be part of Workbench 3.1
  58. and will be shipped within the 3.1 Enhancer kits and with new machines that
  59. include Workbench 3.1. freeanim.library will not be included with the normal
  60. Workbench distribution, but your code does not need to rely on its presence
  61. (see below for more on this). Finally, cd.device will be included with any
  62. AmigaCD-compatible solution that Commodore would potentially offer for its
  63. computer systems.
  64.  
  65.  
  66. Trademark File
  67. --------------
  68.  
  69. In order to get a title to boot on an AmigaCD, an AmigaCD trademark file must
  70. be included directly after the PVD sectors. CDTV supported having the trademark
  71. file either right after the PVD sectors, or as a normal file in the root of the
  72. CD directory structure. This is not the case with AmigaCD, the trademark file
  73. must be included after the PVD sectors.
  74.  
  75. The AmigaCD trademark file differs from the CDTV one. This is how AmigaCD
  76. determines if a title is a CDTV title of an AmigaCD title. Contact CATS for
  77. information on obtaining the trademark file if you plan on generating your own
  78. ISO images. In order to ensure the trademark file gets placed directly after
  79. the PVD sectors, do not simply copy it to your CD's directory. Instead make
  80. sure that the trademark file is in the directory you are currently CD'd to
  81. (probably where ISOCD is located) when creating your ISO image.
  82.  
  83. Note that use of the trademark file requires a CD License Agreement with
  84. Commodore. Contact CATS for licensing information.
  85.  
  86. The type of trademark file on a CD determines the environment in which the
  87. title is started. If a CDTV trademark file is found, the title is booted in ECS
  88. mode. If an AmigaCD trademark is found, the title is booted directly in AA
  89. mode. In addition, many system kludges are applied on a per-title basis when
  90. booting CDTV titles in order to keep them working on the AmigaCD.
  91.  
  92.  
  93. Booting A Title
  94. ---------------
  95.  
  96. AmigaCD boots just like a normal Amiga. The only available boot device is
  97. normally the CD (CD0:), so the system boots off the CD in the same manner it
  98. would boot from a hard drive, executing a startup-sequence et al.
  99.  
  100. Competing game consoles generally have instantaneous startup times for titles,
  101. due to the cartridge interface used. AmigaCD benefits in many ways from its
  102. CD-ROM technology, booting time is not one of these benefits. Due to the very
  103. slow seek times of CD-ROM devices, the dynamics of disk IO is quite a bit
  104. different from a hard drive. It is crucial that developers be aware of this
  105. situation and take appropriate actions to reduce boot times.
  106.  
  107. The startup animation sequence provided by the AmigaCD ROM has some continuous
  108. motion to indicate that the system is doing something while a title is booting.
  109. This animation sequence requires little memory and gets out of the way as soon
  110. as the title is ready to run. This animation helps eliminate the long periods
  111. of black screen visible when booting a CDTV.
  112.  
  113. An important factor in bootup time is the length of the startup-sequence
  114. executed by the system prior to running a title. The startup-sequence shipped
  115. with standard Amiga systems is intended for use in a multitasking computer
  116. environment. Understanding the startup-sequence, and optimizing it can help
  117. reduce bootup time considerably.
  118.  
  119. The following is a startup-sequence which is adequate for most titles. It is
  120. much smaller and many times faster than the standard startup-sequence provided
  121. with Workbench 3.1. It also leaves noticeably more memory for your title than
  122. the standard startup-sequence.
  123.  
  124. *******
  125.  
  126. C:SetPatch QUIET
  127.  
  128. ; Only include this line if you are using locale.library
  129. C:Assign >NIL: LOCALE: SYS:Locale
  130.  
  131. ; here you can add any assignments that are specific to your title.
  132. C:Assign >NIL: WestChesterWarrior: SYS:WestChesterWarrior
  133.  
  134. ; Only include these lines if you include the corresponding monitor files
  135. ; on your disc. Only include the files on the disc if you actually use the
  136. ; modes these monitors provide. Each monitor included eats up memory
  137. ; and takes time to load and run.
  138. DEVS:Monitors/NTSC
  139. DEVS:Monitors/PAL
  140. DEVS:Monitors/DblNTSC
  141. DEVS:Monitors/DblPAL
  142.  
  143. ; here you just start your title
  144. SYS:WestChesterWarrior
  145.  
  146. *******
  147.  
  148. Note that using explicit path specifications (C:Assign instead of just Assign)
  149. avoids a lot of head seeking and can make a noticeably performance difference.
  150.  
  151. Note that use of Workbench files other than plain text files such as
  152. startup-sequence on a CD requires a Workbench License Agreement with Commodore.
  153. Contact CATS for licensing information.
  154.  
  155. Another important consideration in bootup time is the size and complexity of
  156. the title itself. It is highly desirable to get your title on the screen as
  157. soon as possible. This can become difficult with very large titles which take a
  158. long time to load in memory. The solution to this problem involves either the
  159. use of overlays, or the use of a separate loader program.
  160.  
  161. The simpler approach is the loader program. This is a very small program that
  162. gets run in the startup-sequence (just like WestChesterWarrior in the example
  163. above). This loader program contains some animation and music sequences that
  164. can quickly be put onto the screen. While this animation is playing, the loader
  165. program can then proceed to load in the rest of the title into memory and
  166. activate it. See the DOS RunCommand() or System() functions for information on
  167. how the loader program can invoke the main title.
  168.  
  169.  
  170. Startup Environment
  171. -------------------
  172.  
  173. While the system is loading a title into memory, there is a small animation
  174. playing on the screen. This animation tells the user that the system is busy
  175. and will be done shortly. This animation consumes little memory, and exits the
  176. system as soon as the title indicates it is ready to run.
  177.  
  178. There are several things to consider when initializing a title with respect to
  179. interactions with the system:
  180.  
  181.   - The startup animation runs in an Intuition screen. In order for the exit
  182.     sequence of the animation to work correctly, titles must not take over
  183.     the display prior to the animation shutting down.
  184.  
  185.   - The startup animation may use the audio.device. It is therefore important
  186.     that titles do not start to play any music prior to the animation
  187.     shutting down.
  188.  
  189.   - When the animation exits the system, it leaves the display completely
  190.     black. You can assume this in your titles, and fade up from black, or
  191.     whatever other transitions you wish to do.
  192.  
  193. Once your title is in memory and wishes to display something on the screen,
  194. it needs to do:
  195.  
  196.     FreeAnimBase = OpenLibrary("freeanim.library", 0);
  197.  
  198. This tells the startup animation to begin shutting down, which involves
  199. removing itself from the display and freeing the resources it uses. This may
  200. take awhile, up to about a second. While the startup animation is shutting
  201. down, your application can prepare data to display and generally initialize
  202. itself. This parallelism reduces the time the user has to wait for the titles
  203. to start.
  204.  
  205. Once you have done what you need in order to display your title screen, you
  206. must do the following:
  207.  
  208.     CloseLibrary(FreeAnimBase);
  209.  
  210. This waits for the animation to complete its shutdown. Once this function has
  211. returned, it is now safe to display your title screen.
  212.  
  213. If you have no need to process information while the animation is shutting
  214. down, the following will work:
  215.  
  216.     CloseLibrary(OpenLibrary("freeanim.library", 0));
  217.  
  218. It is important to note that on a computer equipped CD-ROM, there will not be a
  219. freeanim.library around, so your code should not fail when freeanim.library
  220. cannot be opened. This is easy to do, just don't put any error checking in:
  221.  
  222.     FreeAnimBase = OpenLibrary("freeanim.library",0);
  223.  
  224.     /* initialize application stuff */
  225.  
  226.     CloseLibrary(FreeAnimBase);
  227.  
  228.     /* start application animation/display */
  229.  
  230. CloseLibrary() accepts a NULL pointer and ignores it. Therefore if
  231. OpenLibrary() fails and returns NULL, CloseLibrary() will still work.
  232.  
  233.  
  234. Running Your Titles From Workbench
  235. ----------------------------------
  236.  
  237. If Commodore decides to make AmigaCD compatible hardware available for its
  238. Amiga computer systems, it would be highly desirable if AmigaCD titles could be
  239. run from Workbench on those systems. This requires only a few lines of code to
  240. support:
  241.  
  242.   1 - You should handle disc insertion and removal events. On a computer
  243.       system, it would not be wise to enable the "reboot on removal"
  244.       feature of cd.device. When running on an AmigaCD, you should
  245.       generally reboot when a disc is removed, but in a computer environment,
  246.       you should deal with this eventuality and handle it gracefully by
  247.       putting up an error message, or at least quiting the title. Crashing
  248.       is never a good idea.
  249.  
  250.   2 - Your code should handle the Workbench startup environment
  251.  
  252.   3 - Your CD should include icons for the appropriate files
  253.  
  254.   4 - Your code should be able to run without having the startup-sequence
  255.       from your CD run. This is important. If your program relies on
  256.       assignments made in the startup-sequence, these will not be present
  257.       when running from Workbench. An easy solution is to provide an
  258.       IconX script on the CD that gets run from WB and loads in the title.
  259.       The script can do the needed assigns.
  260.  
  261.   5 - Your code should multitask nicely. It should release all its
  262.       resources on exit. If this is not possible, you must warn the
  263.       user in the documentation and in the software itself that starting
  264.       this title will take over the system and cause any unsaved work
  265.       to be lost.
  266.  
  267. The startup environment in a computer system will different from the normal
  268. AmigaCD environment. freeanim.library will not be there, so your code should
  269. not fail if freeanim.library cannot be opened. In addition, there will not be a
  270. startup animation in the system, so the initial display will not be a black
  271. screen and will instead be the user's Workbench screen.
  272.  
  273. It is also a nice touch to make the software runnable when not on the CD. This
  274. allows users to copy the title to their hard drive, enabling potentially much
  275. faster operation.
  276.  
  277. Finally, if you wish your application to look right at home on a CD-ROM
  278. equipped Amiga computer, you should avoid direct references to "AmigaCD" within
  279. your title. The title might actually be running on an A1200 or A4000.
  280.  
  281.  
  282. Preferences
  283. -----------
  284.  
  285. CDs should not contain any preferences files. This specifically means that the
  286. following files should not be on your CDs:
  287.  
  288.    Devs/system-configuration
  289.    Prefs/env-archive/sys/#?
  290.  
  291. Including any preferences file can cause odd behavior during the startup
  292. animation sequence.
  293.  
  294. In addition, many CDTV titles used to call the Intuition SetPrefs() function in
  295. order to change screen positioning and centering. This is not the correct
  296. method and will lead to problems with the startup animation. See the section
  297. below on screen positioning for information on how to do it right.
  298.  
  299.  
  300. Screen Positioning
  301. ------------------
  302.  
  303. In the days of 1.3, there was originally no officially supported way to control
  304. overscan and only limited official screen positioning control. Numerous ad hoc
  305. techniques of varying quality were invented, and most are still supported,
  306. though some only work because of kludges designed to keep them operational.
  307.  
  308. V36 introduced the graphics database and a host of structures to help you
  309. control your screen position.  For correct operation on the AmigaCD, we
  310. strongly urge you to use these functions and structures.
  311.  
  312. First, some definitions to help you along:
  313.  
  314. Text Overscan:  this is the old "morerows" size from 1.3, and has been called
  315. the "Text Overscan" or "Text Size" in V37+ Overscan Prefs. This rectangle
  316. defaults to a nominal-sized rectangle, but can be enlarged and/or repositioned
  317. by the user via Overscan Prefs. If this rectangle is correctly set, no pixel in
  318. Text Overscan is supposed to be masked by the bezel of the monitor.
  319.  
  320. Display Clip:  a rectangle that describes the desired displayable portion of
  321. your screen. The coordinates are in screen-pixels, and the origin is the
  322. upper-left corner of the Text Overscan rectangle.
  323.  
  324. It is best to center your own display with respect to the Text Overscan
  325. rectangle. Here's a piece of code to handle it:
  326.  
  327. /* CenterDClip( displayID, width, height, rect )
  328.  * Fills in the struct Rectangle pointed to by rect with a DisplayClip
  329.  * whose size is the width and height specified, and whose position
  330.  * is centered around the Text Overscan rectangle for the specified
  331.  * displayID.
  332.  *
  333.  * Returns TRUE if it succeeds, FALSE if it doesn't (usually caused
  334.  * by an invalid displayID).
  335.  */
  336.  
  337. BOOL CenterDClip(ULONG displayID, ULONG width, ULONG height,
  338.                  struct Rectangle *rect )
  339. {
  340. BOOL success = FALSE;
  341. LONG excess_x;
  342. LONG excess_y;
  343.  
  344.     if ( QueryOverscan( displayID, rect, OSCAN_TEXT ) )
  345.     {
  346.     excess_x = ( width - ( rect->MaxX - rect->MinX + 1 ) );
  347.     excess_y = ( height - ( rect->MaxY - rect->MinY + 1 ) );
  348.     rect->MinX -= excess_x / 2;
  349.     rect->MaxX = rect->MinX + width - 1;
  350.     rect->MinY -= excess_y / 2;
  351.     rect->MaxY = rect->MinY + height - 1;
  352.  
  353.     success = TRUE;
  354.     }
  355.     return( success );
  356. }
  357.  
  358. Sample use:
  359.  
  360.     #define MY_DISPLAY_ID   HIRES_KEY
  361.     #define MY_WIDTH    whatever
  362.     #define MY_HEIGHT   whatever
  363.  
  364.     ...
  365.  
  366.     struct Rectangle dclip;
  367.  
  368.     if ( CenterDClip( MY_DISPLAY_ID, MY_WIDTH, MY_HEIGHT, &dclip ) )
  369.     {
  370.         if ( myscreen = OpenScreenTags( NULL,
  371.         SA_DClip, &dclip,
  372.         ...
  373.         TAG_DONE ) )
  374.     }
  375.  
  376. Centering yourself using CenterDClip() could theoretically give you a
  377. Display Clip which extends outside of the OSCAN_MAX Display Clip,
  378. which represents the hardware limits.  If you would rather be slightly
  379. off-center than clipped, you may wish to shift the resulting DClip
  380. to fit within Maximum Overscan.  The easiest way to get that rectangle
  381. is:
  382.         QueryOverscan( displayID, &maxrect, OSCAN_MAX );
  383.  
  384. A word on screen size/position defaults:
  385.  
  386. The default values for the LeftEdge, TopEdge, Width, and Height of a screen can
  387. be a bit complex. This is partially due to the fact that they are implicitly
  388. specified by supplying a non-NULL NewScreen pointer to OpenScreenTagList(), and
  389. by the fact that while Intuition does define STDSCREENWIDTH and STDSCREENHEIGHT
  390. magic constants, there are no corresponding constants for standard left-edge
  391. and standard top-edge (which are likely non-zero!). The most foolproof strategy
  392. is to use a NULL NewScreen structure, using only tags to specify screen
  393. attributes, and omit all of SA_Left, SA_Top, SA_Width, and SA_Height. The
  394. correct defaults will come from the SA_DClip.
  395.  
  396. The other way (which is required if using a non-NULL NewScreen), is to supply
  397. the correct values for each component (either in the appropriate members of the
  398. NewScreen structure or with the appropriate tags). The correct values are:
  399.  
  400.     left   = dclip.MinX
  401.     top    = dclip.MinY
  402.     width  = dclip.MaxX - dclip.MinX + 1
  403.     height = dclip.MaxY - dclip.MinY + 1
  404.  
  405. Note that if your screen is shorter than the nominal height, other screens that
  406. are behind you can potentially be visible above your screen.
  407.  
  408. You are strongly encouraged to use Intuition screens instead of custom Views
  409. and ViewPorts. However, if you go that route, you can install a DisplayClip
  410. into your ViewPort's ViewPortExtra structure.
  411.  
  412. A word on sprites:
  413.  
  414. User preference can shift the Intuition View origin, which in turn can affect
  415. the number of sprites available on your screen. If you use sprites other than
  416. the pointer sprite, you must take this into consideration, because a change in
  417. the upper-left corner of the Text Overscan rectangle shifts the entire
  418. coordinate system, so even carefully-chosen fixed coordinates may get you into
  419. trouble. The upper-left corner of the OSCAN_MAX rectangle is the one which is
  420. at a fixed position with respect to the hardware fetch cycle (for a given
  421. mode). You can base a positional calculation on this if necessary.
  422.  
  423. There are some Display Clip positions for which the number of possible sprites
  424. varies depending on which fetch mode is used. The higher fetch modes have the
  425. advantage of reducing chip RAM bus saturation, but you may prefer a lower
  426. bandwidth with more sprites.  Graphics will drop the bandwidth to bring
  427. allocated sprites into view if MakeVPort() runs after you obtain your sprites
  428. via GetExtSprite(). In an Intuition environment, you should use RemakeDisplay()
  429. after you get your sprites (not call MakeVPort() directly).
  430.  
  431.  
  432. Avoiding The Workbench Screen
  433. -----------------------------
  434.  
  435. If you use Intuition screens in your titles, it is important to note an
  436. Intuition "feature" which can get in the way. Whenever the last screen opened
  437. in the system is closed, Intuition automatically opens up the Workbench screen.
  438. This can be quite cumbersome in titles which perform transitions between
  439. different screens. Here is a short code sample for SAS/C that defeats this
  440. Intuition feature. Simply call CloseScreenQuiet() instead of calling
  441. CloseScreen() and all will be fine:
  442.  
  443. ULONG __asm OpenWorkBenchPatch(void)
  444. {
  445.     return(0);
  446. }
  447.  
  448. VOID CloseScreenQuiet(struct Screen *screen)
  449. {
  450. APTR OWB;
  451.  
  452.     if (screen)
  453.     {
  454.         OWB = SetFunction(IntuitionBase, -0xd2, (APTR)OpenWorkBenchPatch);
  455.         CloseScreen(screen);
  456.         SetFunction(IntuitionBase, -0xd2, OWB);
  457.     }
  458. }
  459.  
  460. Note that the above code will only work starting with V39 Kickstart. Previous
  461. Kickstarts did not support this. The AmigaCD has a V40 Kickstart.
  462.  
  463.  
  464. V40 Graphics Issues
  465. -------------------
  466.  
  467. The graphics.library for V39 gained many features that make creating system
  468. friendly, fast moving graphics and animations much easier. graphics.doc is a
  469. good source of information on these new features. Some examples are also
  470. available from the 1993 DevCon notes. Of specific interest is the new
  471. double-buffering support which is even available in Intuition screens.
  472.  
  473. V40 of graphics.library which is present in the AmigaCD ROM contains a few
  474. extra features specifically targeted at improving the performance of animation
  475. and rendering code. These features are relatively new and not well known, so
  476. they are briefly explained below.
  477.  
  478.   - ViewPorts that don't load colors.
  479.     ViewPorts normally always have a copper list associated with them which
  480.     loads up all the colors needed for their depth. This new feature makes
  481.     it so that only color 0 gets loaded within the copper list. For deep
  482.     screens, this will substantially reduce the copper list length.
  483.     The rest of the colors are inheritied from the viewport above.
  484.     This feature is useful to reduce the inter-viewport gap, and for faster
  485.     color cycling. See the VC_NoColorPaletteLoad tag in
  486.     <graphics/videocontrol.h> and in the graphics.library/VideoControl()
  487.     autodoc entry.
  488.  
  489.   - Preventing intermediate copper list updating.
  490.     Speeds up LoadRGB(), SetRGB(), ScrollVPort(), and ChangeVPBitMap().
  491.     See the VC_IntermediateCLUpdate tag in <graphics/videocontrol.h> and
  492.     in the graphics.library/VideoControl() autodoc entry.
  493.  
  494.   - Dual-playfield disable.
  495.     Disables setting of the dual playfield bit in dual-playfield viewports.
  496.     Odd and even bit-planes will still scroll separately, but will be fed
  497.     directly to the palette. This can be used for instance to do cross-fades
  498.     between independently scrolling images. See the VC_DUALPF_Disable tag in
  499.     <graphics/videocontrol.h> and the graphics.library/VideoControl() autodoc
  500.     entry.
  501.  
  502.   - AmigaCD includes very fast chunky-to-planar conversion hardware. This
  503.     allows for high-quality 3D graphics. Consult the documentation for the
  504.     WriteChunkyPixels() function in the graphics.doc autodoc file for more
  505.     information.
  506.  
  507. Note that the above new ViewPort features work fine in Intuition screens as
  508. well. You just need to pass the screen's ViewPort as a parameter to the
  509. VideoControl() function.
  510.  
  511. You might also wish to look at the documentation for the SA_VideoControl and
  512. SA_MinimizeISG tags for the OpenScreenTagList() function. These two tags offers
  513. Intuition-level control of the new features outlined above. There are also the
  514. SA_Interleaved, SA_Exclusive, and SA_Draggable tags which can greatly help
  515. writing animation and graphics code. All these tags are documented in
  516. <intuition/screens.h> and in the intuition.doc autodoc.
  517.  
  518. V40 also added four new display modes which are useful for animation support.
  519. These modes are defined in <graphics/modeid.h> as:
  520.  
  521. /* Added for V40 - may be useful modes for some games or animations. */
  522. #define LORESSDBL_KEY                   0x00000008
  523. #define LORESHAMSDBL_KEY                0x00000808
  524. #define LORESEHBSDBL_KEY                0x00000088
  525. #define HIRESHAMSDBL_KEY                0x00008808
  526.  
  527. These new V40 display modes allow you to display a given raster at twice its
  528. height. Each line of the raster automatically gets repeated on the screen as
  529. it is displayed. This allows a 128 pixel high raster to be displayed as if
  530. it was 256 pixels tall. This can be very helpful in order to create full
  531. screen animations. For example, a 128 pixel high CDXL animation can
  532. suddenly occupy the full screen.
  533.  
  534. When you use one of these new modes, you DO NOT allocate more raster or open a
  535. taller screen - i.e. you still allocate a raster of the smaller height (128 for
  536. example), and if you are blitting the image you still only blit 128 lines. The
  537. effect which doubles the height of your image is a visual video effect
  538. accomplished by the AA hardware.
  539.  
  540. These modes work on a composite monitor or TV.
  541.  
  542.  
  543. Mode Promotion
  544. --------------
  545.  
  546. Mode promotion is a feature which converts 15kHz screens into 31kHz screens,
  547. in order to remove interlace flicker, or inter-line gaps. It is the AA
  548. equivalent of the A3000 display enhancer hardware.
  549.  
  550. Mode promotion can be turned on or off by the user. When turned on,
  551. screens opened using the 1.3 OpenScreen() function, or opened using a
  552. default monitor ID will end up promoted to a 31kHz mode. The promotion
  553. process is not totally transparent as certain aspects of the copper list,
  554. the refresh rate, and available overscan dimensions are different
  555. for the promoted state than for the unpromoted state. These differences
  556. can be crucial for many developers.
  557.  
  558. To avoid promotion affecting your titles, you simply need to open your screens
  559. with explicit mode IDs using the PAL_MONITOR_ID and NTSC_MONITOR_ID, instead
  560. of using the DEFAULT_MONITOR_ID.
  561.  
  562. Note that promotion is not turned on in AmigaCD systems, the problem can only
  563. surface in a computer environment.
  564.  
  565. Consult the ROM Kernel manuals, the 1991 and 1993 DevCon notes for more
  566. information on mode ids and mode promotion.
  567.  
  568.  
  569. Localization
  570. ------------
  571.  
  572. There are two ways software can be localized on AmigaCD systems.
  573. lowlevel.library offers a very simple mechanism that returns the number of the
  574. user's current preferred language. The second method involves using
  575. locale.library which provides a complete suite of localization services.
  576.  
  577. If your title does not use locale.library, it is best to remove it from your
  578. CDs.
  579.  
  580. If your title does use locale.library, you must have a directory structure such
  581. as:
  582.  
  583.       Locale (dir)
  584.         Catalogs (dir)
  585.           français (dir)
  586.             westchesterwarrior.catalog
  587.           deutsch (dir)
  588.             westchesterwarrior.catalog
  589.           italiano (dir)
  590.             westchesterwarrior.catalog
  591.         Languages (dir)
  592.           français.language           italiano.language
  593.           deutsch.language
  594.  
  595. That is, you need a Locale directory which contains a Catalogs and a Languages
  596. subdirectory. There is no need to include the Countries directory that comes
  597. with the Workbench disk, this directory is only of use to the Locale
  598. preferences editor.
  599.  
  600. The Catalogs directory must contain one subdirectory for each language that
  601. your title supports. Within these directories, you can put the standard
  602. locale.library catalog files (see locale.doc and catcomp.doc for more
  603. information).
  604.  
  605. The Languages directory must contain a language driver for each of the
  606. languages your title supports. These language drivers are supplied with
  607. Workbench 3.1 on the Locale disk.
  608.  
  609. The LOCALE: assignment must exist if you use locale.library. It should be made
  610. to the Locale directory described above.
  611.  
  612.  
  613. nonvolatile.library
  614. -------------------
  615.  
  616. The purpose of this library is to allow an application to save small amounts of
  617. information to nonvolatile memory or a disk device without having to burden the
  618. application with determining which device to use. It provides a simple, common
  619. access method to whichever device the user chooses. This library also provides
  620. access to true nonvolatile memory present on the game machine.
  621.  
  622. See the nonvolatile.doc autodoc for more information on this library.
  623.  
  624.  
  625. lowlevel.library
  626. ----------------
  627.  
  628. lowlevel.library provides many functions useful for game developers. Among
  629. other things, this library provides the only means to read the AmigaCD
  630. game controller.
  631.  
  632. Aside from the game controller code, the main purpose for lowlevel.library was
  633. to provide functions that are often needed by game developers. Most of the
  634. functions in this library should not be used in a multitasking environment and
  635. is intended purely for simple programs. Aside from the game controller code,
  636. everything else in lowlevel.library can be better done using other system
  637. modules, though more work may be involved.
  638.  
  639. See the lowlevel.doc autodoc for more information on this library.
  640.