#[macro_use] extern crate nom;
extern crate byteorder;
mod mscb_file;
pub use mscb_file::MscsbFile;
#[derive(Debug, Copy, Clone)]
pub enum Cmd {
Nop,
Unk1,
Begin {
arg_count: u16,
var_count: u16
},
End,
Jump {
loc: u32
},
Jump5 {
loc: u32
},
Return6,
Return7,
Return8,
Return9,
PushInt {
val: u32,
},
PushVar {
var_type: u8,
var_num: u16,
},
ErrorC,
PushShort {
val: u16
},
AddI,
SubI,
MultI,
DivI,
ModI,
NegI,
IncI {
var_type: u8,
var_num: u16,
},
DecI{
var_type: u8,
var_num: u16,
},
AndI,
OrI,
NotI,
XorI,
ShiftL,
ShiftR,
SetVar {
var_type: u8,
var_num: u16,
},
AddVarBy{
var_type: u8,
var_num: u16,
},
SubVarBy{
var_type: u8,
var_num: u16,
},
MultVarBy{
var_type: u8,
var_num: u16,
},
DivVarBy{
var_type: u8,
var_num: u16,
},
ModVarBy{
var_type: u8,
var_num: u16,
},
AndVarBy{
var_type: u8,
var_num: u16,
},
OrVarBy{
var_type: u8,
var_num: u16,
},
XorVarBy{
var_type: u8,
var_num: u16,
},
Equals,
NotEquals,
LessThan,
LessOrEqual,
Greater,
GreaterOrEqual,
Not,
PrintF {
arg_count: u8
},
Sys {
arg_count: u8,
sys_num: u8,
},
Try {
loc: u32,
},
CallFunc {
arg_count: u8,
},
CallFunc2 {
arg_count: u8,
},
CallFunc3 {
arg_count: u8,
},
Push,
Pop,
If {
loc: u32,
},
IfNot {
loc: u32,
},
Else {
loc: u32,
},
Error37,
IntToFloat {
stack_pos: u8,
},
FloatToInt {
stack_pos: u8,
},
AddF,
SubF,
MultF,
DivF,
NegF,
IncF{
var_type: u8,
var_num: u16,
},
DecF{
var_type: u8,
var_num: u16,
},
VarSetF{
var_type: u8,
var_num: u16,
},
AddVarByF{
var_type: u8,
var_num: u16,
},
SubVarByF{
var_type: u8,
var_num: u16,
},
MultVarByF{
var_type: u8,
var_num: u16,
},
DivVarByF{
var_type: u8,
var_num: u16,
},
EqualsF,
NotEqualsF,
LessThanF,
LessOrEqualF,
GreaterF,
GreaterOrEqualF,
Error4C,
Exit,
}
#[derive(Debug, Clone)]
pub struct Command {
pub cmd: Cmd,
pub push_bit: bool,
pub position: u32,
}
#[derive(Debug, Clone)]
pub struct Script {
pub commands: Vec<Command>,
pub bounds: (u32, u32),
}
impl Script {
pub fn iter(&self) -> std::slice::Iter<Command> {
self.commands.iter()
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_parser() {
let pikachu = MscsbFile::open("/home/jam/dev/msc/pikachu.mscsb").unwrap();
println!("# of scripts - {}", pikachu.scripts.len());
println!("Script 1\n--------");
for c in pikachu.scripts[0].iter() {
println!("{:?}", c);
}
}
}