#[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);
}
}
}