This document is also located under /nusys/src/nusys-2.06/nusys/history.
- Corrected the spelling error in NU_SC_TASK_LOADABLE.
- In nuboot.c function, idle, a function pointer nuIdleFunc was regarded as a register value due to optimization of the compiler, therefore the registration of nuIdleFunc function from the application could not be validated. This was fixed.
* Modified the Default Graphics Microcode
- In the past, the F3DEX-related microcodes have been the default microcode. Beginning with this version, F3DEX2 will be the default. 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 (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 the FIFO buffer for the graphics microcode. Added nuGfxSetUcodeFifo() for setting and changed nuGfInit() and nuGfxInitEX2().
* Additions and Changes to the Boot Code
- Beginning with OS2.0K, the osInitialize() function becomes a macro that allows initialization processing for each development environment. As a result, object codes have been added to nuboot.c to include the initialization code for various development environments. The added object codes include:
for ROM debugging
nusys.o nusys_ptn.o nusys_isv.o nusys_emu.o nusys_msp.o
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
* Problems which were Fixed
- Fixed a problem in the nuContMgrInit function, where the local variable would not be shifted when an error occurs, and the value would become incorrect.
* Changed the Compile Environment
- Libraries are now created in the O2 (Irix6.3) environment, whereas 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 does not indicate the total processing time, but rather the time from a retrace (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.
- 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 were used without being initialized, and zero-divide exceptions were 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, we 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.
- Fixed the place in nupireadrom.c where, when the PI function is used, sometimes the read size specification was not made. However, we do not recommend using the PI function.
- 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)
- Fixed a problem with the Controller read functions. Corrected the problem in the message sending portion of the nuContDataReadStart function and the nuContDataRead function.
- 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.
* 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,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 pointer array 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.
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
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 system:
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.
Supported the N64 GB Pak:
Added the N64 GB 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.
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.
Corrected previous omission to compile the nuDebConWindowShow function. Corrected previous omission to include nuDebConWindowShow in Makefile.
Support for EPI
Support for Z-Sort microcode
- 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.
- n 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.