diff --git a/programs/develop/tinypy/tinypy/Makefile b/programs/develop/tinypy/tinypy/Makefile index 2612ee159b..321773fd5c 100644 --- a/programs/develop/tinypy/tinypy/Makefile +++ b/programs/develop/tinypy/tinypy/Makefile @@ -1,7 +1,8 @@ export MENUETDEV=../../libraries/menuetlibc OUTFILE = tpmain -OBJS = tpmain.o kolibri_init.o kolibri_fs.o kolibri_gui.o +OBJS = tpmain.o kolibri_init.o kolibri_fs.o kolibri_gui.o kolibri_dbg.o +CFLAGS = -I. include $(MENUETDEV)/makefiles/Makefile_for_program -#testmod.o: fasm_modules/testmod.s -# fasm fasm_modules/testmod.s -# cp fasm_modules/testmod.o . +kolibri_dbg.o: fasm_modules/kolibri_dbg.s + fasm fasm_modules/kolibri_dbg.s + cp fasm_modules/kolibri_dbg.o . diff --git a/programs/develop/tinypy/tinypy/fasm_modules/testmod.s b/programs/develop/tinypy/tinypy/fasm_modules/kolibri_dbg.s similarity index 54% rename from programs/develop/tinypy/tinypy/fasm_modules/testmod.s rename to programs/develop/tinypy/tinypy/fasm_modules/kolibri_dbg.s index c77b3ea08d..75728195d8 100644 --- a/programs/develop/tinypy/tinypy/fasm_modules/testmod.s +++ b/programs/develop/tinypy/tinypy/fasm_modules/kolibri_dbg.s @@ -1,3 +1,9 @@ +; TinyPy module +; Name: kolibri_dbg +; +; Exports: +; debug_print(msg) - prints a message to debug board. + format ELF use32 include 'proc32.inc' @@ -10,24 +16,22 @@ extrn tp_get extrn tp_None extrn tp_fnc -public testmod_init -public getsize +public kolibri_dbg_init -;Module name -modname db "testmod" +; Module name +modname db "kolibri_dbg" modnamelen = $-modname + +; Exported function name debug_print_name db "debug_print" debug_print_namelen = $-debug_print_name - -testmod_dict rb sizeof.tp_obj +; Export dictionary for module +kolibri_dbg_dict rb sizeof.tp_obj +; tp_obj of exported function debug_print_obj rb sizeof.tp_obj -tmp_tp_obj rb sizeof.tp_obj -getsize: - mov eax, tp_vm.params - ret - -;void debug_print(tp_vm *tp) +; Function debug_print(tp_vm *tp) +; return nothing debug_print: push ebp mov ebp, esp @@ -36,34 +40,44 @@ debug_print: push ebx push ecx push edx - ;Reserve space for tp_obj variable in stack - sub esp, sizeof.tp_obj + sub esp, sizeof.tp_obj; Reserve tp_obj tmp + mov edx, esp + push edx ;Store &tmp ; Obtain tp_string parameter - push_tp_obj tp_None - mov eax, dword[ebp+8] + ; tp_get(&tmp, tp, *(tp_obj *)(tp_vm->params), tp_None) + push_tp_none + mov eax, dword[ebp+12] ;4 for return address, 4 for result pointer; 4 for tp_vm add eax, tp_vm.params push_tp_obj_at_reg eax - push dword[ebp+8] - push tmp_tp_obj;esp+(sizeof.tp_obj*2+4) + push dword[ebp+12] + push edx ;ebx contains address of reserved tp_obj variable call tp_get + ;Restore stack - add esp, 56;sizeof.tp_obj*3+4;8? + add esp, sizeof.tp_obj*2+4;2 tp_obj's and 2 pointers in parameters minus 1 pointer to result (cleared inside tp_get) + ;Leave if parameter is not a string. tp_raise() should be called here. - ;cmp dword[esp], TP_STRING - ;jne .exit - ;mov ecx, dword[esp+12] - ;mov edx, dword[esp+8] -;.cont: - ; Print message. -; mov eax, 63 -; mov ebx, 1 -; push ecx -; mov cl, byte[edx] -; inc edx -; int 40h -; pop ecx -; loop .cont -;.exit: + pop edx; edx = &tmp + cmp dword[edx], TP_STRING ; Check that function returned a TP_STRING + jne .exit + mov ecx, dword[edx+tp_string_.len] ; String length + mov edx, dword[edx+tp_string_.val] ; + mov eax, 63 + mov ebx, 1 +.cont: + ; Print message. + push ecx ; Store ecx to use it in inner loop + mov cl, byte[edx] + inc edx + int 40h + pop ecx ; Get ecx back + loop .cont +.exit: + add esp, sizeof.tp_obj ; Release tp_obj reserved in stack. + ; Returning tp_None + mov eax, dword[ebp+8] + mov dword[eax], 0 + ; Restore registers pop edx pop ecx pop ebx @@ -72,22 +86,22 @@ debug_print: pop ebp ret -;void testmod_init(tp_vm *tp); -testmod_init: +;void kolibri_dbg_init(tp_vm *tp); +kolibri_dbg_init: push ebp mov ebp, esp ;Save registers push eax push ebx push ecx - ; Create module dictionary and store its address in testmod_str + ; Create module dictionary and store its address in kolibri_dbg_str mov eax, dword [ebp + 8] push eax - push testmod_dict + push kolibri_dbg_dict call tp_dict add esp, 4 ;Clear stack - ; Push tp_obj structure pointed by testmod_dict - push_tp_obj testmod_dict + ; Push tp_obj structure pointed by kolibri_dbg_dict + push_tp_obj kolibri_dbg_dict ; Push modname as a tp_obj object push modnamelen; len push modname ; val @@ -121,7 +135,7 @@ loop .push_tpobj1 push 0 push TP_STRING ;Pushing module dictionary tp_obj - push_tp_obj testmod_dict + push_tp_obj kolibri_dbg_dict ;Pushing tp_vm push dword[ebp+8] call tp_set diff --git a/programs/develop/tinypy/tinypy/fasm_modules/tinypy.inc b/programs/develop/tinypy/tinypy/fasm_modules/tinypy.inc index e5f220c5ba..37e8045a53 100644 --- a/programs/develop/tinypy/tinypy/fasm_modules/tinypy.inc +++ b/programs/develop/tinypy/tinypy/fasm_modules/tinypy.inc @@ -152,6 +152,15 @@ struct tp_vm steps rd 1 ends +macro push_tp_none +{ + local .push_more + mov ecx, 4 +.push_more: + push 0 + loop .push_more +} + macro push_tp_obj obj { local .push_more diff --git a/programs/develop/tinypy/tinypy/tpmain.c b/programs/develop/tinypy/tinypy/tpmain.c index ae1058b959..68cb098305 100644 --- a/programs/develop/tinypy/tinypy/tpmain.c +++ b/programs/develop/tinypy/tinypy/tpmain.c @@ -2,7 +2,8 @@ /* INCLUDE */ const char header[]="TinyPy for kolibriOS"; const int argc = 2; -extern _stdcall void testmod_init(tp_vm *tp); +extern _stdcall void kolibri_dbg_init(tp_vm *tp); + void main(void) { char *argv[2]={"tpmain", "test.py"}; @@ -15,6 +16,7 @@ void main(void) { argv[1][strlen(argv[1]) - 1] = '\0'; con_printf("Running file %s\n", argv[1]); tp_vm *tp = tp_init(argc, argv); + kolibri_dbg_init(tp); kolibri_init(tp); /* INIT */ tp_call(tp,"py2bc","tinypy",tp_None);