diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 685e6e1ba..45e88692d 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -468,6 +468,7 @@ tup.append_table(img_files, { {"DEMOS/ZEROLINE", VAR_PROGS .. "/demos/zeroline/trunk/zeroline"}, {"DEVELOP/ASCIIVJU", VAR_PROGS .. "/develop/asciivju/trunk/asciivju"}, {"DEVELOP/BOARD", VAR_PROGS .. "/system/board/trunk/board"}, + {"DEVELOP/DBGBOARD", VAR_PROGS .. "/system/dbgboard/dbgboard"}, {"DEVELOP/CEDIT", SRC_PROGS .. "/develop/cedit/CEDIT"}, {"DEVELOP/COBJ", VAR_PROGS .. "/develop/cObj/trunk/cObj"}, {"DEVELOP/ENTROPYV", VAR_PROGS .. "/develop/entropyview/entropyview"}, diff --git a/programs/if.inc b/programs/if.inc new file mode 100644 index 000000000..b410a9bc2 --- /dev/null +++ b/programs/if.inc @@ -0,0 +1,507 @@ + +; Macroinstructions for HLL-style conditional operations + +macro .if [arg] +{ + common + __IF equ + local ..endif + __ENDIF equ ..endif + local ..else + __ELSE equ ..else + JNCOND __ELSE,arg +} + +macro .else +{ + jmp __ENDIF + __ELSE: + restore __IF + __IF equ , +} + +macro .elseif [arg] +{ + common + jmp __ENDIF + __ELSE: + restore __ELSE + local ..else + __ELSE equ ..else + JNCOND __ELSE,arg +} + +macro .endif +{ + if __IF eq + __ELSE: + end if + __ENDIF: + restore __ELSE + restore __ENDIF + restore __IF +} + +macro .while [arg] +{ + common + local ..while + __WHILE equ ..while + local ..endw + __ENDW equ ..endw + __WHILE: + JNCOND __ENDW,arg +} + +macro .endw +{ + jmp __WHILE + __ENDW: + restore __ENDW + restore __WHILE +} + +macro .repeat +{ + local ..repeat + __REPEAT equ ..repeat + __REPEAT: +} + +macro .until [arg] +{ + common + JNCOND __REPEAT,arg + restore __REPEAT +} + +jnne equ je +jnna equ ja +jnnb equ jb +jnng equ jg +jnnl equ jl +jnnae equ jae +jnnbe equ jbe +jnnge equ jge +jnnle equ jle + +macro JNCOND label,v1,c,v2 +{ + match any,c + \{ + cmp v1,v2 + jn\#c label + \} + match ,c + \{ + PARSECOND parsed@cond,v1 + match cond,parsed@cond \\{ JNCONDEXPR label,cond \\} + \} +} + +gt equ > +lt equ < + +macro PARSECOND parsed,cond +{ + define parsed + define neg@cond + define status@cond + define nest@cond + irps symb,cond + \{ + define symb@cond symb + match >,symb + \\{ + define symb@cond gt + \\} + match <,symb + \\{ + define symb@cond lt + \\} + current@cond equ status@cond + match ,current@cond + \\{ + match ~,symb + \\\{ + neg@cond equ neg@cond ~ + match ~~,neg@cond + \\\\{ + define neg@cond + \\\\} + define symb@cond + \\\} + match (,symb + \\\{ + parsed equ parsed neg@cond,< + define nest@cond + + define symb@cond + define neg@cond + \\\} + match any,symb@cond + \\\{ + parsed equ parsed neg@cond,symb@cond + define status@cond + + \\\} + \\} + match status,current@cond + \\{ + match &,symb + \\\{ + parsed equ parsed,&, + define status@cond + define symb@cond + define neg@cond + \\\} + match |,symb + \\\{ + parsed equ parsed,|, + define status@cond + define symb@cond + define neg@cond + \\\} + match (,symb + \\\{ + define nest@cond ( + \\\} + match ),symb + \\\{ + match +,nest@cond + \\\\{ + parsed equ parsed> + define symb@cond + \\\\} + restore nest@cond + \\\} + match any,symb@cond + \\\{ + parsed equ parsed symb@cond + \\\} + \\} + \} +} + +macro define_JNCONDEXPR +{ + macro JNCONDEXPR elabel,[mod,cond,op] + \{ + \common + \local ..t,..f + define t@cond ..t + define f@cond ..f + \forward + match ,op + \\{ + match ,mod \\\{ JNCONDEL elabel, \\\} + match ~,mod \\\{ JCONDEL elabel, \\\} + \\} + match &:flabel:tlabel, op:f@cond:t@cond + \\{ + match ,mod \\\{ JNCONDEL flabel, \\\} + match ~,mod \\\{ JCONDEL flabel, \\\} + tlabel: + \\local ..tnew + restore t@cond + define t@cond ..tnew + \\} + match |:flabel:tlabel, op:f@cond:t@cond + \\{ + match ,mod \\\{ JCONDEL tlabel, \\\} + match ~,mod \\\{ JNCONDEL tlabel, \\\} + flabel: + \\local ..fnew + restore f@cond + define f@cond ..fnew + \\} + \common + label f@cond at elabel + t@cond: + restore t@cond + restore f@cond + \} +} + +macro define_JCONDEXPR +{ + macro JCONDEXPR elabel,[mod,cond,op] + \{ + \common + \local ..t,..f + define t@cond ..t + define f@cond ..f + \forward + match ,op + \\{ + match ,mod \\\{ JCONDEL elabel, \\\} + match ~,mod \\\{ JNCONDEL elabel, \\\} + \\} + match |:flabel:tlabel, op:f@cond:t@cond + \\{ + match ,mod \\\{ JCONDEL flabel, \\\} + match ~,mod \\\{ JNCONDEL flabel, \\\} + tlabel: + \\local ..tnew + restore t@cond + define t@cond ..tnew + \\} + match &:flabel:tlabel, op:f@cond:t@cond + \\{ + match ,mod \\\{ JNCONDEL tlabel, \\\} + match ~,mod \\\{ JCONDEL tlabel, \\\} + flabel: + \\local ..fnew + restore f@cond + define f@cond ..fnew + \\} + \common + label f@cond at elabel + t@cond: + restore t@cond + restore f@cond + \} +} + +macro define_JNCONDEL +{ + macro JNCONDEL label,cond + \{ + \local COND + match car=,cdr,:cond + \\{ + define_JNCONDEXPR + define_JCONDEXPR + define_JCONDEL + define_JNCONDEL + JNCONDEXPR label,cond + purge JNCONDEXPR,JCONDEXPR,JCONDEL,JNCONDEL + define COND + \\} + match c,cond ; replace gt and lt + \\{ + match =COND =signed v1>==v2, COND c + \\\{ + cmp v1,v2 + jl label + define COND + \\\} + match =COND =signed v1<==v2, COND c + \\\{ + cmp v1,v2 + jg label + define COND + \\\} + match =COND v1>==v2, COND c + \\\{ + cmp v1,v2 + jb label + define COND + \\\} + match =COND v1<==v2, COND c + \\\{ + cmp v1,v2 + ja label + define COND + \\\} + match =COND v1==v2, COND c + \\\{ + cmp v1,v2 + jne label + define COND + \\\} + match =COND v1<>v2, COND c + \\\{ + cmp v1,v2 + je label + define COND + \\\} + match =COND =signed v1>v2, COND c + \\\{ + cmp v1,v2 + jle label + define COND + \\\} + match =COND =signed v1v2, COND c + \\\{ + cmp v1,v2 + jbe label + define COND + \\\} + match =COND v1==v2, COND c + \\\{ + cmp v1,v2 + jge label + define COND + \\\} + match =COND =signed v1<==v2, COND c + \\\{ + cmp v1,v2 + jle label + define COND + \\\} + match =COND v1>==v2, COND c + \\\{ + cmp v1,v2 + jae label + define COND + \\\} + match =COND v1<==v2, COND c + \\\{ + cmp v1,v2 + jbe label + define COND + \\\} + match =COND v1==v2, COND c + \\\{ + cmp v1,v2 + je label + define COND + \\\} + match =COND v1<>v2, COND c + \\\{ + cmp v1,v2 + jne label + define COND + \\\} + match =COND =signed v1>v2, COND c + \\\{ + cmp v1,v2 + jg label + define COND + \\\} + match =COND =signed v1v2, COND c + \\\{ + cmp v1,v2 + ja label + define COND + \\\} + match =COND v1 TSTATE_FREE + stdcall string.to_lower_case, thread_info + process_information.process_name + stdcall string.cmp, thread_info + process_information.process_name, thread_name, -1 + .if eax = 0 + inc edx + .if edx >= 2 + jmp .raw_exit + .endif + .endif + .endif + inc esi + .endw + + stdcall dll.Load, @IMPORT + test eax, eax + jnz .exit + + invoke con_start, 1 + invoke con_init, 80, 32, -1, -1, title + + .if byte [_cmdline] <> 0 + mov [log_file_path], _cmdline + .endif + +.main_loop: + invoke con_kbhit + .if eax = 1 + invoke con_getch2 + .if ah = 60 ; F2 + mov eax, [log_file_path] + mov [struct_open_in_notepad.filename], eax + mcall SF_FILE, struct_open_in_notepad + .endif + .endif + + mcall SF_BOARD, SSF_DEBUG_READ + .if ebx = 0 + mcall SF_SLEEP, 50 + jz .main_loop_cond + .endif + mov [chr], al + + .if [is_start_line] = 1 + mov eax, prefix + add eax, [prefix_index] + mov bl, byte [chr] + mov [eax], bl + .if [prefix_index] = 2 + .if dword [prefix] = 'K :' + stdcall set_text_color, TEXT_COLOR_YELLOW + .elseif dword [prefix] = 'L: ' + stdcall set_text_color, TEXT_COLOR_WHITE + .else + stdcall set_text_color, TEXT_COLOR_LIGHTGRAY + .endif + mov [is_start_line], 0 + mov [prefix_index], 0 + invoke con_write_asciiz, prefix + mov dword [prefix], 0 + .else + inc [prefix_index] + .endif + .else + invoke con_write_asciiz, chr + .if byte [chr] = 10 + mov [is_start_line], 1 + stdcall set_text_color, TEXT_COLOR_LIGHTGRAY + .endif + .endif + + stdcall get_file_attrib, [log_file_path], file_info_buf + .if eax = 5 ; file not found + stdcall create_file, [log_file_path] + .endif + stdcall write_file, [log_file_path], chr, 1, dword [file_info_buf + 32], dword [file_info_buf + 32 + 4], bytes_written + +.main_loop_cond: + invoke con_get_flags + and eax, CON_WINDOW_CLOSED + test eax, eax + jz .main_loop + +.exit: + invoke con_exit, 0 +.raw_exit: + mcall SF_TERMINATE_PROCESS + + +; data: +title db 'Debug & message board',0 +log_file_path dd default_log_file_path +default_log_file_path db '/tmp0/1/BOARDLOG.TXT',0 +prefix db 0,0,0,0 +prefix_index dd 0 +is_start_line dd 1 +bytes_written dd 0 +chr db 0, 0 + +struct_open_in_notepad: + dd SSF_START_APP + dd 0 + .filename dd ? + dd 0 + dd 0 + db '/sys/develop/cedit', 0 + + +; include_debug_strings + +align 4 +@IMPORT: +library console, 'console.obj' +import console, \ + con_start, 'START', \ + con_init, 'con_init', \ + con_write_asciiz, 'con_write_asciiz', \ + con_exit, 'con_exit', \ + con_kbhit, 'con_kbhit', \ + con_getch2, 'con_getch2', \ + con_set_flags, 'con_set_flags', \ + con_get_flags, 'con_get_flags' + +align 16 +_image_end: + +file_info_buf rb 40 + +align 4 +_cmdline rb 256 + +thread_info process_information +thread_name rb 16 + +; reserve for stack: +rb 4096 +align 16 +_stacktop: +_memory: