==== Hardware Details ==== * 3DO M1 has 2MB of DRAM and 1MB of VRAM. * The VRAM is generally accessible just as the DRAM. The reverse is not always true. * The ARM60 is set to big endian mode. This can not be changed. ==== Programming Do's and Don'ts ==== [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/cdmfldr/07CDM002.html#XREF15593|https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/cdmfldr/07CDM002.html#XREF15593]] * Making Assumptions about Data Delivery Rates * Handling Data Delays * Alternating File Reads * Testing Performance * Other Things You Should Do ==== Portfolio Programming Etiquette ==== [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGSTOC.html#XREF29562|https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGSTOC.html#XREF29562]] "If you want to make your software available on future 3DO hardware using future versions of the 3DO operating system, follow the advice in this chapter. If you follow the guidelines discussed below, your application will continue to run as the 3DO platform evolves." * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS001.html#XREF18970|Accessing Low Memory]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS002.html|Making Assumptions About Memory Types]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS003.html|Relying on Side Effects of Multitasking]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS004.html#XREF29562|Using Busy Waiting]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS005.html#XREF18200|Ignoring variable frame rates]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS006.html#XREF41033|Using fixed pathnames]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS007.html#XREF33017|Using Self-Modifying Code]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS008.html#XREF23507|Leaving unused fields in DMA structures uninitialized]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS009.html#XREF28617|Bypassing the API]] * [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/smmfldr/gspfldr/06PGS010.html#XREF25182|Hoarding System Resources]] ==== IO Requests ==== * Even though io.h implies otherwise the address of ''ioi_Recv'' and ''ioi_Send'' are both validated. Only memory the task should have access to is allowed otherwise the error **FKr-Severe-System-Standard-ptr/range is illegal for this task **is returned. * The address validation is only done if the ''iob_Len'' is non-zero. The ''iob_Buffer'' values will still be accessible by the process receiving the request. ==== Threads ==== * As mentioned in the [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/pgsfldr/spg/02spg004.html#XREF29823|docs]] you must open any Devices, Drivers, Folios, etc. before using them in a thread. While memory may be shared between Tasks and Threads it does not appear Items share ownership or exist within one's scope. * While it may appear that threads can't take arguments due to the [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/pgsfldr/spr/01spr028.html#XREF27054|CreateThread]] signature you can in fact pass two values via the ''CREATETASK_TAG_ARGC'' and ''CREATETASK_TAG_ARGV'' [[https://ext.3dodev.com/3DO/Portfolio_2.5/OnLineDoc/DevDocs/ppgfldr/pgsfldr/spg/02spg004.html#XREF29823|tags]] via ''CreateItem/CreateItemVA''. * When using ''CREATETASK_TAG_SP'' the ''ta_Arg'' value should be set to the bottom of the stack. ''malloc(stacksize) + stacksize'' ==== Text / Fonts ==== * [[https://ext.3dodev.com/3DO/Portfolio_2.5/Examples/Lib3DO/TextLib/|lib3do's TextLib and FontLib]] provides decent, flexible functions for fonts and text generation. TextLib provides a "TextCel" object which has a Cel CCB which can then be used to render to a Bitmap. No documentation but look at "DrawTextString()" for an example.