Browse Source

* ARM9 detection routine does not generate errors anymore
* Updated libmikmod
* libnds related changes:
* Fixed sound core
* Improved interrupt handling
- Removed unused code

git-svn-id: trunk@10542 -

Legolas 17 years ago
parent
commit
f262aff7ef

+ 173 - 2
packages/libndsfpc/src/libmikmod/inc/mikmod.inc

@@ -23,8 +23,8 @@
 (**** CONST *******************************************************************)
 (**** CONST *******************************************************************)
 const
 const
   LIBMIKMOD_VERSION_MAJOR = 3;
   LIBMIKMOD_VERSION_MAJOR = 3;
-  LIBMIKMOD_VERSION_MINOR = 1;
-  LIBMIKMOD_REVISION      = 10;
+  LIBMIKMOD_VERSION_MINOR = 2;
+  LIBMIKMOD_REVISION      = 0;
 
 
   LIBMIKMOD_VERSION = (
   LIBMIKMOD_VERSION = (
                         (LIBMIKMOD_VERSION_MAJOR shl 16) or
                         (LIBMIKMOD_VERSION_MAJOR shl 16) or
@@ -88,6 +88,7 @@ const
   DMODE_SOFT_SNDFX = $0004; 
   DMODE_SOFT_SNDFX = $0004; 
   DMODE_SOFT_MUSIC = $0008; 
   DMODE_SOFT_MUSIC = $0008; 
   DMODE_HQMIXER    = $0010; 
   DMODE_HQMIXER    = $0010; 
+  DMODE_FLOAT      = $0020;
   DMODE_SURROUND   = $0100; 
   DMODE_SURROUND   = $0100; 
   DMODE_INTERP     = $0200;
   DMODE_INTERP     = $0200;
   DMODE_REVERSE    = $0400;
   DMODE_REVERSE    = $0400;
@@ -146,6 +147,7 @@ const
 
 
   MAXSAMPLEHANDLES  = 384;
   MAXSAMPLEHANDLES  = 384;
 
 
+  STM_NTRACKERS = 3;
 
 
 (****** Types *****************************************************************)
 (****** Types *****************************************************************)
 type
 type
@@ -243,6 +245,18 @@ type
     MMERR_MAC_SPEED,
     MMERR_MAC_SPEED,
     MMERR_MAC_START,
     MMERR_MAC_START,
 
 
+    MMERR_OSX_UNKNOWN_DEVICE,
+    MMERR_OSX_BAD_PROPERTY,
+    MMERR_OSX_UNSUPPORTED_FORMAT,
+    MMERR_OSX_SET_STEREO,
+    MMERR_OSX_BUFFER_ALLOC,
+    MMERR_OSX_ADD_IO_PROC,
+    MMERR_OSX_DEVICE_START,
+    MMERR_OSX_PTHREAD,
+    
+    MMERR_DOSWSS_STARTDMA,
+    MMERR_DOSSB_STARTDMA,
+    
     MMERR_MAX
     MMERR_MAX
   );
   );
     
     
@@ -329,6 +343,7 @@ type
     fadevol: cushort;
     fadevol: cushort;
     panning: csshort;
     panning: csshort;
     kick: cuchar;
     kick: cuchar;
+    kick_flag: cuchar;
     period: cushort;
     period: cushort;
     nna: cuchar;
     nna: cuchar;
     volflg: cuchar;
     volflg: cuchar;
@@ -362,7 +377,9 @@ type
 
 
   MP_CONTROL = packed record
   MP_CONTROL = packed record
     main: MP_CHANNEL;
     main: MP_CHANNEL;
+    
     slave: PMP_VOICE;
     slave: PMP_VOICE;
+    
     slavechn: cuchar;
     slavechn: cuchar;
     muted: cuchar;
     muted: cuchar;
     ultoffset: cushort;
     ultoffset: cushort;
@@ -394,27 +411,34 @@ type
     vibpos: cschar;
     vibpos: cschar;
     vibspd: cuchar;
     vibspd: cuchar;
     vibdepth: cuchar;
     vibdepth: cuchar;
+    
     trmpos: cschar;
     trmpos: cschar;
     trmspd: cuchar;
     trmspd: cuchar;
     trmdepth: cuchar;
     trmdepth: cuchar;
+    
     fslideupspd: cuchar;
     fslideupspd: cuchar;
     fslidednspd: cuchar;
     fslidednspd: cuchar;
     fportupspd: cuchar;
     fportupspd: cuchar;
     fportdnspd: cuchar;
     fportdnspd: cuchar;
     ffportupspd: cuchar;
     ffportupspd: cuchar;
     ffportdnspd: cuchar;
     ffportdnspd: cuchar;
