misc.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. use crate::{
  2. opcode::{self, ext_opcode, opcode},
  3. parser::{choice, comment_scope, id, Parser},
  4. DebugVerbosity,
  5. };
  6. pub fn debug_obj<'a, 'c>() -> impl Parser<'a, 'c, ()>
  7. where
  8. 'c: 'a,
  9. {
  10. /*
  11. * DebugObj := ExtOpPrefix 0x31
  12. */
  13. ext_opcode(opcode::EXT_DEBUG_OP)
  14. }
  15. /// Takes a value between `0` and `7`, where 0 represents `Local0` etc.
  16. pub type LocalNum = u8;
  17. pub fn local_obj<'a, 'c>() -> impl Parser<'a, 'c, LocalNum>
  18. where
  19. 'c: 'a,
  20. {
  21. /*
  22. * LocalObj := Local0Op | Local1Op | Local2Op | Local3Op | Local4Op | Local5Op | Local6Op | Local7Op
  23. * Local0Op := 0x60
  24. * Local1Op := 0x61
  25. * Local2Op := 0x62
  26. * Local3Op := 0x63
  27. * Local4Op := 0x64
  28. * Local5Op := 0x65
  29. * Local6Op := 0x66
  30. * Local7Op := 0x67
  31. */
  32. let local_parser = |i, local_opcode| {
  33. opcode(local_opcode)
  34. .then(comment_scope(DebugVerbosity::AllScopes, "LocalObj", id()))
  35. .map(move |((), _)| Ok(i))
  36. };
  37. choice!(
  38. local_parser(0, opcode::LOCAL0_OP),
  39. local_parser(1, opcode::LOCAL1_OP),
  40. local_parser(2, opcode::LOCAL2_OP),
  41. local_parser(3, opcode::LOCAL3_OP),
  42. local_parser(4, opcode::LOCAL4_OP),
  43. local_parser(5, opcode::LOCAL5_OP),
  44. local_parser(6, opcode::LOCAL6_OP),
  45. local_parser(7, opcode::LOCAL7_OP)
  46. )
  47. }
  48. /// Takes a value between `0` and `6`, where 0 represents `Arg0` etc.
  49. pub type ArgNum = u8;
  50. pub fn arg_obj<'a, 'c>() -> impl Parser<'a, 'c, ArgNum>
  51. where
  52. 'c: 'a,
  53. {
  54. /*
  55. * ArgObj := Arg0Op | Arg1Op | Arg2Op | Arg3Op | Arg4Op | Arg5Op | Arg6Op
  56. * Arg0Op = 0x68
  57. * Arg1Op = 0x69
  58. * Arg2Op = 0x6a
  59. * Arg3Op = 0x6b
  60. * Arg4Op = 0x6c
  61. * Arg5Op = 0x6d
  62. * Arg6Op = 0x6e
  63. */
  64. let arg_parser = |i, arg_opcode| {
  65. opcode(arg_opcode).then(comment_scope(DebugVerbosity::AllScopes, "ArgObj", id())).map(move |((), _)| Ok(i))
  66. };
  67. choice!(
  68. arg_parser(0, opcode::ARG0_OP),
  69. arg_parser(1, opcode::ARG1_OP),
  70. arg_parser(2, opcode::ARG2_OP),
  71. arg_parser(3, opcode::ARG3_OP),
  72. arg_parser(4, opcode::ARG4_OP),
  73. arg_parser(5, opcode::ARG5_OP),
  74. arg_parser(6, opcode::ARG6_OP)
  75. )
  76. }