summaryrefslogtreecommitdiff
path: root/Emulator/Make.cs
blob: aad9644195a07a939c016414ec2291bbb6227040 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
namespace Q1.Emulator;

using System;
using System.Buffers.Binary;

public static class Make
{
    public static u16 u16(u8 high, u8 low)
    {
        return (u16) ((high << 8) | low);
    }
    
    public static u16 u16(ref8 data)
    {
        if (data.Length < 2)
            throw new ArgumentException("Data must contain at least 2 bytes to form a u16.");
        
        return Make.u16(data[0], data[1]);
    }
    
    public static u32 u32(u8 b1, u8 b2, u8 b3, u8 b4)
    {
        return (u32) ((b1 << 24) | (b2 << 16) | (b3 << 8) | b4);
    }
    
    public static u32 u32(ref8 data)
    {
        if (data.Length < 4)
            throw new ArgumentException("Data must contain at least 4 bytes to form a u32.");
        
        return Make.u32(data[0], data[1], data[2], data[3]);
    }
    
    public static ref8 ref8(u16 value)
    {
        u8 high = (u8) (value >> 8);
        u8 low = (u8) (value & 0xFF);
        return new ref8([high, low], 0, 2);
    }
    
    public static ref8 ref8(u32 value)
    {
        u8 b1 = (u8) (value >> 24);
        u8 b2 = (u8) (value >> 16);
        u8 b3 = (u8) (value >> 8);
        u8 b4 = (u8) (value & 0xFF);
        return new ref8([b1, b2, b3, b4], 0, 4);
    }
    public static i16 i16(ref8 value)
    {
        return BinaryPrimitives.ReadInt16BigEndian(value);
    }
    
    public static i16 i16(u8 high, u8 low)
    {
        return BinaryPrimitives.ReadInt16BigEndian(new ReadOnlySpan<u8>([high, low]));
    }
}