+    
     hioffset: cuint;
     hioffset: cuint;
     soffset: cushort;
     soffset: cushort;
+    
     sseffect: cuchar;
     sseffect: cuchar;
     ssdata: cuchar;
     ssdata: cuchar;
     chanvolslide: cuchar;
     chanvolslide: cuchar;
+    
     panbwave: cuchar;
     panbwave: cuchar;
     panbpos: cuchar;
     panbpos: cuchar;
     panbspd: cschar;
     panbspd: cschar;
     panbdepth: cuchar;
     panbdepth: cuchar;
+    
     newsamp: cushort;
     newsamp: cushort;
     voleffect: cuchar;
     voleffect: cuchar;
     voldata: cuchar;
     voldata: cuchar;
+    
     pat_reppos: csshort;
     pat_reppos: csshort;
     pat_repcnt: cushort;
     pat_repcnt: cushort;
   end;
   end;
@@ -494,6 +518,20 @@ type
   TModule = MODULE;
   TModule = MODULE;
   PModule = ^MODULE;
   PModule = ^MODULE;
 
 
+
+  VOICEINFO = packed record
+    i: PInstrument;
+    s: PSample;
+    panning: csshort;
+    volume: cschar;
+    period: cushort;
+    kick: cuchar;
+  end;
+  TVoiceInfo = VOICEINFO;
+  PVoiceInfo = ^VOICEINFO;
+  
+
+
   drvenum1 = (
   drvenum1 = (
     MD_MUSIC = 0,
     MD_MUSIC = 0,
     MD_SNDFX
     MD_SNDFX
@@ -615,6 +653,7 @@ type
     HardVoiceLimit: cuchar;
     HardVoiceLimit: cuchar;
     SoftVoiceLimit: cuchar;
     SoftVoiceLimit: cuchar;
     Alias: pcchar;
     Alias: pcchar;
+    CmdLineHelp: pcchar;
     CommandLine: TMDCommandLine;
     CommandLine: TMDCommandLine;
     IsPresent: TMDIsPresent;
     IsPresent: TMDIsPresent;
     SampleLoad: TMDSampleLoad;
     SampleLoad: TMDSampleLoad;
@@ -788,6 +827,7 @@ var
 
 
   load_669: MLOADER; cvar; external; (* 669 and Extended-669 (by Tran/Renaissance) *)
   load_669: MLOADER; cvar; external; (* 669 and Extended-669 (by Tran/Renaissance) *)
   load_amf: MLOADER; cvar; external; (* DMP Advanced Module Format (by Otto Chrons) *)
   load_amf: MLOADER; cvar; external; (* DMP Advanced Module Format (by Otto Chrons) *)
+  load_asy: MLOADER; cvar; external; (* ASYLUM Music Format 1.0 *)
   load_dsm: MLOADER; cvar; external; (* DSIK internal module format *)
   load_dsm: MLOADER; cvar; external; (* DSIK internal module format *)
   load_far: MLOADER; cvar; external; (* Farandole Composer (by Daniel Potter) *)
   load_far: MLOADER; cvar; external; (* Farandole Composer (by Daniel Potter) *)
   load_gdm: MLOADER; cvar; external; (* General DigiMusic (by Edward Schlunder) *)
   load_gdm: MLOADER; cvar; external; (* General DigiMusic (by Edward Schlunder) *)
@@ -825,6 +865,7 @@ var
 {$ifdef ARM9}
 {$ifdef ARM9}
 var
 var
   md_bpm: cushort; cvar;
   md_bpm: cushort; cvar;
+  
 procedure MikMod9_SendCommand(command: cuint); cdecl; {forward;}external; 
 procedure MikMod9_SendCommand(command: cuint); cdecl; {forward;}external; 
 function Player_LoadMemory(const buffer: pointer; size: cint; maxchan: cint; curious: cint): PModule; cdecl; external;
 function Player_LoadMemory(const buffer: pointer; size: cint; maxchan: cint; curious: cint): PModule; cdecl; external;
 {$endif ARM9}
 {$endif ARM9}
@@ -904,6 +945,42 @@ procedure _mm_write_M_ULONGS(value1: pcuint; value2: cint; value3: PMWriter); cd
 procedure _mm_write_I_ULONGS(value1: pcuint; value2: cint; value3: PMWriter); cdecl; external;
 procedure _mm_write_I_ULONGS(value1: pcuint; value2: cint; value3: PMWriter); cdecl; external;
 
 
 
 
+procedure SL_HalveSample(value1: PSAMPLOAD; value2: cint); cdecl; external;
+procedure SL_Sample8to16(value: PSAMPLOAD); cdecl; external;
+procedure SL_Sample16to8(value: PSAMPLOAD); cdecl; external;
+procedure SL_SampleSigned(value: PSAMPLOAD); cdecl; external;
+procedure SL_SampleUnsigned(value: PSAMPLOAD); cdecl; external;
+function SL_LoadSamples(): cint; cdecl; external;
+function SL_RegisterSample(value1: PSAMPLE; value2: cint; value3: PMREADER): PSAMPLOAD; cdecl; external;
+function SL_Load(value1: pointer; value2: PSAMPLOAD; value3: cuint): cint; cdecl; external;
+function SL_Init(value: PSAMPLOAD): cint; cdecl; external;
+procedure SL_Exit(value: PSAMPLOAD); cdecl; external;
+
+
+
+
+procedure UniSetRow(value: pcuchar); cdecl; external;
+function UniGetByte(): cuchar; cdecl; external;
+function UniGetWord(): cushort; cdecl; external;
+function UniFindRow(value1: pcuchar; value2: cushort): pcuchar; cdecl; external;
+procedure UniSkipOpcode(); cdecl; external;
+procedure UniReset(); cdecl; external;
+procedure UniWriteByte(value: cuchar); cdecl; external;
+procedure UniWriteWord(value: cushort); cdecl; external;
+procedure UniNewline(); cdecl; external;
+function UniDup(): pcuchar; cdecl; external;
+function UniInit(): cint; cdecl; external;
+procedure UniCleanup(); cdecl; external;
+procedure UniEffect(value1: cushort; value2: cushort); cdecl; external;
+procedure UniInstrument(x: cushort); inline;
+procedure UniNote(x: cushort); inline;
+procedure UniPTEffect(value1: cuchar; value2: cuchar); cdecl; external;
+procedure UniVolEffect(value1: cushort; value2: cuchar); cdecl; external;
+
+
+
+
+
 function MikMod_strerror(value: cint): pcchar; cdecl; external;
 function MikMod_strerror(value: cint): pcchar; cdecl; external;
 function MikMod_RegisterErrorHandler(value: MikMod_handler_t): MikMod_handler_t; cdecl; external;
 function MikMod_RegisterErrorHandler(value: MikMod_handler_t): MikMod_handler_t; cdecl; external;
 
 
@@ -912,6 +989,7 @@ procedure MikMod_RegisterAllDrivers(); cdecl; external;
 function MikMod_InfoDriver(): pcchar; cdecl; external;
 function MikMod_InfoDriver(): pcchar; cdecl; external;
 procedure MikMod_RegisterDriver(value: PMDriver); cdecl; external;
 procedure MikMod_RegisterDriver(value: PMDriver); cdecl; external;
 function MikMod_DriverFromAlias(value: pcint): cint; cdecl; external;
 function MikMod_DriverFromAlias(value: pcint): cint; cdecl; external;
+function MikMod_DriverByOrdinal(value: cint): PMDriver; cdecl; external;
 
 
 function MikMod_Init(value: string): cint; cdecl; external;
 function MikMod_Init(value: string): cint; cdecl; external;
 procedure MikMod_Exit(); cdecl; external;
 procedure MikMod_Exit(); cdecl; external;
@@ -972,6 +1050,7 @@ procedure Player_Mute(value: csint; args: array of const); cdecl; external;
 procedure Player_ToggleMute(value: csint; args: array of const); cdecl; external;
 procedure Player_ToggleMute(value: csint; args: array of const); cdecl; external;
 function Player_GetChannelVoice(value: cuchar): cint; cdecl; external;
 function Player_GetChannelVoice(value: cuchar): cint; cdecl; external;
 function Player_GetChannelPeriod(value: cuchar): cushort; cdecl; external;
 function Player_GetChannelPeriod(value: cuchar): cushort; cdecl; external;
+function Player_QueryVoices(numvoices: cushort; vinfo: PVOICEINFO): cint; cdecl; external; 
 
 
 function MikMod_RegisterPlayer(value: MikMod_player_t): MikMod_player_t; cdecl; external;
 function MikMod_RegisterPlayer(value: MikMod_player_t): MikMod_player_t; cdecl; external;
 
 
@@ -1060,6 +1139,87 @@ type
     NDS_HW_CMD_VOICE_UPDATE
     NDS_HW_CMD_VOICE_UPDATE
   );
   );
   
   
