hardware abstraction layer programming