forked from KolibriOS/kolibrios
- Move source code from `trunk` into root directory. - Update build files and ASM include paths. Add SPDX license header where appropriate. - Note: Line endings standardised from `CRLF` > `LF`, so best to view diffs with whitespace changes hidden. (Work towards [#75](KolibriOS/kolibrios#75), point 3) Reviewed-on: KolibriOS/kolibrios#433 Reviewed-by: Burer <burer@kolibrios.org> Reviewed-by: Ivan B <1+dunkaist@noreply.localhost> Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com> Co-authored-by: Andrew <dent.ace@gmail.com> Co-committed-by: Andrew <dent.ace@gmail.com>
420 lines
9.5 KiB
NASM
420 lines
9.5 KiB
NASM
; SPDX-License-Identifier: NOASSERTION
|
|
;
|
|
|
|
; Text encoded with Code Page 866 - Cyrillic
|
|
|
|
|
|
use32 ; транслятор, использующий 32 разрядных команды
|
|
org 0 ; базовый адрес кода, всегда 0x0
|
|
db 'MENUET01' ; идентификатор исполняемого файла (8 байт)
|
|
dd 1 ; версия формата заголовка исполняемого файла
|
|
dd start ; адрес, на который система передаёт управление
|
|
; после загрузки приложения в память
|
|
dd i_end ; размер приложения
|
|
dd mem ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
|
|
dd mem ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
|
|
dd 0 ; указатель на строку с параметрами.
|
|
dd 0;pathprog ;путь и имя проги
|
|
|
|
include "../../../macros.inc"
|
|
include "../../../proc32.inc"
|
|
include "API.INC"
|
|
include "../../../dll.inc"
|
|
include '../../../develop/libraries/box_lib/box_lib.mac'
|
|
;include '../../../KOSfuncs.inc'
|
|
;include '../../../load_lib.mac'
|
|
|
|
start:
|
|
mcall 68,11 ;инициализируем кучу
|
|
test eax,eax
|
|
jz Win1.Exit
|
|
stdcall dll.Load, @IMPORT
|
|
|
|
|
|
; mov ecx,1024
|
|
; mov edi,pathprog
|
|
; xor al,al
|
|
;
|
|
; repne scasb
|
|
;
|
|
; dec edi
|
|
; mov esi,WordFile
|
|
; @@:
|
|
; lodsb
|
|
; stosb
|
|
; test al,al
|
|
; jne @b
|
|
|
|
;GetFileInfo fStruc,pathprog,fInfo ;проверка на наличие файла
|
|
;test eax,eax ;заодно и получу размер файла
|
|
;je WordFileOK
|
|
|
|
;stdcall [mb_create],msgNotFound,mbThread
|
|
;jmp Win1.Redraw
|
|
|
|
;WordFileOK:
|
|
; stdcall mem.Alloc,dword [fInfo+32]
|
|
; mov ebx,dword [fInfo+32]
|
|
; mov [filBuffer],eax
|
|
; add dword[fInfo+32],eax ;здесь хранится указатель на конец буфера
|
|
; ReadFile fStruc,pathprog,ebx,eax,0
|
|
; test eax,eax
|
|
; jz Win1.Redraw
|
|
;
|
|
; add al,30h
|
|
; mov [NumErr],al
|
|
; stdcall [mb_create],msgNotFound1,mbThread
|
|
;
|
|
|
|
|
|
align 4
|
|
Win1.Redraw:
|
|
RedrawWinBeg
|
|
|
|
xor eax,eax
|
|
mov ebx,(524*10000h+500)
|
|
mov ecx,(548*10000h+200)
|
|
mov edx,73FFFFFFh
|
|
mov edi,Win1.Caption
|
|
int 40h ;окно с прозрачным фонoм
|
|
|
|
mcall 9,ThreadInfo,-1
|
|
|
|
mov eax,13
|
|
mov ebx,[ThreadInfo+3Eh]
|
|
inc ebx
|
|
mov ecx,[ThreadInfo+42h]
|
|
inc ecx
|
|
mov edx,clWhite
|
|
int 40h ;а теперь не прозрачным:)
|
|
|
|
call Perevod ; в перерисовке сразу переводим введённое слово
|
|
call NextPerev
|
|
stdcall [edit_box_draw],EditIN
|
|
RedrawWinEnd
|
|
|
|
align 4
|
|
Win1.Events:
|
|
WaitMessage
|
|
dec eax
|
|
jz Win1.Redraw
|
|
dec eax
|
|
jz Win1.Key
|
|
dec eax
|
|
jz Win1.ButtonPress
|
|
|
|
;stdcall [edit_box_mouse],EditIN
|
|
|
|
jmp Win1.Events
|
|
|
|
Win1.ButtonPress:
|
|
GetButtonPressed
|
|
|
|
cmp ah,idbExit
|
|
je Win1.Exit
|
|
|
|
jmp Win1.Events
|
|
|
|
Win1.Key:
|
|
GetKeyPressed
|
|
stdcall [edit_box_key],EditIN
|
|
jmp Win1.FonRedraw
|
|
|
|
|
|
Win1.Exit:
|
|
|
|
ExitProcess
|
|
|
|
Win1.FonRedraw: ;перерисовка области вывода
|
|
mcall 9,ThreadInfo,-1
|
|
|
|
mov eax,13
|
|
mov ebx,[ThreadInfo+3Eh]
|
|
inc ebx
|
|
mov ecx,20
|
|
shl ecx,16
|
|
add ecx,[ThreadInfo+42h]
|
|
sub ecx,19
|
|
mov edx,clWhite
|
|
int 40h
|
|
|
|
call Perevod
|
|
call NextPerev
|
|
jmp Win1.Events
|
|
|
|
;-------------------------------------------------------------------------------
|
|
|
|
Perevod: ;сам перевод
|
|
mov edi,dict;[filBuffer]
|
|
|
|
Perev:
|
|
xor ebx,ebx
|
|
@@: ;сравнием исх. слово со словом под esi
|
|
mov al,[text+ebx]
|
|
test al,al
|
|
je endWord
|
|
cmp [ebx+edi],al
|
|
jne WordNotFound
|
|
inc ebx
|
|
jmp @b
|
|
|
|
endWord:
|
|
cmp byte[ebx+edi],20h
|
|
jne WordNotFound
|
|
|
|
add edi,ebx
|
|
dec edi ;пропускаем пробелы после английского слова
|
|
@@:
|
|
inc edi
|
|
cmp byte[edi],20h
|
|
je @b
|
|
|
|
xor ebx,ebx
|
|
CopyWord: ;копируем перевод в строку для вывода
|
|
mov al,[edi+ebx]
|
|
cmp al,0Dh
|
|
je @f
|
|
mov [perevText+ebx],al
|
|
inc ebx
|
|
jmp CopyWord
|
|
@@:
|
|
mov byte[perevText+ebx],0
|
|
|
|
OutText 7,25,perevText
|
|
ret
|
|
|
|
WordNotFound: ;если слово не подошло
|
|
add edi,ebx
|
|
@@:
|
|
cmp byte[edi],0Dh
|
|
je NextWord
|
|
inc edi
|
|
cmp edi,SizeDict;dword [fInfo+32]
|
|
jae endPerev
|
|
jmp @b
|
|
|
|
NextWord:
|
|
add edi,2
|
|
cmp edi,SizeDict;dword [fInfo+32]
|
|
jae endPerev
|
|
jmp Perev
|
|
endPerev:
|
|
ret
|
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
NextPerev:
|
|
mov ecx,Lines
|
|
mov edi,dict;[filBuffer]
|
|
LinePerev: ;цикл рисования строки
|
|
xor ebx,ebx
|
|
@@: ;сравнием исх. слово со словом под esi
|
|
mov al,[text+ebx]
|
|
test al,al
|
|
je N_endWord
|
|
cmp [ebx+edi],al
|
|
jne N_WordNotFound
|
|
inc ebx
|
|
jmp @b
|
|
|
|
N_endWord:
|
|
cmp ebx,0
|
|
jne N_Ppoisk
|
|
ret
|
|
|
|
N_Ppoisk: ;поиск начала строки
|
|
add edi,ebx
|
|
@@:
|
|
dec edi
|
|
cmp byte[edi],0Ah
|
|
jne @b
|
|
inc edi
|
|
|
|
;########пропускаем уже переведённое слово########
|
|
xor ebx,ebx
|
|
N_NoDouble:
|
|
mov al,[text+ebx]
|
|
test al,al
|
|
je N_Double
|
|
cmp [ebx+edi],al
|
|
jne N_NoDblOk
|
|
inc ebx
|
|
jmp N_NoDouble
|
|
|
|
N_Double:
|
|
cmp byte[ebx+edi],20h
|
|
jne N_NoDblOk
|
|
|
|
add edi,ebx
|
|
@@:
|
|
inc edi
|
|
cmp byte[edi],0Ah
|
|
jne @b
|
|
add edi,2
|
|
jmp LinePerev
|
|
|
|
N_NoDblOk: ;############вывод результатов####################
|
|
xor ebx,ebx ;копируем результат
|
|
N_CopyWord:
|
|
mov al,[edi+ebx]
|
|
cmp al,20h
|
|
je @f
|
|
mov [perevText+ebx],al
|
|
inc ebx
|
|
jmp N_CopyWord
|
|
@@:
|
|
mov byte[perevText+ebx],0
|
|
add edi,ebx
|
|
|
|
mov eax,Lines
|
|
sub eax,ecx
|
|
dec eax
|
|
shl eax,3
|
|
add eax,45
|
|
push ecx
|
|
push edi
|
|
OutText 7,ax,perevText
|
|
pop edi
|
|
pop ecx
|
|
|
|
@@:
|
|
inc edi
|
|
cmp byte[edi],20h
|
|
je @b
|
|
|
|
|
|
xor ebx,ebx
|
|
N_CopyPerev:
|
|
mov al,[edi+ebx]
|
|
cmp al,0Dh
|
|
je @f
|
|
mov [perevText+ebx],al
|
|
inc ebx
|
|
jmp N_CopyPerev
|
|
@@:
|
|
mov byte[perevText+ebx],0
|
|
|
|
mov eax,Lines
|
|
sub eax,ecx
|
|
dec eax
|
|
shl eax,3
|
|
add eax,45
|
|
push ecx
|
|
push edi
|
|
OutText 127,ax,perevText
|
|
pop edi
|
|
pop ecx
|
|
|
|
@@:
|
|
inc edi
|
|
cmp byte[edi],0Ah
|
|
jne @b
|
|
inc edi
|
|
|
|
loop @f ;недотягивается до LinePerev
|
|
ret
|
|
@@:
|
|
jmp LinePerev
|
|
|
|
N_WordNotFound:
|
|
add edi,ebx
|
|
@@:
|
|
cmp byte[edi],0Dh
|
|
je N_NextWord
|
|
inc edi
|
|
cmp edi,SizeDict;dword [fInfo+32]
|
|
jae N_endPerev
|
|
jmp @b
|
|
|
|
N_NextWord:
|
|
add edi,2
|
|
cmp edi,SizeDict;dword [fInfo+32]
|
|
jae N_endPerev
|
|
jmp LinePerev
|
|
N_endPerev:
|
|
ret
|
|
|
|
;-------------------------------------------------------------------------------
|
|
;-------------------------------------------------------------------------------
|
|
;------DATA---------------------------------------------------------------------
|
|
;-------------------------------------------------------------------------------
|
|
;-------------------------------------------------------------------------------
|
|
|
|
idbExit = 1
|
|
|
|
Lines = 16 ;количеств строк
|
|
|
|
clTheme = 080B0FFh
|
|
|
|
Win1.Caption db 'Dictionary ENG -> RUS',0
|
|
Win1X = 524
|
|
Win1Y = 548
|
|
Win1W = 500
|
|
Win1H = 200
|
|
|
|
Memo.X = 5
|
|
Memo.Y = 20
|
|
Memo.W = 400
|
|
Memo.H = 370
|
|
|
|
EditIN edit_box 350,5,5,0FFFFFFh,06F9480h,0,00h,0,40,\
|
|
text,mouse_dd,ed_focus,0,0
|
|
|
|
|
|
|
|
; msgNotFound:
|
|
; dw 0
|
|
; db 'Ошибка',0
|
|
; db 'Файл dictionary.wrd не найден',0
|
|
; db 'Ясно',0
|
|
; db 0
|
|
;
|
|
; msgNotFound1:
|
|
; dw 0
|
|
; db '!!!',0
|
|
; db 'Ошибка чтения '
|
|
; NumErr: db 0
|
|
; db 0
|
|
; db 'Ясно',0
|
|
; db 0
|
|
;
|
|
; WordFile db '.wrd',0
|
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
@IMPORT:
|
|
library box_lib,'box_lib.obj',msgbox,'msgbox.obj'
|
|
import box_lib,\
|
|
edit_box_draw,'edit_box_draw',\
|
|
edit_box_key,'edit_box_key';,\
|
|
;edit_box_mouse,'edit_box_mouse'
|
|
import msgbox,\
|
|
mb_create,'mb_create'
|
|
|
|
dict:
|
|
include 'dictionary.wrd'
|
|
|
|
SizeDict = $;-dict
|
|
|
|
|
|
i_end:
|
|
;-------------------------------------------------------------------------------
|
|
|
|
;WordFP rb 1024
|
|
; m1 dd 0
|
|
;filBuffer rd 1
|
|
|
|
|
|
ThreadInfo: rb 1024
|
|
;pathprog
|
|
mouse_dd rd 1
|
|
text rb 40
|
|
perevText rb 300
|
|
;fStruc rb 30
|
|
;fInfo rb 40
|
|
mbThread rb 1024
|
|
|
|
|
|
rb 4096
|
|
mem:
|