+
+var
+  modreader: PMREADER; cvar; external; 
+  finetune: array [0..15] of cushort; cvar; external;
+  _of: MODULE; external name 'of';
+  npertab: array [0..(7 * OCTAVE) - 1] of cushort; cvar; external;
+
+  remap: array [0..UF_MAXCHAN - 1] of cschar; cvar; external;
+  poslookup: pcuchar; cvar; external;
+
+  poslookupcnt: cuchar; cvar; external;
+  origpositions: pcushort; cvar; external;
+
+  filters: cint; cvar; external;
+  activemacro: cuchar; cvar; external;
+  filtermacros: array [0..UF_MAXMACRO - 1] of cuchar; cvar; external;
+  filtersettings: array [0..UF_MAXFILTER - 1] of FILTER; cvar; external;
+
+  noteindex: pcint; cvar; external;
+
+
+function ReadComment(value: cushort): cint; cdecl; external;
+function ReadLinedComment(value1: cushort; value2: cushort): cint; cdecl; external;
+function AllocPositions(value: cint): cint; cdecl; external;
+function AllocPatterns(): cint; cdecl; external;
+function AllocTracks(): cint; cdecl; external;
+function AllocInstruments(): cint; cdecl; external;
+function AllocSamples(): cint; cdecl; external;
+function DupStr(value1: pcchar; value2: cushort; value3: cint): pcchar; cdecl; external;
+
+function AllocLinear(): pcint; cdecl; external;
+procedure FreeLinear(); cdecl; external;
+function speed_to_finetune(value1: cuint; value2: cint): cint; cdecl; external;
+procedure S3MIT_ProcessCmd(value1: cuchar; value2: cuchar; value3: cuint); cdecl; external;
+procedure S3MIT_CreateOrders(value: cint); cdecl; external;
+
+function getlinearperiod(value1: cushort; value2: cuint): cushort; cdecl; external;
+function getfrequency(value1: cushort; value2: cuint): cuint; cdecl; external;
+
+var
+  STM_Signatures: array [0..STM_NTRACKERS - 1] of pcchar; cvar; external;
+  md_numchn: cushort; cvar; external;
+  md_sngchn: cushort; cvar; external;
+  md_sfxchn: cushort; cvar; external;
+  md_hardchn: cushort; cvar; external;
+  md_softchn: cushort; cvar; external;
+  
+  
+function MD_SampleLoad(value1: PSAMPLOAD; value2: cint): csshort; cdecl; external;
+procedure MD_SampleUnload(value: csshort); cdecl; external;
+function MD_SampleSpace(value: cint): cuint; cdecl; external;
+function MD_SampleLength(value1: cint; value2: PSAMPLE): cuint; cdecl; external;
+
+procedure unsignedtoulaw(value1: pcchar; value2: cint); cdecl; external;
+
+function MD_GetAtom(value1, value2: pcchar; value3: cint): pcchar; cdecl; external;
+
+procedure VC_SetupPointers(); cdecl; external;
+function VC1_Init(): cint; cdecl; external;
+function VC2_Init(): cint; cdecl; external;
+
+
+procedure _mm_registerdriver(value: PMDRIVER); cdecl; external;
+procedure _mm_registerloader(value: PMLOADER); cdecl; external;
+function MikMod_Active_internal(): cint; cdecl; external;
+procedure MikMod_DisableOutput_internal(); cdecl; external;
+function MikMod_EnableOutput_internal(): cint; cdecl; external;
+procedure MikMod_Exit_internal(); cdecl; external;
+function MikMod_SetNumVoices_internal(value1, value2: cint): cint; cdecl; external;
+procedure Player_Exit_internal(value: PMODULE); cdecl; external;
+procedure Player_Stop_internal(); cdecl; external;
+function Player_Paused_internal(): cint; cdecl; external;
+procedure Sample_Free_internal(value: PSAMPLE); cdecl; external;
+procedure Voice_Play_internal(value1: cschar; value2: PSAMPLE; value3: cuint); cdecl; external;
+procedure Voice_SetFrequency_internal(value1: cschar; value2: cuint); cdecl; external;
+procedure Voice_SetPanning_internal(value1: cschar; value2: cuint); cdecl; external;
+procedure Voice_SetVolume_internal(value1: cschar; value2: cushort); cdecl; external;
+procedure Voice_Stop_internal(value: cschar); cdecl; external;
+function Voice_Stopped_internal(value: cschar): cint; cdecl; external;
+
+
 {$endif NDS_INTERFACE}
 {$endif NDS_INTERFACE}
 
 
 {$ifdef NDS_IMPLEMENTATION}
 {$ifdef NDS_IMPLEMENTATION}
