1+ using System . Buffers . Binary ;
12using System . Runtime . InteropServices ;
23
34using BizHawk . BizInvoke ;
@@ -189,6 +190,72 @@ public override void PokeByte(long addr, byte val)
189190 }
190191 }
191192
193+ public override ushort PeekUshort ( long addr , bool bigEndian )
194+ {
195+ if ( ( ulong ) addr < ( ulong ) Size - 1 )
196+ {
197+ byte [ ] bytes = new byte [ 2 ] ;
198+ BulkPeekByte ( addr . RangeTo ( addr + 1 ) , bytes ) ;
199+ if ( bigEndian ) return BinaryPrimitives . ReadUInt16BigEndian ( bytes ) ;
200+ else return BinaryPrimitives . ReadUInt16LittleEndian ( bytes ) ;
201+ }
202+ else
203+ {
204+ throw new ArgumentOutOfRangeException ( nameof ( addr ) ) ;
205+ }
206+ }
207+
208+ public override void PokeUshort ( long addr , ushort val , bool bigEndian )
209+ {
210+ if ( Writable )
211+ {
212+ if ( ( ulong ) addr < ( ulong ) Size - 1 )
213+ {
214+ Span < byte > bytes = stackalloc byte [ 2 ] ;
215+ if ( bigEndian ) BinaryPrimitives . WriteUInt16BigEndian ( bytes , val ) ;
216+ else BinaryPrimitives . WriteUInt16LittleEndian ( bytes , val ) ;
217+ BulkPokeByte ( addr , bytes ) ;
218+ }
219+ else
220+ {
221+ throw new ArgumentOutOfRangeException ( nameof ( addr ) ) ;
222+ }
223+ }
224+ }
225+
226+ public override uint PeekUint ( long addr , bool bigEndian )
227+ {
228+ if ( ( ulong ) addr < ( ulong ) Size - 3 )
229+ {
230+ byte [ ] bytes = new byte [ 4 ] ;
231+ BulkPeekByte ( addr . RangeTo ( addr + 3 ) , bytes ) ;
232+ if ( bigEndian ) return BinaryPrimitives . ReadUInt32BigEndian ( bytes ) ;
233+ else return BinaryPrimitives . ReadUInt32LittleEndian ( bytes ) ;
234+ }
235+ else
236+ {
237+ throw new ArgumentOutOfRangeException ( nameof ( addr ) ) ;
238+ }
239+ }
240+
241+ public override void PokeUint ( long addr , uint val , bool bigEndian )
242+ {
243+ if ( Writable )
244+ {
245+ if ( ( ulong ) addr < ( ulong ) Size - 3 )
246+ {
247+ Span < byte > bytes = stackalloc byte [ 4 ] ;
248+ if ( bigEndian ) BinaryPrimitives . WriteUInt32BigEndian ( bytes , val ) ;
249+ else BinaryPrimitives . WriteUInt32LittleEndian ( bytes , val ) ;
250+ BulkPokeByte ( addr , bytes ) ;
251+ }
252+ else
253+ {
254+ throw new ArgumentOutOfRangeException ( nameof ( addr ) ) ;
255+ }
256+ }
257+ }
258+
192259 public override void BulkPeekByte ( Range < long > addresses , byte [ ] values )
193260 {
194261 var start = ( ulong ) addresses . Start ;
@@ -204,5 +271,34 @@ public override void BulkPeekByte(Range<long> addresses, byte[] values)
204271 throw new ArgumentOutOfRangeException ( nameof ( addresses ) ) ;
205272 }
206273 }
274+
275+ public override void BulkPokeByte ( long addr , byte [ ] memoryblock )
276+ {
277+ var count = memoryblock . Length ;
278+
279+ if ( addr < Size && ( ( ulong ) addr + ( ulong ) count ) <= ( ulong ) Size )
280+ {
281+ fixed( byte * p = memoryblock )
282+ _access . Access ( ( IntPtr ) p , addr , count , true ) ;
283+ }
284+ else
285+ {
286+ throw new ArgumentOutOfRangeException ( nameof ( addr ) ) ;
287+ }
288+ }
289+
290+ private void BulkPokeByte ( long addr , Span < byte > memoryblock )
291+ {
292+ long count = memoryblock . Length ;
293+ if ( addr < Size && ( ( ulong ) addr + ( ulong ) count ) <= ( ulong ) Size )
294+ {
295+ fixed( byte * p = memoryblock )
296+ _access . Access ( ( IntPtr ) p , addr , count , true ) ;
297+ }
298+ else
299+ {
300+ throw new ArgumentOutOfRangeException ( nameof ( addr ) ) ;
301+ }
302+ }
207303 }
208304}
0 commit comments