|
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