@@ -1073,4 +1233,15 @@ begin
     FreeMem(p);
     FreeMem(p);
   p := nil;
   p := nil;
 end;
 end;
+
+procedure UniInstrument(x: cushort); inline;
+begin
+  UniEffect(cushort(UNI_INSTRUMENT), x)
+end; 
+
+procedure UniNote(x: cushort); inline;
+begin
+  UniEffect(cushort(UNI_NOTE), x)
+end;
+
 {$endif NDS_IMPLEMENTATION}
 {$endif NDS_IMPLEMENTATION}

+ 41 - 3
packages/libndsfpc/src/nds/arm9/sound.inc

@@ -39,7 +39,45 @@
 *)
 *)
 
 
 {$ifdef NDS_INTERFACE}
 {$ifdef NDS_INTERFACE}
-procedure playSound(sound: pTransferSoundData); cdecl; external;
-procedure setGenericSound(rate: cuint32; vol: cuint8; pan: cuint8; format: cuint8); cdecl; external;
-procedure playGenericSound(const data: pointer; length: cuint32); cdecl; external;
+var
+  Snd: TTransferSound;
+  SndDat: TTransferSoundData; //  =		{ (void *)0 , 0, 11025, 64, 64, 1 };
+
+procedure playSound(ASound: pTransferSoundData);
+procedure setGenericSound(rate: cuint32; vol: cuint8; pan: cuint8; format: cuint8);
+procedure playGenericSound(data: pointer; length: cuint32);
 {$endif NDS_INTERFACE}
 {$endif NDS_INTERFACE}
