diff --git a/programs/develop/fasm/trunk/FASM.ASM b/programs/develop/fasm/trunk/FASM.ASM new file mode 100644 index 0000000000..45596fdedd --- /dev/null +++ b/programs/develop/fasm/trunk/FASM.ASM @@ -0,0 +1,738 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; ;; +;; flat assembler source ;; +;; Copyright (c) 1999-2012, Tomasz Grysztar ;; +;; All rights reserved. ;; +;; ;; +;; KolibriOS port by KolibriOS Team ;; +;; Menuet port by VT ;; +;; ;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +NORMAL_MODE = 8 +CONSOLE_MODE = 32 + +MAGIC1 = 6*(text.line_size-1)+14 +MAX_PATH = 100 + +APP_MEMORY = 0x00800000 + +;; Menuet header + +appname equ "flat assembler " +;--------------------------------------------------------------------- + use32 + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; program start + dd program_end ; program image size + dd stacktop ; required amount of memory + dd stacktop ; stack + dd params,cur_dir_path ; parameters,icon +;--------------------------------------------------------------------- +include 'lang.inc' +include '../../../macros.inc' +purge add,sub ; macros.inc does incorrect substitution +include 'fasm.inc' + +include '../../../develop/libraries/box_lib/trunk/box_lib.mac' +include '../../../develop/libraries/box_lib/load_lib.mac' + @use_library + +center fix true +;--------------------------------------------------------------------- +START: ; Start of execution + mov edi, fileinfos + mov ecx, (fileinfos_end-fileinfos)/4 + or eax, -1 + rep stosd + push 68 + pop eax + push 11 + pop ebx + mcall + + cmp [params],0 + jz start_1 + ;---------GerdtR + or ecx,-1 + mov esi,params + cmp byte[esi],' ' + jne @f + mov edi,esi + mov al,' ' + repe scasb + mov esi,edi + dec esi + @@: + + mov edi,dbgWord + @@: lodsb + scasb + jne NoOutDebugInfo + cmp byte[edi],0 + jnz @b + + cmp byte[esi],' ' + jne NoOutDebugInfo + + mov edi,esi + mov al,' ' + repe scasb + mov esi,edi + dec esi + + mov edi,params + @@: lodsb + stosb + test al,al + jnz @b + + ; mov [bGenerateDebugInfo], 1 + or dword[ch1_dbg.flags],10b + + +NoOutDebugInfo: + ;---------/GerdtR + mov ecx,10 + mov eax,' ' + mov edi,infile + push ecx + cld + rep stosd + mov ecx,[esp] + mov edi,outfile + rep stosd + pop ecx + mov edi,path + rep stosd + + mov esi,params +; DEBUGF "params: %s\n",esi + mov edi,infile + call mov_param_str +; mov edi,infile +; DEBUGF " input: %s\n",edi + mov edi,outfile + call mov_param_str +; mov edi,outfile +; DEBUGF "output: %s\n",edi + mov edi,path + call mov_param_str +; mov edi,path +; DEBUGF " path: %s\n",edi + dec esi + cmp [esi], dword ',run' + jne @f + mov [_run_outfile],1 +@@: + mov [_mode],CONSOLE_MODE + jmp start +;--------------------------------------------------------------------- +start_1: +;sys_ +load_libraries l_libs_start,load_lib_end + + cmp eax,-1 + jne @f + mcall -1 ;exit if not open box_lib.obj +@@: + mcall 40,0x27 ;маска системных событий +;--------------------------------------------------------------------- +init_checkboxes2 ch1_dbg,ch1_dbg+ch_struc_size +;--------------------------------------------------------------------- +; OpenDialog initialisation + push dword OpenDialog_data + call dword [OpenDialog_Init] +;--------------------------------------------------------------------- +red: ; Redraw + call draw_window + +still: + mcall 10 ; Wait here for event + cmp al,6 + je call_mouse + dec eax + je red ; Redraw request + dec eax + jne button ; Button in buffer +key: ; Key + mcall 2 ; Read it and ignore + + push dword edit1 + call [edit_box_key] + push dword edit2 + call [edit_box_key] + push dword edit3 + call [edit_box_key] + jmp still +;--------------------------------------------------------------------- +call_mouse: + call mouse + jmp still +;--------------------------------------------------------------------- +button: ; Button in Window + mcall 17 + cmp ah,1 + jne noclose + or eax,-1 + mcall +;--------------------------------------------------------------------- +noclose: + cmp ah,5 ;press button for OpenDialog + jne @f + call fun_opn_dlg +@@: + cmp ah,2 ; Start compiling + je start + cmp ah,3 ; Start compiled file + jnz norunout + + mov edx,outfile + call make_fullpaths + mcall 70,file_info_start +; xor ecx,ecx + jmp still +;--------------------------------------------------------------------- +norunout: + cmp ah,4 + jnz norundebug + + mov edx,outfile + call make_fullpaths + mcall 70,file_info_debug + jmp still +;--------------------------------------------------------------------- +norundebug: + jmp still +;--------------------------------------------------------------------- +mouse: + push dword edit1 + call [edit_box_mouse] + push dword edit2 + call [edit_box_mouse] + push dword edit3 + call [edit_box_mouse] + push dword ch1_dbg + call [check_box_mouse] + ret +;--------------------------------------------------------------------- +draw_window: + pusha + mcall 12,1 ; Start of draw + + get_sys_colors 1,0 + edit_boxes_set_sys_color edit1,editboxes_end,sc + check_boxes_set_sys_color2 ch1_dbg,ch1_dbg+ch_struc_size,sc + + mov edx,[sc.work] + or edx,0x33000000 + xor eax,eax + xor esi,esi + mcall ,<100,280>,<90,260>,,,title ; Draw Window Label Text + + mcall 9,PROCESSINFO,-1 + + mov eax,[PROCESSINFO+70] ;status of window + test eax,100b + jne .end + + cmp dword[pinfo.box.width],230 ; яЁютхЁ хь °шЁшэє юъэр + jge @f + mov dword[pinfo.box.width],230 ; хёыш юъэю юўхэ№ єчъюх, єтхышўштрхь °шЁшэє фы  шчсхцрэш  уы■ъют +@@: + mpack ecx,1,1 + mov ebx,[pinfo.box.width] + sub ebx,10 + mov eax,8 + mov edx,0x4000000B + mpack ebx,[pinfo.box.width],MAGIC1 + msub ebx,MAGIC1+10+1,0 + mpack ecx,0, (14*3+16)/3-1 + madd ecx,1,0 + mcall ,,,0x00000002,[sc.work_button] + madd ecx, (14*3+16)/3+1,0 + mcall ,,,0x00000003 + madd ecx, (14*3+16)/3+1,0 + mcall ,,,4 +;button for OpenDialog [..] + mov ebx, 5*65536+47 + mov ecx, 33*65536+14 + mcall ,,,5 + + mpack ebx,6,0 ; Draw Window Text + add ebx,1+ 14/2-3 + mcall 4,,[sc.work_text],text,text.line_size ;InFile + + add ebx, 16 ;14 + add edx,text.line_size + mcall ;OutFile + + mov ecx,[sc.work_button_text] + add ebx, 16 ;14 + add edx,text.line_size + mcall ;Path + + mov ebx,[pinfo.box.width] + sub ebx,MAGIC1+10+1-9 + shl ebx,16 + add ebx,1+( (14*3+16)/3-1)/2-3 + mcall ,,[sc.work_button_text],s_compile,7 + add ebx,(14*3+16)/3+1 + mcall ,,,s_run + add ebx,(14*3+16)/3+1 + mcall ,,,s_debug + + mpack ebx,MAGIC1+6,0 + add ebx,1+ 14/2-3+ 14*0 + mov esi,[pinfo.box.width] + sub esi,MAGIC1*2+5*2+6+3 + mov eax,esi + mov cl,6 + div cl + cmp al,MAX_PATH + jbe @f + mov al,MAX_PATH +@@: + movzx esi,al + + call draw_messages + + mov eax,dword [pinfo.box.width] + sub eax,127 + mov dword[edit1.width],eax ; єёЄрэртыштрхь °шЁшэє ЄхъёЄют√ї яюыхщ + mov dword[edit2.width],eax + mov dword[edit3.width],eax + + push dword edit1 + call [edit_box_draw] + push dword edit2 + call [edit_box_draw] + push dword edit3 + call [edit_box_draw] + push dword ch1_dbg + call [check_box_draw] +.end: + mcall 12,2 ; End of Draw + popa + ret +;--------------------------------------------------------------------- +bottom_right dd ? + +align 4 +fun_opn_dlg: ;функция для вызова OpenFile диалога + pushad + copy_path open_dialog_name,communication_area_default_path,library_path,0 + mov [OpenDialog_data.type],0 + + xor al,al + mov edi,dword [edit3.text] + mov ecx,dword [edit3.max] + cld + repne scasb + cmp byte[edi-2],'/' + jne @f + mov byte[edi-2],0 ;если в конце пути есть слеш, то путь укорачиваем на 1 символ +@@: + push dword OpenDialog_data + call dword [OpenDialog_Start] + cmp [OpenDialog_data.status],2 + je @f + + xor al,al + mov edi,dword [edit3.text] + mov ebx,edi ;copy text pointer + mov ecx,dword [edit3.max] + cld + repne scasb + cmp byte[edi-2],'/' + jne .no_slash + + dec edi ;если в конце пути есть слеш, то путь укорачиваем на 1 символ +.no_slash: + mov byte[edi-1],'/' ;ставим в конце пути слеш + mov byte[edi],0 ;отрезаем имя найденного файла + sub edi,ebx ;edi = strlen(edit3.text) + mov [edit3.size],edi + mov [edit3.pos],edi + + push dword [OpenDialog_data.filename_area] + push dword edit1 + call dword [edit_box_set_text] + + push dword [OpenDialog_data.filename_area] + push dword edit2 + call dword [edit_box_set_text] + + mov esi,[edit2.text] + xor eax,eax + cld +.cycle: + lodsb + test eax,eax + jnz .cycle + + sub esi,5 + cmp esi,[edit2.text] + jle .short_fn + + mov byte[esi],0 + sub dword [edit2.size],4 + sub dword [edit2.pos],4 + +.short_fn: + push dword edit1 + call dword [edit_box_draw] + push dword edit2 + call dword [edit_box_draw] + push dword edit3 + call dword [edit_box_draw] +@@: + popad + ret +;--------------------------------------------------------------------- +draw_messages: + mpack ebx,7-2,[pinfo.box.width] + sub ebx,5*2+7*2-1-2*2 + mpack ecx,0,[pinfo.box.height] + madd ecx, 14*3+16+1+7+1,-( 14*3+16+1+7*2+25) + mov word[bottom_right+2],bx + mov word[bottom_right],cx + msub [bottom_right],7,11 + add [bottom_right],7 shl 16 + 53 + mcall 13,,,[sc.work] ; clear work area +_cy = 0 +_sy = 2 +_cx = 4 +_sx = 6 + push ebx ecx + mpack ebx,4,5 + add bx,[esp+_cx] + mov ecx,[esp+_sy-2] + mov cx,[esp+_sy] + msub ecx,1,1 + mcall 38,,,[sc.work_graph] + mov si,[esp+_cy] + add cx,si + shl esi,16 + add ecx,esi + madd ecx,1,1 + mcall + mpack ebx,4,4 + mov esi,[esp+_sy-2] + mov si,cx + mov ecx,esi + mcall + mov si,[esp+_cx] + add bx,si + shl esi,16 + add ebx,esi + madd ebx,1,1 + mcall + pop ecx ebx + ret +;--------------------------------------------------------------------- +; DATA +;--------------------------------------------------------------------- +if lang eq ru +text: + db ' ВхФайл:' +.line_size = $-text + db 'ВыхФайл:' + db ' Путь:' + ;db 'x' + + s_compile db 'Компил.' + s_run db ' Пуск ' + s_debug db 'Отладка' + s_dbgdescr db 'Создавать отладочную информацию',0 + + + err_message_found_lib0 db 'Не найдена библиотека box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена + err_message_import0 db 'Ошибка при импорте библиотеки box_lib.obj',0 + err_message_found_lib1 db 'Не найдена библиотека proc_lib.obj',0 + err_message_import1 db 'Ошибка при импорте библиотеки proc_lib.obj',0 + head_f_i: + head_f_l db 'Системная ошибка',0 ;заголовок окна, при возникновении ошибки +else +text: + db ' InFile:' +.line_size = $-text + db 'OutFile:' + db ' Path:' + ;db 'x' + + s_compile db 'COMPILE' + s_run db ' RUN ' + s_debug db ' DEBUG ' + s_dbgdescr db 'Generate debug information',0 + + + err_message_found_lib0 db 'Sorry I cannot found library box_lib.obj',0 + err_message_import0 db 'Error on load import library box_lib.obj',0 + err_message_found_lib1 db 'Sorry I cannot found library proc_lib.obj',0 + err_message_import1 db 'Error on load import library proc_lib.obj',0 + + head_f_i: + head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки +end if + + system_dir0 db '/sys/lib/' + lib0_name db 'box_lib.obj',0 + + system_dir1 db '/sys/lib/' + lib1_name db 'proc_lib.obj',0 +;--------------------------------------------------------------------- +align 4 +import_box_lib: +edit_box_draw dd aEdit_box_draw +edit_box_key dd aEdit_box_key +edit_box_mouse dd aEdit_box_mouse +edit_box_set_text dd aEdit_box_set_text +;version_ed dd aVersion_ed + +init_checkbox dd aInit_checkbox +check_box_draw dd aCheck_box_draw +check_box_mouse dd aCheck_box_mouse +;version_ch dd aVersion_ch + + dd 0,0 + +aEdit_box_draw db 'edit_box',0 +aEdit_box_key db 'edit_box_key',0 +aEdit_box_mouse db 'edit_box_mouse',0 +aEdit_box_set_text db 'edit_box_set_text',0 +;aVersion_ed db 'version_ed',0 + +aInit_checkbox db 'init_checkbox2',0 +aCheck_box_draw db 'check_box_draw2',0 +aCheck_box_mouse db 'check_box_mouse2',0 +;aVersion_ch db 'version_ch2',0 +;--------------------------------------------------------------------- +align 4 +import_proc_lib: +OpenDialog_Init dd aOpenDialog_Init +OpenDialog_Start dd aOpenDialog_Start + dd 0,0 +aOpenDialog_Init db 'OpenDialog_init',0 +aOpenDialog_Start db 'OpenDialog_start',0 +;--------------------------------------------------------------------- +;library structures +l_libs_start: + lib0 l_libs lib0_name, cur_dir_path, library_path, system_dir0, err_message_found_lib0, head_f_l, import_box_lib, err_message_import0, head_f_i + lib1 l_libs lib1_name, cur_dir_path, library_path, system_dir1, err_message_found_lib1, head_f_l, import_proc_lib,err_message_import1, head_f_i +load_lib_end: + +edit1 edit_box 153, 56, 1, 0xffffff, 0xff, 0x80ff, 0, 0x8000, (outfile-infile-1), infile, mouse_dd, 0, 11,11 +edit2 edit_box 153, 56, 17, 0xffffff, 0xff, 0x80ff, 0, 0x8000,(path-outfile-1), outfile, mouse_dd, 0, 7,7 +edit3 edit_box 153, 56, 33, 0xffffff, 0xff, 0x80ff, 0, 0x8000,(path_end-path-1), path, mouse_dd, 0, 6,6 +editboxes_end: +ch1_dbg check_box2 (5 shl 16)+12, (49 shl 16)+12, 6, 0xffffff, 0x80ff, 0, s_dbgdescr,ch_flag_bottom +;--------------------------------------------------------------------- +align 4 +OpenDialog_data: +.type dd 0 +.procinfo dd pinfo ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_path dd path ;+16 +.dir_default_path dd default_dir ;+20 +.start_path dd library_path ;+24 путь к диалогу открытия файлов +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_path dd path ;+36 путь к открываемому файлу +.filename_area dd filename_area ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 10 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 10 ;+54 ; Window Y position + +default_dir db '/rd/1',0 ;директория по умолчанию + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_name: + db 'opendial',0 +communication_area_default_path: + db '/rd/1/File managers/',0 + +Filter: +dd Filter.end - Filter +.1: +db 'ASM',0 +.end: +db 0 +;--------------------------------------------------------------------- +mouse_dd dd 0 ;эєцэю фы  Shift-р т editbox +;--------------------------------------------------------------------- +infile db 'example.asm' + times MAX_PATH-$+infile db 0 +outfile db 'example' + times MAX_PATH-$+outfile db 0 +path db '/rd/1//' ;OpenDialog при запуске убирает последний слеш, но диалог может использоваться не всегда, потому слеша 2 + times MAX_PATH-$+path db 0 +path_end: +lf db 13,10,0 +;--------------------------------------------------------------------- +mov_param_str: + cld +@@: + lodsb + cmp al,',' + je @f + stosb + test al,al + jnz @b +@@: + xor al,al + stosb + ret +;--------------------------------------------------------------------- +start: + cmp [_mode],NORMAL_MODE + jne @f + call draw_messages + mov [textxy],7 shl 16 + 70 +@@: + mov esi,_logo + call display_string + +;--------------------------------------------------------------------- +; Fasm native code +;--------------------------------------------------------------------- + mov [input_file],infile + mov [output_file],outfile + + call init_memory + + call make_timestamp + mov [start_time],eax + + call preprocessor + call parser + call assembler + bt dword[ch1_dbg.flags],1 ;cmp [bGenerateDebugInfo], 0 + jae @f ;jz @f + call symbol_dump +@@: + call formatter + + call display_user_messages + movzx eax,[current_pass] + inc eax + call display_number + mov esi,_passes_suffix + call display_string + call make_timestamp + sub eax,[start_time] + xor edx,edx + mov ebx,100 + div ebx + or eax,eax + jz display_bytes_count + xor edx,edx + mov ebx,10 + div ebx + push edx + call display_number + mov dl,'.' + call display_character + pop eax + call display_number + mov esi,_seconds_suffix + call display_string +display_bytes_count: + mov eax,[written_size] + call display_number + mov esi,_bytes_suffix + call display_string + xor al,al + + cmp [_run_outfile],0 + je @f + mov edx,outfile + call make_fullpaths + xor ecx,ecx + mcall 70,file_info_start +@@: + jmp exit_program +;--------------------------------------------------------------------- +include 'system.inc' +include 'version.inc' +include 'errors.inc' +include 'symbdump.inc' +include 'preproce.inc' +include 'parser.inc' +include 'exprpars.inc' +include 'assemble.inc' +include 'exprcalc.inc' +include 'formats.inc' +include 'x86_64.inc' +include 'avx.inc' +include 'tables.inc' +include 'messages.inc' +;--------------------------------------------------------------------- +title db appname,VERSION_STRING,0 + +_logo db 'flat assembler version ',VERSION_STRING,13,10,0 + +_passes_suffix db ' passes, ',0 +_seconds_suffix db ' seconds, ',0 +_bytes_suffix db ' bytes.',13,10,0 + +_include db 'INCLUDE',0 + +_counter db 4,'0000' + +_mode dd NORMAL_MODE +_run_outfile dd 0 + +;bGenerateDebugInfo db 0 + +dbgWord db '-d',0 + +sub_table: +times $41 db $00 +times $1A db $20 +times $25 db $00 +times $10 db $20 +times $30 db $00 +times $10 db $50 +times $04 db $00,$01 +times $08 db $00 + +;include_debug_strings +program_end: +; params db 0 ; 'TINYPAD.ASM,TINYPAD,/HD/1/TPAD4/', +params rb 4096 +cur_dir_path rb 4096 +library_path rb 4096 +filename_area rb 256 + +align 4 + +include 'variable.inc' + +program_base dd ? +buffer_address dd ? +memory_setting dd ? +start_time dd ? +memblock dd ? + +predefinitions rb 1000h + +dbgfilename rb MAX_PATH+4 + +sc system_colors +max_handles = 8 +fileinfos rb (4+20+MAX_PATH)*max_handles +fileinfos_end: +pinfo process_information + +align 1000h +rb 1000h +stacktop: