Version 2.06
	Modified the default graphics microcode
	* The F3DEX-related microcodes have been the default microcode until now.
	  From this version forward, F3DEX2 will be the default microcode.
	  Therefore, "F3DEX_GBI_2" is defined in nusys.h. However, if
	  F3DEX_GBI is already defined, F3DEX_GBI_2 is not defined.
	  When the F3DEX-related microcodes are used, please define
	  F3DEX_GBI for the application code compile option (it is not necessary
	  to change anything on NuSystem side).

	Changes regarding microcode's FIFO buffer
	* Changed so that the user can set the size and the location of
	  FIFO buffer of the graphics microcode. Added nuGfxSetUcodeFifo()
	  for setting, and changed nuGfInit() and nuGfxInitEX2().

	Addition and changes to the boot code
	* Beginning with OS2.0K, osInitialize() function becomes a macro that
	  allows initialization process for each development environment. 
	  For this change, object codes have been added to nuboot.c to
	  include the initialization code for various development environments.
	  The added object codes include:

	  for ROM
	  nusys_rom.o

	  for ROM debugging
	  nusys.o nusys_ptn.o nusys_isv.o nusys_emu.o nusys_msp.o

	  for debugging
	  nusys_d.o nusys_ptn_d.o nusys_isv_d.o nusys_emu_d.o nusys_msp_d.o

	  nusys.o and nusys_d.o perform automatical detection
	  _FINALROM is defined in nusys_rom.o
	  ISV64 is defined in nusys_isv.o and nusys_isv_d.o
	  PTN64 is defined in nusys_ptn.o and nusys_ptn_d.o
	  MWN64 is defined in nusys_msp.o and nusys_msp_d.o


	Fixed problems
	* Fixed a problem in the nuContMgrInit function, where the local variable
	  would not be shifted when an error occurs and an erroneous value
	  resulted.

Version 2.05

Changed the compile environment

     Libraries are now created in the O2 (Irix6.3) environment, whereas up 
     until now they were created in the Indy (Irix5.3) environment.

Added functions

   -- In order to provide an idea of how long a process is going to take,
      we added the nuDebPerfMarkSet function, which indicates the current
      position of a process on the performance meter.  (We know you've been
      wanting this for a long time.  Sorry it took so long.)

      Marks are displayed on nuDebTaskPerfBar0 and nuDebTaskPerfBar1.  

      Note that the task bar for nuDebTaskPerfBar1 indicates not the total
      processing time, but rather the time from a retrace timing (i.e., it is
      the same as nuDebTaskPerfBar0).

      The returned value is the duration in microseconds from the retrace.

   -- Added the nuDebTaskPerfIntervalSet function to set the time interval 
      between measurements on the performance meter.  The performance meter
      should be easier to read if this value is set larger than 1.

   -- Added the PI transfer function nuPiReadRomOverlay for overlays.


Revisions

  -- Fixed the problems with the part of nusched.c that waits for the frame
     buffer to become free.

  -- Problem with the Rumble Pak manager
     The member variables of the Rumble Pak control function nuContRmbCtl can
     be read from a number of threads.  These variables are read from the Rumble 
     Pak manager, but they are also read from within the nuContRmbModeSet() and 
     nuContRmbCheck() functions, which are called by other threads.  To deal 
     with the problem, interrupts are now prohibited when the variables are 
     called from these other functions.

  -- Problem with nuaumgrex.c
     There was a part in nuaumgrex.c where local variables are used without
     being initialized, and zero-divide exceptions are a possibility. 

  -- Changed the size of nuYieldBuf to 0xc10, increasing it by 0x10 in order
     to support HQV.

  -- Changed those external variable declarations of nusys.h that included
     the number of arrays so that they no longer include the number of arrays
     (excluded structure members). 

  -- Changed the SI manager thread ID because it and the graphics task 
     manager thread ID were overlapping.

  -- Previously, the debug console settings were changed so that, of the
     four windows, only window 0 would be displayed and the rest would be hidden
     as the default.  However, the changes to the initial values were confusing,
     so we put things back the way they were, and all four windows are now again
     displayed as the default.

     Use the nuDebConWindowShow function if you want to hide windows 1 ~ 3.
     This will cut down on wasteful CPU processing time.

  -- Changed the name of the thread structure of the nugfxthrea.c graphics 
     thread from GfxThread to nuGfxThread, making it a global variable.

  -- nudebtaskperfbar0.c and nudebtaskperfbar0_ex2.c had the same content, as
     did nudebtaskperfbar1.c and nudebtaskperfbar1_ex2.c, the only difference in
     each case being whether F3DEX_GBI_2 was defined or not.  This made 
     maintenance troublesome, since it was necessary to make changes and
     corrections to two files.  For this reason, they were changed to be
     included. (Although we don't like including .c files)

  -- Fixed the incorrect usage of nuAuDebDmaCount when using the PI with 
     nualsgi/nuaudma.c.

  -- With nualsgi/nuauseqplayerbankset.c the bank is set in both sequence 
     player 0 and 1.  But when only one sequence player is being used, problems 
     arise.  To deal with this, changed it so a check is made to see whether the
     sequence players are initialized or not before the bank is set.

  -- Sneaked in the Version.  Please do not delete this if possible.



Version 2.04

Revisions

  -- Fixed the place in nupireadrom.c where, when the PI function is used,
     sometimes the read size specification is not made.  However, we do not 
     recommend using the PI function.



Version 2.03

Revisions

  -- The same target global variables and static variables were mixed up in
     the nuaumgr.c, nuaumgrex.c and nuaumgrparams.c files.  This mess was 
     cleaned up. (People forgot to recover files deleted with erroneous RCS
     commands)



Version 2.02

Revisions

  -- Fixed a problem with the Controller read functions
     Corrected the problem in the message sending part of the nuContDataReadStart
     function and the nuContDataRead function.



Version 2.01

Revisions

  -- Fixed the bug when writing to SRAM.
     There were cases when writing to the NuSystem SRAM in which the cache 
     was not written back to.  This has been corrected so that, the cache 
     is disabled when the SRAM is read, and the cache is written back to
     when the SRAM is written to.  

  -- Fixed the bug which produced noise when the reset button was held down.
     Made changes so that a retrace message is not sent to the audio thread 
     of the mus library, and so that the audio thread is stopped, 28 frames 
     after a PreNMI event. 

  -- Corrected spelling mistakes and made additions to nusys.h. 
     Corrected NU_RMON_THERAD_ID to read NU_RMON_THREAD_ID. 
     Also added a definition for NU_RMON_STACK_SIZE. 

  -- Changed nudebconprintf.c
     There were incomplete segments in this file that caused warnings 
     to appear when the file was compiled.  These incomplete segments
     have been removed. 

  -- Changed nugfxsetcfb.c
     Fixed the bug in which the graphics task would not run if the frame 
     buffer array was changed by the nuGfxSetCfb function, or if the 
     address of the currently displayed frame buffer was the same as the 
     0th address in a newly registered frame buffer array.  Please note
     that a retrace standby is run once when the buffer is set. 




Version 2.00
	
Changes to the Scheduler

  -- Implemented measures to prevent loss of Pre-NMI message data:
     Clicking on Pre-NMI messages with a certain timing may cause the second 
     Pre-NMI message to be lost. In this case, Pre-NMI messages may not be 
     processed and, in the worst case, the program may hang. This is improved in 
     NuSystem Version 2.00 so that Pre-NMI messages received are recorded 
     internally and, when a client that requires pre-NMI messages is registered 
     with the Scheduler, the client is sent Pre-NMI messages.

  -- Executes processing necessary with a Pre-NMI:
     Modified so that following a Pre-NMI message and approximately 2 frames before 
     the reset, the Y scale is set to 1.0, the screen is cleared by 
     osViBlack(FALSE), and osAfterPreNMI() is executed in the Scheduler. However, 
     a check should always be performed to determine whether a hang will occur.

  -- Added the global variable nuScPreNMIFlag: 
     In this version, it is set to NU_SC_GET_PRENMI when a Pre-NMI message is 
     received and to NU_SC_BEFORE_RESET 3 frames before the reset (3 frames before 
     0.5 sec from the pre-NMI). 

  -- Disabled RSP tasks immediately before a reset:
     Modified so that when the global variable nuScPreNMIFlag is set to
     NU_SC_BEFORE_RESET, a task is not initiated by an RSP task message.
     However, an RSP task termination message is returned so that the 
     application does not hang.
	  
  -- Support for single frame buffers:
     A single frame buffer previously could not be used because when a graphics
     task started, processing halted until a frame buffer was free.  Consequently, 
     the function nuScSetFrameBufferNum(), which specifies the number of 
     frame buffers, was added.  When 1 is specified as the argument to this
     function, frame buffer status is not checked.  Specifying any argument 
     other than 1 causes the program to function just as before.  The default
     argument is 2.

  -- Added a frame-rate acquisition function:
     The function frameBufferNum was added to store the frame rate in the 
     NUSched structure.  When the scheduler is initialized, the function 
     osTvType is used to check whether the format is PAL or another format,
     and the value 50 or 60 is stored.  This value can be obtained with
     nuScGetFrameRate().  However, automatic switching using osTvType is 	  
     disabled, so automatic screen switching should not be performed.

  -- Added a function to change messages sent to the client:
     The function nuScResetClientMesgType() was added to enable changes in
     the type of message sent to the client, which is specified in the argument to
     nuScAddClient().


Audio Changes (nualsgi and nualsgi_n)

  -- Added an audio manager that uses AI events:
     An audio manager was added that provides FIFO control using AI events.  (An AI 
     event occurs when the register for the AI-DMA settings, which make up the FIFO 
     data structure, goes from being full to not full.)  The audio manager uses AI 
     events to switch the order of the FIFO queue. Thus, unlike the previous version 
     which used only a retrace, this version makes it unnecessary to adjust the size 
     of the synthesized sample. In addition, no noise occurs because the FIFO queue 
     logically does not empty. Moreover, 2 buffers are sufficient for the 
     synthesized sample data (previously 3 were needed).  However, the size of the 
     synthesized sample data must be a multiple of 16 (184 for n_audio microcode). 
     Consequently, the timing of AI events varies with each frame, and deviates 
     from the timing of the start of the audio tasks. This should be noted for 
     programs that specify in the application the time free of RSP processing. 
     (Although some degree of control is possible, it was not provided in the 
     present version.) When using the audio manager, initialize it using 
     nuAuInitEx() or nuAuMgrInitEx().  
	
  -- Improved the audio manager: 
     With the audio manager that used only a retrace, control resulted from 
     determining the sample size used to set the FIFO queue for the frame after the 
     next frame. The size was determined based on number of samples remaining in 
     the queue. With this method, however, control was not reflected until 2 frames 
     after current frame, preventing good control.  Thus, depending on the playback 
     frequency, it was therefore necessary to regulate the number of remaining 
     samples. This was modified so that the size of the synthesized samples is 
     predicted using the number samples in next frame as well as the number of 
     samples remaining in the queue. In addition, the control method was changed so 
     that, while the previous unit of control was the number of samples in 1 frame, 
     it became the number of samples in 1.25 frames.  

     Previously, audio was created by setting FIFO, creating the audio commands, 
     and starting the audio task, in that order.  However, in some cases the DMA 
     transfer did not occur in time for the start of audio. The order was therefore 
     changed to setting FIFO, starting the audio task, and creating the audio task.
	  

  -- Decreased the amount of memory used:
     Made changes so that the number of synthesized samples is calculated based 
     on the playback frequency, retrace count, and frame rate.  This sample 
     number is used in reserving heap memory. In addition, the size of an audio 
     command was changed. The amount of memory used was also greatly reduced by 
     modifying audio manager processing. 

  -- Changed the PI-DMA processing that occurs with callback: 
     Previously, the DMA buffer areas were freed using the frame counter. This was 
     changed so that a counter is provided for each area.  This is used to free 
     that area. In addition, the number of frames stored was reduced from 2 to 1. 
     This slightly reduced the number of DMA buffers required.

  -- Added measures for debug tuning: 
     Modified to allow measurement of the size of the DMA buffer used, the number 
     of DMA callbacks, the number of times PI-DMA is performed, and the maximum 
     size of the command list. In addition, a flag indicates when the number of DMA 
     buffers or that the command list buffer is insufficient, the DMA buffer is too 
     small, or there are no samples remaining. 

  -- Changed nuAuInit() and nuAuMgrInit():
     Modified so that nuAuInit() and nuAuMgrInit() return the size of the heap used. 

  -- Added heap memory functions: 
     Added a function that acquires and initializes heap memory. 
     Also added was a function that obtains the size of used and free heap memory.

  -- Consolidated the source code in the audio and n_audio libraries: 
     Consolidated the microcode libraries for audio and n_audio, which were 
     previously separate. 

  -- Modified nualsgi_n.h: 
     Modified nualsgi_n.h to include only the N_AUDIO definition, nualsgi.h, and the 
     n_audio microcode header. 

  -- Modified to support PAL:
     PAL support previously required recompiling the library. This was changed by 
     adding a frame-rate variable to the Scheduler and using this variable to 
     determine the video parameters. As a result, recompiling is now generally not 
     required for PAL support. 
	  

Audio changes: (mus library)

  -- Support for mus library Version 3:
     Beginning with Version 3, the mus library was modified to allow use of an 
     external scheduler. This allowed mus and NuSystem to be separated and the mus 
     library functions to be used directly.  Versions of the mus library other than 
     Version 3 can not be used.

  -- Allowed for multiple sequence players: 
     Beginning with mus library Version 3, multiple sequences (songs) can be played. 
     Thus, as in the nualsgi library, the number of sequence players was changed to 
     two.  As a result, the sequence-related functions were modified.

  -- Changed type of nuAuStlInit() and nuAuStlMgrInit():
     Modified nuAuStlInit() and nuAuStlMgrInit() to return the size of the used 
     heap.

  -- Function changes due to changes in Version 3 of mus library: 
     Added nuAuStlPtrBankInit(), nuAuStlPtrBankSet(), nuAuStlSeqPlayerInit(),
     and nuAuStlSndPlayerDataSet().

     Changed nuAuStlSeqPlayerDataSet() to nuAuStlSeqPlayerDataSet().

     Eliminated nuAuStlBankSet() and nuAuStlPlayerInit().

  -- Added a heap memory function:
     Added a function that can obtain the amount of heap memory used and available.  

  -- Consolidated the source code in the audio and n_audio libraries:
     Consolidated the libraries used for the audio and n_audio microcode, which 
     were previously separate.

  -- Changed nualsgi_n.h:
     Modified nualsgi_n.h to include only the N_AUDIO definition, nualsgi.h, and 
     the n_audio microcode header. 
	

Graphics changes

  -- Changed the variable nuGfxDisplay:
     Previously when the variable nuGfxDisplay was set to NU_GFX_DISPLAY_ON in 
     nuGfxDisplayOn(), osViBlack(FALSE) was used in nuGfxTaskMgr() for each frame 
     to turn the screen display on. This was changed so that the flag 
     NU_GFX_DISPLAY_ON_TRIGGER is set and, after osViBlack(FALSE) is called, 
     NU_GFX_DISPLAY_ON is stored in uGfxDisplay. This allows osViBlack(FALSE) to be 
     called only once after nuGfxDisplayOn().

  -- Changed nuGfxSetCfb():
     Modified nuGfxSetCfb() so that it registers the number of frame buffers, 
     allowing the Scheduler to handle single frame buffers. In addition, the 
     pointerarray of the frame buffers to be registered is checked, and if all the 
     pointers have same address, the number of frame buffers is set to 1.

  -- Support for XBUS microcode and self-loading:
     Provided support for XBUS microcode.  Because of the Scheduler, XBUS microcode 
     could actually be used even with the previous NuSystem.  However, because the 
     necessary values for the flags of the OSTask structure could not be specified 
     internally, special tasks and self-loading were precluded.  Thus, the following 
     values for the nuGfxTaskStart() flag were added.  More than one of these values 
     can be specified at once using a logical OR condition.
	  

	NU_SC_NORDP		Either the RDP is not used or a wait for 
				messages from the RDP is not performed. Usually 
				specified when only RSP microcode is used.						
	NU_SC_UCODE_XBUS	Specified when BUS microcode is used
	NU_SC_TASK_YIELDED	Equivalent to OS_TASK_YIELDED.
	NU_SC_TASK_DP_WAIT	Equivalent to OS_TASK_DP_WAIT.
	NU_SC_TASK_LODABLE	Equivalent to OS_TASK_LOADABLE. 
				Specified when the UCODE self-loading feature is 
				used.		
	NU_SC_TASK_SP_ONLY	Equivalent to OS_TASK_SP_ONLY.
	  
PI Manager

  -- nuPiReadRom()
     Modified so that when data are transferred from Game Pak by PI-DMA, they are 
     transferred in 1-block units, each 16,384 bytes in size.  

     This change was made because transferring a large amount of data by PI-DMA at 
     one time disables the transfer of audio data by PI-DMA, and noise occurs in the 
     audio.


SI Manager

  -- Modified internal processing:
     Previously, in each thread registered with the SI manager, the manager for each 
     device was called, and the messages sent were compared with a switch statement. 
     However, the possibility emerged that the types of devices connected to the SI 
     could increase in number and place heavy burden on this processing.  Processing 
     was therefore changed so that a major number is assigned to each device 
     manager, and a table of function pointers is registered in the SI manager for 
     each device manager.  Messages to a device manager are sent to the SI manager 
     in the form major number + minor number.  The SI manager calls the function 
     corresponding to the minor number in the pointer table corresponding to the 
     major number.  This greatly reduces the number of comparison operations, 
     lightening the processing load on the SI manager.  Because these modifications 
     involve major changes in the flow of processing, caution must be exercised 
     when changing SI devices.
	
  -- Modified the SI manager registration functions:
     The changes in internal processing were accompanied by changes to the SI 
     manager registration functions nuSiCallBackAdd() and nuSiCallBackRemove(). 
     Note that the number of parameters in nuSiCallBackAdd() were decreased.

  -- Added functions that send messages to the SI manager:
     The changes to the SI manager were accompanied by standardization of the 
     format of messages sent to the SI manager and the introduction of the 
     special-purpose functions nuSiSendMesg() (synchronous) and nuSiSendMesgNW() 
     (asynchronous). The arguments to these functions are pointers that indicate 
     the message number and the location of the data sent and received. If the SI 
     manager is customized, these functions should be used to send it messages. 
	  

  -- Added functions to stop and restart the SI manager:
     Added the function nuSiMgrStop(), which stops the SI manager, and 
     nuSiMgrRestart(), which enables it to be restarted. During the time that the SI 
     manager is stopped by nuSiMgrStop(), the user application can use nuSiMesgQ, 
     which is associated with SI events. The SI manager does not receive retrace 
     messages while it is stopped. 


  -- Changed nuContPakOpen():
     osPfsInitPak() had internally checked whether a Controller Pak was inserted 
     and, if not, checked for a Rumble Pak.  However, with subsequent OS changes,  
     nuContPakRepairId() became incapable of normal processing when the data in the 
     ID area of an inserted Controller Pak were destroyed. This problem was fixed.
     As a result, nuContPakOpen() was changed so that it does not check for a 
     Rumble Pak.


  -- Added nuContRmbStop():
     Added the function nuContRmbStop(), which stops the Rumble Pak from vibrating. 

  -- Added support for voice recognition: 
     Added support for voice recognition system and added a voice recognition 
     system manager.


Debug Console
  -- Support for reversed characters:
     Reversed characters were added to the character attributes of the debug 
     console.  To use this attribute, specify NU_DEB_CON_ATTR_REVERSE. 



Version 1.20
	
  -- Supported the N64 GB Pak:
     Added the 64GB Pak Manager and control functions.

  -- Fixed Rumble Pak Manager problems:
     Fixed a bug in the Rumble Pak Manager that caused the program to hang when a 
     Pre-NMI occurred.

  -- Improved the character font of the debug console:
     Changed the font used in debugging.  Also improved the display method so that 
     characters are no longer destroyed due to a problem resulting from coverage.

  -- Added a character output function for the debug console:
     Added the function nuDebConPrintf(), although it is not yet complete.  
     Floating-point display is not yet supported.

  -- Modified Controller Pak functions:
     Modified the Controller Pak functions so that they return errors.

  -- Supported F3DEX2:
     Added the F3DEX2 graphics initialization function nuGfxInitEX2().

     Added nuDebConDispEX2() to the debug console and nuDebTaskPerfBar0EX2(), 
     nuDebTaskPerfBar1EX2() to the performance meter.  Also changed the header file 
     so that when F3DEX_GBI_2 is defined, both the debug console and performance 
     meter automatically use the F3DEX2 functions.

  -- Provided SRAM support for the PI functions:
     Added the functions nuPiInitSram and nuPiReadWritSram.

Version 1.11

  -- Corrected previous omission to compile the nuDebConWindowShow function. 
  -- Corrected previous omission to include nuDebConWindowShow in Makefile. 
	

Version 1.10

  -- Support for EPI

  -- Support for Z-Sort microcode

  -- nusys.h

  -- Added NU_SC_NORDP:

     nusched.c
     - Changed the nuScExecuteGraphics function so it does not wait 
       for RDP to end when NU_SC_NORDP.
     - Made change so RDP end time is not measured when NU_SC_NORDP. 
		
     nugfxtaskmgr.c
     - In the nuGfxTaskMgr function, changed the nuGfxSwapCfbFunc argument
       from framebuffer to the NuScTask structure. 
     - Changed the nuGfxTaskEndFunc argument to the NuScTask structure. 

     nugfxswapcfb.c
     - Since the nuGfxSwapCfbFunc argument was changed, also changed it 
       so that the framebuffer address is gotten from the gfxTask structure.
			
  -- Changed the Controller Manager: 
     Divided the Controller Manager into separate SI Manager and 
     Controller Manager parts.  Now the Controller Manager, like the 
     Controller Pak Manager and the Rumble Pak Manager, is called back
     by the SI Manager. 
		
  -- Changed the nuDebConClear function:
     Made change so that when the NuDebConClear function is called,
     the text display returns to its original point. 

  -- Support for EEPROM:
     Added the EEPROM Manager. 

  -- Support for high-resolution debug console. 

  -- Support for high-resolution performance meter. 

  -- Improved the performance meter:
     Added an RDP internal counter bar to the performance
     meter nuDebTaskPerf1().

  -- Deleted nuContPakFileReSize and nuContPakFileReSizeJis.

  -- Corrected problems with the Rumble Pak Manager. 

  -- Changed nuContDataGet and nuContDataGetAll from macros to functions. 

  -- Used semaphores for exclusive control of the copy part of the Controller data 
     of the nuContDataGet, nuContDataGetAll, nuContDataGetEx and nuContDataGetExAll 
     functions.
	
	
	
			