+
+{$ifdef NDS_IMPLEMENTATION}
+procedure playSoundBlock(ASnd: PTransferSound);
+begin
+	DC_FlushRange(ASnd, sizeof(TTransferSound));
+	IPC^.soundData := ASnd;
+end;
+
+procedure setGenericSound(rate: cuint32; vol: cuint8; pan: cuint8; format: cuint8);
+begin
+	SndDat.rate		:= rate;
+	SndDat.vol		:= vol;
+	SndDat.pan		:= pan;
+	SndDat.format	:= format;
+end;
+
+procedure playSound(ASound: pTransferSoundData);
+begin
+	Snd.count := 1;
+	Move(ASound^,  Snd.data[0], sizeof(TTransferSoundData) );
+	playSoundBlock(@Snd);
+end;
+
+procedure playGenericSound(data: pointer; length: cuint32);
+begin
+	Snd.count := 1;
+  move(SndDat, Snd.data, sizeof(TTransferSoundData) );
+	Snd.data[0].data := data;
+	Snd.data[0].len := length;
+	playSoundBlock(@Snd);
+end;
+
+
+{$endif NDS_IMPLEMENTATION}

+ 10 - 4
packages/libndsfpc/src/nds/interrupts.inc

@@ -86,14 +86,20 @@ const
   IME_ENABLE  : IME_VALUE = 1;  (* Enable all interrupts not masked out in REG_IE *)
   IME_ENABLE  : IME_VALUE = 1;  (* Enable all interrupts not masked out in REG_IE *)
 
 
 
 
+type
+  TVoidFunctionPointer = procedure of object;
+  
 var
 var
 //  __irq_vector: array [0..0] of VoidFunctionPointer; cvar; external;
 //  __irq_vector: array [0..0] of VoidFunctionPointer; cvar; external;
 //  __irq_vector: array [0..0] of Pointer; cvar; external;
 //  __irq_vector: array [0..0] of Pointer; cvar; external;
 //  __irq_flags: array [0..0] of cuint32; cvar; external;
 //  __irq_flags: array [0..0] of cuint32; cvar; external;
 //  __irq_flags: pcuint32; cvar; external;
 //  __irq_flags: pcuint32; cvar; external;
 //  __irq_vector: ^VoidFunctionPointer; cvar; external;
 //  __irq_vector: ^VoidFunctionPointer; cvar; external;
-  __irq_vector: Pointer; cvar; external;
-  __irq_flags: pcuint32; cvar; external;
+
+///  __irq_vector: Pointer; cvar; external;
+///  __irq_flags: pcuint32; cvar; external;
+  __irq_vector: Pointer; external name '__irq_vector';
+  __irq_flags: pcuint32; external name '__irq_flags';
 
 
 
 
 
 
@@ -107,10 +113,10 @@ type
   end;
   end;
 
 
 procedure irqInit(); cdecl; external;
 procedure irqInit(); cdecl; external;
