Implement "from module import *" construct.
diff --git a/py/runtime.c b/py/runtime.c
index f12b3e6..d15a38e 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -1016,6 +1016,17 @@
     return x;
 }
 
+void rt_import_all(mp_obj_t module) {
+    DEBUG_printf("import all %p\n", module);
+
+    mp_map_t *map = mp_obj_module_get_globals(module);
+    for (uint i = 0; i < map->alloc; i++) {
+        if (map->table[i].key != MP_OBJ_NULL) {
+            rt_store_name(MP_OBJ_QSTR_VALUE(map->table[i].key), map->table[i].value);
+        }
+    }
+}
+
 mp_map_t *rt_locals_get(void) {
     return map_locals;
 }
diff --git a/py/runtime.h b/py/runtime.h
index 20595c6..f5a9f2a 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -39,6 +39,7 @@
 mp_obj_t rt_iternext(mp_obj_t o);
 mp_obj_t rt_import_name(qstr name, mp_obj_t fromlist, mp_obj_t level);
 mp_obj_t rt_import_from(mp_obj_t module, qstr name);
+void rt_import_all(mp_obj_t module);
 
 struct _mp_map_t;
 struct _mp_map_t *rt_locals_get(void);
diff --git a/py/showbc.c b/py/showbc.c
index 9dfbc88..e3387db 100644
--- a/py/showbc.c
+++ b/py/showbc.c
@@ -390,6 +390,10 @@
                 printf("IMPORT_FROM %s", qstr_str(qstr));
                 break;
 
+            case MP_BC_IMPORT_STAR:
+                printf("IMPORT_STAR");
+                break;
+
             default:
                 printf("code %p, byte code 0x%02x not implemented\n", ip, op);
                 assert(0);
diff --git a/py/vm.c b/py/vm.c
index 1d47076..10db35e 100644
--- a/py/vm.c
+++ b/py/vm.c
@@ -595,6 +595,10 @@
                         PUSH(obj1);
                         break;
 
+                    case MP_BC_IMPORT_STAR:
+                        rt_import_all(TOP());
+                        break;
+
                     default:
                         printf("code %p, byte code 0x%02x not implemented\n", ip, op);
                         assert(0);