5 * Copyright (C) 2008 Pawel Dziepak
7 * This file consist of functions that are called in order to run Manes. It
8 * includes initialization of hardware and internal kernel data structures.
9 * After this operation kernel can change to the standard way of working witch
10 * preemption, resources, actors and so on.
14 #error Quarn OS is needed to be compiled on GCC 4 or later.
18 //#include "kernel_state.h"
21 #include "arch/x86/launch.h"
22 //#include "arch/x86/speaker.h"
25 #include "services/timer.h"
26 #include "services/logger.h"
27 #include "services/early_logger.h"
28 #include "services/tty_logger.h"
29 #include "services/service.h"
30 #include "services/service_manager.h"
31 #include "services/service_shadow.h"
32 #include "resources/resource_id.h"
33 #include "resources/resource_order.h"
34 #include "resources/isa.h"
35 #include "resources/keybscr.h"
36 #include "resources/fdc.h"
37 #include "resources/fat.h"
38 #include "resources/rs232.h"
39 #include "resources/pio.h"
40 #include "resources/fs.h"
41 #include "resources/speaker.h"
42 #include "resources/resource.h"
43 #include "resources/resource_manager.h"
44 #include "resources/slob.h"
45 #include "resources/device.h"
46 #include "modules/main_mmanager.h"
47 #include "actors/actor_manager.h" */
49 #include "libs/delegate.h"
50 #include "libs/string.h"
52 using namespace manes
;
56 services::service_manager *sman = GET_SERVICES();
57 sman->call<delegate<void, const char*> >("early_logger", "print")("\nHELLO!");
64 { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
73 for (i = 0; i <= 8; i++) {
74 temp[i] = numbers[(cn & 0x0F)];
77 for (i = 7; i != -1; i--) {
78 if (temp[i] == '0' && j == 8 && i != 0)
95 for (i = 0; i <= 8; i++) {
96 temp[i] = (cn % 10)+'0';
99 for (i = 7; i != -1; i--) {
100 if (temp[i] == '0' && j == 8 && i != 0)
112 #if USE_MULTIBOOT == CONF_YES
113 extern "C" void start() {
115 extern "C" void _start() {
117 /* Prepare to execute C++ code */
120 /* Launch Managed Execution System */
121 manec::launch_manes();
123 manager
*main
= manec::get();
126 /* Run low-level procedures */
129 /* Register creators */
130 manec::register_creators();
132 /* Register built in types */
133 //manec::register_builtin_types();
136 //manec::animate_creators();
138 /* Manes is ready to use */
141 //services::service_manager *sman = services::service_manager::get_instance();
143 /* Register early logger service */
144 services::logger::register_service();
146 services::early_logger::register_service();
148 services::timer::register_service();
150 delegate
<void> ablah
;
152 services::service_shadow
log("early_logger");
154 log
.call
<delegate
<void, const char*> >("print")("OK.\nStarting Quarn OS...");
156 resources::resource_manager
*rman
= GET_RESOURCES();
158 delegate
<manes::object
*> res
;
161 resources::fs::register_resource();
164 resources::isa::register_resource();
167 resources::keybscr::register_resource();
170 //resources::rs232::register_resource();
173 resources::speaker::register_resource();
176 resources::fdc::register_resource();
179 resources::fat::register_resource();
182 //resources::pio::register_resource();
185 resources::slob::register_resource();
187 resources::slob
*_alloc
= (resources::slob
*)rman
->new_object("slob");
188 GET_KSTATE()->set_memory_allocator(_alloc
);
191 //resources::res_buffer::register_resource();
193 resources::res_bus
*isabus
= (resources::res_bus
*)rman
->new_object("isa");
195 log
.call
<delegate
<void, const char*> >("print")("\nMemory size: ~");
196 log
.call
<delegate
<void, const char*> >("print")(itoa(GET_KSTATE()->get_memory_size()/1024/1024 + 1));
197 log
.call
<delegate
<void, const char*> >("print")(" MB.\n");
199 log
.call
<delegate
<void, const char*> >("print")("Scanning ISA bus...");
200 int isadevs
= ((resources::isa
*)isabus
)->scan_bus();
202 log
.call
<delegate
<void, const char*> >("print")("done. Found ");
203 log
.call
<delegate
<void, const char*> >("print")(htoa(isadevs
));
204 log
.call
<delegate
<void, const char*> >("print")(" devices.\n\n\n\n");
206 resources::res_stream
*rstr
= rman
->get_resource
<resources::res_stream
>("keybscr",0);
208 resources::res_stream
*speak
= rman
->get_resource
<resources::res_stream
>("speaker",0);
210 rstr
->write_bytes("\nResources: running \n",26);
212 // resources::pio *str = (resources::pio *)rman->new_object(rstr, "pio");
214 // str->send_packet((void*)"Hello World!!!",14);
216 /* Sending orders (experimental) */
217 resources::resource_order
ord("speaker");
218 ord
.set_command("speed");
219 ord
.set_data
<int>(3);
220 // str->send_order(&ord);
222 resources::resource_order
ord1("speaker");
223 ord1
.set_command("start");
224 ord1
.set_data
<bool>(true);
225 ord1
.set_data
<delegate
<void> >(ablah
);
226 //str->send_order(&ord1);
228 resources::res_block
*flop
= rman
->get_resource
<resources::res_block
>("fdc",0);
229 flop
->read_block(19, 1, (void*)0x60000);
231 rman
->new_object((resources::resource
*)flop
, "fat");
233 //resources::fat *faa = (resources::fat*)rman->get_resource<resources::res_fs>("fat", "fdc", 0);
234 resources::resource_id
rid("/fdc,0/fat");
235 resources::fat
*faa
= (resources::fat
*)rid
.get_resource();
237 faa
->load_file("authors", (void*)0x60000);
238 log
.call
<delegate
<void, const char*> >("print")((const char*)0x60000);
240 ((modules::simple_mmanager
*)modules::simple_mmanager::get_instance())->require("modules_start.ko");
242 u16
*com1_base_port
= (u16
*)0x400;
243 resources::isa_address com1_addr
;
245 com1_addr
.ioport_base
= (int)*com1_base_port
;
246 resources::rs232
*com1
= (resources::rs232
*)rman
->new_object("rs232");
247 com1
->init_device(com1_addr
);
249 resources::res_stream
*Srstr
= rman
->get_resource
<resources::res_stream
>("rs232",0);
251 Srstr
->write_bytes("Starting Quarn OS...",20);
253 services::tty_logger::register_service();
255 services::service_shadow
tlog("tty_logger");
257 ((modules::simple_mmanager
*)modules::simple_mmanager::get_instance())->require("test.ko");
259 //GET_ACTORS()->new_actor(ablah);
260 //GET_ACTORS()->launch();
262 tlog
.call
<delegate
<void, const char*, services::logger::log_level
> >("print")("\ntty logger is running (master)", services::logger::log_warning
);
263 tlog
.call
<delegate
<void, const char*, services::logger::log_level
> >("print")("\ntty logger is running (slave)", services::logger::log_info
);
265 /* Testing allocation of memory */
266 /* This code is a bit pointless but tests all possible circumstances
267 in which slob will have to allocate_space memory. */
270 speak
->write_dwords(&temp
,1);
273 while (1) __asm__("hlt");