-//procedure irqSet(irq: IRQ_MASK; handler: VoidFunctionPointer); cdecl; external;
+procedure irqSet(irq: IRQ_MASK; handler: TVoidFunctionPointer); cdecl; external;
 procedure irqSet(irq: IRQ_MASK; handler: pointer); cdecl; external;
 procedure irqSet(irq: IRQ_MASK; handler: pointer); cdecl; external;
 procedure irqClear(irq: IRQ_MASK); cdecl; external;
 procedure irqClear(irq: IRQ_MASK); cdecl; external;
-//procedure irqInitHandler(handler: VoidFunctionPointer); cdecl; external;
+procedure irqInitHandler(handler: TVoidFunctionPointer); cdecl; external;
 procedure irqInitHandler(handler: pointer); cdecl; external;
 procedure irqInitHandler(handler: pointer); cdecl; external;
 procedure irqEnable(irq: cuint32); cdecl; external;
 procedure irqEnable(irq: cuint32); cdecl; external;
 procedure irqDisable(irq: cuint32); cdecl; external;
 procedure irqDisable(irq: cuint32); cdecl; external;

+ 10 - 8
packages/libndsfpc/src/nds/ipc.inc

@@ -87,20 +87,22 @@ type
             end;
             end;
            ); 
            ); 
     end;
     end;
-    unixTime: cint32;
+//    unixTime: cint32; // Moved!
     
     
   	battery: cuint16;            // battery life ??  hopefully.  :)
   	battery: cuint16;            // battery life ??  hopefully.  :)
   	aux: cuint16;                // i have no idea...
   	aux: cuint16;                // i have no idea...
 
 
   
   
     // Don't rely on these below, will change or be removed in the future
     // Don't rely on these below, will change or be removed in the future
-  	soundData: pTransferSound;
+  	soundData: PTransferSound;
     mailAddr: cuint32;
     mailAddr: cuint32;
     mailData: cuint32;
     mailData: cuint32;
     mailRead: cuint8;
     mailRead: cuint8;
     mailBusy: cuint8;
     mailBusy: cuint8;
     mailSize: cuint32;
     mailSize: cuint32;
 
 
+    // unixTime here, because in the old position it breaked nds sound system O_o
+    unixTime: cint32;
   end;
   end;
   TransferRegion = sTransferRegion; 
   TransferRegion = sTransferRegion; 
   TTransferRegion = TransferRegion;
   TTransferRegion = TransferRegion;
@@ -129,14 +131,14 @@ const
 
 
 
 
 {$ifdef NDS_IMPLEMENTATION}
 {$ifdef NDS_IMPLEMENTATION}
-function getIPC(): pTransferRegion; inline;
+function getIPC(): PTransferRegion; inline;
 begin
 begin
-	getIPC := pTransferRegion(pointer($027FF000));
+	getIPC := PTransferRegion(pointer($027FF000));
 end;
 end;
 
 
-function IPC(): TransferRegion; 
+function IPC(): PTransferRegion; inline;
 begin
 begin
-	IPC := getIPC()^;
+	IPC := getIPC();
 end;
 end;
   
   
 procedure IPC_SendSync(sync: cuint); inline; 
 procedure IPC_SendSync(sync: cuint); inline; 
@@ -173,8 +175,8 @@ const
 {$endif NDS_INTERFACE}
 {$endif NDS_INTERFACE}
 
 
 {$ifdef NDS_INTERFACE}
 {$ifdef NDS_INTERFACE}
-function getIPC(): pTransferRegion; inline;
-function IPC(): TransferRegion; 
+function getIPC(): PTransferRegion; inline;
+function IPC(): PTransferRegion; inline;
 procedure IPC_SendSync(sync: cuint); inline; 
 procedure IPC_SendSync(sync: cuint); inline; 
 function IPC_GetSync(): cint; inline;
 function IPC_GetSync(): cint; inline;
 {$endif NDS_INTERFACE}
 {$endif NDS_INTERFACE}

+ 22 - 18
packages/libndsfpc/src/nds/registers_alt.inc

@@ -39,17 +39,20 @@
 *)
 *)
 
 
 {$ifdef NDS_INTERFACE}
 {$ifdef NDS_INTERFACE}
+type 
+  f32 = integer;
+
 const
 const
   REG_DISPCNT		: pcuint32 = pointer($4000000);
   REG_DISPCNT		: pcuint32 = pointer($4000000);
 
 
 {$ifdef ARM9}
 {$ifdef ARM9}
-  WAIT_CR = REG_EXMEMCNT;
+  {$define   WAIT_CR := REG_EXMEMCNT}
 {$else}
 {$else}
-  WAIT_CR = REG_EXMEMSTAT;
+  {$define   WAIT_CR := REG_EXMEMSTAT}
 {$endif}
 {$endif}
 
 
