|
1 | 1 | #![no_std]
|
2 | 2 | #![feature(let_chains, inherent_str_constructors)]
|
3 | 3 |
|
4 |
| - |
5 | 4 | extern crate alloc;
|
6 | 5 |
|
7 | 6 | pub mod namespace;
|
@@ -148,6 +147,8 @@ where
|
148 | 147 | | Opcode::LLess => {
|
149 | 148 | self.do_logical_op(&mut context, op)?;
|
150 | 149 | }
|
| 150 | + Opcode::FromBCD => self.do_from_bcd(&mut context, op)?, |
| 151 | + Opcode::ToBCD => self.do_to_bcd(&mut context, op)?, |
151 | 152 | Opcode::Name => {
|
152 | 153 | let [Argument::Namestring(name), Argument::Object(object)] = &op.arguments[..] else {
|
153 | 154 | panic!()
|
@@ -593,8 +594,7 @@ where
|
593 | 594 | Opcode::Wait => todo!(),
|
594 | 595 | Opcode::Reset => todo!(),
|
595 | 596 | Opcode::Release => todo!(),
|
596 |
| - Opcode::FromBCD => todo!(), |
597 |
| - Opcode::ToBCD => todo!(), |
| 597 | + Opcode::FromBCD | Opcode::ToBCD => context.start_in_flight_op(OpInFlight::new(opcode, 2)), |
598 | 598 | Opcode::Revision => {
|
599 | 599 | context.contribute_arg(Argument::Object(Arc::new(Object::Integer(INTERPRETER_REVISION))));
|
600 | 600 | }
|
@@ -989,6 +989,38 @@ where
|
989 | 989 | Ok(())
|
990 | 990 | }
|
991 | 991 |
|
| 992 | + fn do_from_bcd(&self, context: &mut MethodContext, op: OpInFlight) -> Result<(), AmlError> { |
| 993 | + let [Argument::Object(value)] = &op.arguments[..] else { Err(AmlError::InvalidOperationOnObject)? }; |
| 994 | + let Object::Integer(mut value) = **value else { Err(AmlError::InvalidOperationOnObject)? }; |
| 995 | + |
| 996 | + let mut result = 0; |
| 997 | + let mut i = 1; |
| 998 | + while value > 0 { |
| 999 | + result += (value & 0x0f) * i; |
| 1000 | + i *= 10; |
| 1001 | + value >>= 4; |
| 1002 | + } |
| 1003 | + |
| 1004 | + context.contribute_arg(Argument::Object(Arc::new(Object::Integer(result)))); |
| 1005 | + Ok(()) |
| 1006 | + } |
| 1007 | + |
| 1008 | + fn do_to_bcd(&self, context: &mut MethodContext, op: OpInFlight) -> Result<(), AmlError> { |
| 1009 | + let [Argument::Object(value)] = &op.arguments[..] else { Err(AmlError::InvalidOperationOnObject)? }; |
| 1010 | + let Object::Integer(mut value) = **value else { Err(AmlError::InvalidOperationOnObject)? }; |
| 1011 | + |
| 1012 | + let mut result = 0; |
| 1013 | + let mut i = 0; |
| 1014 | + while value > 0 { |
| 1015 | + result |= (value % 10) << (4 * i); |
| 1016 | + value /= 10; |
| 1017 | + i += 1; |
| 1018 | + } |
| 1019 | + |
| 1020 | + context.contribute_arg(Argument::Object(Arc::new(Object::Integer(result)))); |
| 1021 | + Ok(()) |
| 1022 | + } |
| 1023 | + |
992 | 1024 | fn do_size_of(&self, context: &mut MethodContext, op: OpInFlight) -> Result<(), AmlError> {
|
993 | 1025 | let [Argument::Object(object)] = &op.arguments[..] else { Err(AmlError::InvalidOperationOnObject)? };
|
994 | 1026 | let object = object.clone().unwrap_reference();
|
|
0 commit comments