msc/
lib.rs

1//
2// msc
3//  L Command
4//  L Script
5//  L MscsbFile
6//
7
8#[macro_use] extern crate nom;
9extern crate byteorder;
10
11mod mscb_file;
12pub use mscb_file::MscsbFile;
13
14#[derive(Debug, Copy, Clone)]
15pub enum Cmd {
16    Nop, // 0
17    Unk1, // 1
18    Begin {
19        arg_count: u16,
20        var_count: u16
21    }, // 2
22    End, // 3
23    Jump {
24        loc: u32
25    }, // 4
26    Jump5 {
27        loc: u32
28    }, // 5
29    Return6, // 6
30    Return7, // 7
31    Return8, // 8
32    Return9, // 9
33    PushInt {
34        val: u32,
35    }, // 0xA
36    PushVar {
37        var_type: u8,
38        var_num: u16,
39    }, // 0xB
40    ErrorC,
41    PushShort {
42        val: u16
43    }, // 0xD
44    AddI, // 0xE
45    SubI, // 0xF
46    MultI,// 0x10
47    DivI, // 0x11
48    ModI, // 0x12
49    NegI, // 0x13
50    IncI {
51        var_type: u8,
52        var_num: u16,
53    }, // 0x14
54    DecI{
55        var_type: u8,
56        var_num: u16,
57    }, // 0x15
58    AndI, // 0x16
59    OrI,  // 0x17
60    NotI, // 0x18
61    XorI, // 0x19
62    ShiftL,//0x1A
63    ShiftR,//0x1B
64    SetVar {
65        var_type: u8,
66        var_num: u16,
67    },   //0x1C
68    AddVarBy{
69        var_type: u8,
70        var_num: u16,
71    }, //0x1D
72    SubVarBy{
73        var_type: u8,
74        var_num: u16,
75    }, //0x1E
76    MultVarBy{
77        var_type: u8,
78        var_num: u16,
79    },//0x1F
80    DivVarBy{
81        var_type: u8,
82        var_num: u16,
83    }, //0x20
84    ModVarBy{
85        var_type: u8,
86        var_num: u16,
87    }, //0x21
88    AndVarBy{
89        var_type: u8,
90        var_num: u16,
91    }, //0x22
92    OrVarBy{
93        var_type: u8,
94        var_num: u16,
95    },  //0x23
96    XorVarBy{
97        var_type: u8,
98        var_num: u16,
99    }, //0x24
100    Equals,    // 0x25
101    NotEquals, // 0x26
102    LessThan,  // 0x27
103    LessOrEqual,//0x28
104    Greater,   // 0x29
105    GreaterOrEqual,//0x2A
106    Not,           // 0x2B
107    PrintF {
108        arg_count: u8
109    },    // 0x2C
110    Sys {
111        arg_count: u8,
112        sys_num: u8,
113    },   // 0x2D
114    Try {
115        loc: u32,
116    },      // 0x2E
117    CallFunc {
118        arg_count: u8,
119    },  // 0x2F
120    CallFunc2 {
121        arg_count: u8,
122    }, // 0x2F
123    CallFunc3 {
124        arg_count: u8,
125    }, // 0x2F
126    Push,    // 0x32
127    Pop,     // 0x33
128    If {
129        loc: u32,
130    },   // 0x34
131    IfNot {
132        loc: u32,
133    },// 0x35
134    Else {
135        loc: u32,
136    }, // 0x36
137    Error37, // 0x37
138    IntToFloat {
139        stack_pos: u8,
140    }, // 0x38
141    FloatToInt {
142        stack_pos: u8,
143    }, // 0x39
144    AddF, // 0x3A
145    SubF, // 0x3B
146    MultF,// 0x3C
147    DivF, // 0x3D
148    NegF, // 0x3E
149    IncF{
150        var_type: u8,
151        var_num: u16,
152    }, // 0x3F
153    DecF{
154        var_type: u8,
155        var_num: u16,
156    }, // 0x40
157    VarSetF{
158        var_type: u8,
159        var_num: u16,
160    }, // 0x41
161    AddVarByF{
162        var_type: u8,
163        var_num: u16,
164    }, //0x42
165    SubVarByF{
166        var_type: u8,
167        var_num: u16,
168    }, //0x43
169    MultVarByF{
170        var_type: u8,
171        var_num: u16,
172    },//0x44
173    DivVarByF{
174        var_type: u8,
175        var_num: u16,
176    }, //0x45
177    EqualsF,    // 0x46
178    NotEqualsF, // 0x47
179    LessThanF,  // 0x48
180    LessOrEqualF,//0x49
181    GreaterF,   // 0x4A
182    GreaterOrEqualF,//0x4B
183    Error4C, // 0x4C
184    Exit, // 0x4D
185}
186
187#[derive(Debug, Clone)]
188pub struct Command {
189    pub cmd: Cmd,
190    pub push_bit: bool,
191    pub position: u32,
192}
193
194#[derive(Debug, Clone)]
195pub struct Script {
196    pub commands: Vec<Command>,
197    pub bounds: (u32, u32),
198}
199
200impl Script {
201    pub fn iter(&self) -> std::slice::Iter<Command> {
202        self.commands.iter()
203    }
204}
205
206#[cfg(test)]
207mod test {
208    use super::*;
209
210    #[test]
211    fn test_parser() {
212        let pikachu = MscsbFile::open("/home/jam/dev/msc/pikachu.mscsb").unwrap();
213        println!("# of scripts - {}", pikachu.scripts.len());
214        println!("Script 1\n--------");
215        for c in pikachu.scripts[0].iter() {
216            println!("{:?}", c);
217        }
218    }
219}
220