-  DISP_SR = REG_DISPSTAT;
-  DISP_Y = REG_VCOUNT;
+{$define   DISP_SR := REG_DISPSTAT}
+{$define   DISP_Y := REG_VCOUNT}
   
   
   REG_BGCTRL		: pcuint16 = pointer($4000008);
   REG_BGCTRL		: pcuint16 = pointer($4000008);
   REG_BG0CNT		: pcuint16 = pointer($4000008);
   REG_BG0CNT		: pcuint16 = pointer($4000008);
@@ -106,12 +109,13 @@ const
   REG_BLDMOD		: pcuint16 = pointer($4000050);
   REG_BLDMOD		: pcuint16 = pointer($4000050);
   REG_COLV		: pcuint16 = pointer($4000052);
   REG_COLV		: pcuint16 = pointer($4000052);
   REG_COLY		: pcuint16 = pointer($4000054);
   REG_COLY		: pcuint16 = pointer($4000054);
-  
-  SERIAL_CR = REG_SPICNT;
-  SERIAL_DATA = REG_SPIDATA;
-  SIO_CR = REG_SIOCNT;
-  R_CR = REG_RCNT;  
-  
+
+{$ifdef ARM7}
+  {$define SERIAL_CR := REG_SPICNT}
+  {$define SERIAL_DATA := REG_SPIDATA}
+  {$define SIO_CR := REG_SIOCNT}
+  {$define R_CR := REG_RCNT}  
+{$endif ARM7}
   (*	secondary screen *)
   (*	secondary screen *)
   REG_DISPCNT_SUB		: pcuint32 = pointer($4001000);
   REG_DISPCNT_SUB		: pcuint32 = pointer($4001000);
   REG_BGCTRL_SUB		: pcuint16 = pointer($4001008);
   REG_BGCTRL_SUB		: pcuint16 = pointer($4001008);
@@ -218,22 +222,22 @@ const
   REG_TM3CNT	: pcuint16 = pointer($400010E);
   REG_TM3CNT	: pcuint16 = pointer($400010E);
   
   
   
   
-  REG_SIOCNT		: pcuint16 = pointer($4000128);
+//  REG_SIOCNT		: pcuint16 = pointer($4000128);
   REG_SIOMLT_SEND	: pcuint16 = pointer($400012A);
   REG_SIOMLT_SEND	: pcuint16 = pointer($400012A);
   
   
-  KEYS		= REG_KEYINPUT;
-  KEYS_CR = REG_KEYCNT;
+{$define KEYS		:= REG_KEYINPUT}
+{$define KEYS_CR := REG_KEYCNT}
   //???
   //???
-  REG_RCNT		: pcuint16 = pointer($4000134);
+//  REG_RCNT		: pcuint16 = pointer($4000134);
   REG_HS_CTRL		: pcuint16 = pointer($4000140);
   REG_HS_CTRL		: pcuint16 = pointer($4000140);
   
   
   (* Interupt	enable registers *)
   (* Interupt	enable registers *)
-  IE  = REG_IE;
-  _IF	=	REG_IF;
-  IME	= REG_IME;
+{$define IE  := REG_IE}
+{$define _IF :=	REG_IF}
+{$define IME	:= REG_IME}
   
   
   (*controls power  0x30f	is all on *)
   (*controls power  0x30f	is all on *)
-  POWER_CR = REG_POWERCNT;
+{$define POWER_CR := REG_POWERCNT}
   
   
   (* ram	controllers	0x8	is enabled,	other bits have	to do with mapping *)
   (* ram	controllers	0x8	is enabled,	other bits have	to do with mapping *)
   REG_VRAM_A_CR	: pcuint8 = pointer($4000240);
   REG_VRAM_A_CR	: pcuint8 = pointer($4000240);

+ 1 - 20
packages/libndsfpc/src/nds/system.inc

@@ -83,17 +83,6 @@ end;
 
 
 {$ifdef ARM9}
 {$ifdef ARM9}
 {$ifdef NDS_INTERFACE}
 {$ifdef NDS_INTERFACE}
-{$ifdef DOXYGEN}
-type
-  ARM9_power = cint;
-const  
-  POWER_LCD       : ARM9_power = 0;
-  POWER_2D_A      : ARM9_power = 1;
-  POWER_MATRIX    : ARM9_power = 2;
-  POWER_3D_CORE   : ARM9_power = 3;
-  POWER_2D_B      : ARM9_power = 4;
-  POWER_SWAP_LCDS : ARM9_power = 5;
-{$else DOXYGEN}
 const
 const
   POWER_LCD			= (1 shl 0);
   POWER_LCD			= (1 shl 0);
   POWER_2D_A		= (1 shl 1);
   POWER_2D_A		= (1 shl 1);
@@ -103,7 +92,6 @@ const
   POWER_SWAP_LCDS	= (1 shl 15);
   POWER_SWAP_LCDS	= (1 shl 15);
   POWER_ALL_2D    = (POWER_LCD or POWER_2D_A or POWER_2D_B);
   POWER_ALL_2D    = (POWER_LCD or POWER_2D_A or POWER_2D_B);
   POWER_ALL       = (POWER_ALL_2D or POWER_3D_CORE or POWER_MATRIX);
   POWER_ALL       = (POWER_ALL_2D or POWER_3D_CORE or POWER_MATRIX);
-{$endif DOXYGEN}
 {$endif NDS_INTERFACE}
 {$endif NDS_INTERFACE}
 
 
 {$ifdef NDS_IMPLEMENTATION}
 {$ifdef NDS_IMPLEMENTATION}
@@ -126,17 +114,10 @@ end;
 
 
 {$ifdef ARM7}
 {$ifdef ARM7}
 {$ifdef NDS_INTERFACE}
 {$ifdef NDS_INTERFACE}
-{$ifdef DOXYGEN}
-type
-  ARM7_power = cint;
-const
-    POWER_SOUND: ARM7_power = 0;	
-    POWER_UNKNOWN: ARM7_power = 1;	
-{$else DOXYGEN}
 const
 const
   POWER_SOUND  = (1 shl 0);
   POWER_SOUND  = (1 shl 0);
   POWER_UNKNOWN  = (1 shl 1);
   POWER_UNKNOWN  = (1 shl 1);
-{$endif DOXYGEN}
+
 procedure readUserSettings(); cdecl; external;
 procedure readUserSettings(); cdecl; external;
 {$endif NDS_INTERFACE}
 {$endif NDS_INTERFACE}
 {$endif ARM7}
 {$endif ARM7}

+ 25 - 2
rtl/nds/system.pp

@@ -58,6 +58,9 @@ var
   envp: PPChar;
   envp: PPChar;
   errno: integer;
   errno: integer;
   fake_heap_end: ^byte; cvar;
   fake_heap_end: ^byte; cvar;
+  irq_vector: integer; external name '__irq_vector';
+  
+
 
 
 implementation
 implementation
 
 
@@ -81,6 +84,23 @@ implementation
 {$i ndsbios.inc}
 {$i ndsbios.inc}
 
 
 
 
+{
+  NDS CPU detecting function
+  --------------------------
+   ARM946E-S processor can handle dsp extensions, but ARM7TDMI does not. FPC can 
+   detect dsp by catching a SIGILL that fires when ARM7 cpu tries to use a dsp 
+   command. Unfortunately, NDS' rtl does not have any error catching mechanism.
+   This function takes care to check if the code is running on an ARM9 or on an 
+   ARM7 CPU, by checking the IRQ vector address ($0B003FFC for ARM9, 0380fff8 
+   for ARM7), declared in the linker script. This function is cleaner than the
+   older one, because does not raise any memory writing error.  
+   It works on Nintendo DS only, I guess :)
+}
+function IsARM9(): boolean;
+begin
+  IsARM9 := integer(@irq_vector) = $0B003FFC;
+end;
+
 {
 {
   NDS CPU detecting function (thanks to 21o6):
   NDS CPU detecting function (thanks to 21o6):
   --------------------------------------------
   --------------------------------------------
@@ -93,17 +113,20 @@ implementation
    function takes care to check if the code is running on an ARM9 or on an ARM7
    function takes care to check if the code is running on an ARM9 or on an ARM7
    CPU. It works on Nintendo DS only, I guess :)
    CPU. It works on Nintendo DS only, I guess :)
 }
 }
-function IsARM9(): boolean;
+function IsARM92(): boolean;
 var
 var
   Dummy : pword absolute $06800000;
   Dummy : pword absolute $06800000;
   tmp: word;
   tmp: word;
 begin
 begin
   tmp := Dummy^;
   tmp := Dummy^;
   Dummy^ := $C0DE;
   Dummy^ := $C0DE;
-  IsARM9 := Dummy^ = $C0DE;
+  IsARM92 := Dummy^ = $C0DE;
   Dummy^ := tmp;
   Dummy^ := tmp;
 end;
 end;
 
 
+
+
+
 {$ifdef FPC_HAS_FEATURE_PROCESSES}
 {$ifdef FPC_HAS_FEATURE_PROCESSES}
 function GetProcessID: SizeUInt;
 function GetProcessID: SizeUInt;
 begin
 begin