You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9012 lines
185 KiB
9012 lines
185 KiB
;;-------------------------------------------------------------------------
|
|
;;
|
|
;; Adic Helper [cJass]
|
|
;; v 01 04 01 05
|
|
;;
|
|
;; © 2009 ADOLF aka ADX
|
|
;; http://cjass.xgm.ru
|
|
;;
|
|
;;-------------------------------------------------------------------------
|
|
|
|
;;-------------------------------------------------------------------------
|
|
.686
|
|
.model flat
|
|
.xmm
|
|
;;-------------------------------------------------------------------------
|
|
includelib \masm32\lib\kernel32.lib
|
|
includelib \masm32\lib\user32.lib
|
|
includelib \masm32\lib\gdi32.lib
|
|
includelib \masm32\lib\comctl32.lib
|
|
includelib \masm32\lib\shell32.lib
|
|
|
|
includelib SFmpq.lib
|
|
|
|
;; include \masm32\include\kernel32.inc
|
|
include \masm32\include\gdi32.inc
|
|
include \masm32\include\windows.inc
|
|
include \masm32\include\comctl32.inc
|
|
;;-------------------------------------------------------------------------
|
|
extern _imp__ExitProcess@4:dword
|
|
extern _imp__GetCommandLineA@0:dword
|
|
extern _imp__CreateThread@24:dword
|
|
extern _imp__CloseHandle@4:dword
|
|
extern _imp__GlobalAlloc@8:dword
|
|
extern _imp__GlobalLock@4:dword
|
|
extern _imp__GlobalUnlock@4:dword
|
|
extern _imp__GlobalFree@4:dword
|
|
extern _imp__CreateFileA@28:dword
|
|
extern _imp__WriteFile@20:dword
|
|
extern _imp__DeleteFileA@4:dword
|
|
extern _imp__GetCurrentDirectoryA@8:dword
|
|
extern _imp__SetCurrentDirectoryA@4:dword
|
|
extern _imp__ReadFile@20:dword
|
|
extern _imp__GetFileSize@8:dword
|
|
extern _imp__SetThreadPriority@8:dword
|
|
|
|
extern _imp__MessageBoxA@16:dword
|
|
extern _imp__RegisterClassA@4:dword
|
|
extern _imp__CreateWindowExA@48:dword
|
|
extern _imp__GetSystemMetrics@4:dword
|
|
extern _imp__GetMessageA@16:dword
|
|
extern _imp__DispatchMessageA@4:dword
|
|
extern _imp__DefWindowProcA@16:dword
|
|
extern _imp__LoadIconA@8:dword
|
|
extern _imp__PostMessageA@16:dword
|
|
extern _imp__SendMessageA@16:dword
|
|
extern _imp__ShowWindow@8:dword
|
|
extern _imp__RedrawWindow@16:dword
|
|
extern _imp__LoadCursorA@8:dword
|
|
extern _imp__SetCursor@4:dword
|
|
;; extern _imp__DrawIcon@16:dword
|
|
extern _imp__DestroyWindow@4:dword
|
|
extern _imp__SetWindowTextA@8:dword
|
|
extern _imp__MoveWindow@24:dword
|
|
extern _imp__MessageBeep@4:dword
|
|
extern _imp__SetFocus@4:dword
|
|
|
|
extern _imp__MpqOpenArchiveForUpdate@12:dword
|
|
extern _imp__MpqDeleteFile@8:dword
|
|
extern _imp__SFileOpenFileEx@16:dword
|
|
extern _imp__MpqCompactArchive@4:dword
|
|
extern _imp__MpqCloseUpdatedArchive@8:dword
|
|
extern _imp__SFileGetFileSize@8:dword
|
|
extern _imp__SFileReadFile@20:dword
|
|
extern _imp__MpqAddFileToArchiveEx@24:dword
|
|
|
|
extern _imp__BeginPaint@8:dword
|
|
extern _imp__EndPaint@8:dword
|
|
extern _imp__SetBkMode@8:dword
|
|
extern _imp__GetStockObject@4:dword
|
|
extern _imp__SelectObject@8:dword
|
|
extern _imp__SetBkMode@8:dword
|
|
extern _imp__DrawTextA@20:dword
|
|
extern _imp__SetTextColor@8:dword
|
|
extern _imp__CreateFontIndirectA@4:dword
|
|
|
|
extern _imp__ShellExecuteA@24:dword
|
|
|
|
extern _imp__GetLocalTime@4:dword
|
|
|
|
;;dbg
|
|
;;extern _imp__wsprintfA:dword
|
|
;;-------------------------------------------------------------------------
|
|
.data
|
|
|
|
WM_PROCEND equ WM_USER+02h
|
|
WM_CJ_ERROR equ WM_USER+03h
|
|
|
|
_dWndStlEx dd WS_VISIBLE
|
|
|
|
; align 04h
|
|
_sWinName db "AdicHelper 1.4.1.5", 00h
|
|
_sTollInfo db "cJass parser and optimizer AdicHelper v 1.4.1.5", 0dh, 0ah, "(c) ADOLF aka ADX, 2009", 00h
|
|
_sSiteAdr db "http://cjass.xgm.ru", 00h
|
|
|
|
_sOpen db "open", 00h
|
|
|
|
_sAttr db "(attributes)", 00h
|
|
_sWJ db "war3map.j", 00h
|
|
_sWJP db "parsed_war3map.j", 00h
|
|
_sWJO db "optimized_war3map.j", 00h
|
|
_sSynErr db "AdicHelper: syntax error", 00h
|
|
|
|
_dfilename dd offset _sWJP
|
|
|
|
_dDefTableSD equ $
|
|
|
|
_dMapProcCode dd 00h ;; used in string preprocessor
|
|
|
|
;; used in setdef
|
|
dd 00h, 00h, 00h
|
|
|
|
_hWndCls dd CS_NOCLOSE or CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW,
|
|
offset _hWndProc, 00h, 00h, 400000h, ?, 10011h, COLOR_WINDOW, 00h, offset _sWJ
|
|
_hErrCls dd CS_HREDRAW or CS_VREDRAW,
|
|
offset _hErrProc, 00h, 00h, 400000h, ?, 10011h, COLOR_WINDOW, 00h, offset _sSynErr
|
|
|
|
;; fonts
|
|
_xOutFont dd 0bh, 00h, 00h, 00h, 0190h
|
|
db 00h, 00h ,00h, ANSI_CHARSET, 00h, 00h, 00h, 01h
|
|
db "Lucida console", 00h
|
|
_xGuiFont dd 0dh, 00h, 00h, 00h, 0190h
|
|
db 00h, 00h ,00h, ANSI_CHARSET, 00h, 00h, 00h, 01h
|
|
db "MS Sans Serif", 00h
|
|
_xWWWFont dd 0dh, 00h, 00h, 00h, 0190h
|
|
db 00h, 01h ,00h, ANSI_CHARSET, 00h, 00h, 00h, 01h
|
|
db "MS Sans Serif", 00h
|
|
|
|
_dFreeScope dd 00h
|
|
|
|
_dDbgOff dd offset _lCRDebugRem ;; is debug mode
|
|
|
|
_dSynDesc dd offset _xSynDesc ;; ex syntax (zinc and boa) pointer
|
|
|
|
_dSortSteps dd 0010h, 0050h, 0130h, 0290h, 06d0h, 0d10h, 1f90h, 3a10h, 8710h, 0f410h, 0ffffffffh
|
|
;;
|
|
;; 10 bits offset oriented
|
|
;;
|
|
|
|
_dCurrStr dd offset _sProg_00
|
|
|
|
_xRect_00 dd 0010h, 10h, 0172h, 40h
|
|
_xRect_01 dd 0010h, 24h, 0172h, 40h
|
|
_xRect_toRedraw dd 0118h, 10h, 0172h, 1ch
|
|
|
|
_xRect_02 dd 0010h, 08h, 0172h, 20h
|
|
|
|
_dEnumStrPoint dd offset _xEnumStr+0dh
|
|
_dEnumTablePointer dd offset _xEnumTable+0ch
|
|
;; _dEnumLabelPointer dd offset _xEnumLabel
|
|
|
|
_dEnumDefTable dd offset _xEnumDefTable, offset _xEnumDefTable+0ch
|
|
_xEnumDefTable dd 80000000h, 0ffffffffh, offset _xEnumDefTable+0ch, 00000000h, 7fffffffh, 00000000h
|
|
|
|
_sDateL db "DATE", 02h
|
|
_sTimeL db "TIME", 02h
|
|
_sDebugL db "DEBUG", 02h
|
|
_sCountL db "COUNTER", 02h
|
|
_sWeatherL db "WEATHER_ON_MARS", 02h
|
|
_sWarVer db "WAR3VER", 02h
|
|
_sFuncNameL db "FUNCNAME", 02h
|
|
|
|
_sTrue db "1", 03h
|
|
_sVer24 db "WAR3VER_24", 03h
|
|
_sVer23 db "WAR3VER_23", 03h
|
|
_sVerUndef db "WAR3VER_00", 03h
|
|
_sCntSpec db 01h, 36h, 03h
|
|
_sWether db 01h, 37h, 03h
|
|
_sFuncName db 66h, 66h, 01h, 38h, 03h
|
|
|
|
_dWarVerSL dd offset _sVerUndef ;; if zero - do not remove unused code
|
|
|
|
_sProg_00 db "Parsing: preparing...", 00h
|
|
_sProg_01 db "Parsing: processing...", 00h
|
|
_sProg_02 db "Parsing: build Find'n'Replace table...", 00h
|
|
_sProg_03 db "Parsing: find'n'Replace: process...", 00h
|
|
_sProg_04 db "Parsing: killing Vexorian...", 00h
|
|
_sProg_05 db "Parsing: success!", 00h
|
|
|
|
_sProg_06 db "Optimization: preparing...", 00h
|
|
_sProg_07 db "Optimization: removing unused code...", 00h
|
|
_sProg_08 db "Optimization: success!", 00h
|
|
|
|
_sExit db "Exit", 00h
|
|
|
|
_sProgBar db "msctls_progress32", 00h
|
|
_sEditWnd db "edit", 00h
|
|
_sListWnd db "listbox", 00h
|
|
_sButton db "button", 00h
|
|
|
|
_sErr_Arch db "Error: cannot open archive", 00h
|
|
_sErr_Code db "Error: cannot find war3map.j", 00h
|
|
|
|
_sErr_Title db "Compiling is stopped", 00h
|
|
|
|
_sErr_Base db "[00] Critical syntax error", 00h
|
|
_sErr_UnclosedString db "[01] Critical error: string unclosed or too big", 00h
|
|
_sErr_CantOpenFile db "[02] Critical error: cannot open included file", 00h
|
|
_sErr_BadBlockInFile db "[03] Critical error: unclosed block in included file", 00h
|
|
_sErr_BadBlock db "[04] Critical error: excessive block closing bracket", 00h
|
|
_sErr_UnclosedBlock db "[05] Critical error: unclosed block", 00h
|
|
_sErr_EndLibScope db "[06] Critical error: excessive endlibrary/endscope", 00h
|
|
_sErr_BadDef db "[07] Critical error: word cannot be defined: maybe missing enddefine?", 00h
|
|
_sErr_BadChar db "[08] Critical error: bad char", 00h
|
|
_sErr_UnclosedLib db "[09] Critical error: missing endlibrary or endscope", 00h
|
|
_sErr_UnclosedComment db "[10] Critical error: unclosed comment block", 00h
|
|
_sErr_BadComment db "[11] Critical error: comment closed without opening", 00h
|
|
_sErr_ValueRedefined db "[12] Critical error: macro defined twice with different arguments", 00h
|
|
_sErr_ValueRedefinedEX db "[**] Redeclared here", 00h
|
|
_sErr_MissDefArg db "[13] Critical error: missing define arguments", 00h
|
|
_sErr_DefArg db "[14] Critical error: too many arguments passed to define", 00h
|
|
_sErr_UnknowBlock db "[15] Critical error: unknown block", 00h
|
|
_sErr_IncorrectLiteral db "[16] Critical error: incorrect literal", 00h
|
|
_sErr_PreProc db "[17] Critical error: incorrect preprocessor instruction", 00h
|
|
_sErr_Ude db "[18] Critical error: used defined error", 00h
|
|
_sErr_FailedDef db "[19] Critical error: defines cannot be declared in #if/#endif block. Please declare them outside of this block and use setdef instruction", 00h
|
|
|
|
_bFCLL db 40h ;; locals
|
|
_bFCLLMAX db 40h ;; locals max
|
|
|
|
_dFCPL dd offset _bFuncPostEX ;; postix index - pointer
|
|
|
|
_sCodeConst db "true", 00h
|
|
db "false", 00h
|
|
db "function", 00h
|
|
db "Player", 00h
|
|
db "GetRandomInt", 00h
|
|
db "GetRandomReal", 00h
|
|
db "Deg2Rad", 00h
|
|
db "Rad2Deg", 00h
|
|
db "Sin", 00h
|
|
db "Cos", 00h
|
|
db "Tan", 00h
|
|
db "Asin", 00h
|
|
db "Acos", 00h
|
|
db "Atan", 00h
|
|
db "Atan2", 00h
|
|
db "SquareRoot", 00h
|
|
db "Pow", 00h
|
|
db "I2R", 00h
|
|
db "R2I", 00h
|
|
db "I2S", 00h
|
|
db "R2S", 00h
|
|
db "R2SW", 00h
|
|
db "S2I", 00h
|
|
db "S2R", 00h
|
|
db "SubString", 00h
|
|
db "StringLength", 00h
|
|
db "StringCase", 00h
|
|
db "Condition", 00h
|
|
db "Filter", 00h
|
|
|
|
db 00h
|
|
|
|
_sCodeNXFunc db "laeRmodnaRteG", 00h
|
|
db "tnImodnaRteG", 00h
|
|
db "reyalP", 00h
|
|
db "reggirTetaerC", 00h
|
|
db "noigeRetaerC", 00h
|
|
db "noitacoL", 00h
|
|
db "tceR", 00h
|
|
db "ecroFetaerC", 00h
|
|
db "puorGetaerC", 00h
|
|
db "remiTetaerC", 00h
|
|
db "tnImodnaRteG", 00h
|
|
db "laeRmodnaRteG", 00h
|
|
|
|
db 00h
|
|
|
|
;;
|
|
;; 0...9 ; A...Z ; _ ; a...z
|
|
;;
|
|
|
|
_bAscii_00 \
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
|
|
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 00h, 00h, 00h, 00h, 01h
|
|
db 00h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
|
|
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
|
|
;;
|
|
;; 0...9 ; A...Z ; _ ; a...z ; , and .
|
|
;;
|
|
|
|
_bAscii_03 \
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 01h, 00h
|
|
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
|
|
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 00h, 00h, 00h, 00h, 01h
|
|
db 00h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h
|
|
db 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 01h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
|
|
|
|
;;
|
|
;; remove bs 00
|
|
;;
|
|
;; 00h, 01h, 02h, 03h, 04h, 05h, 06h, 07h, 08h, 09h, 0ah, 0bh, 0ch, 0dh, 0eh, 0fh
|
|
_bAscii_01 \
|
|
db _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00 ;; 00h - 0fh
|
|
db _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00 ;; 10h - 1fh
|
|
db _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_02, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_01, _lCRDD_01, _lCRDD_00, _lCRDD_01, _lCRDD_02, _lCRDD_01 ;; 20h - 2fh
|
|
db _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00 ;; 30h - 3fh
|
|
db _lCRDD_00, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02 ;; 40h - 4fh
|
|
db _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00 ;; 50h - 5fh
|
|
db _lCRDD_00, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02 ;; 60h - 6fh
|
|
db _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_02, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00 ;; 70h - 7fh
|
|
|
|
_lCRDD_00 equ offset _lCRScanBS - _lBSRemBase
|
|
_lCRDD_01 equ offset _lCRIncDec - _lBSRemBase
|
|
_lCRDD_02 equ offset _lCRBSNext - _lBSRemBase
|
|
_lCRDD_03 equ offset _lCRBSAdd - _lBSRemBase
|
|
|
|
;;
|
|
;; remove bs 01
|
|
;;
|
|
_bAscii_02 \
|
|
db _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00
|
|
db _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00
|
|
db _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_03, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_03, _lCRDD_00
|
|
db _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00
|
|
db _lCRDD_00, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03
|
|
db _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_03
|
|
db _lCRDD_00, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03
|
|
db _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_03, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00, _lCRDD_00
|
|
|
|
;;----------------
|
|
;; for debug
|
|
;;_sDbgSrc db "%d", 00h
|
|
;;_sDbgDest db 20h dup(00h)
|
|
;;----------------
|
|
|
|
;;-------------------------------------------------------------------------
|
|
.data?
|
|
|
|
_sTime db 09h dup(?)
|
|
_sDate db 0bh dup(?)
|
|
_dCounterV dd ?
|
|
|
|
_bCodeSys db ? ;; 0 = not return and not if construction
|
|
_bCodePosOp db ? ;; 0 = no post operation (++ or --)
|
|
|
|
_bTempBool db ?
|
|
_bTempType db ?
|
|
|
|
_dBuffer dd ? ;; buffer
|
|
_hOLMacro dd ? ;; used in macro overloading
|
|
|
|
_dGuiFont dd ?
|
|
_dWWWFont dd ? ;; used in string preprocessor
|
|
|
|
_fScr dd ?
|
|
|
|
_dUndefPnt dd ? ;; script position in undefined
|
|
|
|
_hWnd dd ?
|
|
_hPrg dd ?
|
|
_hList dd ?
|
|
_hBtn dd ? ;; used in #if ...
|
|
|
|
;; _hIconCJ dd ?
|
|
_hTrd dd ?
|
|
|
|
_dStackPos dd ?
|
|
_dPreStackPos dd ?
|
|
|
|
_dErrorCodeStart dd ? ;; edi position of bad code
|
|
_xErrorTable dd 08h dup(?)
|
|
|
|
_dStdCursor dd ?
|
|
_dExCursor dd ?
|
|
|
|
_sMapPath db 0200h dup(?)
|
|
_dMapPathToEX equ 0200h
|
|
_sMapPathEX db 0200h dup(?) ;; for include
|
|
_dMapPathEnd dd ?
|
|
|
|
_sCurrDir db 0200h dup(?)
|
|
_dCurrDirEnd dd ?
|
|
|
|
align 10h
|
|
_lDefX dd 00010000h dup(?) ;; 80h bits defBlocks
|
|
|
|
_dScopeIn dd 0100h dup(?)
|
|
_dScopeOut dd 0100h dup(?)
|
|
|
|
_dDefTable dd 0080h dup(?) ;; used in f'n'p ;; used in code romoning (variables)
|
|
_dDefTableEX dd 0080h dup(?) ;; used in code romoning (function)
|
|
|
|
_dDefArgs dd 0080h dup(?)
|
|
|
|
_xPntStr PAINTSTRUCT <?>
|
|
|
|
_dFCL dd ? ;; locals
|
|
_dFCB dd ? ;; base code of function
|
|
|
|
_dBCP dd ? ;; base code pointer
|
|
|
|
align 10h
|
|
_bFuncCodeLocals db 00010000h dup(?) ;; locals ;; used also in string preprocessor ;; used in guard ;; used in removing unused code - variables
|
|
align 10h
|
|
_bFuncCodeBase db 000a0000h dup(?) ;; base code of function ;; used also in string preprocessor ;; used in removing unused code - functions
|
|
_bFuncCodeOneLine db 00004000h dup(?) ;; one line of func code
|
|
_bFuncPostEX db 00000200h dup(?) ;; postix index
|
|
|
|
_xEnumStr db 00008000h dup(?) ;; enum string
|
|
_xEnumTable dd 00008000h dup(?) ;; enum structs ;; used also in #if
|
|
_xEnumLabel dd 00000100h dup(?) ;; enum labels
|
|
|
|
_xSysTime dw 08h dup(?) ;; system time
|
|
|
|
_dVarParams dd ? ;; variable group params
|
|
|
|
_dLastFuncName dd ? ;; used in FUNCNAME macro
|
|
|
|
_bIsPPCEn db ? ;; in #if/#endif block
|
|
|
|
_xSynDesc dd 0400h dup(?) ;; ex syntax (zinc and boa) descriptor
|
|
|
|
_bStrXX db ? ;; uses to add bs at strings
|
|
|
|
;;-------------------------------------------------------------------------
|
|
.code
|
|
|
|
_next equ @f
|
|
_prew equ @b
|
|
_lbl equ @@
|
|
|
|
;;----------------
|
|
;; debug print reg
|
|
_printReg macro reg
|
|
pushad
|
|
|
|
push reg
|
|
push offset _sDbgSrc
|
|
push offset _sDbgDest
|
|
|
|
call _imp__wsprintfA
|
|
add esp, 0ch
|
|
|
|
push 00h
|
|
push 00h
|
|
push offset _sDbgDest
|
|
push 00h
|
|
call _imp__MessageBoxA@16
|
|
|
|
popad
|
|
endm
|
|
;;----------------
|
|
|
|
;;-------------------------------------------------------------------------
|
|
|
|
;; struct defBlock
|
|
;;
|
|
;; _sDFLabel dd ;; adress of string [define label]
|
|
;; _sDFValue dd ;; adress of string [define value]
|
|
;; _sDFScope dd ;; scope id
|
|
;; _dValueLenght dd ;; arg count
|
|
_dDFSize equ 10h
|
|
|
|
;; struct errorTable
|
|
;;
|
|
;; _hString dd ;; offset of info string
|
|
;; _hStarsS dd ;; selection end
|
|
;; _hEndS dd ;; selection start
|
|
;; dd ;; not use
|
|
|
|
;; struct enumLabels
|
|
;;
|
|
;; _hName dd ;; pointer to string
|
|
;; _hNegBase dd ;; negative enumTable
|
|
;; _hPosBase dd ;; positive enumTable
|
|
|
|
;; struct enumTable
|
|
;;
|
|
;; _hMin dd
|
|
;; _hMax dd
|
|
;; _hNext dd ;; next enumTable
|
|
|
|
;; struct globVar/func
|
|
;;
|
|
;; _hAddrS dd ;; address - start
|
|
;; _hAddrE dd ;; end
|
|
;; _hName dd ;; var Name
|
|
;; _wCnt dw ;; counter
|
|
;; _ db
|
|
;; _ db
|
|
|
|
;; struct funcCode
|
|
;;
|
|
;; _hAddrS dd ;; address - start
|
|
;; _hAddrE dd ;; end
|
|
;; _hName dd ;; var Name
|
|
;; _wCnt dw ;; counter
|
|
;; _bIsChecked db ;; is checked
|
|
;; _ db
|
|
|
|
;;-------------------------------------------------------------------------
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; proc optimize
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
_lMapOptimizeCode:
|
|
|
|
;;----------------
|
|
mov _dCurrStr, offset _sProg_06
|
|
mov eax, 10h
|
|
call _lSetProg
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; code preparation
|
|
xor ebx, ebx ;; use bl only
|
|
jmp _lOptPreStartEX
|
|
_lOptPreStart:
|
|
movsb
|
|
_lOptPreStartEX:
|
|
mov eax, dword ptr [esi]
|
|
|
|
;;----------------
|
|
;; nl
|
|
cmp ax, 0a0dh ;; nl
|
|
jne _next
|
|
|
|
_lOptAddNLEX:
|
|
cmp byte ptr [edi-01h], 0ah ;; nl
|
|
jne _lOptAddNL
|
|
add esi, 02h
|
|
jmp _lOptPreStartEX
|
|
|
|
_lOptAddNL:
|
|
mov byte ptr [edi], 0ah ;; nl
|
|
add esi, 02h
|
|
inc edi
|
|
jmp _lOptPreStartEX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; comments
|
|
_lbl:
|
|
cmp ax, 2f2fh ;; //
|
|
jne _next
|
|
|
|
_lOptComm:
|
|
inc esi
|
|
cmp byte ptr [esi], 00h
|
|
je _lOptPreEnd
|
|
cmp word ptr [esi], 0a0dh
|
|
jne _lOptComm
|
|
jmp _lOptAddNLEX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; strings
|
|
_lbl:
|
|
cmp eax, 2b202222h ;; "" +
|
|
jne _next
|
|
add esi, 04h
|
|
jmp _lOptPreStartEX
|
|
|
|
_lbl:
|
|
cmp eax, 2222202bh ;; + ""
|
|
jne _next
|
|
add esi, 04h
|
|
jmp _lOptPreStartEX
|
|
|
|
_lbl:
|
|
cmp eax, 202b2022h ;; " +
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 22h ;; "
|
|
jne _next
|
|
add esi, 05h
|
|
jmp _lOptPreStartEX
|
|
|
|
_lbl:
|
|
cmp al, 22h ;; "
|
|
jne _next
|
|
|
|
_lOptStr:
|
|
movsb
|
|
_lOptStrSX:
|
|
cmp byte ptr [esi], 5ch ;; \
|
|
je _lOptStrEX
|
|
cmp byte ptr [esi], 22h ;; "
|
|
jne _lOptStr
|
|
jmp _lOptPreStart
|
|
|
|
_lOptStrEX:
|
|
movsw
|
|
jmp _lOptStrSX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; bs
|
|
_lbl:
|
|
cmp al, 20h ;; bs
|
|
jne _next
|
|
jmp _lOptRemoveBS
|
|
|
|
_lbl:
|
|
cmp al, 09h ;; tab
|
|
jne _next
|
|
|
|
_lOptRemoveBS:
|
|
;; prew char
|
|
mov bl, byte ptr [edi-01h]
|
|
cmp byte ptr [_bAscii_00+ebx], bh ;; bh = 00h
|
|
jne _lOptBS
|
|
|
|
inc esi
|
|
jmp _lOptPreStartEX
|
|
|
|
;; next char
|
|
_lOptBS:
|
|
mov bl, ah
|
|
cmp byte ptr [_bAscii_00+ebx], bh ;; bh = 00h
|
|
jne _lOptPreStart
|
|
|
|
inc esi
|
|
jmp _lOptPreStartEX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; null
|
|
_lbl:
|
|
cmp al, 00h ;; null
|
|
jne _lOptPreStart
|
|
|
|
cmp byte ptr [edi-01h], 0ah ;; nl
|
|
jne _lOptPreEnd
|
|
dec edi
|
|
mov byte ptr [edi], 00h ;; null
|
|
|
|
;;----------------
|
|
|
|
_lOptPreEnd:
|
|
;;----------------
|
|
|
|
;;----------------
|
|
mov _dCurrStr, offset _sProg_07
|
|
mov eax, 20h
|
|
call _lSetProg
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; removing unused code
|
|
cmp dword ptr [_dWarVerSL], 00h
|
|
jne _next
|
|
|
|
add esi, 04h
|
|
jmp _lOptCC_NoRemove
|
|
|
|
_lbl:
|
|
push edi
|
|
push esi
|
|
|
|
|
|
;;----------------
|
|
;; variables
|
|
mov ebx, offset _bFuncCodeLocals
|
|
add esi, 0ch ;; globals_
|
|
|
|
_lOptCC_VarStr:
|
|
cmp dword ptr [esi], 67646e65h ;; endg
|
|
jne _lOptCC_VarAdd
|
|
cmp dword ptr [esi+04h], 61626f6ch ;; loba
|
|
jne _lOptCC_VarAdd
|
|
cmp word ptr [esi+08h], 736ch ;; ls
|
|
jne _lOptCC_VarAdd
|
|
cmp byte ptr [esi+0ah], 0ah ;; nl
|
|
jne _lOptCC_VarAdd
|
|
|
|
add esi, 0bh
|
|
|
|
;;----------------
|
|
;; go to sort
|
|
push esi ;; store esi before sort
|
|
cmp ebx, offset _bFuncCodeLocals+10h
|
|
jbe _lOptCC_VarNoSort
|
|
|
|
mov ebp, offset _bFuncCodeLocals
|
|
sub ebx, ebp
|
|
call _lOptCC_SortIn
|
|
|
|
_lOptCC_VarNoSort:
|
|
mov eax, offset _bFuncCodeLocals-10h
|
|
mov edx, offset _dDefTable
|
|
push offset _lOptCC_Func
|
|
jmp _lOptCC_BuildIn
|
|
;;----------------
|
|
|
|
_lOptCC_VarAdd:
|
|
mov dword ptr [ebx], esi ;; start
|
|
|
|
cmp dword ptr [esi], 736e6f63h ;; cons
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 746e6174h ;; tant
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 20h ;; bs
|
|
add esi, 09h ;; remove constant
|
|
_lbl:
|
|
inc esi
|
|
cmp byte ptr [esi], 20h ;; bs
|
|
jne _prew
|
|
inc esi
|
|
|
|
cmp dword ptr [esi], 61727261h ;; arra
|
|
jne _next
|
|
cmp word ptr [esi+04h], 2079h ;; y_
|
|
jne _next
|
|
add esi, 06h
|
|
_lbl:
|
|
|
|
mov dword ptr [ebx+08h], esi ;; var name
|
|
|
|
_lbl:
|
|
inc esi
|
|
cmp byte ptr [esi], 0ah ;; nl
|
|
jne _prew
|
|
inc esi
|
|
mov dword ptr [ebx+04h], esi ;; end
|
|
add ebx, 10h
|
|
|
|
jmp _lOptCC_VarStr
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; functions
|
|
_lOptCC_Func:
|
|
pop esi
|
|
mov ebx, offset _bFuncCodeBase
|
|
|
|
_lOptCC_FuncStr:
|
|
cmp byte ptr [esi], 00h
|
|
jne _lOptCC_FuncAdd
|
|
|
|
;;----------------
|
|
;; go to sort
|
|
cmp ebx, offset _bFuncCodeBase+10h
|
|
jbe _lOptCC_FuncNoSort
|
|
|
|
mov ebp, offset _bFuncCodeBase
|
|
sub ebx, ebp
|
|
call _lOptCC_SortIn
|
|
|
|
_lOptCC_FuncNoSort:
|
|
mov eax, offset _bFuncCodeBase-10h
|
|
mov edx, offset _dDefTableEX
|
|
push offset _lOptCC_ChStr
|
|
jmp _lOptCC_BuildIn
|
|
;;----------------
|
|
|
|
_lOptCC_FuncAdd:
|
|
mov dword ptr [ebx], esi
|
|
cmp dword ptr [esi], 736e6f63h ;; cons
|
|
jne _next
|
|
add esi, 09h
|
|
_lbl:
|
|
add esi, 09h
|
|
mov dword ptr [ebx+08h], esi
|
|
|
|
_lbl:
|
|
inc esi
|
|
cmp dword ptr [esi], 6b617420h ;; _tak
|
|
jne _prew
|
|
|
|
cmp dword ptr [esi+07h], 68746f6eh ;; noth
|
|
jne _lOptCC_FuncGetEnd
|
|
cmp dword ptr [esi+0bh], 20676e69h ;; ing_
|
|
jne _lOptCC_FuncGetEnd
|
|
|
|
;;----------------
|
|
;; is optional
|
|
mov word ptr [ebx+0ch], 01h
|
|
;;----------------
|
|
|
|
_lOptCC_FuncGetEnd:
|
|
inc esi
|
|
cmp dword ptr [esi], 646e650ah ;; _end
|
|
jne _lOptCC_FuncGetEnd
|
|
cmp dword ptr [esi+04h], 636e7566h ;; func
|
|
jne _lOptCC_FuncGetEnd
|
|
|
|
add esi, 0dh
|
|
mov dword ptr [ebx+04h], esi
|
|
add ebx, 10h
|
|
jmp _lOptCC_FuncStr
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; sort
|
|
;;----------------
|
|
;; set step
|
|
_lOptCC_SortIn:
|
|
mov eax, offset _dSortSteps-04h
|
|
_lbl:
|
|
add eax, 04h
|
|
mov ecx, dword ptr [eax+04h]
|
|
lea ecx, dword ptr [ecx+ecx*02h]
|
|
cmp ebx, ecx
|
|
jg _prew
|
|
;;----------------
|
|
|
|
_lOptCC_SortStr:
|
|
mov ecx, dword ptr [eax]
|
|
lea ebx, dword ptr [ebp+ecx]
|
|
|
|
_lOptCC_SortGo:
|
|
mov esi, dword ptr [ebx+08h]
|
|
mov edi, ebx
|
|
mov dl, byte ptr [esi]
|
|
movaps xmm1, [ebx]
|
|
|
|
_lbl:
|
|
sub edi, ecx
|
|
cmp edi, ebp
|
|
jb _lOptCC_SortNext
|
|
mov esi, dword ptr [edi+08h]
|
|
cmp byte ptr [esi], dl
|
|
jb _lOptCC_SortNext
|
|
|
|
movaps xmm0, [edi]
|
|
movaps [edi+ecx], xmm0
|
|
|
|
jmp _prew
|
|
|
|
_lOptCC_SortNext:
|
|
movaps [edi+ecx], xmm1
|
|
add ebx, 10h
|
|
cmp dword ptr [ebx], 00h
|
|
jnz _lOptCC_SortGo
|
|
|
|
sub eax, 04h
|
|
cmp eax, offset _dSortSteps-04h
|
|
jne _lOptCC_SortStr
|
|
|
|
_lOptCC_SortEnd:
|
|
retn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; build table
|
|
_lOptCC_BuildIn:
|
|
xor ebx, ebx
|
|
xor ecx, ecx
|
|
|
|
_lOptCC_VarDT:
|
|
add eax, 10h
|
|
cmp dword ptr [eax], 00h
|
|
je _lOptCC_VarDTEnd
|
|
|
|
mov ebp, dword ptr [eax+08h]
|
|
mov bl, byte ptr [ebp]
|
|
cmp cl, bl
|
|
je _lOptCC_VarDT
|
|
mov dword ptr[edx+ebx*04h], eax
|
|
mov cl, bl
|
|
jmp _lOptCC_VarDT
|
|
|
|
_lOptCC_VarDTEnd:
|
|
retn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; checking
|
|
_lOptCC_ChStr:
|
|
|
|
;;----------------
|
|
;; check next function
|
|
_lOptCC_ChNext:
|
|
xor ebx, ebx
|
|
_lOptCC_ChNextEX:
|
|
mov eax, offset _bFuncCodeBase
|
|
|
|
_lOptCC_ChIn:
|
|
cmp dword ptr [eax], 00h
|
|
je _lOptCC_RemIn
|
|
|
|
cmp word ptr [eax+0ch], 00h
|
|
jne _lOptCC_ChCall
|
|
add eax, 10h
|
|
jmp _lOptCC_ChIn
|
|
|
|
_lOptCC_ChCall:
|
|
cmp byte ptr [eax+0eh], 00h
|
|
je _lOptCC_ChInFunc
|
|
add eax, 10h
|
|
jmp _lOptCC_ChIn
|
|
|
|
;;----------------
|
|
;; in function
|
|
_lOptCC_ChInFunc:
|
|
mov esi, dword ptr [eax+08h]
|
|
mov byte ptr [eax+0eh], 01h
|
|
|
|
_lbl:
|
|
inc esi
|
|
cmp byte ptr [esi-01h], 0ah ;; nl
|
|
jne _prew
|
|
|
|
_lOptCC_ChInFunc_GetWord:
|
|
mov bl, byte ptr [esi]
|
|
cmp byte ptr [_bAscii_00+ebx], bh
|
|
je _lOptCC_ChInFunc_Inc
|
|
|
|
cmp dword ptr [esi], 66646e65h ;; endf
|
|
jne _lOptCC_ChInFunc_CheckWord
|
|
cmp byte ptr [esi-01h], 0ah ;; nl
|
|
je _lOptCC_ChNextEX
|
|
|
|
;;----------------
|
|
_lOptCC_ChInFunc_CheckWord:
|
|
mov bl, byte ptr [esi]
|
|
lea edx, [_dDefTable+ebx*04h]
|
|
mov edx, dword ptr [edx]
|
|
test edx, edx
|
|
jz _lOptCC_ChInFunc_ReCheck
|
|
|
|
_lOptCC_ChInFunc_CheckWordEX:
|
|
mov ecx, esi
|
|
mov ebp, dword ptr [edx+08h]
|
|
mov bl, byte ptr [ecx]
|
|
cmp byte ptr [ebp], bl
|
|
jne _lOptCC_ChInFunc_ReCheck
|
|
inc ecx
|
|
inc ebp
|
|
|
|
_lOptCC_ChInFunc_CheckWordFX:
|
|
mov bl, byte ptr [ecx]
|
|
cmp byte ptr [_bAscii_00+ebx], bh
|
|
je _lOptCC_ChInFunc_CheckWordOX
|
|
|
|
cmp byte ptr [ebp], bl
|
|
jne _lOptCC_ChInFunc_NextFX
|
|
inc ebp
|
|
inc ecx
|
|
jmp _lOptCC_ChInFunc_CheckWordFX
|
|
|
|
_lOptCC_ChInFunc_CheckWordOX:
|
|
mov bl, byte ptr [ebp]
|
|
cmp byte ptr [_bAscii_00+ebx], bh
|
|
jne _lOptCC_ChInFunc_NextFX
|
|
|
|
inc word ptr [edx+0ch]
|
|
;;----------------
|
|
|
|
_lOptCC_ChInFunc_NextWord:
|
|
inc esi
|
|
mov bl, byte ptr [esi]
|
|
cmp byte ptr [_bAscii_00+ebx], bh
|
|
jne _lOptCC_ChInFunc_NextWord
|
|
jmp _lOptCC_ChInFunc_GetWord
|
|
|
|
_lOptCC_ChInFunc_NextFX:
|
|
add edx, 10h
|
|
cmp dword ptr [edx], 00h
|
|
je _lOptCC_ChInFunc_ReCheck
|
|
jmp _lOptCC_ChInFunc_CheckWordEX
|
|
|
|
_lOptCC_ChInFunc_Inc:
|
|
cmp bl, 22h ;; "
|
|
je _lOptCC_ChInFunc_IncStr
|
|
inc esi
|
|
jmp _lOptCC_ChInFunc_GetWord
|
|
|
|
_lOptCC_ChInFunc_IncStrEX:
|
|
inc esi
|
|
_lOptCC_ChInFunc_IncStr:
|
|
inc esi
|
|
cmp byte ptr [esi], 5ch ;; \
|
|
je _lOptCC_ChInFunc_IncStrEX
|
|
cmp byte ptr [esi], 22h ;; "
|
|
jne _lOptCC_ChInFunc_IncStr
|
|
inc esi
|
|
jmp _lOptCC_ChInFunc_GetWord
|
|
|
|
_lOptCC_ChInFunc_ReCheck:
|
|
cmp edx, offset _bFuncCodeBase
|
|
jge _lOptCC_ChInFunc_NextWord
|
|
|
|
mov bl, byte ptr [esi]
|
|
lea edx, [_dDefTableEX+ebx*04h]
|
|
mov edx, dword ptr [edx]
|
|
test edx, edx
|
|
jz _lOptCC_ChInFunc_NextWord
|
|
jmp _lOptCC_ChInFunc_CheckWordEX
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; remove unused
|
|
_lOptCC_RemIn:
|
|
mov al, 02h
|
|
|
|
;;----------------
|
|
;; functions
|
|
mov edx, offset _bFuncCodeBase-10h
|
|
|
|
_lOptCC_RemFunc:
|
|
add edx, 10h
|
|
cmp dword ptr [edx], 00h
|
|
je _lOptCC_RemVarIn
|
|
|
|
cmp word ptr [edx+0ch], 00h
|
|
jne _lOptCC_RemFunc
|
|
|
|
;;----------------
|
|
;; remove
|
|
mov edi, dword ptr [edx]
|
|
mov ecx, dword ptr [edx+04h]
|
|
sub ecx, edi
|
|
rep stosb
|
|
|
|
jmp _lOptCC_RemFunc
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; variables
|
|
_lOptCC_RemVarIn:
|
|
mov edx, offset _bFuncCodeLocals-10h
|
|
|
|
_lOptCC_RemVar:
|
|
add edx, 10h
|
|
cmp dword ptr [edx], 00h
|
|
je _lOptCC_RemParse
|
|
|
|
cmp word ptr [edx+0ch], 00h
|
|
jne _lOptCC_RemParse
|
|
|
|
;;----------------
|
|
;; remove
|
|
mov ebp, dword ptr [edx+08h]
|
|
|
|
_lbl:
|
|
inc ebp
|
|
cmp byte ptr [ebp], 0ah ;; nl
|
|
je _lOptCC_RemVarEX
|
|
cmp byte ptr [ebp], 3dh ;; =
|
|
jne _prew
|
|
|
|
;;----------------
|
|
;; check
|
|
_lOptCC_RemVarCheckStart:
|
|
inc ebp
|
|
cmp byte ptr [ebp], 0ah ;; nl
|
|
je _lOptCC_RemVarEX
|
|
cmp byte ptr [ebp], 28h ;; (
|
|
jne _lOptCC_RemVarCheckStart
|
|
|
|
mov bl, byte ptr [ebp-01h]
|
|
cmp byte ptr [_bAscii_00+ebx], bh
|
|
je _lOptCC_RemVarCheckStart
|
|
|
|
;;----------------
|
|
mov esi, offset _sCodeNXFunc
|
|
|
|
_lOptCC_RemVarCheck:
|
|
lea ecx, [ebp-01h]
|
|
|
|
_lbl:
|
|
mov bl, byte ptr [ecx]
|
|
cmp bl, byte ptr [esi]
|
|
jne _lOptCC_RemVarCheckFX
|
|
dec ecx
|
|
inc esi
|
|
jmp _prew
|
|
|
|
_lOptCC_RemVarCheckFX:
|
|
cmp byte ptr [_bAscii_00+ebx], bh
|
|
jne _lOptCC_RemVarCheckNext
|
|
cmp byte ptr [esi], 00h
|
|
je _lOptCC_RemVarCheckStart
|
|
|
|
_lOptCC_RemVarCheckNext:
|
|
cmp byte ptr [esi], 00h
|
|
jne _lOptCC_RemVarCheckNextEX
|
|
inc esi
|
|
cmp byte ptr [esi], 00h
|
|
jne _lOptCC_RemVarCheck
|
|
jmp _lOptCC_RemVarCheckStart
|
|
|
|
_lOptCC_RemVarCheckNextEX:
|
|
inc esi
|
|
jmp _lOptCC_RemVarCheckNext
|
|
;;----------------
|
|
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lOptCC_RemVarEX:
|
|
mov edi, dword ptr [edx]
|
|
mov ecx, dword ptr [edx+04h]
|
|
sub ecx, edi
|
|
rep stosb
|
|
|
|
jmp _lOptCC_RemVar
|
|
;;----------------
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; parse code
|
|
_lOptCC_RemParse:
|
|
pop esi
|
|
pop edi
|
|
add esi, 04h
|
|
add edi, 04h
|
|
|
|
_lOptCC_RemParseEX:
|
|
lodsb
|
|
cmp al, 02h
|
|
je _lOptCC_RemParseEX
|
|
test al, al
|
|
jz _lOptCC_RemParseEnd
|
|
stosb
|
|
jmp _lOptCC_RemParseEX
|
|
|
|
_lOptCC_RemParseEnd:
|
|
add esi, 03h
|
|
;;----------------
|
|
;;----------------
|
|
;;----------------
|
|
_lOptCC_NoRemove:
|
|
;;----------------
|
|
|
|
;;----------------
|
|
mov _dCurrStr, offset _sProg_08
|
|
mov eax, 64h
|
|
call _lSetProg
|
|
;;----------------
|
|
|
|
sub edi, esi ;; edi = new script size
|
|
|
|
retn
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; optimize endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; proc parse
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;; esi=Src
|
|
;; edi=Dest
|
|
|
|
;; stack:
|
|
;;
|
|
;; edi
|
|
;; mem
|
|
;; mem
|
|
;; archive
|
|
;; attributes
|
|
|
|
_lMapParseCode:
|
|
|
|
;;----------------
|
|
mov _dCurrStr, offset _sProg_01
|
|
mov eax, 10h
|
|
call _lSetProg
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; comments removing
|
|
|
|
;;----------------
|
|
;; utf 8 bom
|
|
cmp word ptr [esi], 0bbefh
|
|
jne _lCrStr
|
|
cmp byte ptr [esi+02h], 0bfh
|
|
jne _lCrStr
|
|
|
|
add esi, 03h
|
|
;;----------------
|
|
|
|
_lCrStr:
|
|
push 00h ;; for safe
|
|
mov _dStackPos, esp ;; save stack
|
|
mov dword ptr [_dErrorCodeStart], edi ;; for syntax error
|
|
jmp _lCRScanLineSx
|
|
|
|
;;----------------
|
|
;; line start
|
|
_lCRScanLine:
|
|
|
|
;;----------------
|
|
cmp dword ptr [_hBtn], 00h
|
|
je _lCRScanLineFx
|
|
|
|
mov dword ptr [_hBtn], 00h
|
|
lea eax, [edi+02h]
|
|
push eax
|
|
mov dword ptr [edi], 78016101h ;; #a#x
|
|
add edi, 08h
|
|
jmp _lCRScanLineDx
|
|
;;----------------
|
|
|
|
_lCRScanLineFx:
|
|
cmp word ptr [edi-02h], 0a0dh ;; nl
|
|
je _lCRScanLineDx
|
|
cmp byte ptr [edi-01h], 00h
|
|
je _lCRScanLineDx
|
|
mov word ptr [edi], 0a0dh ;; nl
|
|
add edi, 02h
|
|
_lCRScanLineDx:
|
|
cmp byte ptr [esi], 0ah
|
|
jne _next
|
|
inc esi
|
|
jmp _lCRScanLineDx
|
|
_lbl:
|
|
cmp byte ptr [esi], 0dh
|
|
jne _lCRScanLineSx
|
|
inc esi
|
|
jmp _lCRScanLineDx
|
|
|
|
_lCRScanLineSx: ;; <---
|
|
mov eax, dword ptr [esi]
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; remove bs and tabs in line start
|
|
_lbl:
|
|
cmp al, 09h
|
|
jne _next
|
|
inc esi
|
|
jmp _lCRScanLineSx
|
|
|
|
_lbl:
|
|
cmp al, 20h
|
|
jne _next
|
|
inc esi
|
|
jmp _lCRScanLineSx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; define test
|
|
_lbl:
|
|
cmp byte ptr [_bIsPPCEn], 00h
|
|
je _next
|
|
|
|
cmp eax, 69666564h ;; defi
|
|
jne _next
|
|
cmp word ptr [esi+04h], 656eh ;; ne
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 20h
|
|
jg _next
|
|
|
|
_lDefErrFGS:
|
|
mov dword ptr [_xErrorTable], offset _sErr_FailedDef
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
_lDefErrFGSEX:
|
|
movsb
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lDefErrFGSEX
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; pre proc
|
|
_lbl:
|
|
cmp al, 23h ;; #
|
|
jne _next
|
|
|
|
;;----------------
|
|
;; #if
|
|
cmp eax, 20666923h ;; #if_
|
|
jne _lCRElifDX
|
|
mov byte ptr [_bIsPPCEn], al
|
|
|
|
mov dword ptr [_hBtn], eax
|
|
mov word ptr [edi], 6901h ;; #i
|
|
add esi, 02h
|
|
add edi, 02h
|
|
jmp _lCRScan
|
|
|
|
_lCRElifDX:
|
|
cmp word ptr [esi+01h], 6669h ;; if
|
|
jne _lCRElifOS
|
|
|
|
;;----------------
|
|
;; error
|
|
_lCRErrPrePorc:
|
|
mov dword ptr [_xErrorTable], offset _sErr_PreProc
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
_lCRErrPrePorcEX:
|
|
movsb
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lCRErrPrePorcEX
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #else #elseif
|
|
|
|
;;----------------
|
|
;; close
|
|
_lCRElifOX:
|
|
mov dword ptr [_hBtn], eax
|
|
_lCRElifFF:
|
|
mov word ptr [esi], 6901h ;; #i
|
|
|
|
pop eax
|
|
test eax, eax
|
|
jz _lBlockErr
|
|
|
|
mov dword ptr [eax+02h], edi
|
|
mov word ptr [edi], 7901h ;; #y
|
|
mov dword ptr [edi+02h], eax
|
|
mov dword ptr [edi+06h], 06060606h ;; ex backspace
|
|
mov dword ptr [edi+0ah], 06060606h
|
|
mov word ptr [edi+0eh], 0a0dh ;; new line
|
|
|
|
add edi, 10h
|
|
movsd
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
_lCRElifOS:
|
|
cmp eax, 736c6523h ;; #els
|
|
jne _lCRElifER
|
|
cmp dword ptr [esi+04h], 20666965h ;; eif_
|
|
je _lCRElifOX
|
|
|
|
cmp byte ptr [esi+04h], 65h ;; e
|
|
jne _lCRElifER
|
|
cmp byte ptr [esi+05h], 20h
|
|
jbe _lCRElifOX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; error
|
|
_lCRElifER:
|
|
cmp eax, 72726523h ;; #err
|
|
jne _lCRElif_AAX
|
|
cmp word ptr [esi+04h], 726fh ;; or
|
|
jne _lCRElif_AAX
|
|
cmp byte ptr [esi+06h], 22h
|
|
jg _lCRElif_AAX
|
|
|
|
mov word ptr [esi], 6701h ;; #g
|
|
movsd
|
|
movsw
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lCRElif_AAX:
|
|
cmp eax, 66656423h ;; #def
|
|
je _lCRElif_SOX
|
|
cmp eax, 74657323h ;; #set
|
|
je _lCRElif_OOX
|
|
cmp eax, 646e7523h ;; #und
|
|
je _lCRElif_OOX
|
|
cmp eax, 636e6923h ;; #inc
|
|
jne _lCRElif_GU
|
|
|
|
_lCRElif_OOX:
|
|
inc esi
|
|
jmp _lCRScanLineSx
|
|
|
|
_lCRElif_SOX:
|
|
inc esi
|
|
cmp byte ptr [_bIsPPCEn], 00h
|
|
je _lCRScanLineSx
|
|
jmp _lDefErrFGS
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; guard
|
|
_lCRElif_GU:
|
|
cmp eax, 61756723h ;; #gua
|
|
jne _lCRElifFX
|
|
cmp word ptr [esi+04h], 6472h ;; rd
|
|
jne _lCRElifFX
|
|
|
|
add esi, 06h
|
|
xor eax, eax
|
|
|
|
_lCRElif_GU_01:
|
|
inc esi
|
|
cmp byte ptr [esi], 20h ;; bs
|
|
je _lCRElif_GU_01
|
|
cmp byte ptr [esi], 09h ;; tab
|
|
je _lCRElif_GU_01
|
|
|
|
mov ebp, offset _bFuncCodeLocals
|
|
|
|
_lCRElif_GU_02:
|
|
mov edx, esi
|
|
|
|
_lCRElif_GU_03:
|
|
mov al, byte ptr [edx]
|
|
cmp al, byte ptr [ebp]
|
|
jne _lCRElif_GU_04
|
|
inc ebp
|
|
inc edx
|
|
jmp _lCRElif_GU_03
|
|
|
|
_lCRElif_GU_04:
|
|
cmp byte ptr [ebp], 00h
|
|
jne _lCRElif_GU_Next
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
je _lRetnGuard
|
|
|
|
_lCRElif_GU_Next:
|
|
inc ebp
|
|
cmp byte ptr [ebp], 00h
|
|
jne _lCRElif_GU_Next
|
|
inc ebp
|
|
cmp byte ptr [ebp], 00h
|
|
jne _lCRElif_GU_02
|
|
|
|
_lCRElif_GU_Add:
|
|
mov al, byte ptr [esi]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
je _lCRScan
|
|
mov byte ptr [ebp], al
|
|
inc esi
|
|
inc ebp
|
|
jmp _lCRElif_GU_Add
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #endif
|
|
_lCRElifFX:
|
|
cmp eax, 646e6523h ;; #end
|
|
jne _lCRErrPrePorc
|
|
cmp word ptr [esi+04h], 6669h ;; if
|
|
jne _lCRErrPrePorc
|
|
mov byte ptr [_bIsPPCEn], 00h
|
|
|
|
jmp _lCRElifFF
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; textmacros
|
|
|
|
;;----------------
|
|
;; start
|
|
_lCRTTInOnce:
|
|
cmp dword ptr [esi+08h], 636e5f6fh ;; o_nc
|
|
jne _next
|
|
cmp word ptr [esi+0ch], 2065h ;; e_
|
|
jne _next
|
|
add esi, 0dh
|
|
jmp _lCRTTInOX
|
|
|
|
_lbl:
|
|
cmp eax, 74786574h ;; text
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 7263616dh ;; macr
|
|
jne _next
|
|
cmp word ptr [esi+08h], 206fh ;; o_
|
|
jne _lCRTTInOnce
|
|
|
|
add esi, 09h
|
|
_lCRTTInOX:
|
|
mov dword ptr [edi-04h], 69666564h ;; defi
|
|
mov word ptr [edi], 656eh ;; ne
|
|
add edi, 02h
|
|
|
|
mov eax, esi
|
|
_lCRTTIn:
|
|
inc eax
|
|
cmp byte ptr [eax], 0ah ;; nl
|
|
je _lCRTTInEnd
|
|
cmp dword ptr [eax], 656b6174h ;; take
|
|
jne _lCRTTIn
|
|
cmp word ptr [eax+04h], 2073h ;; s_
|
|
jne _lCRTTIn
|
|
|
|
mov dword ptr [eax], 20202020h ;; bs
|
|
mov word ptr [eax+04h], 1320h ;; _(
|
|
|
|
_lCRTTInEX:
|
|
inc eax
|
|
cmp byte ptr [eax], 2ch ;; ,
|
|
jne _lCRTTInFF
|
|
mov byte ptr [eax], 14h
|
|
jmp _lCRTTInEX
|
|
|
|
_lCRTTInFF:
|
|
cmp byte ptr [eax], 0ah ;; nl
|
|
jne _lCRTTInEX
|
|
|
|
cmp byte ptr [eax-01h], 0dh
|
|
jne _lCRTTInFX
|
|
mov byte ptr [eax-01h], 20h ;; bs
|
|
|
|
_lCRTTInFX:
|
|
mov byte ptr [eax], 11h
|
|
jmp _lCRScan
|
|
|
|
_lCRTTInEnd:
|
|
cmp byte ptr [eax-01h], 0dh
|
|
jne _lCRTTInDX
|
|
mov byte ptr [eax-01h], 20h
|
|
_lCRTTInDX:
|
|
mov byte ptr [eax], 12h
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; end
|
|
_lbl:
|
|
cmp eax, 74646e65h ;; endt
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 6d747865h ;; extm
|
|
jne _next
|
|
cmp dword ptr [esi+08h], 6f726361h ;; acro
|
|
jne _next
|
|
cmp byte ptr [esi+0ch], 20h ;; _
|
|
jg _next
|
|
|
|
sub edi, 04h
|
|
add esi, 0ch
|
|
|
|
pop eax
|
|
test eax, eax
|
|
jz _lBlockErr
|
|
|
|
cmp word ptr [edi-02h], 0a0dh ;; new line
|
|
je _lCLTMNE
|
|
mov word ptr [edi], 0a0dh ;; new line
|
|
add edi, 02h
|
|
_lCLTMNE:
|
|
mov dword ptr [eax+02h], edi
|
|
mov word ptr [edi], 7901h ;; #y
|
|
mov dword ptr [edi+02h], eax
|
|
mov dword ptr [edi+06h], 06060606h ;; ex backspace
|
|
mov dword ptr [edi+0ah], 06060606h
|
|
mov word ptr [edi+0eh], 0a0dh ;; new line
|
|
|
|
add edi, 10h
|
|
jmp _lCRScanLine
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; run
|
|
_lbl:
|
|
cmp eax, 746e7572h ;; runt
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 6d747865h ;; extm
|
|
jne _next
|
|
cmp dword ptr [esi+08h], 6f726361h ;; acro
|
|
jne _next
|
|
cmp byte ptr [esi+0ch], 20h ;; _
|
|
jne _next
|
|
|
|
lea eax, [esi+0ah]
|
|
sub edi, 04h
|
|
add esi, 0dh
|
|
mov ebx, eax
|
|
|
|
_lCRMacroRun:
|
|
inc eax
|
|
cmp byte ptr [eax], 22h ;; "
|
|
jne _lCRMacroRunEX
|
|
|
|
test ebx, ebx
|
|
jz _lCRMacroRunB
|
|
|
|
_lCRMacroRunA:
|
|
mov byte ptr [eax], 0bh
|
|
xor ebx, ebx
|
|
|
|
;;----------------
|
|
;; special for Strilanc
|
|
cmp word ptr [eax+01h], 2f2fh ;; //
|
|
jne _lCRMacroRun
|
|
|
|
mov word ptr [eax+01h], 3501h ;; #5
|
|
jmp _lCRMacroRun
|
|
;;----------------
|
|
|
|
_lCRMacroRunB:
|
|
mov byte ptr [eax], 0bh
|
|
inc ebx
|
|
jmp _lCRMacroRun
|
|
|
|
_lCRMacroRunEX:
|
|
cmp byte ptr [eax], 0ah ;; nl
|
|
jne _lCRMacroRun
|
|
|
|
cmp ebx, 01h
|
|
jbe _lCRScan
|
|
|
|
_lCRMacroRunSF:
|
|
dec eax
|
|
cmp byte ptr [eax], 0ah
|
|
je _lCRScan
|
|
cmp byte ptr [eax], 28h ;; (
|
|
je _lCRMacroRunDF
|
|
cmp byte ptr [eax], 29h ;; )
|
|
jne _lCRMacroRunSF
|
|
_lCRMacroRunDF:
|
|
mov byte ptr [eax], 20h ;; bs
|
|
jmp _lCRMacroRunSF
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; zinc and boa
|
|
_lbl:
|
|
cmp eax, 636e697ah ;; zinc
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 20h
|
|
jg _next
|
|
jmp _lCRFXSyn
|
|
|
|
_lbl:
|
|
cmp ax, 6f62h ;; bo
|
|
jne _next
|
|
cmp byte ptr [esi+02h], 61h ;; a
|
|
jne _next
|
|
cmp byte ptr [esi+03h], 20h
|
|
jg _next
|
|
|
|
_lCRFXSyn:
|
|
mov eax, dword ptr [_dSynDesc]
|
|
mov dword ptr [eax], esi
|
|
mov dword ptr [edi-04h], 0a0d3901h ;; #9 nl
|
|
|
|
_lCREndFXSyn:
|
|
inc esi
|
|
|
|
;; cmp byte ptr [esi], 00h
|
|
;; je
|
|
|
|
cmp dword ptr [esi], 7a646e65h ;; endz
|
|
jne _lCREndFXSynEX
|
|
cmp word ptr [esi+04h], 6e69h ;; in
|
|
jne _lCREndFXSynEX
|
|
cmp byte ptr [esi+06h], 63h ;; c
|
|
jne _lCREndFXSynEX
|
|
cmp byte ptr [esi+07h], 20h ;; bs
|
|
jb _lCREndFXSynDX
|
|
|
|
_lCREndFXSynEX:
|
|
cmp dword ptr [esi], 62646e65h ;; endb
|
|
jne _lCREndFXSyn
|
|
cmp word ptr [esi+04h], 616fh ;; oa
|
|
jne _lCREndFXSyn
|
|
cmp byte ptr [esi+06h], 20h ;; bs
|
|
jg _lCREndFXSyn
|
|
|
|
_lCREndFXSynDX:
|
|
inc esi
|
|
cmp word ptr [esi-02h], 0a0dh
|
|
jne _lCREndFXSynDX
|
|
|
|
mov dword ptr [eax+04h], esi
|
|
add eax, 08h
|
|
mov dword ptr [_dSynDesc], eax
|
|
jmp _lCRScanLineSx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; debug?
|
|
_lbl:
|
|
cmp eax, 75626564h ;; debu
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 67h ;; g
|
|
jne _next
|
|
cmp byte ptr [esi+05h], 20h ;; bs or tab
|
|
jg _next
|
|
jmp dword ptr [_dDbgOff]
|
|
|
|
_lCRDebugRem:
|
|
inc esi
|
|
cmp byte ptr [esi], 0ah ;; nl
|
|
jne _lCRDebugRem
|
|
jmp _lCRScanLine
|
|
|
|
_lCRDebugAdd:
|
|
add esi, 06h
|
|
jmp _lCRScanLineSx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; include?
|
|
_lbl:
|
|
cmp eax, 6c636e69h ;; incl
|
|
jne _lCRScanEx
|
|
cmp dword ptr [esi+04h], 20656475h ;; ude_
|
|
jne _lCRScanEx
|
|
lea ebx, [esi+07h]
|
|
|
|
_lIncSearch:
|
|
inc ebx
|
|
cmp byte ptr [ebx], 22h ;; "
|
|
je _lIncParveName
|
|
cmp byte ptr [ebx], 20h ;; bs
|
|
je _lIncSearch
|
|
cmp byte ptr [ebx], 09h ;; tab
|
|
je _lIncSearch
|
|
|
|
;;----------------
|
|
;; error
|
|
mov dword ptr [_xErrorTable], offset _sErr_Base
|
|
movsd
|
|
movsd
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
_lIncludeErrEX:
|
|
movsb
|
|
cmp word ptr [esi], 0a0dh
|
|
jne _lIncludeErrEX
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
_lIncParveName:
|
|
mov edx, dword ptr [_dCurrDirEnd]
|
|
mov ebp, dword ptr [_dMapPathEnd]
|
|
mov ecx, ebx
|
|
inc ebx
|
|
_lIncLib:
|
|
inc ecx
|
|
mov al, byte ptr [ecx]
|
|
inc edx
|
|
inc ebp
|
|
cmp al, 22h ;; "
|
|
mov byte ptr [edx], al
|
|
mov byte ptr [ebp], al
|
|
jne _lIncLib
|
|
mov byte ptr [ecx], 00h
|
|
mov byte ptr [edx], 00h
|
|
mov byte ptr [ebp], 00h
|
|
|
|
lea esi, [ecx+01h] ;; new sorc script position
|
|
|
|
;;----------------
|
|
;; open file
|
|
push 00h
|
|
push FILE_ATTRIBUTE_NORMAL
|
|
push OPEN_EXISTING
|
|
push 00h
|
|
push FILE_SHARE_READ
|
|
push GENERIC_READ
|
|
push offset _sCurrDir
|
|
call _imp__CreateFileA@28
|
|
|
|
inc eax
|
|
jnz _lIncNoReopen
|
|
|
|
push 00h
|
|
push FILE_ATTRIBUTE_NORMAL
|
|
push OPEN_EXISTING
|
|
push 00h
|
|
push FILE_SHARE_READ
|
|
push GENERIC_READ
|
|
push offset _sMapPathEX
|
|
call _imp__CreateFileA@28
|
|
|
|
inc eax
|
|
jnz _lIncNoReopen
|
|
|
|
push 00h
|
|
push FILE_ATTRIBUTE_NORMAL
|
|
push OPEN_EXISTING
|
|
push 00h
|
|
push FILE_SHARE_READ
|
|
push GENERIC_READ
|
|
push ebx
|
|
call _imp__CreateFileA@28
|
|
|
|
inc eax
|
|
jnz _lIncNoReopen
|
|
|
|
;;----------------
|
|
;; cannot open file
|
|
mov ecx, esi
|
|
mov dword ptr [_xErrorTable], offset _sErr_CantOpenFile
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
_lIncludeErr:
|
|
dec esi
|
|
cmp byte ptr [esi-01h], 0ah
|
|
jne _lIncludeErr
|
|
sub ecx, esi
|
|
rep movsb
|
|
mov byte ptr [edi-01h], 22h ;; "
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; read file
|
|
_lIncNoReopen:
|
|
dec eax ;; restore eax
|
|
sub esp, 08h ;; old esi, mem handle, mem address
|
|
mov ebx, eax ;; ebx = file handle
|
|
|
|
push esi ;; old script position
|
|
|
|
push 00h
|
|
push eax
|
|
call _imp__GetFileSize@8
|
|
|
|
mov ebp, eax ;; ebp = file size
|
|
|
|
push 00h ;; ---> _imp__ReadFile@20
|
|
push offset _dBuffer ;; ---> _imp__ReadFile@20
|
|
push eax ;; ---> _imp__ReadFile@20
|
|
add eax, 04h
|
|
|
|
push eax
|
|
push GMEM_ZEROINIT
|
|
call _imp__GlobalAlloc@8
|
|
push eax
|
|
mov dword ptr [esp+14h], eax
|
|
call _imp__GlobalLock@4
|
|
mov esi, eax
|
|
mov dword ptr [esp+14h], eax
|
|
add ebp, eax
|
|
|
|
push eax
|
|
push ebx
|
|
call _imp__ReadFile@20
|
|
|
|
push ebx
|
|
call _imp__CloseHandle@4
|
|
|
|
mov dword ptr [ebp], 00007201h ;; #r__
|
|
push 00h ;; for safe
|
|
|
|
jmp _lCRScanLine
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; remove bs
|
|
_lBSRemBase equ $
|
|
_lCRScanBS:
|
|
inc esi
|
|
|
|
_lCRScan:
|
|
mov eax, dword ptr [esi]
|
|
|
|
_lCRScanEx: ;; <---
|
|
cmp al, 20h
|
|
jne _next
|
|
|
|
;;----------------
|
|
;; check prew blocks
|
|
cmp word ptr [edi-06h], 7801h ;; #x
|
|
je _lCRScanBS
|
|
cmp word ptr [edi-06h], 7901h ;; #y
|
|
je _lCRScanBS
|
|
;;----------------
|
|
|
|
_lCRBSStart: ;; test previous char
|
|
xor ebx, ebx
|
|
mov bl, byte ptr [edi-01h]
|
|
mov bl, byte ptr [_bAscii_01+ebx]
|
|
add ebx, _lBSRemBase
|
|
jmp ebx
|
|
|
|
_lCRBSNext: ;; test next chaqr
|
|
xor ebx, ebx
|
|
mov bl, ah
|
|
mov bl, byte ptr [_bAscii_02+ebx]
|
|
add ebx, _lBSRemBase
|
|
jmp ebx
|
|
|
|
_lCRBSAdd:
|
|
mov byte ptr [edi], 20h ;; _
|
|
inc esi
|
|
inc edi
|
|
jmp _lCRScan
|
|
|
|
_lCRIncDec:
|
|
cmp ah, 2bh ;; ++
|
|
je _lCRBSAdd
|
|
cmp ah, 2dh ;; --
|
|
je _lCRBSAdd
|
|
jmp _lCRScanBS
|
|
|
|
_lbl:
|
|
cmp al, 09h ;; tab
|
|
je _lCRBSStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; new line
|
|
cmp al, 0ah
|
|
je _lCRScanLine
|
|
cmp al, 0dh
|
|
je _lCRScanLine
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; error with 80+ char
|
|
cmp al, 80h
|
|
jb _next
|
|
|
|
mov dword ptr [_xErrorTable], offset _sErr_BadChar
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
movsb
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ascii int
|
|
_lbl:
|
|
cmp al, 27h ;; '
|
|
jne _next
|
|
|
|
xor eax, eax
|
|
mov al, byte ptr [edi-01h]
|
|
inc esi
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
je _lCRASCII_FX
|
|
mov byte ptr [edi], 20h ;; bs
|
|
inc edi
|
|
|
|
_lCRASCII_FX:
|
|
mov word ptr [edi], 7830h ;; 0x
|
|
add edi, 02h
|
|
mov ecx, 05h
|
|
|
|
_lCRASCII:
|
|
mov al, byte ptr [esi]
|
|
cmp al, 27h ;; '
|
|
je _lCRASCII_EX
|
|
|
|
shr eax, 04h
|
|
and al, 0fh
|
|
cmp al, 0ah
|
|
sbb al, 69h
|
|
das
|
|
stosb
|
|
mov al, byte ptr [esi]
|
|
and al, 0fh
|
|
cmp al, 0ah
|
|
sbb al, 69h
|
|
das
|
|
stosb
|
|
|
|
inc esi
|
|
dec ecx
|
|
jnz _lCRASCII
|
|
|
|
;;----------------
|
|
;; error
|
|
mov dword ptr [_xErrorTable], offset _sErr_IncorrectLiteral
|
|
dec edi
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
inc edi
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
_lCRASCII_EX:
|
|
inc esi
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; textmacro fx
|
|
_lbl:
|
|
cmp al, 11h
|
|
jne _next
|
|
inc esi
|
|
|
|
lea eax, [edi+06h]
|
|
mov dword ptr [edi], 74747474h ;; tttt
|
|
mov dword ptr [edi+04h], 78013d29h ;; )={
|
|
add edi, 0ch
|
|
push eax
|
|
jmp _lCRScan
|
|
|
|
_lbl:
|
|
cmp al, 12h
|
|
jne _next
|
|
inc esi
|
|
|
|
lea eax, [edi+01h]
|
|
mov dword ptr [edi], 0078013dh ;; ={
|
|
add edi, 07h
|
|
push eax
|
|
jmp _lCRScan
|
|
|
|
_lbl:
|
|
cmp al, 13h
|
|
jne _next
|
|
|
|
inc esi
|
|
mov byte ptr [edi], 28h ;; (
|
|
mov dword ptr [edi+01h], 74747474h
|
|
add edi, 05h
|
|
jmp _lCRScan
|
|
|
|
_lbl:
|
|
cmp al, 14h
|
|
jne _next
|
|
|
|
_lCRGFDD:
|
|
inc esi
|
|
cmp byte ptr [esi], 09h ;; tab
|
|
je _lCRGFDD
|
|
cmp byte ptr [esi], 20h ;; bs
|
|
je _lCRGFDD
|
|
|
|
; inc edi
|
|
; _lCRGFGG:
|
|
; dec edi
|
|
; cmp byte ptr [edi], 20h
|
|
|
|
mov dword ptr [edi], 74747474h ;; tttt
|
|
mov byte ptr [edi+04h], 2ch ;; ,
|
|
mov dword ptr [edi+05h], 74747474h ;; tttt
|
|
add edi, 09h
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; comments? vJass parser instruction?
|
|
_lbl:
|
|
cmp ax, 2f2fh ;; //
|
|
jne _lCRCommTest_01
|
|
cmp byte ptr [esi+02h], 21h ;; !
|
|
jne _lComm_00
|
|
mov dword ptr [edi], 20212f2fh ;; //!_
|
|
add edi, 04h
|
|
add esi, 03h
|
|
jmp _lCRScanLineSx
|
|
_lComm_00:
|
|
inc esi
|
|
cmp byte ptr [esi], 00h
|
|
je _lCREnd
|
|
cmp word ptr [esi], 0a0dh
|
|
jne _lComm_00
|
|
jmp _lCRScanLine
|
|
|
|
_lCRCommTest_01:
|
|
cmp ax, 2a2fh ;; /*
|
|
jne _next
|
|
|
|
mov edx, 01h
|
|
_lCRCommNextEx:
|
|
inc esi
|
|
_lCRCommNext:
|
|
inc esi
|
|
cmp byte ptr [esi], 00h
|
|
je _lCRErrorComm
|
|
cmp word ptr [esi], 2f2fh ;; //
|
|
jne _lCRCommNextX
|
|
inc esi
|
|
_lCRCommRemX:
|
|
inc esi
|
|
cmp byte ptr [esi], 00h
|
|
je _lCREnd
|
|
cmp word ptr [esi], 0a0dh
|
|
jne _lCRCommRemX
|
|
jmp _lCRCommNextEx
|
|
_lCRCommNextX:
|
|
cmp word ptr [esi], 2f2ah ;; */
|
|
je _lCRCommSX
|
|
cmp word ptr [esi], 2a2fh ;; /*
|
|
jne _lCRCommNext
|
|
inc edx
|
|
jmp _lCRCommNextEx
|
|
_lCRCommSX:
|
|
dec edx
|
|
jnz _lCRCommNextEx
|
|
add esi, 02h
|
|
jmp _lCRScan
|
|
|
|
;;----------------
|
|
;; error
|
|
_lCRErrorComm:
|
|
mov dword ptr [_xErrorTable], offset _sErr_UnclosedComment
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
mov dword ptr [edi], 2a2fh ;; /*
|
|
add edi, 02h
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; textmacro arg
|
|
_lbl:
|
|
cmp al, 24h ;; $
|
|
jne _next
|
|
|
|
xor eax, eax
|
|
mov ebx, esi
|
|
inc esi
|
|
|
|
_lCRMArgFX:
|
|
inc ebx
|
|
mov al, byte ptr [ebx]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
jne _lCRMArgFX
|
|
|
|
cmp byte ptr [ebx], 24h ;; $
|
|
je _lCRMArgSF
|
|
mov word ptr [edi], 7830h ;; 0x
|
|
add edi, 02h
|
|
jmp _lCRScan
|
|
|
|
_lCRMArgSF:
|
|
mov al, byte ptr [esi-02h]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
jz _lCRMArg_00
|
|
|
|
mov word ptr [edi], 2323h ;; ##
|
|
mov dword ptr [edi+02h], 74747474h ;; tttt
|
|
add edi, 06h
|
|
jmp _lCRMArg_01
|
|
|
|
_lCRMArg_00:
|
|
mov dword ptr [edi], 74747474h ;; tttt
|
|
add edi, 04h
|
|
|
|
_lCRMArg_01:
|
|
movsb
|
|
cmp esi, ebx
|
|
jb _lCRMArg_01
|
|
|
|
inc esi
|
|
mov al, byte ptr [esi]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
|
|
je _lCRMArg_02
|
|
|
|
mov dword ptr [edi], 74747474h ;; tttt
|
|
mov word ptr [edi+04h], 2323h ;; ##
|
|
add edi, 06h
|
|
jmp _lCRScan
|
|
|
|
_lCRMArg_02:
|
|
mov dword ptr [edi], 74747474h ;; tttt
|
|
add edi, 04h
|
|
cmp byte ptr [esi], 24h ;; $
|
|
jne _lCRScan
|
|
mov word ptr [edi], 2323h ;; ##
|
|
add edi, 02h
|
|
jmp _lCRScan
|
|
|
|
_lbl:
|
|
cmp ax, 3501h ;; #5
|
|
jne _next
|
|
|
|
add esi, 02h
|
|
mov word ptr [edi], 2f2fh ;; //
|
|
add edi, 02h
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; error with */
|
|
_lbl:
|
|
cmp ax, 2f2ah ;; */
|
|
jne _next
|
|
|
|
mov dword ptr [_xErrorTable], offset _sErr_BadComment
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
mov dword ptr [edi], 2f2ah ;; /*
|
|
add edi, 02h
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; line ex
|
|
_lbl:
|
|
cmp al, 5ch ;; \
|
|
jne _next
|
|
mov edx, esi
|
|
|
|
_lCRSBS_00:
|
|
inc edx
|
|
|
|
cmp byte ptr [edx], 20h ;; bs
|
|
je _lCRSBS_00
|
|
cmp byte ptr [edx], 09h ;; tab
|
|
je _lCRSBS_00
|
|
cmp byte ptr [edx], 5ch ;; \
|
|
je _lCRSBS_00
|
|
|
|
cmp word ptr [edx], 2f2fh ;; //
|
|
je _lCRSBS_02
|
|
|
|
cmp word ptr [edx], 6201h ;; #b
|
|
je _lCRScanBS
|
|
|
|
cmp word ptr [edx], 0a0dh ;; nl
|
|
je _lCRSBS_01
|
|
|
|
_lCRSBS_03:
|
|
movsb
|
|
jmp _lCRScan
|
|
|
|
_lCRSBS_01:
|
|
inc esi
|
|
mov word ptr [edx], 6201h ;; #b
|
|
jmp _lCRScan
|
|
|
|
_lCRSBS_02:
|
|
cmp byte ptr [edx+02h], 21h ;; !
|
|
je _lCRSBS_03
|
|
|
|
_lCRSBS_04:
|
|
mov byte ptr [edx], 20h ;; bs
|
|
inc edx
|
|
|
|
cmp word ptr [edx], 0a0dh ;; nl
|
|
jne _lCRSBS_04
|
|
|
|
inc esi
|
|
mov word ptr [edx], 6201h ;; #b
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ex new line
|
|
_lbl:
|
|
cmp al, 3bh ;; ;
|
|
jne _next
|
|
inc esi
|
|
jmp _lCRScanLine
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; blocks
|
|
;;----------------
|
|
;; x
|
|
_lbl:
|
|
cmp al, 7bh ;; {
|
|
jne _next
|
|
|
|
_lCRBlockCheck:
|
|
cmp word ptr [edi-02h], 0a0dh
|
|
jne _lCRBlockCheckEnd
|
|
sub edi, 02h
|
|
_lCRBlockCheckEnd:
|
|
push edi
|
|
mov word ptr [edi], 7801h ;; #x
|
|
inc esi
|
|
add edi, 06h
|
|
jmp _lCRScan ;; ???
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; y
|
|
_lbl:
|
|
cmp al, 7dh ;; }
|
|
jne _next
|
|
_lCRCloseBlock:
|
|
pop eax
|
|
test eax, eax
|
|
jz _lBlockErr
|
|
cmp word ptr [edi-02h], 0a0dh ;; new line
|
|
je _lCLAddNE
|
|
mov word ptr [edi], 0a0dh ;; new line
|
|
|
|
add edi, 02h
|
|
_lCLAddNE:
|
|
mov dword ptr [eax+02h], edi
|
|
mov word ptr [edi], 7901h ;; #y
|
|
mov dword ptr [edi+02h], eax
|
|
mov dword ptr [edi+06h], 06060606h ;; ex backspace
|
|
mov dword ptr [edi+0ah], 06060606h
|
|
mov word ptr [edi+0eh], 0a0dh ;; new line
|
|
|
|
inc esi
|
|
add edi, 10h
|
|
jmp _lCRScanLine
|
|
|
|
;;----------------
|
|
;; error
|
|
_lBlockErr:
|
|
mov dword ptr [_xErrorTable], offset _sErr_BadBlock
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
mov byte ptr [edi], 7dh ;; }
|
|
inc edi
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
|
|
jmp _lErrIn
|
|
;;----------------
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; return from included file
|
|
_lbl:
|
|
cmp ax, 7201h ;; #r
|
|
jne _next
|
|
_lRetnGuard:
|
|
pop eax ;; for safe
|
|
test eax, eax
|
|
jnz _lIncRetErr
|
|
pop esi
|
|
call _imp__GlobalUnlock@4
|
|
call _imp__GlobalFree@4
|
|
jmp _lCRScanLine
|
|
|
|
;;----------------
|
|
;; error
|
|
_lIncRetErr:
|
|
mov dword ptr [_xErrorTable], offset _sErr_BadBlockInFile
|
|
mov dword ptr [_xErrorTable+04h], eax
|
|
inc eax
|
|
mov dword ptr [_xErrorTable+08h], eax
|
|
jmp _lErrIn
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #b
|
|
_lbl:
|
|
cmp ax, 6201h ;; #b
|
|
jne _next
|
|
add esi, 02h
|
|
mov byte ptr [edi], 20h ;; bs
|
|
inc edi
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; strings
|
|
_lbl:
|
|
cmp al, 22h ;; "
|
|
jne _next
|
|
mov ebp, edi
|
|
mov ecx, 0800h
|
|
jmp _lCRStringDX
|
|
|
|
_lCRStringEX:
|
|
movsb
|
|
_lCRStringDX:
|
|
movsb
|
|
_lCRStringSX:
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lCRStringNext
|
|
mov word ptr [edi], 6e5ch ;; \n
|
|
add esi, 02h
|
|
add edi, 02h
|
|
jmp _lCRStringSX
|
|
_lCRStringNext:
|
|
cmp byte ptr [esi], 00h ;; null
|
|
je _lCRStringError
|
|
cmp byte ptr [esi], 5ch ;; \
|
|
je _lCRStringEX
|
|
dec ecx
|
|
jz _lCRStringError
|
|
cmp byte ptr [esi], 22h ;; "
|
|
jne _lCRStringDX
|
|
movsb
|
|
jmp _lCRScan
|
|
|
|
;;----------------
|
|
;; not closed string
|
|
_lCRStringError:
|
|
mov dword ptr [_xErrorTable], offset _sErr_UnclosedString
|
|
mov dword ptr [_xErrorTable+04h], ebp
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
|
|
jmp _lErrIn
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; null and other
|
|
_lbl:
|
|
cmp byte ptr [esi], 00h ;; null
|
|
je _lCREnd
|
|
movsb
|
|
jmp _lCRScan
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lCREnd:
|
|
cmp dword ptr [_dStackPos], esp
|
|
je _next
|
|
;;----------------
|
|
;; error
|
|
mov dword ptr [_xErrorTable], offset _sErr_UnclosedBlock
|
|
pop eax
|
|
add eax, 02h
|
|
mov dword ptr [_xErrorTable+04h], eax
|
|
inc eax
|
|
mov dword ptr [_xErrorTable+08h], eax
|
|
jmp _lErrIn
|
|
;;----------------
|
|
_lbl:
|
|
pop eax ;; for safe
|
|
;;----------------
|
|
|
|
mov esi, dword ptr [esp+04h]
|
|
add edi, 04h
|
|
mov dword ptr [_dSynDesc], offset _xSynDesc ;; reset
|
|
push edi
|
|
;;----------------
|
|
|
|
mov _dCurrStr, offset _sProg_02
|
|
mov eax, 28h
|
|
call _lSetProg
|
|
|
|
;;----------------
|
|
;; build define block
|
|
dec esi
|
|
mov ebx, offset _lDefX
|
|
|
|
;;----------------
|
|
;; sysdefines
|
|
|
|
;;----------------
|
|
;; date time
|
|
push offset _xSysTime
|
|
call _imp__GetLocalTime@4
|
|
|
|
mov ecx, 0ah
|
|
xor eax, eax
|
|
xor edx, edx
|
|
mov ax, word ptr [_xSysTime]
|
|
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sDate+03h], dl
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sDate+02h], dl
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sDate+01h], dl
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sDate], dl
|
|
|
|
mov byte ptr [_sDate+04h], 2eh ;; .
|
|
|
|
mov al, byte ptr [_xSysTime+02h]
|
|
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sDate+06h], dl
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sDate+05h], dl
|
|
|
|
mov byte ptr [_sDate+07h], 2eh ;; .
|
|
|
|
mov al, byte ptr [_xSysTime+06h]
|
|
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sDate+09h], dl
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sDate+08h], dl
|
|
|
|
mov byte ptr [_sDate+0ah], 03h
|
|
|
|
mov al, byte ptr [_xSysTime+08h]
|
|
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sTime+01h], dl
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sTime], dl
|
|
|
|
mov byte ptr [_sTime+02h], 3ah ;; :
|
|
|
|
mov al, byte ptr [_xSysTime+0ah]
|
|
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sTime+04h], dl
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sTime+03h], dl
|
|
|
|
mov byte ptr [_sTime+05h], 3ah ;; :
|
|
|
|
mov al, byte ptr [_xSysTime+0ch]
|
|
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sTime+07h], dl
|
|
xor edx, edx
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [_sTime+06h], dl
|
|
|
|
mov byte ptr [_sTime+08h], 03h
|
|
|
|
mov dword ptr [ebx], offset _sDateL
|
|
mov dword ptr [ebx+04h], offset _sDate
|
|
mov dword ptr [ebx+10h], offset _sTimeL
|
|
mov dword ptr [ebx+14h], offset _sTime
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; weather
|
|
mov dword ptr [ebx+20h], offset _sWeatherL
|
|
mov dword ptr [ebx+24h], offset _sWether
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; version
|
|
_lbl:
|
|
mov eax, dword ptr [_dWarVerSL]
|
|
mov dword ptr [ebx+30h], offset _sWarVer
|
|
mov dword ptr [ebx+34h], eax
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; count
|
|
mov dword ptr [ebx+40h], offset _sCountL
|
|
mov dword ptr [ebx+44h], offset _sCntSpec
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; funcname
|
|
mov dword ptr [ebx+50h], offset _sFuncNameL
|
|
mov dword ptr [ebx+54h], offset _sFuncName
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; debug
|
|
cmp dword ptr [_dDbgOff], offset _lCRDebugAdd
|
|
jne _next
|
|
|
|
mov dword ptr [ebx+60h], offset _sDebugL
|
|
mov dword ptr [ebx+64h], offset _sTrue
|
|
add ebx, 10h
|
|
;;----------------
|
|
|
|
_lbl:
|
|
add ebx, 60h
|
|
;;----------------
|
|
|
|
xor ecx, ecx ;; current scope = 00h
|
|
mov _dStackPos, esp ;; save stack
|
|
|
|
;;----------------
|
|
;; line start
|
|
_lLineStart:
|
|
inc esi
|
|
_lLineStartEx:
|
|
mov eax, dword ptr [esi]
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; define in
|
|
_lbl:
|
|
cmp eax, 69666564h ;; defi
|
|
jne _next
|
|
cmp word ptr [esi+04h], 656eh ;; ne
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 20h ;; _
|
|
jg _lDefInEX
|
|
|
|
mov eax, esi
|
|
jne _lBlockCheckPre
|
|
inc esi
|
|
_lBlockCheckPre:
|
|
add esi, 06h
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lBlockCheck_01 ;; single constant or block
|
|
add esi, 02h
|
|
mov edx, offset _lDefEx
|
|
mov word ptr [eax], 6401h ;; #d
|
|
jmp _lDefEx
|
|
|
|
_lBlockCheck_01:
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
jne _lBlockCheck_02 ;; single constant
|
|
mov word ptr [eax], 6401h ;; #d
|
|
mov eax, dword ptr [esi+02h]
|
|
add esi, 06h
|
|
mov dword ptr [eax], 6e650a0dh ;; __en
|
|
mov dword ptr [eax+04h], 66656464h ;; ddef
|
|
mov dword ptr [eax+08h], 20656e69h ;; ine_
|
|
mov edx, offset _lDefEx
|
|
jmp _lDefEx
|
|
_lBlockCheck_02:
|
|
mov edx, offset _lLineStartEx
|
|
mov word ptr [eax], 6301h ;; #c
|
|
jmp _lDefEx
|
|
|
|
_lDefInEX:
|
|
cmp byte ptr [esi+06h], 3ch ;; <
|
|
jne _next
|
|
mov word ptr [esi], 6301h ;; #c
|
|
mov edx, offset _lLineStartEx
|
|
add esi, 06h
|
|
jmp _lDefEx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; enum in
|
|
_lbl:
|
|
cmp eax, 6d756e65h ;; enum
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 28h ;; (
|
|
je _lEnumInEX
|
|
cmp byte ptr [esi+04h], 20h ;; bs
|
|
jg _next
|
|
je _lEnumInBase
|
|
mov ebp, offset _dEnumDefTable-04h
|
|
jmp _lEnumInBlock
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; undef
|
|
_lbl:
|
|
cmp eax, 65646e75h ;; unde
|
|
jne _next
|
|
cmp word ptr [esi+04h], 2066h ;; f_
|
|
je _lUndefNorm
|
|
|
|
cmp word ptr [esi+04h], 3c66h ;; f<
|
|
jne _next
|
|
|
|
;;----------------
|
|
;; hard
|
|
mov word ptr [esi], 7501h ;; #u
|
|
add esi, 06h
|
|
_lUndefHard:
|
|
inc esi
|
|
cmp byte ptr [esi], 3eh ;; >
|
|
jne _lUndefHard
|
|
mov byte ptr [esi], 02h
|
|
jmp _lLineStartEx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; norm
|
|
_lUndefNorm:
|
|
mov word ptr [esi], 7501h ;; #u
|
|
add esi, 06h
|
|
_lUndefNormEX:
|
|
inc esi
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lUndefNormEX
|
|
mov byte ptr [esi], 02h
|
|
jmp _lLineStartEx
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; setdef
|
|
_lbl:
|
|
cmp eax, 64746573h ;; setd
|
|
jne _next
|
|
cmp word ptr [esi+04h], 6665h ;; ef
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 3ch ;; <
|
|
je _lSetdefHard
|
|
cmp byte ptr [esi+06h], 20h ;; bs
|
|
jne _next
|
|
|
|
push ebx
|
|
mov edx, offset _lSerdefExit
|
|
xor eax, eax
|
|
xor ebp, ebp
|
|
lea edi, [esi+02h]
|
|
mov byte ptr [esi], 08h ;; setdef
|
|
add esi, 06h
|
|
mov ebx, _dDefTableSD+_dDFSize
|
|
|
|
_lSetdef:
|
|
inc esi
|
|
mov al, byte ptr [esi]
|
|
cmp byte ptr [_bAscii_00+eax], ah ;; ah = 00h
|
|
jne _lSetdef
|
|
|
|
_lSetdefEX:
|
|
cmp byte ptr [esi], 3dh ;; =
|
|
je _lSetdefClose
|
|
cmp word ptr [esi], 2928h ;; ()
|
|
je _lSetdefFVEX
|
|
|
|
;;----------------
|
|
;; macro
|
|
mov byte ptr [esi], 02h
|
|
mov ebp, esi
|
|
_lSetdefArg:
|
|
inc esi
|
|
cmp byte ptr [esi], 3dh ;; =
|
|
jne _lSetdefArg
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; close setdef
|
|
_lSetdefClose:
|
|
mov byte ptr [esi], 02h
|
|
inc esi
|
|
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
je _lSetdefMultiline
|
|
|
|
mov dword ptr [edi], esi
|
|
dec edi
|
|
mov dword ptr [_dDefTableSD+04h], esi
|
|
push edi
|
|
jmp _lDFFindValueEndRE ;; !!!
|
|
|
|
_lSetdefMultiline:
|
|
mov eax, dword ptr [esi+02h]
|
|
add esi, 06h
|
|
mov dword ptr [edi], esi
|
|
mov byte ptr [eax], 03h
|
|
jmp _lDFFindValueEndEG
|
|
;;----------------
|
|
|
|
_lSetdefFVEX:
|
|
add esi, 02h
|
|
jmp _lSetdefClose
|
|
|
|
_lSetdefHard:
|
|
push ebx
|
|
mov edx, offset _lSerdefExit
|
|
xor ebp, ebp
|
|
lea edi, [esi+02h]
|
|
mov byte ptr [esi], 08h ;; setdef
|
|
add esi, 06h
|
|
mov ebx, _dDefTableSD+_dDFSize
|
|
_lSetdefHardEX:
|
|
inc esi
|
|
cmp byte ptr [esi], 3eh ;; >
|
|
jne _lSetdefHardEX
|
|
mov byte ptr [esi], 02h
|
|
inc esi
|
|
jmp _lSetdefEX
|
|
|
|
;;----------------
|
|
;; restore ebx
|
|
_lSerdefExit:
|
|
pop edi
|
|
mov eax, dword ptr [_dDefTableSD+0ch]
|
|
mov byte ptr [edi], al
|
|
pop ebx
|
|
jmp _lLineStartEx
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; scope
|
|
_lbl:
|
|
cmp eax, 706f6373h ;; scop
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 65h ;; e
|
|
jne _next
|
|
cmp byte ptr [esi+05h], 20h ;; _
|
|
jg _next
|
|
add esi, 05h
|
|
_lScopeIn:
|
|
inc esi
|
|
cmp word ptr [esi], 0a0dh
|
|
je _lLSIn
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
jne _lScopeIn
|
|
mov eax, dword ptr [esi+02h]
|
|
mov dword ptr [esi], 05050505h
|
|
mov word ptr [esi+04h], 0a0dh
|
|
add esi, 04h
|
|
cmp word ptr [eax-02h], 0a0dh
|
|
je _lScopeInEX
|
|
mov word ptr [eax], 0a0dh
|
|
add eax, 02h
|
|
_lScopeInEX:
|
|
mov dword ptr [eax], 73646e65h ;; ends
|
|
mov dword ptr [eax+04h], 65706f63h ;; cope
|
|
_lLSIn:
|
|
push ecx
|
|
inc dword ptr [_dFreeScope]
|
|
mov ecx, _dFreeScope
|
|
lea eax, [offset _dScopeIn+ecx*04h]
|
|
mov dword ptr [eax], esi
|
|
jmp _lNextLineSx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; library
|
|
_lbl:
|
|
cmp eax, 7262696ch ;; libr
|
|
jne _next
|
|
cmp dword ptr [esi+03h], 79726172h ;; rary
|
|
jne _next
|
|
cmp dword ptr [esi+07h], 636e6f5fh ;; _onc
|
|
jne _lLibExTest
|
|
cmp byte ptr [esi+0bh], 65h ;; e
|
|
jne _lLibExTest
|
|
cmp byte ptr [esi+0ch], 20h ;; _
|
|
jg _lLibExTest
|
|
add esi, 0eh
|
|
jmp _lLibInEX
|
|
_lLibExTest:
|
|
cmp byte ptr [esi+07h], 20h ;; _
|
|
jg _next
|
|
add esi, 08h
|
|
_lLibIn:
|
|
inc esi
|
|
_lLibInEX:
|
|
cmp word ptr [esi], 0a0dh
|
|
je short _lLSIn
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
jne _lLibIn
|
|
mov eax, dword ptr [esi+02h]
|
|
mov dword ptr [esi], 05050505h
|
|
mov word ptr [esi+04h], 0a0dh
|
|
add esi, 04h
|
|
cmp word ptr [eax-02h], 0a0dh
|
|
je _lLibInSX
|
|
mov word ptr [eax], 0a0dh
|
|
add eax, 02h
|
|
_lLibInSX:
|
|
mov word ptr [eax], 6e65h ;; en
|
|
mov dword ptr [eax+02h], 62696c64h ;; dlib
|
|
mov dword ptr [eax+06h], 79726172h ;; rary
|
|
jmp _lLSIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; endscope
|
|
_lbl:
|
|
cmp eax, 73646e65h ;; ends
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 65706f63h ;; cope
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 20h ;; _
|
|
jg _next
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; scope/library out
|
|
_lOut:
|
|
test ecx, ecx
|
|
jz _lLibScpErr
|
|
lea eax, [offset _dScopeOut+ecx*04h]
|
|
mov dword ptr [eax], esi
|
|
pop ecx
|
|
jmp _lNextLineSx
|
|
|
|
;;----------------
|
|
;; error
|
|
_lLibScpErr:
|
|
mov dword ptr [_xErrorTable], offset _sErr_EndLibScope
|
|
mov dword ptr [_xErrorTable+04h], esi
|
|
_lLibScpErrEX:
|
|
inc esi
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lLibScpErrEX
|
|
mov dword ptr [_xErrorTable+08h], esi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; endlibrary
|
|
_lbl:
|
|
cmp eax, 6c646e65h ;; endl
|
|
jne _lNextLineSx
|
|
cmp dword ptr [esi+04h], 61726269h ;; ibra
|
|
jne _lNextLineSx
|
|
cmp word ptr [esi+08h], 7972h ;; ry
|
|
jne _lNextLineSx
|
|
cmp byte ptr [esi+0ah], 20h ;; _
|
|
jbe _lOut
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; search new line
|
|
_lNextLineEx:
|
|
inc esi
|
|
_lNextLineSx:
|
|
cmp word ptr [esi], 0a0dh ;; new line
|
|
je _next
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
je _lNextLineDx
|
|
cmp word ptr [esi], 7901h ;; #y
|
|
je _lNextLineDx
|
|
cmp byte ptr [esi], 00h
|
|
jne _lNextLineEx
|
|
jmp _lScanEnd
|
|
_lbl:
|
|
inc esi
|
|
jmp _lLineStart
|
|
|
|
_lNextLineDx:
|
|
add esi, 06h
|
|
jmp _lLineStartEx ; _lNextLineSx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; build enum
|
|
;;----------------
|
|
;; named enum
|
|
|
|
;;----------------
|
|
;; error
|
|
_lEnumInErr:
|
|
mov dword ptr [_xErrorTable], offset _sErr_Base
|
|
mov dword ptr [_xErrorTable+04h], esi
|
|
inc esi
|
|
mov dword ptr [_xErrorTable+08h], esi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
_lEnumInEX:
|
|
xor eax, eax
|
|
add esi, 05h
|
|
mov dword ptr [_dBuffer], esi
|
|
mov ebp, offset _xEnumLabel
|
|
mov edi, dword ptr [ebp]
|
|
test edi, edi
|
|
jz _lEnumInEXCreateNew
|
|
|
|
_lEnumInEXCheck:
|
|
lodsb
|
|
cmp byte ptr [_bAscii_00+eax], ah ;; ah = 00h
|
|
jne _lEnumInEXCheckEX
|
|
|
|
cmp al, 29h ;; )
|
|
jne _lEnumInErr
|
|
scasb
|
|
jne _lEnumInEXGetNext
|
|
mov eax, dword ptr [_dBuffer]
|
|
sub eax, 05h
|
|
jmp _lEnumInBlockEX
|
|
|
|
_lEnumInEXCheckEX:
|
|
scasb
|
|
je _lEnumInEXCheck
|
|
|
|
_lEnumInEXGetNext:
|
|
add ebp, 0ch
|
|
mov edi, dword ptr [ebp]
|
|
mov esi, dword ptr [_dBuffer]
|
|
test edi, edi
|
|
jnz _lEnumInEXCheck
|
|
|
|
_lEnumInEXCreateNew:
|
|
mov dword ptr [ebp], esi
|
|
mov edi, dword ptr [_dEnumTablePointer]
|
|
mov dword ptr [edi], 80000000h
|
|
mov dword ptr [edi+04h], 0ffffffffh
|
|
lea eax, [edi+0ch]
|
|
mov dword ptr [edi+08h], eax
|
|
mov dword ptr [ebp+04h], edi
|
|
mov dword ptr [edi+0ch], 00000000h
|
|
mov dword ptr [edi+10h], 7fffffffh
|
|
mov dword ptr [edi+14h], 00000000h
|
|
lea eax, [edi+0ch]
|
|
mov dword ptr [ebp+08h], eax
|
|
add edi, 18h
|
|
mov dword ptr [_dEnumTablePointer], edi
|
|
mov eax, dword ptr [_dBuffer]
|
|
sub eax, 05h
|
|
|
|
_lbl:
|
|
inc esi
|
|
cmp byte ptr [esi-01h], 29h ;; )
|
|
jne _prew
|
|
|
|
jmp _lEnumInBlockEX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; base enum
|
|
_lEnumInBase:
|
|
mov word ptr [esi], 6301h ;; #c
|
|
add esi, 05h
|
|
mov ebp, offset _dEnumDefTable-04h
|
|
mov dword ptr [_dBuffer], offset _lLineStartEx
|
|
jmp _lEnumBStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; block enum
|
|
_lEnumInBlock:
|
|
mov eax, esi
|
|
add esi, 04h
|
|
_lEnumInBlockEX:
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
je _lEnumInBlockFX
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
je _lEnumInBlockSX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; single lined
|
|
mov dword ptr [_dBuffer], offset _lLineStartEx
|
|
mov word ptr [eax], 6301h ;; #c
|
|
jmp _lEnumBStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lEnumInBlockSX:
|
|
add esi, 04h
|
|
_lEnumInBlockFX:
|
|
add esi, 02h
|
|
mov dword ptr [_dBuffer], offset _lEnumMStart
|
|
mov word ptr [eax], 6401h ;; #d
|
|
jmp _lEnumBStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; start
|
|
|
|
;;----------------
|
|
;; exit from block
|
|
_lEnumMStart:
|
|
cmp word ptr [esi], 7901h ;; #y
|
|
jne _lEnumMStartEX
|
|
|
|
mov word ptr [esi+0eh], 6401h ;; #d
|
|
add esi, 10h
|
|
jmp _lLineStartEx
|
|
|
|
_lEnumMStartEX:
|
|
cmp dword ptr [esi], 65646e65h ;; ende
|
|
jne _lEnumBStart
|
|
cmp word ptr [esi+04h], 756eh ;; nu
|
|
jne _lEnumBStart
|
|
cmp byte ptr [esi+06h], 6dh ;; m
|
|
jne _lEnumBStart
|
|
cmp byte ptr [esi+07h], 20h ;;
|
|
jg _lEnumBStart
|
|
cmp word ptr [esi+07h], 0a0dh ;; nl
|
|
jne _lEnumInErr
|
|
|
|
mov word ptr [esi+07h], 6401h ;; #d
|
|
add esi, 09h
|
|
jmp _lLineStartEx
|
|
;;----------------
|
|
|
|
_lEnumBStart:
|
|
|
|
;;----------------
|
|
;; private ?
|
|
cmp dword ptr [esi], 76697270h ;; priv
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 20657461h ;; ate_
|
|
jne _next
|
|
add esi, 08h
|
|
mov dword ptr [ebx+08h], ecx
|
|
;;----------------
|
|
|
|
_lbl:
|
|
mov dword ptr [ebx], esi ;; label
|
|
|
|
cmp byte ptr [esi], 3ch ;; <
|
|
jne _lEnumNorm
|
|
|
|
;;----------------
|
|
;; hard enum
|
|
inc dword ptr [ebx]
|
|
_lEnumHard:
|
|
inc esi
|
|
cmp byte ptr [esi], 3eh ;; >
|
|
jne _lEnumHard
|
|
|
|
mov byte ptr [esi], 02h ;; label end
|
|
inc esi
|
|
jmp _lEnumCheckRange
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; norm enum
|
|
_lEnumNorm:
|
|
xor eax, eax
|
|
dec esi
|
|
_lEnumNormEX:
|
|
inc esi
|
|
mov al, byte ptr [esi]
|
|
cmp byte ptr [_bAscii_00+eax], ah ;; ah = 00h
|
|
jnz _lEnumNormEX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ranged?
|
|
_lEnumCheckRange:
|
|
cmp byte ptr [esi], 28h ;; (
|
|
je _lEnumRanged
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; simple
|
|
cmp byte ptr [esi], 2ch ;; ,
|
|
jne _next
|
|
|
|
mov byte ptr [esi], 02h ;; label end
|
|
inc esi
|
|
jmp _lEnumNextLabel
|
|
|
|
_lbl:
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
; jne
|
|
mov word ptr [esi], 0702h ;; label end ; enum out
|
|
add esi, 02h
|
|
|
|
_lEnumNextLabel:
|
|
mov edi, dword ptr [ebp+08h]
|
|
mov eax, dword ptr [edi]
|
|
cmp eax, dword ptr [edi+04h]
|
|
; je
|
|
inc dword ptr [edi]
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; calculate string
|
|
push ebp
|
|
|
|
mov edi, dword ptr [_dEnumStrPoint]
|
|
mov ebp, 0ah
|
|
mov byte ptr [edi], 03h ;; define value end
|
|
dec edi
|
|
_lbl:
|
|
xor edx, edx
|
|
div ebp
|
|
add edx, 30h
|
|
mov byte ptr [edi], dl
|
|
test eax, eax
|
|
jnz _prew
|
|
|
|
mov dword ptr [ebx+04h], edi
|
|
add ebx, _dDFSize
|
|
|
|
add edi, 0dh
|
|
mov dword ptr [_dEnumStrPoint], edi
|
|
|
|
pop ebp
|
|
jmp dword ptr [_dBuffer]
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ranged
|
|
_lEnumRanged:
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; build defines
|
|
_lDefEx:
|
|
mov eax, dword ptr [esi]
|
|
|
|
cmp ax, 0a0dh
|
|
jne _lDefCheck
|
|
add esi, 02h
|
|
jmp _lDefEx
|
|
|
|
;;----------------
|
|
;; exit
|
|
_lDefCheck:
|
|
cmp eax, 64646e65h ;; endd
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 6e696665h ;; efin
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 65h ;; e
|
|
jne _next
|
|
cmp byte ptr [esi+09h], 20h ;; _
|
|
jg _next
|
|
|
|
cmp byte ptr [esi+0ah], 06h
|
|
jne _lDefExitEX
|
|
add esi, 05h
|
|
|
|
_lDefExitEX:
|
|
add esi, 09h
|
|
mov word ptr [esi-02h], 6401h ;; #d
|
|
jmp _lLineStartEx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; private ?
|
|
_lDefPrivEX:
|
|
cmp dword ptr [esi+04h], 3c657461h ;; ate<
|
|
jne _next
|
|
add esi, 07h
|
|
jmp _lDefPrivSX
|
|
|
|
_lbl:
|
|
cmp eax, 76697270h ;; priv
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 20657461h ;; ate_
|
|
jne _lDefPrivEX
|
|
add esi, 08h
|
|
_lDefPrivSX:
|
|
mov dword ptr [ebx+08h], ecx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; define label
|
|
_lbl:
|
|
mov dword ptr [ebx], esi ;; find label
|
|
mov al, byte ptr [esi]
|
|
xor ebp, ebp
|
|
;;----------------
|
|
|
|
cmp al, 3ch ;; <
|
|
jne _lDefNorm
|
|
inc dword ptr [ebx]
|
|
|
|
_lDefHard:
|
|
inc esi
|
|
cmp byte ptr [esi], 3eh ;; >
|
|
jne _lDefHard
|
|
mov byte ptr [esi], 02h
|
|
inc esi
|
|
cmp byte ptr [esi], 3dh ;; =
|
|
je _lDFFindValue
|
|
cmp byte ptr [esi], 28h ;; (
|
|
je _lDFFindArgValue
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
je _lDFNull
|
|
|
|
;;----------------
|
|
;; error
|
|
_lDefErrorBase:
|
|
mov dword ptr [_xErrorTable], offset _sErr_BadDef
|
|
mov dword ptr [_xErrorTable+04h], esi
|
|
inc esi
|
|
mov dword ptr [_xErrorTable+08h], esi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check first char
|
|
_lDefNorm:
|
|
cmp al, 41h
|
|
jb _lDefErrorBase
|
|
cmp al, 5ah
|
|
jbe _next
|
|
cmp al, 61h
|
|
jb _lDefErrorBase
|
|
cmp al, 7ah
|
|
jg _lDefErrorBase
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check define label
|
|
_lbl:
|
|
inc esi
|
|
mov al, byte ptr [esi]
|
|
cmp al, 3dh ;; =
|
|
je _lDFFindValue
|
|
cmp al, 28h ;; (
|
|
je _lDFFindArgValue
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
je _lDFNull
|
|
|
|
cmp al, 5fh
|
|
je _prew
|
|
cmp al, 30h
|
|
jb _lDefErrorBase
|
|
cmp al, 39h
|
|
jbe _prew
|
|
cmp al, 41h
|
|
jb _lDefErrorBase
|
|
cmp al, 5ah
|
|
jbe _prew
|
|
cmp al, 61h
|
|
jb _lDefErrorBase
|
|
cmp al, 7ah
|
|
jg _lDefErrorBase
|
|
jmp _prew
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; null define
|
|
_lDFNullEX:
|
|
mov dword ptr [esi], 02h
|
|
add esi, 02h
|
|
_lDFNull:
|
|
mov word ptr [esi], 0302h ;; label end ; def end
|
|
inc esi
|
|
mov dword ptr [ebx+04h], esi
|
|
add ebx, _dDFSize
|
|
inc esi
|
|
jmp edx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; macros
|
|
_lDFFindArgValue:
|
|
cmp dword ptr [esi], 0a0d2928h ;; () nl
|
|
je _lDFNullEX
|
|
cmp word ptr [esi], 2928h ;; ()
|
|
jne _lDFFindArgValueSX
|
|
mov byte ptr [esi], 02h
|
|
add esi, 03h
|
|
jmp _lDFFindValueTX
|
|
|
|
_lDFFindArgValueSX:
|
|
mov byte ptr [esi], 02h
|
|
mov ebp, esi
|
|
_lDFFindArgValueRe:
|
|
inc esi
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
je _lDFFindValueEndFS
|
|
cmp byte ptr [esi], 3dh ;; =
|
|
jne _lDFFindArgValueRe
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; close define
|
|
_lDFFindValue:
|
|
mov byte ptr [esi], 02h
|
|
inc esi
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; is it multilined define?
|
|
_lDFFindValueTX:
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
je _lDFFindValueEndEx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
mov dword ptr [ebx+04h], esi
|
|
add ebx, _dDFSize
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lDFFindValueEndRE:
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
je _lDFFindValueEndRR
|
|
|
|
_lDFFindValueEnd:
|
|
inc esi
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lDFFindValueEnd
|
|
_lDFFindValueEndRR:
|
|
mov byte ptr [esi], 03h
|
|
add esi, 02h
|
|
jmp _lDFArcCheckStart
|
|
|
|
_lDFFindValueEndFS:
|
|
mov word ptr [esi], 0302h ;; label end ; def end
|
|
inc esi
|
|
mov dword ptr [ebx+04h], esi
|
|
add ebx, _dDFSize
|
|
inc esi
|
|
jmp _lDFArcCheckStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; multilined define
|
|
_lDFFindValueEndEx:
|
|
mov eax, dword ptr [esi+02h]
|
|
add esi, 06h
|
|
mov dword ptr [ebx+04h], esi
|
|
add ebx, _dDFSize
|
|
mov byte ptr [eax], 03h
|
|
_lDFFindValueEndEG:
|
|
lea esi, [eax+05h]
|
|
_lDFFindValueEndES:
|
|
inc esi
|
|
cmp word ptr [esi], 0a0dh
|
|
jne _lDFFindValueEndES
|
|
add esi, 02h
|
|
;; jmp _lDFArcCheckStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; parse arguments
|
|
_lDFArcCheckStart:
|
|
test ebp, ebp
|
|
jnz _lDFEAXLoad
|
|
jmp edx ;; exit
|
|
|
|
_lDFEAXLoad:
|
|
mov ah, 7fh
|
|
_lDFNextArg:
|
|
inc ebp
|
|
cmp byte ptr [ebp], 29h ;; )
|
|
jne _lDFArgReplace
|
|
jmp edx ;; exit - all arguments parsed
|
|
|
|
_lDFArgReplace:
|
|
push ebp
|
|
inc ah
|
|
inc dword ptr [ebx+0ch-_dDFSize]
|
|
mov edi, dword ptr [ebx+04h-_dDFSize]
|
|
|
|
dec edi
|
|
_lDFArgSearchWord:
|
|
inc edi
|
|
_lDFArgSearchWordEx:
|
|
cmp byte ptr [edi], 03h
|
|
je _lDFArgCheckEnd
|
|
|
|
;;----------------
|
|
;; strings
|
|
cmp byte ptr [edi], 22h ;; "
|
|
jne _lDFArgSearchWordSx
|
|
_lDFArgSearchWordDx:
|
|
inc edi
|
|
_lDFArgSearchWordRx:
|
|
cmp byte ptr [edi], 03h
|
|
je _lDFArgCheckEnd
|
|
cmp byte ptr [edi], 5ch ;; \
|
|
jne _lDFArgSearchWordFx
|
|
add edi, 02h
|
|
jmp _lDFArgSearchWordRx
|
|
_lDFArgSearchWordFx:
|
|
cmp byte ptr [edi], 22h ;; "
|
|
jne _lDFArgSearchWordDx
|
|
jmp _lDFArgSearchWord
|
|
;;----------------
|
|
|
|
_lDFArgSearchWordSx:
|
|
cmp byte ptr [edi], 01h
|
|
je _lDFArgSearchWordSS
|
|
cmp byte ptr [edi], 30h
|
|
jb _lDFArgSearchWord
|
|
cmp byte ptr [edi], 3ah
|
|
jb _lDFArgNextWord
|
|
cmp byte ptr [edi], 41h
|
|
jb _lDFArgSearchWord
|
|
cmp byte ptr [edi], 5bh
|
|
jb _lDFArgCheckWord
|
|
cmp byte ptr [edi], 5fh
|
|
je _lDFArgCheckWord
|
|
cmp byte ptr [edi], 61h
|
|
jb _lDFArgSearchWord
|
|
cmp byte ptr [edi], 7bh
|
|
jb _lDFArgCheckWord
|
|
cmp byte ptr [edi], 7ch
|
|
je _lDFArgSearchWord
|
|
|
|
_lDFArgNextWord:
|
|
inc edi
|
|
_lDFArgNextWordSS:
|
|
cmp byte ptr [edi], 30h
|
|
jb _lDFArgSearchWordEx
|
|
cmp byte ptr [edi], 3ah
|
|
jb _lDFArgNextWord
|
|
cmp byte ptr [edi], 41h
|
|
jb _lDFArgSearchWordEx
|
|
cmp byte ptr [edi], 5bh
|
|
jb _lDFArgNextWord
|
|
cmp byte ptr [edi], 5fh
|
|
je _lDFArgNextWord
|
|
cmp byte ptr [edi], 61h
|
|
jb _lDFArgSearchWordEx
|
|
cmp byte ptr [edi], 7bh
|
|
jb _lDFArgNextWord
|
|
jmp _lDFArgSearchWordEx
|
|
|
|
;;----------------
|
|
;; special
|
|
_lDFArgSearchWordSS:
|
|
cmp word ptr [edi], 7801h ;; #x
|
|
je _lDFArgSearchWordSSEX
|
|
cmp word ptr [edi], 7901h ;; #y
|
|
je _lDFArgSearchWordSSEX
|
|
|
|
cmp word ptr [edi], 6901h ;; #i
|
|
jne _lDFArgSearchWordSSNorm
|
|
|
|
add edi, 02h
|
|
jmp _lDFArgSearchWordSx
|
|
|
|
_lDFArgSearchWordSSEX:
|
|
add edi, 06h
|
|
jmp _lDFArgSearchWordSx
|
|
|
|
_lDFArgSearchWordSSNorm:
|
|
add edi, 02h
|
|
jmp _lDFArgSearchWordSx
|
|
;;----------------
|
|
|
|
_lDFArgCheckWord:
|
|
mov ebp, dword ptr [esp]
|
|
mov dword ptr [_dBuffer], edi
|
|
jmp _lDFArgCheckWordStartEX
|
|
|
|
_lDFArgCheckWordStart:
|
|
inc ebp
|
|
inc edi
|
|
_lDFArgCheckWordStartEX:
|
|
mov al, byte ptr [ebp]
|
|
cmp al, 29h
|
|
je _lDFArgCheckWordEnd
|
|
cmp al, 2ch
|
|
je _lDFArgCheckWordEnd
|
|
cmp al, 30h
|
|
jb _lDFArgCheckError ;_lDFArgCheckWordEnd
|
|
cmp al, 3ah
|
|
jb _lDFArgCheckTest
|
|
cmp al, 41h
|
|
jb _lDFArgCheckError ;_lDFArgCheckWordEnd
|
|
cmp al, 5bh
|
|
jb _lDFArgCheckTest
|
|
cmp al, 5fh
|
|
je _lDFArgCheckTest
|
|
cmp al, 61h
|
|
jb _lDFArgCheckError ;_lDFArgCheckWordEnd
|
|
cmp al, 7bh
|
|
jb _lDFArgCheckTest
|
|
|
|
;;----------------
|
|
;; error
|
|
_lDFArgCheckError:
|
|
mov dword ptr [_xErrorTable], offset _sErr_BadChar
|
|
mov dword ptr [_xErrorTable+04h], ebp
|
|
inc ebp
|
|
mov dword ptr [_xErrorTable+08h], ebp
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
_lDFArgCheckTest:
|
|
cmp al, byte ptr [edi]
|
|
jne _lDFArgNextWordSS
|
|
jmp _lDFArgCheckWordStart
|
|
|
|
_lDFArgCheckWordEnd:
|
|
mov al, byte ptr [edi]
|
|
cmp al, 30h
|
|
jb _lDFArgCheckWordEndFx
|
|
cmp al, 3ah
|
|
jb _lDFArgNextWord
|
|
cmp al, 41h
|
|
jb _lDFArgCheckWordEndFx
|
|
cmp al, 5bh
|
|
jb _lDFArgNextWord
|
|
cmp al, 5fh
|
|
je _lDFArgNextWord
|
|
cmp al, 61h
|
|
jb _lDFArgCheckWordEndFx
|
|
cmp al, 7bh
|
|
jb _lDFArgNextWord
|
|
|
|
_lDFArgCheckWordEndFx:
|
|
mov ebp, dword ptr [_dBuffer]
|
|
_lDFArgCheckWordEndEx:
|
|
mov byte ptr [ebp], 05h ;; ex backspace
|
|
inc ebp
|
|
cmp ebp, edi
|
|
jne _lDFArgCheckWordEndEx
|
|
mov byte ptr [edi-01h], ah
|
|
jmp _lDFArgSearchWordEx
|
|
|
|
_lDFArgCheckEnd:
|
|
pop ebp
|
|
_lDFArgCheckEndEx:
|
|
inc ebp
|
|
cmp byte ptr [ebp], 29h ;; )
|
|
jne _lDFArgCheckEndSx
|
|
jmp edx
|
|
_lDFArgCheckEndSx:
|
|
cmp byte ptr [ebp], 2ch ;; ,
|
|
jne _lDFArgCheckEndEx
|
|
jmp _lDFNextArg
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; lib check
|
|
_lScanEnd:
|
|
cmp esp, _dStackPos
|
|
je _next
|
|
|
|
lea eax, dword ptr [offset _dScopeIn+ecx*04h]
|
|
mov ebx, dword ptr [eax]
|
|
mov dword ptr [_xErrorTable], offset _sErr_UnclosedLib
|
|
mov eax, ebx
|
|
_lUncLibErr:
|
|
dec ebx
|
|
cmp word ptr [ebx-02h], 0a0dh
|
|
jne _lUncLibErr
|
|
mov dword ptr [_xErrorTable+04h], ebx
|
|
mov dword ptr [_xErrorTable+08h], eax
|
|
jmp _lErrIn
|
|
;;----------------
|
|
_lbl:
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; sort define block
|
|
cmp ebx, offset _lDefX+10h
|
|
jbe _lDFSortEnd
|
|
|
|
;;----------------
|
|
;; set step
|
|
mov eax, offset _dSortSteps-04h
|
|
|
|
sub ebx, offset _lDefX
|
|
shr edx, 02h ;; ??? why ?!
|
|
_lbl:
|
|
add eax, 04h
|
|
mov ebp, dword ptr [eax+04h]
|
|
lea ebp, dword ptr [ebp+ebp*02h]
|
|
cmp ebx, ebp
|
|
jg _prew
|
|
;;----------------
|
|
|
|
_lDFSordStart:
|
|
mov ecx, dword ptr [eax]
|
|
lea ebx, dword ptr [_lDefX+ecx]
|
|
|
|
_lDFSordGo:
|
|
mov edi, ebx
|
|
mov ebp, dword ptr [ebx+08h]
|
|
mov esi, dword ptr [ebx]
|
|
mov dl, byte ptr [esi]
|
|
movaps xmm1, [ebx]
|
|
|
|
_lbl:
|
|
sub edi, ecx
|
|
cmp edi, offset _lDefX-10h
|
|
jbe _lDFSortNext
|
|
mov esi, dword ptr [edi]
|
|
cmp byte ptr [esi], dl
|
|
jb _lDFSortNext
|
|
je _lDFSortNextEx
|
|
|
|
_lDFSortRe:
|
|
movaps xmm0, [edi]
|
|
movaps [edi+ecx], xmm0
|
|
|
|
jmp _prew
|
|
|
|
_lDFSortNextEx:
|
|
cmp ebp, dword ptr [edi+08h]
|
|
jg _lDFSortRe
|
|
|
|
_lDFSortNext:
|
|
movaps [edi+ecx], xmm1
|
|
|
|
add ebx, 10h
|
|
cmp dword ptr [ebx], 00h
|
|
jnz _lDFSordGo
|
|
|
|
_lDFNextStep:
|
|
sub eax, 04h
|
|
cmp eax, offset _dSortSteps-04h
|
|
jne _lDFSordStart
|
|
|
|
_lDFSortEnd:
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; build find'n'replace table
|
|
mov eax, offset _lDefX-10h
|
|
mov edx, offset _dDefTable
|
|
xor ebx, ebx
|
|
xor ecx, ecx
|
|
|
|
_lDFTableBld:
|
|
add eax, 10h
|
|
cmp dword ptr [eax], 00h
|
|
je _lDFBuildEnd
|
|
mov ebp, dword ptr [eax]
|
|
mov bl, byte ptr [ebp]
|
|
|
|
cmp cl, bl
|
|
je _lDFTableBld
|
|
mov [edx+ebx*04h], eax
|
|
mov cl, bl
|
|
jmp _lDFTableBld
|
|
|
|
_lDFBuildEnd:
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check defines table
|
|
mov ebx, offset _lDefX-10h
|
|
|
|
_lDFTableCheckNext:
|
|
add ebx, 10h
|
|
cmp dword ptr [ebx], 00h
|
|
jz _lDFTableCheckEnd
|
|
|
|
mov edx, dword ptr [ebx] ;; edx = string addr
|
|
mov ah, byte ptr [edx]
|
|
mov ebp, ebx ;; ebp = checked struct
|
|
|
|
;;----------------
|
|
;; check next defines
|
|
_lDFTableCheckStart:
|
|
add ebp, 10h
|
|
cmp dword ptr [ebp], 00h
|
|
je _lDFTableCheckNext
|
|
mov edi, dword ptr [ebp] ;; checked string
|
|
cmp byte ptr [edi], ah
|
|
jne _lDFTableCheckNext
|
|
|
|
;;----------------
|
|
;; check own lib
|
|
mov esi, dword ptr [ebp+08h]
|
|
cmp esi, dword ptr [ebx+08h]
|
|
jne _lDFTableCheckStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check string
|
|
mov esi, edx ;; base string, edi loaded before
|
|
|
|
_lbl:
|
|
lodsb
|
|
cmp al, 02h
|
|
je _next
|
|
scasb
|
|
je _prew
|
|
jmp _lDFTableCheckStart
|
|
|
|
_lbl:
|
|
scasb
|
|
jne _lDFTableCheckStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check arg count
|
|
mov esi, dword ptr [ebp+0ch]
|
|
cmp esi, dword ptr [ebx+0ch]
|
|
je _lDFTableCheckValue ;_lDFTableCheckStart
|
|
|
|
;;----------------
|
|
;; resort
|
|
mov esi, ebp
|
|
mov edi, ebx
|
|
jb _lDFTableCheckSort
|
|
add edi, 10h
|
|
|
|
_lDFTableCheckSort:
|
|
cmp edi, esi
|
|
je _lDFTableCheckSortEnd
|
|
|
|
movaps xmm0, [esi]
|
|
|
|
_lDFTableCheckSortEX:
|
|
sub esi, 10h
|
|
movaps xmm1, [esi]
|
|
movaps [esi+10h], xmm1
|
|
|
|
cmp edi, esi
|
|
jne _lDFTableCheckSortEX
|
|
|
|
movaps [edi], xmm0
|
|
|
|
_lDFTableCheckSortEnd:
|
|
mov dword ptr [ebx+18h], 0ffffffffh ;; modify to overload define
|
|
jmp _lDFTableCheckStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check value
|
|
_lDFTableCheckValue:
|
|
mov esi, dword ptr [ebp+04h]
|
|
mov edi, dword ptr [ebx+04h]
|
|
|
|
_lbl:
|
|
lodsb
|
|
cmp al, 03h
|
|
je _next
|
|
scasb
|
|
je _prew
|
|
jmp _lDFTableError
|
|
|
|
_lbl:
|
|
scasb
|
|
je _lDFTableCheckStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; error
|
|
_lDFTableError:
|
|
mov dword ptr [_xErrorTable], offset _sErr_ValueRedefined
|
|
mov edi, dword ptr [ebp]
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
_lbl:
|
|
inc edi
|
|
cmp byte ptr [edi], 02h
|
|
jne _prew
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
|
|
mov dword ptr [_xErrorTable+10h], offset _sErr_ValueRedefinedEX
|
|
mov edi, dword ptr [ebx]
|
|
mov dword ptr [_xErrorTable+14h], edi
|
|
_lbl:
|
|
inc edi
|
|
cmp byte ptr [edi], 02h
|
|
jne _prew
|
|
mov dword ptr [_xErrorTable+18h], edi
|
|
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
|
|
_lDFTableCheckEnd:
|
|
;;----------------
|
|
|
|
mov _dCurrStr, offset _sProg_03
|
|
mov eax, 48h
|
|
call _lSetProg
|
|
|
|
;;----------------
|
|
;; find'n'replacing
|
|
mov _dStackPos, esp ;; save stack
|
|
mov edi, dword ptr [esp]
|
|
mov esi, dword ptr [esp+08h]
|
|
xor eax, eax
|
|
jmp _lXFPStart
|
|
|
|
_lXFPNewWord:
|
|
movsb
|
|
_lXFPStart:
|
|
|
|
;;----------------
|
|
;; string preprocessor in
|
|
cmp dword ptr [esi], 73404021h ;; !@@s
|
|
je _lXFPStrPrIn
|
|
cmp dword ptr [esi], 65404021h ;; !@@e
|
|
je _lXFPStrPrOut
|
|
;;----------------
|
|
|
|
_lXFPStartFX:
|
|
mov al, byte ptr [esi]
|
|
|
|
cmp al, 80h
|
|
jb _lXFPDFF
|
|
|
|
;;----------------
|
|
;; arguments
|
|
inc esi
|
|
sub eax, 80h
|
|
push esi
|
|
lea edx, dword ptr [esp+eax*08h+10h]
|
|
cmp dword ptr [edx], 00ffh
|
|
jg _lFXPCSX
|
|
add edx, 04h
|
|
_lFXPCSX:
|
|
mov esi, dword ptr [edx]
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check word
|
|
_lXFPDFF:
|
|
cmp al, 41h
|
|
jb _lXFPGetNextEx
|
|
|
|
lea edx, [_dDefTable+eax*04h]
|
|
mov edx, dword ptr [edx] ;; edx = def block address
|
|
test edx, edx
|
|
jz _lXFPGetNextEx
|
|
|
|
mov ecx, esi ;; ecx = temt src script position
|
|
mov dword ptr [_dUndefPnt], esi ;; for undef
|
|
_lXFPCheck:
|
|
mov ebx, dword ptr [edx]
|
|
mov al, byte ptr [esi]
|
|
cmp al, byte ptr [ebx]
|
|
jne _lXFPGetNext
|
|
|
|
_lXFPCheckStart:
|
|
inc esi
|
|
inc ebx
|
|
mov al, byte ptr [esi]
|
|
cmp al, byte ptr [ebx]
|
|
je _lXFPCheckStart
|
|
cmp byte ptr [ebx], 02h
|
|
jne _lXFPNext
|
|
|
|
cmp byte ptr [_bAscii_00+eax], ah ;; ah = 00h
|
|
je _lXFPFound
|
|
|
|
mov al, byte ptr [ebx-01h]
|
|
cmp byte ptr [_bAscii_00+eax], ah ;; ah = 00h
|
|
jne _lXFPNext
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; is private
|
|
_lXFPFound:
|
|
mov ebx, dword ptr [edx+08h]
|
|
test ebx, ebx
|
|
jnz _lXFPLibTest
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; arguments?
|
|
_lXFPAct:
|
|
mov dword ptr [_hOLMacro], edx
|
|
mov ecx, dword ptr [edx+04h]
|
|
cmp dword ptr [edx+0ch], 00h
|
|
jne _lXFPActArg
|
|
|
|
;;----------------
|
|
;; overloaded macros
|
|
cmp dword ptr [edx+18h], 0ffffffffh ;; is macros overload
|
|
jne _lXFPNoOverLoad
|
|
cmp byte ptr [esi], 28h ;; (
|
|
jne _lXFPNoOverLoad
|
|
cmp word ptr [esi], 2928h ;; ()
|
|
jne _lXPFArgErrEX
|
|
add esi, 02h
|
|
;;----------------
|
|
|
|
_lXFPNoOverLoad:
|
|
|
|
;;----------------
|
|
;; undefined?
|
|
test ecx, ecx
|
|
jz _lXFPUndefined
|
|
;;----------------
|
|
|
|
push esi
|
|
push 00h
|
|
mov esi, ecx
|
|
xor eax, eax
|
|
jmp _lXFPStart
|
|
|
|
_lXFPActArg:
|
|
mov edx, dword ptr [edx+0ch]
|
|
mov eax, offset _dDefArgs
|
|
cmp byte ptr [esi], 28h ;; (
|
|
mov ebp, edx
|
|
je _lXFPNextArg
|
|
|
|
;;----------------
|
|
;; error
|
|
_lXPFArgErr:
|
|
mov dword ptr [_xErrorTable], offset _sErr_MissDefArg
|
|
mov dword ptr [_xErrorTable+08h], esi
|
|
dec esi
|
|
mov dword ptr [_xErrorTable+04h], esi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; next macro
|
|
_lXPFArgErrEX:
|
|
cmp byte ptr [esi], 28h ;; (
|
|
jne _lXPFArgErr
|
|
add edx, 10h
|
|
mov dword ptr [_hOLMacro], edx
|
|
mov ecx, dword ptr [edx+04h]
|
|
jmp _lXFPActArg
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; parse arguments
|
|
_lXFPNextArgAdd:
|
|
mov byte ptr [esi], 04h
|
|
|
|
_lXFPNextArg:
|
|
dec edx
|
|
js _lXFPArgEnd
|
|
|
|
_lXFPNextArgFX:
|
|
inc esi
|
|
cmp byte ptr [esi], 05h
|
|
je _lXFPNextArgFX
|
|
|
|
;;----------------
|
|
;; arg transfer
|
|
cmp byte ptr [esi], 80h
|
|
jb _lXFPNextArgEEX
|
|
|
|
xor ebx, ebx
|
|
mov bl, byte ptr [esi]
|
|
sub bl, 80h
|
|
lea ebx, dword ptr [esp+ebx*08h+0ch]
|
|
mov ebx, dword ptr [ebx]
|
|
mov dword ptr [eax], ebx
|
|
mov dword ptr [eax+04h], 00h
|
|
add eax, 08h
|
|
inc esi
|
|
|
|
cmp byte ptr [esi], 29h ;; )
|
|
jne _lXFPMArgTrns
|
|
test edx, edx
|
|
jnz _lXPFArgErr
|
|
;; mov byte ptr [esi], 04h
|
|
jmp _lXFPArgEndOX
|
|
|
|
_lXFPMArgTrns:
|
|
cmp byte ptr [esi], 2ch ;; ,
|
|
jne _lXFPMArgErr
|
|
;; jmp _lXFPNextArgAdd
|
|
jmp _lXFPNextArg
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; complex arg
|
|
_lXFPNextArgEEX:
|
|
mov dword ptr [eax], esi
|
|
add eax, 04h
|
|
|
|
xor ebx, ebx
|
|
|
|
cmp byte ptr [esi], 0bh
|
|
je _lXFPHardArg
|
|
cmp byte ptr [esi], 3ch ;; <
|
|
jne _lXFPArgSX ;; simple arg
|
|
inc dword ptr [eax-04h]
|
|
inc ebx
|
|
_lXFPMArg:
|
|
inc esi
|
|
cmp byte ptr [esi], 22h ;; "
|
|
je _lXFPMArgStr
|
|
cmp byte ptr [esi], 80h
|
|
jb _lXFPMArgFX
|
|
|
|
shl ebx, 10h ;; save bx
|
|
mov bx, bp ;; defines arg count
|
|
add bx, 80h
|
|
cmp byte ptr [esi], bl
|
|
|
|
jg _lXFPMArgOX
|
|
|
|
mov bh, byte ptr [esi]
|
|
sub bh, 7fh
|
|
add bh, bl
|
|
mov byte ptr [esi], bh
|
|
|
|
_lXFPMArgOX:
|
|
shr ebx, 10h ;; load bx
|
|
|
|
_lXFPMArgFX:
|
|
cmp byte ptr [esi], 3eh ;; >
|
|
je _lXFPMArgEX
|
|
cmp byte ptr [esi], 3ch ;; <
|
|
jne _lXFPMArg
|
|
inc ebx
|
|
jmp _lXFPMArg
|
|
|
|
_lXFPMArgEX:
|
|
dec ebx
|
|
jnz _lXFPMArg
|
|
mov byte ptr [esi], 04h
|
|
mov dword ptr [eax], 3eh
|
|
|
|
_lXFPMArgETT:
|
|
add eax, 04h
|
|
|
|
inc esi
|
|
cmp byte ptr [esi], 29h ;; )
|
|
jne _lXFPMArgDX
|
|
test edx, edx
|
|
jnz _lXPFArgErr
|
|
jmp _lXFPArgEndOX
|
|
|
|
_lXFPMArgDX:
|
|
cmp byte ptr [esi], 2ch ;; ,
|
|
;; jne _lXFPMArgErr
|
|
;; jmp _lXFPNextArg
|
|
je _lXFPNextArg
|
|
|
|
;;----------------
|
|
;; error
|
|
_lXFPMArgErr:
|
|
mov dword ptr [_xErrorTable], offset _sErr_Base
|
|
mov dword ptr [_xErrorTable+04h], esi
|
|
dec esi
|
|
mov dword ptr [_xErrorTable+08h], esi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
_lXFPMArgStrEX:
|
|
inc esi
|
|
_lXFPMArgStr:
|
|
inc esi
|
|
cmp byte ptr [esi], 5ch ;; \
|
|
je _lXFPMArgStrEX
|
|
cmp byte ptr [esi], 22h ;; "
|
|
jne _lXFPMArgStr
|
|
jmp _lXFPMArg
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; hard arg
|
|
_lXFPHardArg:
|
|
inc dword ptr [eax-04h]
|
|
inc ebx
|
|
_lXFPHardArgEX:
|
|
inc esi
|
|
cmp byte ptr [esi], 0bh
|
|
jne _lXFPHardArgEX
|
|
|
|
mov byte ptr [esi], 04h
|
|
mov dword ptr [eax], 0bh
|
|
jmp _lXFPMArgETT
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; simple arg
|
|
_lXFPArgDX:
|
|
inc ebx
|
|
|
|
_lXFPArgEX:
|
|
inc esi
|
|
|
|
_lXFPArgSX:
|
|
cmp byte ptr [esi], 22h ;; "
|
|
je _lXFPArgGX
|
|
cmp byte ptr [esi], 28h ;; (
|
|
je _lXFPArgDX
|
|
cmp byte ptr [esi], 29h ;; )
|
|
je _lXFPArgXX
|
|
cmp byte ptr [esi], 2ch ;; ,
|
|
jne _lXFPArgEX
|
|
test ebx, ebx
|
|
jnz _lXFPArgEX
|
|
mov dword ptr [eax], 2ch
|
|
add eax, 04h
|
|
jmp _lXFPNextArgAdd
|
|
|
|
_lXFPArgXX:
|
|
dec ebx
|
|
jns _lXFPArgEX
|
|
test edx, edx
|
|
jnz _lXPFArgErr
|
|
mov dword ptr [eax], 29h
|
|
add eax, 04h
|
|
jmp _lXFPNextArgAdd
|
|
|
|
_lXFPArgGS:
|
|
inc esi
|
|
_lXFPArgGX:
|
|
inc esi
|
|
cmp byte ptr [esi], 5ch ;; \
|
|
je _lXFPArgGS
|
|
cmp byte ptr [esi], 22h ;; "
|
|
jne _lXFPArgGX
|
|
jmp _lXFPArgEX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lXFPArgEnd:
|
|
cmp dword ptr [eax-04h], 3eh ;; >
|
|
jne _lXFPArgEndSX
|
|
cmp byte ptr [esi-01h], 29h ;; )
|
|
jne _lXFPOverload
|
|
_lXFPArgEndSX:
|
|
cmp dword ptr [eax-04h], 29h ;; )
|
|
jne _lXFPOverload
|
|
_lXFPArgEndOX:
|
|
|
|
;;----------------
|
|
;; undefined?
|
|
test ecx, ecx
|
|
jz _lXFPUndefined
|
|
;;----------------
|
|
|
|
inc esi
|
|
_lXFPArgEndEX:
|
|
push dword ptr [eax-08h]
|
|
push dword ptr [eax-04h]
|
|
sub eax, 08h
|
|
cmp eax, offset _dDefArgs
|
|
jne _lXFPArgEndEX
|
|
|
|
push esi
|
|
push ebp
|
|
mov esi, ecx
|
|
xor eax, eax
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; next overloaded macros
|
|
_lXFPOverload:
|
|
mov ebx, dword ptr [_hOLMacro]
|
|
add ebx, 10h
|
|
cmp dword ptr [ebx+08h], 0ffffffffh
|
|
je _lXFPOverloadEX
|
|
|
|
;;----------------
|
|
;; error
|
|
mov dword ptr [_xErrorTable], offset _sErr_DefArg
|
|
mov dword ptr [_xErrorTable+04h], esi
|
|
dec esi
|
|
mov dword ptr [_xErrorTable+08h], esi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
_lXFPOverloadEX:
|
|
mov ecx, dword ptr [ebx+04h]
|
|
mov dword ptr [_hOLMacro], ebx
|
|
|
|
mov edx, dword ptr [ebx+0ch]
|
|
mov ebp, edx
|
|
sub edx, dword ptr [ebx-04h]
|
|
|
|
jmp _lXFPNextArg
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check own lib
|
|
_lXFPLibTest:
|
|
cmp ecx, dword ptr [_dScopeIn+ebx*04h]
|
|
jb _lXFPNext
|
|
cmp ecx, dword ptr [_dScopeOut+ebx*04h]
|
|
jb _lXFPAct
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check next define
|
|
_lXFPNext:
|
|
mov esi, ecx
|
|
_lXFPNextEX:
|
|
add edx, 10h
|
|
cmp dword ptr [edx], 00h
|
|
je _lXFPGetNext
|
|
;;----------------
|
|
;; overloaded?
|
|
cmp dword ptr [edx+08h], 0ffffffffh
|
|
je _lXFPNextEX
|
|
;;----------------
|
|
jmp _lXFPCheck
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; undefined
|
|
_lXFPUndefined:
|
|
mov esi, dword ptr [_dUndefPnt]
|
|
|
|
;;----------------
|
|
;; remove arg
|
|
_lXFPUndefinedRE:
|
|
cmp eax, offset _dDefArgs ;; ???
|
|
jbe _lXFPUndefinedEnd
|
|
|
|
mov dl, byte ptr [eax-04h]
|
|
test dl, dl
|
|
jz _lXFPUndefinedREEX
|
|
mov ebx, dword ptr [eax-08h]
|
|
dec ebx
|
|
|
|
_lXFPUndefinedRemArg:
|
|
inc ebx
|
|
_lXFPUndefinedRemArgEX:
|
|
cmp word ptr [ebx], 7801h ;; #x
|
|
je _lXFPUndefinedRemArgSX
|
|
cmp word ptr [ebx], 7901h ;; #y
|
|
je _lXFPUndefinedRemArgSX
|
|
cmp byte ptr [ebx], 04h
|
|
jne _lXFPUndefinedRemArg
|
|
|
|
mov byte ptr [ebx], dl
|
|
|
|
_lXFPUndefinedREEX:
|
|
sub eax, 08h
|
|
jmp _lXFPUndefinedRE
|
|
|
|
_lXFPUndefinedRemArgSX:
|
|
add ebx, 06h
|
|
jmp _lXFPUndefinedRemArgEX
|
|
;;----------------
|
|
|
|
_lXFPUndefinedEnd:
|
|
xor eax, eax
|
|
jmp _lXFPGetNext
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; remove bs
|
|
_lXFPBSRem:
|
|
xor eax, eax
|
|
mov al, byte ptr [edi-01h] ;; bs
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
jne _lXFPNewWord
|
|
cmp byte ptr [esi+01h], 2bh ;; +
|
|
je _lXFPNewWord
|
|
cmp byte ptr [esi+01h], 2dh ;; -
|
|
je _lXFPNewWord
|
|
|
|
inc esi
|
|
jmp _lXFPStartFX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; get next word and parse text
|
|
_lXFPGetNext:
|
|
movsb
|
|
mov al, byte ptr [esi]
|
|
_lXFPGetNextEx:
|
|
cmp al, 05h ;; ex backspace
|
|
jne _next
|
|
inc esi
|
|
jmp _lXFPStart
|
|
_lbl:
|
|
cmp al, 20h
|
|
jb _lXFPXX
|
|
je _lXFPBSRem
|
|
cmp al, 22h ;; "
|
|
je _lXFPString
|
|
cmp word ptr [esi], 2323h ;; ##
|
|
je _lXFPConf
|
|
cmp al, 30h
|
|
jb _lXFPNewWord
|
|
cmp al, 3ah
|
|
jb _lXFPGetNext
|
|
cmp al, 41h
|
|
jb _lXFPNewWord
|
|
cmp al, 5bh
|
|
jb _lXFPGetNext
|
|
cmp al, 5fh
|
|
jb _lXFPNewWord
|
|
cmp al, 60h ;; `
|
|
je _lXPFRepStr
|
|
cmp al, 7ah
|
|
jg _lXFPNewWord
|
|
jmp _lXFPGetNext
|
|
|
|
_lXFPConf:
|
|
add esi, 02h
|
|
jmp _lXFPStart
|
|
|
|
;;----------------
|
|
;; string
|
|
_lXFPStringEX:
|
|
movsb
|
|
_lXFPString:
|
|
movsb
|
|
cmp byte ptr [esi], 5ch ;; \
|
|
je _lXFPStringEX
|
|
cmp byte ptr [esi], 22h ;; "
|
|
jne _lXFPString
|
|
jmp _lXFPNewWord
|
|
|
|
_lXPFRepStr:
|
|
mov byte ptr [edi], 22h ;; "
|
|
inc esi
|
|
inc edi
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; system
|
|
_lXFPXX:
|
|
cmp al, 08h
|
|
je _lXFPSetdef
|
|
cmp al, 04h
|
|
je _lXFPArgOut
|
|
cmp al, 03h
|
|
je _lXFPDefOut
|
|
cmp al, 0bh
|
|
je _lXFPTMArg
|
|
|
|
cmp word ptr [esi], 3801h ;; #8
|
|
jne _lXFPXX_Next
|
|
movsw
|
|
jmp _lXFPStart
|
|
|
|
_lXFPXX_Next:
|
|
cmp word ptr [esi], 6401h ;; #d
|
|
je _lXFP_00
|
|
cmp word ptr [esi], 6701h ;; #g
|
|
je _lXFP_0a
|
|
cmp word ptr [esi], 6301h ;; #c
|
|
je _lXFP_01
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
je _lXFP_02
|
|
cmp word ptr [esi], 7901h ;; #y
|
|
je _lXFP_02
|
|
cmp word ptr [esi], 7301h ;; #s
|
|
je _lXFP_03
|
|
cmp word ptr [esi], 6901h ;; #i
|
|
je _lXFP_04
|
|
cmp word ptr [esi], 6101h ;; #a
|
|
je _lXFP_05
|
|
cmp word ptr [esi], 6501h ;; #e
|
|
je _lXFP_06
|
|
cmp word ptr [esi], 7501h ;; #u
|
|
je _lXFP_07
|
|
cmp word ptr [esi], 3601h ;; #6
|
|
je _lXFP_08
|
|
cmp word ptr [esi], 3701h ;; #7
|
|
je _lXFP_09
|
|
cmp al, 00h
|
|
je _lXFPEnd
|
|
jmp _lXFPNewWord
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lXFPTMArg:
|
|
mov byte ptr [edi], 22h ;; "
|
|
inc esi
|
|
inc edi
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; set esi
|
|
_lXFP_03:
|
|
mov esi, dword ptr [esi+02h]
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; arg out
|
|
_lXFPArgOut:
|
|
pop esi
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; error
|
|
_lXFP_0a:
|
|
mov dword ptr [_xErrorTable], offset _sErr_Ude
|
|
mov dword ptr [_xErrorTable+04h], esi
|
|
_lXFP_0a_EX:
|
|
inc esi
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lXFP_0a_EX
|
|
mov dword ptr [_xErrorTable+08h], esi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; setdef
|
|
_lXFPSetdef:
|
|
mov al, byte ptr [esi+07h]
|
|
lea edx, [_dDefTable+eax*04h]
|
|
mov edx, dword ptr [edx] ;; edx = def block address
|
|
test edx, edx
|
|
jnz _lXFPSetdefCheck
|
|
|
|
;; error
|
|
_lXFPSetdefCheckNext:
|
|
add edx, 10h
|
|
_lXFPSetdefCheck:
|
|
lea ecx, [esi+07h]
|
|
mov ebx, dword ptr [edx]
|
|
mov al, byte ptr [ecx]
|
|
cmp al, byte ptr [ebx]
|
|
;; jne
|
|
_lXFPSetdefCheckEX:
|
|
inc ecx
|
|
inc ebx
|
|
mov al, byte ptr [ecx]
|
|
cmp al, 02h ;; def label end
|
|
je _lXFPSetdefCheckEnd
|
|
cmp al, byte ptr [ebx]
|
|
je _lXFPSetdefCheckEX
|
|
jmp _lXFPSetdefCheckNext
|
|
|
|
_lXFPSetdefCheckEnd:
|
|
cmp al, byte ptr [ebx]
|
|
jne _lXFPSetdefCheckNext
|
|
|
|
;;----------------
|
|
;; check lib
|
|
mov ecx, dword ptr [edx+08h]
|
|
|
|
test ecx, ecx
|
|
jz _lXFPSetdefGlob
|
|
|
|
cmp esi, dword ptr [_dScopeIn+ecx*04h]
|
|
jb _lXFPSetdefCheckNext
|
|
cmp esi, dword ptr [_dScopeOut+ecx*04h]
|
|
jg _lXFPSetdefCheckNext
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check arg count
|
|
_lXFPSetdefGlob:
|
|
mov al, byte ptr [esi+01h]
|
|
cmp eax, dword ptr [edx+0ch]
|
|
jne _lXFPSetdefCheckNext
|
|
;;----------------
|
|
|
|
mov ecx, dword ptr [esi+02h]
|
|
mov dword ptr [edx+04h], ecx ;; huh...
|
|
|
|
add esi, 08h
|
|
_lXFPSetdefEnd:
|
|
inc esi
|
|
cmp byte ptr [esi], 03h
|
|
jne _lXFPSetdefEnd
|
|
add esi, 02h
|
|
;; cmp byte ptr [esi-01h], 79h ;; y
|
|
;; jne _lXFPStart
|
|
;; add esi, 0eh
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; undef
|
|
_lXFP_07:
|
|
mov al, byte ptr [esi+06h]
|
|
lea edx, [_dDefTable+eax*04h]
|
|
mov edx, dword ptr [edx] ;; edx = def block address
|
|
test edx, edx
|
|
jnz _lXFPUndefCheck
|
|
|
|
;; error
|
|
_lXFPUndefCheckNext:
|
|
add edx, 10h
|
|
_lXFPUndefCheck:
|
|
lea ecx, [esi+06h]
|
|
mov ebx, dword ptr [edx]
|
|
mov al, byte ptr [ecx]
|
|
cmp al, byte ptr [ebx]
|
|
;; jne
|
|
_lXFPUndefCheckEX:
|
|
inc ecx
|
|
inc ebx
|
|
mov al, byte ptr [ecx]
|
|
cmp al, 02h ;; def label end
|
|
je _lXFPUndefCheckEnd
|
|
cmp al, byte ptr [ebx]
|
|
je _lXFPUndefCheckEX
|
|
jmp _lXFPUndefCheckNext
|
|
|
|
_lXFPUndefCheckEnd:
|
|
cmp al, byte ptr [ebx]
|
|
jne _lXFPUndefCheckNext
|
|
|
|
;;----------------
|
|
;; check lib
|
|
mov ebx, dword ptr [edx+08h]
|
|
|
|
test ebx, ebx
|
|
jz _lXFPUndefRem
|
|
|
|
cmp esi, dword ptr [_dScopeIn+ebx*04h]
|
|
jb _lXFPUndefCheckNext
|
|
cmp esi, dword ptr [_dScopeOut+ebx*04h]
|
|
jg _lXFPUndefCheckNext
|
|
|
|
jmp _lXFPUndefRem
|
|
;;----------------
|
|
|
|
_lXFPUndefRemEX:
|
|
add edx, 10h
|
|
_lXFPUndefRem:
|
|
mov dword ptr [edx+04h], 00000000h ;; huh...
|
|
cmp dword ptr [edx+18h], 0ffffffffh ;; is overloaded?
|
|
je _lXFPUndefRemEX
|
|
|
|
lea esi, [ecx+01h]
|
|
|
|
cmp byte ptr [esi], 0ah
|
|
jne _lXFPStartFX
|
|
inc esi
|
|
jmp _lXFPStartFX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; counter
|
|
_lXFP_08:
|
|
add esi, 02h
|
|
mov eax, dword ptr [_dCounterV]
|
|
|
|
inc edi
|
|
cmp eax, 0ah
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
cmp eax, 64h
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
cmp eax, 03e8h
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
cmp eax, 2710h
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
cmp eax, 000186a0h
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
cmp eax, 000f4240h
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
cmp eax, 00989680h
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
cmp eax, 05f5e100h
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
cmp eax, 3b9aca00h
|
|
jb _lXFP_08_FX
|
|
|
|
inc edi
|
|
|
|
mov ecx, 0ah
|
|
|
|
_lXFP_08_FX:
|
|
mov ebp, edi
|
|
_lXFP_08_EX:
|
|
xor edx, edx
|
|
dec ebp
|
|
div ecx
|
|
add dl, 30h
|
|
mov byte ptr [ebp], dl
|
|
test eax, eax
|
|
jnz _lXFP_08_EX
|
|
|
|
inc dword ptr [_dCounterV]
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; weather
|
|
_lXFP_09:
|
|
add esi, 02h
|
|
rdtsc
|
|
and eax, 01h
|
|
or eax, 30h
|
|
stosb
|
|
xor eax, eax
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; def out
|
|
_lXFPDefOut:
|
|
pop eax
|
|
pop esi
|
|
_lXFPDefOutEX:
|
|
test eax, eax
|
|
jz _lXFPStart
|
|
mov ecx, dword ptr [esp]
|
|
test ecx, ecx
|
|
jz _lXFPDefOutSBX
|
|
mov ebp, dword ptr [esp+04h]
|
|
dec ebp
|
|
_lXFPDefOutDX:
|
|
inc ebp
|
|
_lXFPDefOutAX:
|
|
cmp word ptr [ebp], 7801h ;; #x
|
|
je _lXFPDefOutBX
|
|
cmp word ptr [ebp], 7901h ;; #y
|
|
je _lXFPDefOutBX
|
|
cmp byte ptr [ebp], 04h
|
|
jne _lXFPDefOutDX
|
|
|
|
mov byte ptr [ebp], cl
|
|
_lXFPDefOutSBX:
|
|
add esp, 08h
|
|
dec eax
|
|
jmp _lXFPDefOutEX
|
|
|
|
_lXFPDefOutBX:
|
|
add ebp, 06h
|
|
jmp _lXFPDefOutAX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #i
|
|
|
|
;;----------------
|
|
;; #if
|
|
_lXFP_04:
|
|
cmp word ptr [esi+02h], 2066h ;; f_ ;; #if_
|
|
jne _lXFP_04_FX
|
|
|
|
mov dword ptr [_xEnumTable], edi
|
|
add esi, 04h
|
|
mov edi, offset _xEnumTable+04h
|
|
jmp _lXFPStartFX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #elseif
|
|
_lXFP_04_FX:
|
|
cmp dword ptr [esi+02h], 6965736ch ;; lsei
|
|
jne _lXFP_04_DX
|
|
cmp word ptr [esi+06h], 2066h ;; f_ ;; #if_
|
|
jne _lXFP_04_DX
|
|
|
|
mov dword ptr [_xEnumTable], edi
|
|
add esi, 08h
|
|
mov edi, offset _xEnumTable+04h
|
|
jmp _lXFPStartFX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #else
|
|
_lXFP_04_DX:
|
|
cmp dword ptr [esi+02h], 0165736ch ;; lse#
|
|
jne _lXFP_04_RX
|
|
|
|
mov ecx, dword ptr [esi+09h]
|
|
mov word ptr [ecx], 0606h
|
|
mov dword ptr [ecx+02h], 06060606h
|
|
add esi, 0dh
|
|
jmp _lXFPStartFX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #endif
|
|
_lXFP_04_RX:
|
|
cmp dword ptr [esi+02h], 6669646eh ;; ndif
|
|
jne _lCRErrPrePorc ;; omg!
|
|
add esi, 06h
|
|
jmp _lXFPStartFX
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #e
|
|
_lXFP_06:
|
|
mov word ptr [esi], 6901h ;; #i
|
|
_lXFP_06_EX:
|
|
inc esi
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
jne _lXFP_06_EX
|
|
|
|
mov esi, dword ptr [esi+02h]
|
|
add esi, 10h
|
|
jmp _lXFPStartFX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #d
|
|
_lXFP_00:
|
|
inc esi
|
|
|
|
_lXFP_00_Re:
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
je _lXFP_00_FX
|
|
cmp word ptr [esi], 7901h ;; #y
|
|
je _lXFP_00_FX
|
|
|
|
cmp word ptr [esi], 6401h ;; #d
|
|
jne _lXFP_00
|
|
add esi, 02h
|
|
jmp _lXFPStart
|
|
|
|
_lXFP_00_FX:
|
|
add esi, 06h
|
|
jmp _lXFP_00_Re
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #a
|
|
_lXFP_05:
|
|
xor ebx, ebx
|
|
mov dword ptr [edi], ebx
|
|
mov edi, dword ptr [_xEnumTable]
|
|
mov edx, offset _xEnumTable+04h
|
|
mov ecx, edx
|
|
|
|
;;----------------
|
|
;; true ?
|
|
cmp word ptr [ecx], 0031h ;; 1
|
|
je _lXFP_05_SX
|
|
|
|
cmp dword ptr [ecx], 65757274h ;; true
|
|
jne _lXFP_05_lStr
|
|
cmp byte ptr [ecx+04h], 00h
|
|
jne _lXFP_05_lStr
|
|
|
|
jmp _lXFP_05_SX
|
|
;;----------------
|
|
|
|
_lXFP_05_AX:
|
|
inc ecx
|
|
_lXFP_05_lStr:
|
|
cmp byte ptr [ecx], 00h
|
|
je _lXFP_05_Fail
|
|
|
|
cmp word ptr [ecx], 3d3dh ;; ==
|
|
je _lXFP_05_BX ;; ebx = 00h
|
|
cmp word ptr [ecx], 3d21h ;; !=
|
|
jne _lXFP_05_AX
|
|
mov ebx, eax ;; non zero
|
|
|
|
_lXFP_05_BX:
|
|
add ecx, 02h
|
|
_lXFP_05_OX:
|
|
mov al, byte ptr [edx]
|
|
cmp al, byte ptr [ecx]
|
|
jne _lXFP_05_NE
|
|
inc edx
|
|
inc ecx
|
|
jmp _lXFP_05_OX
|
|
|
|
_lXFP_05_NE:
|
|
cmp word ptr [edx], 3d3dh ;; ==
|
|
je _lXFP_05_NE_EX
|
|
cmp word ptr [edx], 3d21h ;; !=
|
|
jne _lXFP_05_NE_FX
|
|
|
|
_lXFP_05_NE_EX:
|
|
cmp byte ptr [ecx], 00h
|
|
je _lXFP_05_XX
|
|
|
|
;;----------------
|
|
;; fail
|
|
_lXFP_05_NE_FX:
|
|
test ebx, ebx
|
|
jnz _lXFP_05_SX
|
|
|
|
_lXFP_05_Fail:
|
|
mov esi, dword ptr [esi+04h]
|
|
add esi, 10h
|
|
jmp _lXFPStartFX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lXFP_05_XX:
|
|
test ebx, ebx
|
|
jnz _lXFP_05_Fail
|
|
|
|
_lXFP_05_SX:
|
|
mov ecx, dword ptr [esi+04h]
|
|
mov word ptr [ecx], 0606h
|
|
mov dword ptr [ecx+02h], 06060606h
|
|
add esi, 08h
|
|
|
|
_lXFP_05_FX:
|
|
add ecx, 10h
|
|
cmp dword ptr [ecx], 646e6901h ;; #ind ;; #end
|
|
je _lXFPStartFX
|
|
|
|
mov word ptr [ecx], 6501h ;; #e
|
|
_lXFP_05_Remove:
|
|
inc ecx
|
|
cmp word ptr [ecx], 7801h ;; #x
|
|
jne _lXFP_05_Remove
|
|
mov ecx, dword ptr [ecx+02h]
|
|
jmp _lXFP_05_FX
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #c
|
|
_lXFP_01_Ex:
|
|
add esi, 05h
|
|
_lXFP_01:
|
|
inc esi
|
|
cmp byte ptr [esi], 07h ;; enum out
|
|
jne _lXFP_01_Sx
|
|
inc esi
|
|
jmp _lXFPStart
|
|
_lXFP_01_Sx:
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
je _lXFP_01_Ex
|
|
cmp word ptr [esi], 7901h ;; #y
|
|
je _lXFP_01_Ex
|
|
cmp word ptr [esi], 0302h ;; null define
|
|
je _lXFP_01_Dx
|
|
cmp byte ptr [esi], 03h
|
|
jne _lXFP_01
|
|
add esi, 02h
|
|
cmp byte ptr [esi-01h], 79h ;; y
|
|
jne _lXFPStart
|
|
add esi, 0eh
|
|
jmp _lXFPStart
|
|
|
|
_lXFP_01_Dx: ;; ???
|
|
add esi, 02h
|
|
cmp byte ptr [esi], 0ah
|
|
jne _lXFPStart
|
|
inc esi
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; blocks
|
|
_lXFP_02:
|
|
movsw
|
|
mov edx, dword ptr [esi]
|
|
sub edi, 02h
|
|
mov dword ptr [edx+02h], edi
|
|
add edi, 06h
|
|
add esi, 04h
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; string preprocessor
|
|
|
|
;;----------------
|
|
;; in
|
|
_lXFPStrPrIn:
|
|
add esi, 04h
|
|
mov dword ptr [_dMapProcCode], edi
|
|
mov edi, offset _bFuncCodeBase
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; out
|
|
_lXFPStrPrOut:
|
|
movsd ;; copy !@@e
|
|
|
|
mov dword ptr [_dWWWFont], esi
|
|
mov esi, offset _bFuncCodeBase ;; esi = old buffer
|
|
mov edi, offset _bFuncCodeLocals ;; edi = new buffer
|
|
|
|
mov ebx, esi
|
|
_lXFPStrPrOutAX:
|
|
inc ebx
|
|
cmp dword ptr [ebx], 61404021h ;; !@@a
|
|
jne _lXFPStrPrOutAX ;; ebx = arg types
|
|
|
|
lea ecx, [ebx+03h]
|
|
_lXFPStrPrOutBX:
|
|
inc ecx
|
|
;; cmp dword ptr [ecx], 65404021h ;; !@@e
|
|
;; error - no args
|
|
cmp byte ptr [ecx-01h], 40h ;; @
|
|
jne _lXFPStrPrOutBX ;; ecx = first arg
|
|
|
|
jmp _lXFPStrPrOutDX
|
|
|
|
_lXFPStrPrOutEX:
|
|
stosb
|
|
_lXFPStrPrOutCX:
|
|
cmp esi, ebx
|
|
jne _lXFPStrPrOutDX
|
|
|
|
;;----------------
|
|
;; huh...
|
|
mov word ptr [edi], 7301h ;; #s
|
|
mov ebx, dword ptr [_dWWWFont]
|
|
mov dword ptr [edi+02h], ebx
|
|
mov esi, offset _bFuncCodeLocals
|
|
mov edi, dword ptr [_dMapProcCode]
|
|
jmp _lXFPStart
|
|
;;----------------
|
|
|
|
_lXFPStrPrOutSX:
|
|
cmp byte ptr [esi], 5eh ;; ^
|
|
je _lXFPStrPrOutTX
|
|
cmp byte ptr [esi], 25h ;; %
|
|
je _lXFPStrPrOutTX
|
|
stosb
|
|
_lXFPStrPrOutTX:
|
|
movsb
|
|
_lXFPStrPrOutDX:
|
|
lodsb
|
|
cmp al, 5ch ;; \
|
|
je _lXFPStrPrOutSX
|
|
cmp al, 25h ;; %
|
|
je lXFPStrPr_GX
|
|
cmp al, 5eh ;; ^
|
|
jne _lXFPStrPrOutEX
|
|
|
|
;;----------------
|
|
;; find type
|
|
lXFPStrPr_GX:
|
|
lea ebp, [ebx+06h] ;; ebp = first arg type
|
|
|
|
_lXFPStrPrOutJX:
|
|
mov edx, esi ;; edx = position in string
|
|
|
|
_lXFPStrPrOutFX:
|
|
mov al, byte ptr [ebp]
|
|
|
|
cmp al, 5eh ;; ^
|
|
je _lXFPStrPrOutGX
|
|
|
|
cmp al, byte ptr [edx]
|
|
jne _lXFPStrPrOutHX
|
|
inc ebp
|
|
inc edx
|
|
jmp _lXFPStrPrOutFX
|
|
|
|
_lXFPStrPrOutHX:
|
|
inc ebp
|
|
cmp byte ptr [ebp-01h], 5eh ;; ^
|
|
jne _lXFPStrPrOutHX
|
|
jmp _lXFPStrPrOutJX
|
|
|
|
_lXFPStrPrOutGX:
|
|
mov esi, edx
|
|
|
|
;;----------------
|
|
;; replace
|
|
add ebp, 02h ;; remove ^=
|
|
|
|
_lXFPStrPrOutLX:
|
|
mov al, byte ptr [ebp]
|
|
cmp al, 3ch ;; <
|
|
je _lXFPStrPrOutIX
|
|
cmp al, 3eh ;; >
|
|
je _lXFPStrPrOutKX
|
|
cmp al, 24h ;; $
|
|
je _lXFPStrPrOutMX
|
|
cmp al, 5eh ;; ^
|
|
je _lXFPStrPrOutCX
|
|
cmp al, 22h ;; "
|
|
je _lXFPStrPrOutCX
|
|
mov byte ptr [edi], al
|
|
inc edi
|
|
inc ebp
|
|
jmp _lXFPStrPrOutLX
|
|
|
|
_lXFPStrPrOutMX:
|
|
inc ebp
|
|
_lXFPStrPrOutNX:
|
|
cmp dword ptr [ecx], 65404021h ;; !@@e
|
|
je _lXFPStrPrOutLX
|
|
mov al, byte ptr [ecx]
|
|
cmp al, 40h ;; @
|
|
je _lXFPStrPrOutOX
|
|
mov byte ptr [edi], al
|
|
inc edi
|
|
inc ecx
|
|
jmp _lXFPStrPrOutNX
|
|
_lXFPStrPrOutOX:
|
|
inc ecx
|
|
jmp _lXFPStrPrOutLX
|
|
|
|
_lXFPStrPrOutIX:
|
|
inc ebp
|
|
;; cmp byte ptr [edx-01h], 22h ;; "
|
|
;; je _lXFPStrPrOutUX ;; ???
|
|
mov word ptr [edi], 2b22h ;; "+
|
|
add edi, 02h
|
|
jmp _lXFPStrPrOutLX
|
|
|
|
;; _lXFPStrPrOutUX:
|
|
;; inc edx
|
|
;; jmp _lXFPStrPrOutLX
|
|
|
|
_lXFPStrPrOutKX:
|
|
inc ebp
|
|
;; cmp byte ptr [esi], 22h ;; " ;; [edx+01h] ???
|
|
;; je _lXFPStrPrOutPX
|
|
mov word ptr [edi], 222bh ;; +"
|
|
add edi, 02h
|
|
jmp _lXFPStrPrOutLX
|
|
|
|
_lXFPStrPrOutPX:
|
|
inc esi
|
|
jmp _lXFPStrPrOutLX
|
|
;;----------------
|
|
;;----------------
|
|
|
|
|
|
|
|
;;----------------
|
|
;;----------------
|
|
|
|
_lXFPEnd:
|
|
mov esp, _dStackPos ;; load stack
|
|
add esi, 04h
|
|
add edi, 04h
|
|
;;----------------
|
|
|
|
mov _dCurrStr, offset _sProg_04
|
|
mov eax, 52h
|
|
call _lSetProg
|
|
|
|
;;----------------
|
|
;; capture world...
|
|
mov dword ptr [_dErrorCodeStart], edi ;; for syntax error
|
|
mov _dStackPos, esp
|
|
|
|
xor ebx, ebx ;; f l a g s
|
|
;; 0 0 0 0 b
|
|
;; | | | |
|
|
;; | | | is in function (0 - out)
|
|
;; | | | dont add set/call/local etc
|
|
;; | | |
|
|
;; | | is int struct (0 - out)
|
|
;; | | dont add globals/endglobals
|
|
;; | |
|
|
;; | is in interface (0 - out)
|
|
;; | not entry to functions/methods
|
|
;; |
|
|
;; is in globals (0 - out)
|
|
;; not add nothing
|
|
|
|
|
|
push ebx ;; 00h on stack top
|
|
jmp _lFNPLine
|
|
|
|
_lFNPLineEx:
|
|
movsw
|
|
|
|
_lFNPLine:
|
|
mov eax, dword ptr [esi]
|
|
|
|
cmp al, 00h
|
|
je _lFNPEnd
|
|
|
|
cmp ax, 0a0dh
|
|
jne _lFNPParseStart
|
|
add esi, 02h
|
|
jmp _lFNPLine
|
|
|
|
;;----------------
|
|
;; global instruction parsing
|
|
_lFNPParseStart:
|
|
|
|
;;----------------
|
|
;; nocjass
|
|
cmp ax, 3901h ;; #9
|
|
jne _next
|
|
|
|
lea edx, [esi+02h]
|
|
mov eax, dword ptr [_dSynDesc]
|
|
mov esi, dword ptr [eax]
|
|
mov ecx, dword ptr [eax+04h]
|
|
add eax, 08h
|
|
mov dword ptr [_dSynDesc], eax
|
|
mov dword ptr [edi], 20212f2fh ;; //!_
|
|
add edi, 04h
|
|
sub ecx, esi
|
|
rep movsb
|
|
mov esi, edx
|
|
jmp _lFNPLine
|
|
;;----------------
|
|
|
|
_lbl:
|
|
test ebx, 01b
|
|
jp _next
|
|
mov edi, offset _bFuncCodeOneLine
|
|
|
|
;;----------------
|
|
;; comment
|
|
_lbl:
|
|
cmp ax, 2f2fh ;; //
|
|
jne _next
|
|
|
|
cmp byte ptr [esi+02h], 21h ;; !
|
|
je _lFNPExCode
|
|
|
|
_lFNPCommExs:
|
|
inc esi
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lFNPCommExs
|
|
add esi, 02h
|
|
mov eax, dword ptr [esi]
|
|
jmp _lFNPParseStart
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp al, 0ch
|
|
je _lFNPVarX
|
|
|
|
_lbl:
|
|
test ebx, 01b
|
|
jp _lFNPOutside ;; globals ? ;; out the function
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; in function
|
|
cmp eax, 6c6c6163h ;; call
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 20h ;; _
|
|
je _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp eax, 20746573h ;; set_
|
|
je _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp eax, 61636f6ch ;; loca
|
|
jne _next
|
|
cmp word ptr [esi+04h], 206ch ;; l_
|
|
jne _next
|
|
jmp _lFNVarParse
|
|
|
|
_lbl:
|
|
cmp eax, 74617473h ;; stat
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 69206369h ;; ic_i
|
|
jne _next
|
|
cmp word ptr [esi+08h], 2066h ;; f_
|
|
je _lFNPCopyParse
|
|
|
|
;;----------------
|
|
;; if
|
|
_lbl:
|
|
cmp ax, 6669h ;; if
|
|
jne _next
|
|
cmp byte ptr [esi+02h], 2eh ;; _ ;; !!!!
|
|
jg _next
|
|
|
|
movsw
|
|
mov dword ptr [edi], 20202020h ;; bs
|
|
mov dword ptr [edi+04h], 20202020h ;; bs
|
|
mov dword ptr [edi+08h], 20202020h ;; bs
|
|
add edi, 0ch
|
|
mov byte ptr [_bCodeSys], al
|
|
mov byte ptr [_bCodePosOp], 00h
|
|
|
|
jmp _FNPIf
|
|
|
|
_lbl:
|
|
cmp eax, 65736c65h ;; else
|
|
jne _next
|
|
cmp word ptr [esi+04h], 0a0dh ;; new line
|
|
je _lFNPCopyParse
|
|
cmp word ptr [esi+04h], 7801h ;; #x
|
|
jne _lFNPIfEX
|
|
|
|
mov ecx, dword ptr [esi+06h]
|
|
mov dword ptr [esi+04h], 06060606h
|
|
cmp word ptr [esi+0ah], 0a0dh ;; new line
|
|
je _lFNPIfElseFX
|
|
mov word ptr [esi+08h], 0a0dh ;; new line
|
|
jmp _lFNPIfBlockEx
|
|
_lFNPIfElseFX:
|
|
mov word ptr [esi+08h], 0606h ;; new line
|
|
jmp _lFNPIfBlockEx
|
|
|
|
_lFNPIfEX:
|
|
cmp word ptr [esi+04h], 6669h ;; if
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 2ch ;; _ ;; !!!!
|
|
jg _next
|
|
|
|
_FNPIf:
|
|
mov eax, esi
|
|
_FNPIfx:
|
|
inc eax
|
|
cmp dword ptr [eax], 6e656874h ;; then
|
|
je _FNPIfs
|
|
cmp word ptr [eax], 7801h ;; #x
|
|
je _lFNPIfBlock
|
|
cmp word ptr [eax], 0a0dh
|
|
jne _FNPIfx
|
|
mov word ptr [eax], 3001h ;; #0
|
|
jmp _lFNPCopyParse
|
|
_FNPIfs:
|
|
cmp byte ptr [eax+04h], 20h
|
|
je _lFNPCopyParse
|
|
cmp word ptr [eax+04h], 0a0dh
|
|
je _lFNPCopyParse
|
|
jmp _FNPIfx
|
|
|
|
_lFNPIfBlock:
|
|
mov ecx, dword ptr [eax+02h]
|
|
|
|
mov dword ptr [eax], 06060606h
|
|
mov word ptr [eax+04h], 3001h ;; #0
|
|
|
|
cmp dword ptr [ecx+10h], 65736c65h ;; else
|
|
jne _lFNPIfBlockEx
|
|
cmp word ptr [ecx+14h], 6669h ;; if
|
|
jne _lFNPIfBlockSx
|
|
cmp byte ptr [ecx+16h], 2dh ;; _ ;; !!!
|
|
jbe _lFNPIfBlockNull
|
|
_lFNPIfBlockSx:
|
|
cmp byte ptr [ecx+14h], 2dh ;; _ ;; !!!
|
|
jbe _lFNPIfBlockNull
|
|
|
|
_lFNPIfBlockEx:
|
|
mov dword ptr [ecx], 69646e65h ;; endi
|
|
mov word ptr [ecx+04h], 0666h ;; f_
|
|
jmp _lFNPCopyParse
|
|
|
|
_lFNPIfBlockNull:
|
|
mov dword ptr [ecx], 06060606h ;; ex bs
|
|
mov word ptr [ecx+04h], 0606h
|
|
cmp word ptr [ecx-02h], 0a0dh ;; new line
|
|
jne _lFNPCopyParse
|
|
mov word ptr [ecx-02h], 0606h
|
|
jmp _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp eax, 69646e65h ;; endi
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 66h ;; f
|
|
jne _next
|
|
cmp byte ptr [esi+05h], 20h ;; _
|
|
jbe _lFNPCopyParse
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; loop
|
|
_lbl:
|
|
cmp eax, 706f6f6ch ;; loop
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 20h ;; _
|
|
jg _next
|
|
call _lFNPCheckBlock
|
|
test eax, eax
|
|
jz _lFNPCopyParse
|
|
mov dword ptr [eax], 6c646e65h ;; endl
|
|
mov dword ptr [eax+04h], 06706f6fh ;; oop_
|
|
jmp _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp eax, 6c646e65h ;; endl
|
|
jne _next
|
|
cmp word ptr [esi+04h], 6f6fh ;; oo
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 70h ;; p
|
|
jne _next
|
|
cmp byte ptr [esi+07h], 20h ;; _
|
|
jbe _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp eax, 74697865h ;; exit
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 6e656877h ;; when
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 2dh ;; _ ;; !!!!
|
|
jg _next
|
|
|
|
movsd
|
|
movsd
|
|
mov dword ptr [edi], 20202020h
|
|
mov word ptr [edi+04h], 2020h
|
|
add edi, 06h
|
|
|
|
mov byte ptr [_bCodeSys], al
|
|
mov byte ptr [_bCodePosOp], 00h
|
|
|
|
jmp _lFNPCopyParse
|
|
|
|
;;----------------
|
|
;; whilenot
|
|
_lbl:
|
|
cmp eax, 6c696877h ;; whil
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 746f6e65h ;; enot
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 2dh ;; _ ;; !!!!
|
|
jg _next
|
|
call _lFNPCheckBlock
|
|
add esi, 08h
|
|
test eax, eax
|
|
jz _lFNPWhileEX
|
|
mov dword ptr [eax], 6c646e65h ;; endl
|
|
mov dword ptr [eax+04h], 06706f6fh ;; oop_
|
|
_lFNPWhileEX:
|
|
mov eax, dword ptr [_dFCB]
|
|
mov dword ptr [eax], 706f6f6ch ;; loop
|
|
mov word ptr [eax+04h], 0a0dh ;; new line
|
|
add eax, 06h
|
|
mov dword ptr [_dFCB], eax
|
|
cmp byte ptr [esi], 10h ;; 0a0dh or #
|
|
jbe _lFNPCopyParse
|
|
mov dword ptr [edi], 74697865h ;; exit
|
|
mov dword ptr [edi+04h], 6e656877h ;; when
|
|
mov byte ptr [edi+08h], 20h ;; _
|
|
add edi, 09h
|
|
jmp _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp eax, 77646e65h ;; endw
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 656c6968h ;; hile
|
|
jne _next
|
|
cmp dword ptr [esi+08h], 0d746f6eh ;; not_
|
|
jne _next
|
|
add esi, 0bh
|
|
mov dword ptr [edi], 6c646e65h ;; endl
|
|
mov dword ptr [edi+04h], 00706f6fh ;; oop_
|
|
add edi, 07h
|
|
jmp _lFNPCopyParse
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; do
|
|
_lbl:
|
|
cmp ax, 6f64h ;; do
|
|
jne _next
|
|
cmp byte ptr [esi+02h], 21h
|
|
jg _next
|
|
|
|
mov dword ptr [edi], 706f6f6ch ;; loop
|
|
mov word ptr [edi+04h], 0a0dh ;; new line
|
|
add edi, 06h
|
|
|
|
call _lFNPCheckBlock
|
|
add esi, 02h
|
|
test eax, eax
|
|
jz _lFNPCopyParse
|
|
|
|
cmp dword ptr [eax+10h], 6c696877h ;; whil
|
|
jne _lFNPDo
|
|
cmp dword ptr [eax+14h], 746f6e65h ;; enot
|
|
jne _lFNPDo
|
|
cmp byte ptr [eax+18h], 2dh ;; _ ;; !!!!
|
|
jg _lFNPDo
|
|
|
|
mov dword ptr [eax], 06060606h
|
|
mov word ptr [eax+04h], 0606h
|
|
mov dword ptr [eax+0eh], 78650a0dh ;; __ex
|
|
mov dword ptr [eax+12h], 68777469h ;; itwh
|
|
mov word ptr [eax+16h], 6e65h ;; en
|
|
|
|
add eax, 11h
|
|
_lFNPDoEX:
|
|
inc eax
|
|
cmp word ptr [eax], 0a0dh ;; nl
|
|
jne _lFNPDoEX
|
|
mov word ptr [eax], 6601h ;; #f
|
|
jmp _lFNPCopyParse
|
|
|
|
_lFNPDo:
|
|
mov dword ptr [eax], 6c646e65h ;; endl
|
|
mov dword ptr [eax+04h], 06706f6fh ;; oop_
|
|
jmp _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp eax, 64646e65h ;; endd
|
|
jne _next
|
|
cmp word ptr [esi+04h], 206fh ;; o_
|
|
jne _next
|
|
cmp dword ptr [esi+06h], 6c696877h ;; whil
|
|
jne _next
|
|
cmp dword ptr [esi+0ah], 746f6e65h ;; enot
|
|
jne _next
|
|
cmp byte ptr [esi+0eh], 2dh ;; _ ;; !!!!
|
|
jg _next
|
|
|
|
mov dword ptr [esi], 74697865h ;; exit
|
|
mov dword ptr [esi+04h], 6e656877h ;; when
|
|
mov dword ptr [esi+08h], 06060606h
|
|
mov word ptr [esi+0ch], 06060606h
|
|
mov eax, esi
|
|
jmp _lFNPDoEX
|
|
;;----------------
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp eax, 75746572h ;; retu
|
|
jne _next
|
|
cmp word ptr [esi+04h], 6e72h ;; rn
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 2eh ;; _ ;; !!!!
|
|
jg _next
|
|
|
|
movsd
|
|
movsw
|
|
mov dword ptr [edi], 20202020h ;; bs
|
|
mov dword ptr [edi+04h], 20202020h ;; bs
|
|
add edi, 08h
|
|
mov byte ptr [_bCodeSys], al
|
|
mov byte ptr [_bCodePosOp], 00h
|
|
|
|
jmp _lFNPCopyParse
|
|
|
|
;;----------------
|
|
;; ++ -- pre
|
|
_lbl:
|
|
cmp ax, 2b2bh ;; ++
|
|
jne _next
|
|
|
|
;;----------------
|
|
_lFNPIDPreX:
|
|
mov ecx, edi
|
|
mov edx, esi
|
|
|
|
mov edi, esi
|
|
lea esi, [esi+02h]
|
|
|
|
_lFNPIDPreXfx:
|
|
movsb
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
jne _lFNPIDPreXfx
|
|
|
|
mov word ptr [edi], ax
|
|
add edi, 02h
|
|
|
|
mov edi, ecx
|
|
mov esi, edx
|
|
jmp _lFNPFuncScanIn
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp ax, 2d2dh ;; --
|
|
je _lFNPIDPreX
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp eax, 66646e65h ;; endf
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 74636e75h ;; unct
|
|
jne _next
|
|
cmp word ptr [esi+08h], 6f69h ;; io
|
|
jne _next
|
|
cmp byte ptr [esi+0ah], 6eh ;; n
|
|
jne _next
|
|
cmp byte ptr [esi+0bh], 20h ;; _
|
|
jg _next
|
|
|
|
;;----------------
|
|
;; function out
|
|
_lFNPFuncOut:
|
|
mov edi, dword ptr [_dBCP]
|
|
|
|
;;----------------
|
|
;; sys locals
|
|
;;----------------
|
|
;; type
|
|
cmp byte ptr [_bTempType], 00h
|
|
je _lFNPFuncOutAX
|
|
|
|
mov ecx, edi
|
|
_lFNPFuncOutBX:
|
|
dec ecx
|
|
cmp byte ptr [ecx], 20h
|
|
jne _lFNPFuncOutBX
|
|
|
|
mov dword ptr [edi], 61636f6ch ;; loca
|
|
mov word ptr [edi+04h], 206ch ;; l_
|
|
add edi, 06h
|
|
|
|
_lFNPFuncOutCX:
|
|
inc ecx
|
|
mov al, byte ptr [ecx]
|
|
cmp al, 0dh ;; nl
|
|
je _lFNPFuncOutDX
|
|
stosb
|
|
jmp _lFNPFuncOutCX
|
|
_lFNPFuncOutDX:
|
|
mov dword ptr [edi], 5f6a6320h ;; _cj_
|
|
mov dword ptr [edi+04h], 36363676h ;; v666
|
|
mov dword ptr [edi+08h], 0a0d725fh ;; _r__
|
|
add edi, 0ch
|
|
mov byte ptr [_bTempType], 00h
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; bool
|
|
_lFNPFuncOutAX:
|
|
cmp byte ptr [_bTempBool], 00h
|
|
je _lFNPFuncOutTT
|
|
|
|
mov dword ptr [edi], 61636f6ch ;; loca
|
|
mov dword ptr [edi+04h], 6f62206ch ;; l bo
|
|
mov dword ptr [edi+08h], 61656c6fh ;; olea
|
|
mov dword ptr [edi+0ch], 6a63206eh ;; n cj
|
|
mov dword ptr [edi+10h], 3636765fh ;; _v66
|
|
mov dword ptr [edi+14h], 0a625f36h ;; 6_b_
|
|
mov byte ptr [edi+18h], 0dh ;; _
|
|
add edi, 19h
|
|
mov byte ptr [_bTempBool], 00h
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; index
|
|
_lFNPFuncOutTT:
|
|
mov al, byte ptr [_bFCLLMAX]
|
|
mov byte ptr [_bFCLLMAX], 40h
|
|
_lFNPFuncOutIS:
|
|
cmp al, 40h
|
|
je _lFNPFuncOutEX
|
|
|
|
mov dword ptr [edi], 61636f6ch ;; loca
|
|
mov dword ptr [edi+04h], 6e69206ch ;; l_in
|
|
mov dword ptr [edi+08h], 65676574h ;; tege
|
|
mov dword ptr [edi+0ch], 78712072h ;; r_qx
|
|
mov byte ptr [edi+10h], al
|
|
mov word ptr [edi+11h], 0a0dh ;; nl
|
|
add edi, 13h
|
|
dec al
|
|
jmp _lFNPFuncOutIS
|
|
;;----------------
|
|
;;----------------
|
|
|
|
_lFNPFuncOutEX:
|
|
mov eax, esi
|
|
mov esi, offset _bFuncCodeLocals
|
|
mov ecx, dword ptr [_dFCL]
|
|
sub ecx, offset _bFuncCodeLocals
|
|
|
|
rep movsb
|
|
|
|
mov esi, offset _bFuncCodeBase
|
|
mov ecx, dword ptr [_dFCB]
|
|
sub ecx, offset _bFuncCodeBase
|
|
|
|
rep movsb
|
|
|
|
xor ebx, 01b
|
|
mov esi, eax
|
|
jmp _lFNPCopy
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp eax, 6d646e65h ;; endm
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 6f687465h ;; etho
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 64h ;; d
|
|
jne _next
|
|
cmp byte ptr [esi+09h], 20h
|
|
jg _next
|
|
jmp _lFNPFuncOut
|
|
|
|
;;----------------
|
|
;; in function scan
|
|
_lbl:
|
|
_lFNPFuncScanIn:
|
|
mov ecx, esi ;; temp script posiyion
|
|
xor ebp, ebp ;; temp flags
|
|
|
|
_lFNPInFuncScan:
|
|
inc ecx
|
|
mov eax, dword ptr [ecx]
|
|
|
|
cmp al, 22h ;; "
|
|
jne _next
|
|
_lFNPInFuncScanString:
|
|
inc ecx
|
|
cmp byte ptr [ecx], 5ch ;; \
|
|
jne _lFNPInFuncScanStringEX
|
|
add ecx, 02h
|
|
_lFNPInFuncScanStringEX:
|
|
cmp byte ptr [ecx], 22h ;; "
|
|
jne _lFNPInFuncScanString
|
|
jmp _lFNPInFuncScan
|
|
|
|
_lbl:
|
|
cmp ax, 0a0dh
|
|
jne _next
|
|
cmp ebp, 0100b ;; adding call
|
|
jb _lFNPCopyParse
|
|
mov dword ptr [edi], 6c6c6163h ;; call
|
|
mov byte ptr [edi+04h], 20h ;; _
|
|
add edi, 05h
|
|
jmp _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp al, 28h ;; (
|
|
jne _next
|
|
or ebp, 0100b ;; call pre
|
|
jmp _lFNPInFuncScan
|
|
|
|
_lbl:
|
|
cmp al, 3dh ;; =
|
|
jne _next
|
|
cmp ax, 3d3dh ;; ==
|
|
jne _lFNPSetEX
|
|
inc ecx
|
|
jmp _lFNPInFuncScan
|
|
|
|
_lFNPSetEX:
|
|
cmp ax, 3d3dh ;; set pre
|
|
je _lFNPInFuncScan
|
|
cmp byte ptr [ecx-01h], 3ch
|
|
je _lFNPInFuncScan
|
|
cmp byte ptr [ecx-01h], 3eh
|
|
je _lFNPInFuncScan
|
|
cmp byte ptr [ecx-01h], 21h
|
|
je _lFNPInFuncScan
|
|
_lFNPSet:
|
|
mov dword ptr [edi], 20746573h ;; set_
|
|
add edi, 04h
|
|
jmp _lFNPCopyParse
|
|
|
|
_lbl:
|
|
cmp eax, 0a0d2b2bh ;; ++
|
|
jne _next
|
|
mov word ptr [ecx], 7001h ;; #p
|
|
jmp _lFNPSet
|
|
_lbl:
|
|
cmp eax, 06062b2bh ;; ++
|
|
jne _next
|
|
mov word ptr [ecx], 7001h ;; #p
|
|
jmp _lFNPSet
|
|
|
|
_lbl:
|
|
cmp eax, 0a0d2d2dh ;; --
|
|
jne _next
|
|
mov word ptr [ecx], 6d01h ;; #m
|
|
jmp _lFNPSet
|
|
_lbl:
|
|
cmp eax, 06062d2dh ;; --
|
|
jne _next
|
|
mov word ptr [ecx], 6d01h ;; #m
|
|
jmp _lFNPSet
|
|
|
|
_lbl:
|
|
cmp al, 20h
|
|
jne _next
|
|
or ebp, 01b ;; local pre
|
|
jmp _lFNPInFuncScan
|
|
|
|
_lbl:
|
|
cmp al, 5bh
|
|
jne _next
|
|
or ebp, 10b ;; local not
|
|
jmp _lFNPInFuncScan
|
|
|
|
_lbl:
|
|
cmp ebp, 01h
|
|
jne _lFNPInFuncScan
|
|
cmp al, 41h
|
|
jb _lFNPInFuncScan
|
|
cmp al, 5ah
|
|
jbe _lFNPLocal
|
|
cmp al, 61h
|
|
jb _lFNPInFuncScan
|
|
cmp al, 7ah
|
|
jg _lFNPInFuncScan
|
|
|
|
_lFNPLocal:
|
|
mov dword ptr [edi], 61636f6ch ;; loca
|
|
mov dword ptr [edi+04h], 206ch ;; l_
|
|
add edi, 06h
|
|
jmp _lFNVarParse
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ex code parsing
|
|
_lFNPExCode:
|
|
mov dword ptr [edi], 20212f2fh ;; //!_
|
|
add esi, 03h
|
|
add edi, 04h
|
|
mov eax, dword ptr [esi]
|
|
|
|
cmp ax, 0a0dh
|
|
je _lFNPCopy
|
|
|
|
cmp eax, 656a6e69h ;; inje
|
|
jne _next
|
|
cmp word ptr [esi+04h], 7463h ;; ct
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 20h ;; _
|
|
jg _next
|
|
lea edx, [esi+06h]
|
|
_lFNPInjectLoop:
|
|
inc edx
|
|
mov eax, dword ptr [edx]
|
|
cmp ax, 0a0dh
|
|
je _lFNPCopy
|
|
cmp eax, 6e69616dh ;; main
|
|
jne _lFNPInjectLoopEX
|
|
cmp byte ptr [edx+04h], 20h ;; _
|
|
jg _lFNPInjectLoopEX
|
|
jmp _lFNPCopyFuncIn
|
|
_lFNPInjectLoopEX:
|
|
cmp eax, 666e6f63h ;; conf
|
|
jne _lFNPInjectLoop
|
|
cmp word ptr [edx+04h], 6769h ;; if
|
|
jne _lFNPInjectLoop
|
|
cmp byte ptr [edx+06h], 20h ;; _
|
|
jg _lFNPInjectLoop
|
|
jmp _lFNPCopyFuncIn
|
|
|
|
;; _lbl:
|
|
;; cmp eax, 6f706d69h ;; impo
|
|
;; jne _next
|
|
;; cmp word ptr [esi+04h], 7472h ;; rt
|
|
;; jne _next
|
|
;; movsd
|
|
;; movsw
|
|
;; mov byte ptr [edi], 20h ;; bs
|
|
;; inc edi
|
|
;; jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 69646e65h ;; endi
|
|
jne _lFNPCopy
|
|
cmp dword ptr [esi+04h], 63656a6eh ;; njec
|
|
jne _lFNPCopy
|
|
cmp byte ptr [esi+08h], 74h ;; t
|
|
jne _lFNPCopy
|
|
cmp byte ptr [esi+09h], 20h ;; _
|
|
jg _lFNPCopy
|
|
|
|
mov eax, dword ptr [_dFCB]
|
|
mov dword ptr [eax], 20212f2fh ;; //!_
|
|
add eax, 04h
|
|
mov dword ptr [_dFCB], eax
|
|
|
|
jmp _lFNPFuncOut
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; outside the function
|
|
_lFNPOutside:
|
|
cmp eax, 65736c65h ;; else
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 20h ;; bs
|
|
jb _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 69646e65h ;; endi
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 66h ;; f
|
|
jne _next
|
|
cmp byte ptr [esi+05h], 20h ;; bs
|
|
jb _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 74617473h ;; stat
|
|
jne _lFNPGlob
|
|
cmp dword ptr [esi+04h], 69206369h ;; ic_i
|
|
jne _lFNPGlob
|
|
cmp word ptr [esi+08h], 2066h ;; f_
|
|
je _lFNPCopy
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; in globals
|
|
_lFNPGlob:
|
|
cmp ebx, 1000b
|
|
jb _lFNPInCode
|
|
|
|
cmp eax, 67646e65h ;; endg
|
|
jne _lFNVarParse
|
|
cmp dword ptr [esi+04h], 61626f6ch ;; loba
|
|
jne _lFNVarParse
|
|
cmp word ptr [esi+08h], 736ch ;; ls
|
|
jne _lFNVarParse
|
|
cmp byte ptr [esi+0ah], 20h ;; _
|
|
jg _lFNVarParse
|
|
xor ebx, 1000b
|
|
jmp _lFNPCopy
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; in code
|
|
_lFNPInCode:
|
|
cmp eax, 626f6c67h ;; glob
|
|
jne _next
|
|
cmp dword ptr [esi+03h], 736c6162h ;; bals
|
|
jne _next
|
|
cmp byte ptr [esi+07h], 20h ;; _
|
|
jg _next
|
|
or ebx, 1000b
|
|
jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 73646e65h ;; ends
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 63757274h ;; truc
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 74h ;; t
|
|
jne _next
|
|
cmp byte ptr [esi+09h], 20h ;; _
|
|
jg _next
|
|
xor ebx, 10b
|
|
jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 6d646e65h ;; endm
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 6c75646fh ;; odul
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 65h ;; e
|
|
jne _next
|
|
cmp byte ptr [esi+09h], 20h ;; _
|
|
jg _next
|
|
xor ebx, 10b
|
|
jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 69646e65h ;; endi
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 7265746eh ;; nter
|
|
jne _next
|
|
cmp dword ptr [esi+08h], 65636166h ;; face
|
|
jne _next
|
|
cmp byte ptr [esi+0ch], 20h ;; _
|
|
jg _next
|
|
xor ebx, 0100b
|
|
jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
test ebx, ebx
|
|
jz _lFNPOutStruct
|
|
|
|
;;----------------
|
|
;; in the struct
|
|
cmp eax, 656c6564h ;; dele
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 65746167h ;; gate
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 20h ;; _
|
|
jbe _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 6c706d69h ;; impl
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 6e656d65h ;; emen
|
|
jne _next
|
|
cmp word ptr [esi+06h], 2074h ;; t_
|
|
je _lFNPCopy
|
|
|
|
_lbl:
|
|
lea ecx, [esi-01h]
|
|
_lFNPMSStart:
|
|
inc ecx
|
|
mov eax, dword ptr [ecx]
|
|
|
|
cmp al, 3dh ;; =
|
|
je _lFNVarParse
|
|
|
|
cmp al, 28h ;; (
|
|
je _lFNPExFuncDef
|
|
|
|
cmp ax, 0a0dh
|
|
je _lFNVarParse
|
|
|
|
cmp eax, 7265706fh ;; oper
|
|
jne _lFNPMSStartEX
|
|
cmp dword ptr [ecx+04h], 726f7461h ;; ator
|
|
jne _lFNPMSStartEX
|
|
cmp byte ptr [ecx+08h], 3ch ;; <
|
|
je _lFNPExFuncDefEX
|
|
cmp byte ptr [ecx+08h], 3dh ;; =
|
|
je _lFNPExFuncDefEX
|
|
;; cmp byte ptr [ecx+08h], 3eh ;; >
|
|
;; je _lFNPExFuncDef
|
|
cmp byte ptr [ecx+08h], 21h ;; !
|
|
je _lFNPExFuncDefEX
|
|
cmp byte ptr [ecx+08h], 5bh ;; [
|
|
je _lFNPExFuncDefEX
|
|
cmp byte ptr [ecx+08h], 20h ;; bs
|
|
je _lFNPExFuncDefEX
|
|
|
|
_lFNPMSStartEX:
|
|
cmp eax, 6874656dh ;; meth
|
|
jne _lFNPMSStart
|
|
cmp word ptr [ecx+04h], 646fh ;; od
|
|
jne _lFNPMSStart
|
|
cmp byte ptr [ecx+06h], 20h ;; _
|
|
jg _lFNPMSStart
|
|
|
|
lea eax, [ecx+09h]
|
|
mov dword ptr [_dLastFuncName], eax
|
|
|
|
jmp _lFNPCopyFuncIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; out the struct
|
|
_lFNPOutStruct:
|
|
cmp eax, 7262696ch ;; libr
|
|
jne _next
|
|
cmp dword ptr [esi+03h], 79726172h ;; rary
|
|
jne _next
|
|
cmp dword ptr [esi+07h], 636e6f5fh ;; _onc
|
|
jne _lFNPLibTestEX
|
|
cmp byte ptr [esi+0bh], 65h ;; e
|
|
jne _lFNPLibTestEX
|
|
cmp byte ptr [esi+0ch], 20h ;; _
|
|
jg _next
|
|
_lFNPLibBlockEX:
|
|
call _lFNPCheckBlock
|
|
test eax, eax
|
|
jz _lFNPCopy
|
|
mov dword ptr [eax], 6c646e65h ;; endl
|
|
mov dword ptr [eax+04h], 61726269h ;; ibra
|
|
mov word ptr [eax+08h], 7972h ;; ry
|
|
jmp _lFNPCopy
|
|
_lFNPLibTestEX:
|
|
cmp byte ptr [esi+07h], 20h ;; _
|
|
jbe _lFNPLibBlockEX
|
|
|
|
_lbl:
|
|
cmp eax, 706f6373h ;; scop
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 65h ;; e
|
|
jne _next
|
|
cmp byte ptr [esi+05h], 20h ;; _
|
|
jg _next
|
|
call _lFNPCheckBlock
|
|
test eax, eax
|
|
jz _lFNPCopy
|
|
mov dword ptr [eax], 73646e65h ;; ends
|
|
mov dword ptr [eax+04h], 65706f63h ;; cope
|
|
jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 6c646e65h ;; endl
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 61726269h ;; ibra
|
|
jne _next
|
|
cmp word ptr [esi+08h], 7972h ;; ry
|
|
jne _next
|
|
cmp byte ptr [esi+0ah], 20h ;; _
|
|
jbe _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 73646e65h ;; ends
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 65706f63h ;; cope
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 20h ;; _
|
|
jbe _lFNPCopy
|
|
|
|
;;----------------
|
|
;; public/private loop
|
|
_lbl:
|
|
lea ecx, [esi-01h]
|
|
_lFNPInCodeScan:
|
|
inc ecx
|
|
_lFNPInCodeScanEX:
|
|
mov eax, dword ptr [ecx]
|
|
|
|
cmp eax, 76697270h ;; priv
|
|
jne _next
|
|
cmp dword ptr [ecx+04h], 20657461h ;; ate_
|
|
jne _next
|
|
add ecx, 08h
|
|
jmp _lFNPInCodeScanEX
|
|
|
|
_lbl:
|
|
cmp eax, 6c627570h ;; publ
|
|
jne _next
|
|
_lFNPScanIc:
|
|
cmp word ptr [ecx+04h], 6369h ;; ic
|
|
jne _next
|
|
cmp byte ptr [ecx+06h], 20h ;; _
|
|
jne _next
|
|
add ecx, 07h
|
|
jmp _lFNPInCodeScanEX
|
|
|
|
_lbl:
|
|
cmp eax, 736e6f63h ;; cons
|
|
jne _next
|
|
cmp dword ptr [ecx+04h], 746e6174h ;; tant
|
|
jne _next
|
|
cmp byte ptr [ecx+08h], 20h ;; _
|
|
jne _next
|
|
add ecx, 09h
|
|
jmp _lFNPInCodeScanEX
|
|
|
|
_lbl:
|
|
cmp eax, 74617473h ;; stat
|
|
je _lFNPScanIc
|
|
|
|
;;----------------
|
|
;; function, native function and function interface
|
|
_lbl:
|
|
cmp eax, 6974616eh ;; nati
|
|
jne _next
|
|
cmp word ptr [ecx+04h], 6576h ;; ve
|
|
jne _next
|
|
cmp byte ptr [ecx+06h], 20h ;; bs
|
|
jne _next
|
|
|
|
_lXFPNative:
|
|
inc ecx
|
|
cmp word ptr [ecx], 0a0dh ;; nl
|
|
je _lFNPCopy
|
|
cmp byte ptr [ecx], 28h ;; (
|
|
jne _lXFPNative
|
|
jmp _lFNPExFuncDef
|
|
|
|
_lbl:
|
|
cmp eax, 636e7566h ;; func
|
|
jne _next
|
|
cmp dword ptr [ecx+04h], 6e6f6974h ;; tion
|
|
jne _next
|
|
cmp byte ptr [ecx+08h], 20h ;; _
|
|
jne _next
|
|
cmp ebx, 0100b
|
|
jge _lFNPCopy
|
|
|
|
lea eax, [ecx+09h]
|
|
mov dword ptr [_dLastFuncName], eax
|
|
|
|
cmp dword ptr [ecx+09h], 65746e69h ;; inte
|
|
jne _lFNPCopyFuncIn
|
|
cmp dword ptr [ecx+0dh], 63616672h ;; rfac
|
|
jne _lFNPCopyFuncIn
|
|
cmp word ptr [ecx+11h], 2065h ;; e_
|
|
je _lFNPCopy
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp eax, 75727473h ;; stru
|
|
jne _next
|
|
cmp word ptr [ecx+04h], 7463h ;; ct
|
|
jne _next
|
|
cmp byte ptr [ecx+06h], 20h ;; _
|
|
jg _next
|
|
or ebx, 10b
|
|
call _lFNPCheckBlock
|
|
test eax, eax
|
|
jz _lFNPCopy
|
|
mov dword ptr [eax], 73646e65h ;; ends
|
|
mov dword ptr [eax+04h], 63757274h ;; truc
|
|
mov byte ptr [eax+08h], 74h ;; t
|
|
jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 75646f6dh ;; modu
|
|
jne _next
|
|
cmp word ptr [ecx+04h], 656ch ;; le
|
|
jne _next
|
|
cmp byte ptr [ecx+06h], 20h ;; _
|
|
jg _next
|
|
or ebx, 10b
|
|
call _lFNPCheckBlock
|
|
test eax, eax
|
|
jz _lFNPCopy
|
|
mov dword ptr [eax], 6d646e65h ;; endm
|
|
mov dword ptr [eax+04h], 6c75646fh ;; odul
|
|
mov byte ptr [eax+08h], 65h ;; e
|
|
jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 65746e69h ;; inte
|
|
jne _next
|
|
cmp dword ptr [ecx+04h], 63616672h ;; rfac
|
|
jne _next
|
|
cmp byte ptr [ecx+08h], 65h ;; e
|
|
jne _next
|
|
cmp byte ptr [ecx+09h], 20h ;; _
|
|
jg _next
|
|
or ebx, 0100b
|
|
call _lFNPCheckBlock
|
|
test eax, eax
|
|
jz _lFNPCopy
|
|
mov dword ptr [eax], 69646e65h ;; endi
|
|
mov dword ptr [eax+04h], 7265746eh ;; nter
|
|
mov dword ptr [eax+08h], 65636166h ;; face
|
|
jmp _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 7779656bh ;; keyw
|
|
jne _next
|
|
cmp dword ptr [ecx+03h], 64726f77h ;; word
|
|
jne _next
|
|
cmp byte ptr [ecx+07h], 20h ;; _
|
|
jbe _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 6b6f6f68h ;; hook
|
|
jne _next
|
|
cmp byte ptr [esi+04h], 20h ;; bs
|
|
je _lFNPCopy
|
|
|
|
_lbl:
|
|
cmp eax, 65707974h ;; type
|
|
jne _lFNPGlobalsScan
|
|
cmp byte ptr [ecx+04h], 20h ;; _
|
|
jbe _lFNPCopy
|
|
|
|
_lFNPGlobalsScanEx:
|
|
inc ecx
|
|
mov eax, dword ptr [ecx]
|
|
_lFNPGlobalsScan:
|
|
cmp ax, 0a0dh
|
|
je _lFNPAddGlobals
|
|
cmp al, 3dh ;; =
|
|
je _lFNPAddGlobalsEx
|
|
|
|
cmp al, 28h ;; (
|
|
jne _lFNPGlobalsScanEx
|
|
cmp word ptr [ecx-02h], 0a0dh ;; nl
|
|
jne _lFNPExFuncDef
|
|
|
|
jmp _lFNPGlobalsScanEx
|
|
|
|
_lFNPAddGlobalsEx:
|
|
inc ecx
|
|
cmp word ptr [ecx], 0a0dh
|
|
jne _lFNPAddGlobalsEx
|
|
_lFNPAddGlobals:
|
|
mov word ptr [ecx], 3301h ;; #3
|
|
mov dword ptr [edi], 626f6c67h ;; glob
|
|
mov dword ptr [edi+04h], 0d736c61h ;; als_
|
|
mov byte ptr [edi+08h], 0ah ;; _
|
|
add edi, 09h
|
|
jmp _lFNVarParse
|
|
;;----------------
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ex function define
|
|
_lFNPExFuncDefEX: ;; from overloading operators
|
|
inc ecx
|
|
cmp byte ptr [ecx], 28h ;; (
|
|
jne _lFNPExFuncDefEX
|
|
|
|
_lFNPExFuncDef:
|
|
dec ecx ;; ecx = func name
|
|
cmp word ptr [ecx-02h], 0a0dh ;; nl
|
|
je _lFNPCopy
|
|
cmp byte ptr [ecx-01h], 20h ;; _
|
|
jne _lFNPExFuncDef
|
|
|
|
;; is operator?
|
|
cmp dword ptr [ecx-05h], 726f7461h ;; ator
|
|
jne _next
|
|
cmp dword ptr [ecx-09h], 7265706fh ;; oper
|
|
jne _next
|
|
sub ecx, 09h
|
|
|
|
_lbl:
|
|
mov edx, ecx
|
|
_lbl: ;; edx = type
|
|
dec edx
|
|
cmp word ptr [edx-02h], 0a0dh ;; new line
|
|
je _lFNPExFuncDefDX
|
|
cmp byte ptr [edx-01h], 20h ;; _
|
|
jne _prew
|
|
|
|
_lbl: ;; copy func params
|
|
movsb
|
|
_lFNPExFuncDefDX:
|
|
cmp esi, edx
|
|
jne _prew
|
|
|
|
;;----------------
|
|
;; add func or method
|
|
cmp dword ptr [edi-07h], 6974616eh ;; nati
|
|
jne _lFNPExFuncDefTTTF
|
|
cmp word ptr [edi-03h], 6576h ;; ve
|
|
jne _lFNPExFuncDefTTTF
|
|
cmp byte ptr [edi-01h], 20h ;; bs
|
|
je _next
|
|
|
|
_lFNPExFuncDefTTTF:
|
|
cmp ebx, 10b
|
|
jb _lFNPExFuncDefFF
|
|
|
|
mov dword ptr [edi], 6874656dh ;; meth
|
|
mov dword ptr [edi+04h], 0020646fh ;; od_
|
|
add edi, 07h
|
|
jmp _next
|
|
_lFNPExFuncDefFF:
|
|
mov dword ptr [edi], 636e7566h ;; func
|
|
mov dword ptr [edi+04h], 6e6f6974h ;; tion
|
|
mov byte ptr [edi+08h], 20h ;; _
|
|
add edi, 09h
|
|
;;----------------
|
|
|
|
_lbl:
|
|
mov esi, ecx ;; copy func name
|
|
|
|
mov dword ptr [_dLastFuncName], ecx
|
|
|
|
_lbl:
|
|
movsb
|
|
cmp byte ptr [esi], 28h ;; (
|
|
jne _prew
|
|
|
|
_lbl: ;; adding takes
|
|
mov dword ptr [edi], 6b617420h ;; _tak
|
|
mov dword ptr [edi+04h], 00207365h ;; es_
|
|
add edi, 07h
|
|
|
|
cmp word ptr [esi], 2928h ;; ()
|
|
jne _next
|
|
|
|
mov dword ptr [edi], 68746f6eh ;; noth
|
|
mov dword ptr [edi+04h], 00676e69h ;; ing
|
|
add edi, 07h
|
|
inc esi
|
|
jmp _lFNPExFuncDefSX
|
|
|
|
_lbl:
|
|
inc esi
|
|
_lbl: ;; copy arguments
|
|
movsb
|
|
cmp byte ptr [esi], 29h ;; )
|
|
jne _prew
|
|
|
|
_lFNPExFuncDefSX: ;; add returns
|
|
inc esi
|
|
mov dword ptr [edi], 74657220h ;; _ret
|
|
mov dword ptr [edi+04h], 736e7275h ;; urns
|
|
mov byte ptr [edi+08h], 20h ;; _
|
|
add edi, 09h
|
|
|
|
_lbl: ;; copy func type
|
|
mov al, byte ptr [edx]
|
|
cmp al, 20h
|
|
je _next
|
|
mov byte ptr [edi], al
|
|
inc edx
|
|
inc edi
|
|
jmp _prew
|
|
|
|
_lbl: ;; func in?
|
|
cmp ebx, 0100b
|
|
jge _lFNPExFuncDefUX
|
|
|
|
;; add endfunction
|
|
cmp word ptr [esi], 7801h ;; #x
|
|
je _lFNPExFuncDefEnd ;; ???
|
|
|
|
_lFNPExFuncDefUX:
|
|
mov word ptr [edi], 0a0dh ;; nl
|
|
add edi, 02h
|
|
jmp _lFNPLine
|
|
|
|
_lFNPExFuncDefEnd:
|
|
mov eax, dword ptr [esi+02h]
|
|
add esi, 06h
|
|
mov word ptr [edi], 0a0dh ;; new line
|
|
add edi, 02h
|
|
|
|
;;----------------
|
|
;; add endfunc or endmethod
|
|
cmp word ptr [eax-02h], 0a0dh ;; new line
|
|
je _next
|
|
mov word ptr [eax], 0a0dh ;; new line
|
|
add eax, 02h
|
|
_lbl:
|
|
cmp ebx, 10b
|
|
jb _lFNPExFuncDefEF
|
|
mov dword ptr [eax], 6d646e65h ;; endm
|
|
mov dword ptr [eax+04h], 6f687465h ;; etho
|
|
mov byte ptr [eax+08h], 64h ;; d
|
|
jmp _next
|
|
_lFNPExFuncDefEF:
|
|
mov dword ptr [eax], 66646e65h ;; endf
|
|
mov dword ptr [eax+04h], 74636e75h ;; unct
|
|
mov dword ptr [eax+08h], 066e6f69h ;; ion
|
|
;;----------------
|
|
|
|
_lbl:
|
|
mov dword ptr [_dBCP], edi ;; system in
|
|
or ebx, 01h
|
|
|
|
mov dword ptr [_dFCL], offset _bFuncCodeLocals
|
|
mov dword ptr [_dFCB], offset _bFuncCodeBase
|
|
|
|
jmp _lFNPLine
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; parse comma in variables declaration
|
|
_lFNVarParse:
|
|
lea ecx, [esi-01h]
|
|
xor edx, edx
|
|
|
|
_lFNVarParseEx:
|
|
inc ecx
|
|
mov eax, dword ptr [ecx]
|
|
|
|
cmp al, 22h ;; "
|
|
jne _next
|
|
_lFNVarParseString:
|
|
inc ecx
|
|
cmp byte ptr [ecx], 5ch ;; \
|
|
jne _lFNVarParseStringEX
|
|
add ecx, 02h
|
|
_lFNVarParseStringEX:
|
|
cmp byte ptr [ecx], 22h ;; "
|
|
jne _lFNVarParseString
|
|
jmp _lFNVarParseEx
|
|
|
|
_lbl:
|
|
cmp al, 28h ;; (
|
|
jne _next
|
|
inc edx
|
|
jmp _lFNVarParseEx
|
|
|
|
_lbl:
|
|
cmp al, 29h ;; )
|
|
jne _next
|
|
dec edx
|
|
jmp _lFNVarParseEx
|
|
|
|
_lbl:
|
|
cmp al, 2ch ;; ,
|
|
jne _next
|
|
test edx, edx
|
|
jnz _lFNVarParseEx
|
|
mov byte ptr [ecx], 0eh ;; ;
|
|
jmp _lFNVarParseEx
|
|
|
|
_lbl:
|
|
cmp ax, 3301h ;; #3
|
|
je _lFNPCopyParse
|
|
cmp ax, 0a0dh
|
|
jne _lFNVarParseEx
|
|
|
|
jmp _lFNPCopyParse
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; check blocks
|
|
_lFNPCheckBlock:
|
|
mov ecx, esi
|
|
_lFNPCheckBlockEx:
|
|
inc ecx
|
|
cmp word ptr [ecx], 0a0dh
|
|
je _lFNPCheckBlockSx
|
|
cmp word ptr [ecx], 7801h ;; #x
|
|
jne _lFNPCheckBlockEx
|
|
|
|
mov eax, dword ptr [ecx+02h]
|
|
mov dword ptr [ecx], 06060606h
|
|
mov word ptr [ecx+04h], 0a0dh
|
|
|
|
cmp word ptr [eax-02h], 0a0dh
|
|
je _lFNPCheckBlockRet
|
|
mov word ptr [eax], 0a0dh
|
|
add eax, 02h
|
|
_lFNPCheckBlockRet:
|
|
retn
|
|
|
|
_lFNPCheckBlockSx:
|
|
xor eax, eax
|
|
retn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; copy line (function in)
|
|
_lFNPCopyFuncIn:
|
|
movsb
|
|
_lFNPCopyFuncInEx:
|
|
mov eax, dword ptr [esi]
|
|
;; cmp al, 00h
|
|
;; je _lFNPEnd
|
|
cmp ax, 7801h ;; #x
|
|
je _lFNPUnBlockErr
|
|
|
|
cmp al, 3ch ;; < = >
|
|
jb _lFNPCopyFuncInSx
|
|
cmp al, 3eh ;; >
|
|
jg _lFNPCopyFuncInDx
|
|
|
|
_lFNPCopyFuncInOx:
|
|
cmp byte ptr [esi+01h], 3dh ;; = ;; ==
|
|
je _lFNPCopyFuncIn
|
|
mov ah, 20h ;; _
|
|
mov word ptr [edi], ax
|
|
add edi, 02h
|
|
inc esi
|
|
jmp _lFNPCopyFuncInEx
|
|
|
|
_lFNPCopyFuncInDx:
|
|
cmp al, 5dh ;; ]
|
|
jne _lFNPCopyFuncInSx
|
|
cmp ax, 3d5dh ;; ]=
|
|
je _lFNPCopyFuncIn
|
|
jmp _lFNPCopyFuncInOx
|
|
|
|
_lFNPCopyFuncInSx:
|
|
cmp ax, 0a0dh
|
|
jne _next
|
|
|
|
movsw
|
|
|
|
;;----------------
|
|
;; interfaces ?
|
|
cmp ebx, 0100b
|
|
je _lFNPLine
|
|
;;----------------
|
|
|
|
mov dword ptr [_dBCP], edi
|
|
or ebx, 01h
|
|
|
|
mov dword ptr [_dFCL], offset _bFuncCodeLocals
|
|
mov dword ptr [_dFCB], offset _bFuncCodeBase
|
|
|
|
jmp _lFNPLine
|
|
|
|
_lbl:
|
|
cmp al, 06h ;; ex _
|
|
jne _lFNPCopyFuncIn
|
|
inc esi
|
|
jmp _lFNPCopyFuncInEx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; unknow block
|
|
_lFNPUnBlockErr:
|
|
mov dword ptr [_xErrorTable], offset _sErr_UnknowBlock
|
|
mov dword ptr [_xErrorTable+04h], edi
|
|
mov dword ptr [edi], 007b0a0dh ;; nl {
|
|
add edi, 03h
|
|
mov dword ptr [_xErrorTable+08h], edi
|
|
jmp _lErrIn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; copy line (no parse)
|
|
_lFNPCopySTR:
|
|
cmp byte ptr [_bStrXX], 00h
|
|
je _lFNPCopySTREX
|
|
movsb
|
|
mov byte ptr [edi], 20h
|
|
inc edi
|
|
jmp _lFNPCopyEx
|
|
|
|
_lFNPCopySTREX:
|
|
mov byte ptr [_bStrXX], al
|
|
mov byte ptr [edi], 20h
|
|
inc edi
|
|
|
|
_lFNPCopy:
|
|
movsb
|
|
_lFNPCopyEx:
|
|
mov eax, dword ptr [esi]
|
|
cmp al, 00h
|
|
je _lFNPEnd
|
|
cmp al, 22h ;; "
|
|
je _lFNPCopySTR
|
|
cmp ax, 7801h ;; #x
|
|
je _lFNPUnBlockErr
|
|
cmp ax, 0a0dh
|
|
jne _lFNPCopySx
|
|
test ebx, 01b
|
|
jp _lFNPLineEx
|
|
|
|
;;----------------
|
|
;; add line ex
|
|
movsw ;; copy nl
|
|
|
|
mov eax, esi
|
|
mov esi, offset _bFuncCodeOneLine
|
|
mov ecx, edi
|
|
sub ecx, esi
|
|
mov edi, dword ptr [_dFCB]
|
|
rep movsb
|
|
mov esi, eax
|
|
mov dword ptr [_dFCB], edi
|
|
jmp _lFNPLine
|
|
;;----------------
|
|
|
|
_lFNPCopySx:
|
|
cmp al, 06h ;; ex _
|
|
jne _lFNPCopy
|
|
inc esi
|
|
jmp _lFNPCopyEx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; copy line (with parse)
|
|
_lFNPCopyParse:
|
|
xor eax, eax
|
|
jmp _lFNPCopyParseNext
|
|
|
|
_lFNPCopyParseCX:
|
|
stosb
|
|
_lFNPCopyParseNext:
|
|
lodsb
|
|
|
|
cmp byte ptr [_bAscii_00+eax], 00h
|
|
jz _lFNPCopyParseSym
|
|
jmp _lFNPCopyParseCX
|
|
|
|
;;----------------
|
|
;; symbols
|
|
_lFNPCopyParseSym:
|
|
mov ecx, dword ptr [esi-01h]
|
|
|
|
cmp cx, 7c7ch ;; ||
|
|
jne _next
|
|
inc esi
|
|
mov dword ptr [edi], 20726f20h ;; _or_
|
|
add edi, 04h
|
|
jmp _lFNPCopyParseNext
|
|
|
|
_lbl:
|
|
cmp cl, 21h ;; !
|
|
jne _next
|
|
cmp cx, 3d21h ;; !=
|
|
jne _lFNPNot
|
|
stosb
|
|
movsb
|
|
jmp _lFNPCopyParseNext
|
|
_lFNPNot:
|
|
mov dword ptr [edi], 746f6e20h ;; _not
|
|
mov dword ptr [edi+04h], 20h ;; _
|
|
add edi, 05h
|
|
jmp _lFNPCopyParseNext
|
|
|
|
_lbl:
|
|
cmp cx, 2626h ;; &&
|
|
jne _next
|
|
inc esi
|
|
mov dword ptr [edi], 646e6120h ;; _and
|
|
mov dword ptr [edi+04h], 20h ;; _
|
|
add edi, 05h
|
|
jmp _lFNPCopyParseNext
|
|
|
|
_lbl:
|
|
cmp cx, 2b2bh ;; ++
|
|
jne _next
|
|
push 2bh ;; +
|
|
jmp _lFNPIncDecPreX
|
|
|
|
_lbl:
|
|
cmp cx, 2d2dh ;; --
|
|
jne _next
|
|
push 2dh ;; -
|
|
|
|
;;----------------
|
|
;; inc dec pre
|
|
_lFNPIncDecPreX:
|
|
push edi
|
|
inc esi
|
|
|
|
mov al, byte ptr [esi]
|
|
cmp byte ptr [_bAscii_00+eax], 00h
|
|
jz _lFNPCopyParseNext
|
|
|
|
mov al, byte ptr [esi-03h]
|
|
cmp byte ptr [_bAscii_00+eax], 00h
|
|
jz _lFNPCopyParseNext
|
|
|
|
mov byte ptr [edi], 20h ;; _
|
|
inc edi
|
|
inc dword ptr [esp]
|
|
|
|
jmp _lFNPCopyParseNext
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; string
|
|
_lbl:
|
|
cmp cl, 22h ;; "
|
|
jne _next
|
|
stosb
|
|
_lFNPCopyString:
|
|
cmp word ptr [esi], 3801h ;; #8
|
|
je _lFNPCopyStringFN
|
|
movsb
|
|
_lFNPCopyStringSX:
|
|
cmp byte ptr [edi-01h], 22h ;; "
|
|
je _lFNPCopyParseNext
|
|
cmp byte ptr [edi-01h], 5ch ;; \
|
|
je _lFNPCopyStringEX
|
|
jmp _lFNPCopyString
|
|
_lFNPCopyStringEX:
|
|
movsw
|
|
jmp _lFNPCopyStringSX
|
|
|
|
_lFNPCopyStringFN:
|
|
sub edi, 02h
|
|
add esi, 02h
|
|
xor eax, eax
|
|
mov ecx, dword ptr [_dLastFuncName]
|
|
|
|
_lFNPCopyStringFNFX:
|
|
mov al, byte ptr [ecx]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
je _lFNPCopyString
|
|
stosb
|
|
inc ecx
|
|
jmp _lFNPCopyStringFNFX
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp cx, 3d2bh ;; +=
|
|
jne _next
|
|
mov al, 2bh ;; +
|
|
jmp _lFNPPx
|
|
|
|
_lbl:
|
|
cmp cx, 3d2dh ;; -=
|
|
jne _next
|
|
mov al, 2dh ;; -
|
|
jmp _lFNPPx
|
|
|
|
_lbl:
|
|
cmp cx, 3d2ah ;; *=
|
|
jne _next
|
|
mov al, 2ah ;; *
|
|
jmp _lFNPPx
|
|
|
|
_lbl:
|
|
cmp cx, 3d2fh ;; /=
|
|
jne _next
|
|
mov al, 2fh ;; /
|
|
|
|
|
|
;;----------------
|
|
;; += -= *= /=
|
|
|
|
;;----------------
|
|
;; scan
|
|
_lFNPPx:
|
|
cmp byte ptr [edi-01h], 5dh ;; ]
|
|
jne _lFNPPxNorm
|
|
|
|
mov ecx, edi
|
|
xor edx, edx
|
|
|
|
_lFNPPxSS:
|
|
dec ecx
|
|
cmp byte ptr [ecx], 5bh ;; [
|
|
jne _lFNPPxDD
|
|
dec ah
|
|
jmp _lFNPPxSS
|
|
|
|
_lFNPPxDD:
|
|
cmp byte ptr [ecx], 5dh ;; ]
|
|
jne _lFNPPxFF
|
|
inc ah
|
|
jmp _lFNPPxSS
|
|
|
|
_lFNPPxFF:
|
|
cmp word ptr [ecx], 0a0dh ;; nl
|
|
je _lFNPPxNorm
|
|
cmp byte ptr [ecx], 28h ;; (
|
|
jne _lFNPPxSS
|
|
|
|
mov dl, byte ptr [ecx-01h]
|
|
cmp byte ptr [_bAscii_00+edx], dh
|
|
je _lFNPPxSS
|
|
|
|
;;----------------
|
|
;; ex index
|
|
mov ebp, esp
|
|
push ebx
|
|
mov ebx, dword ptr [ebp]
|
|
|
|
_lFNPPxII:
|
|
dec ecx
|
|
cmp byte ptr [ecx], 5dh ;; ]
|
|
jne _lFNPPxII_00
|
|
inc ah
|
|
jmp _lFNPPxII
|
|
|
|
_lFNPPxII_00:
|
|
cmp byte ptr [ecx], 5bh ;; [
|
|
jne _lFNPPxII
|
|
dec ah
|
|
jnz _lFNPPxII
|
|
|
|
mov edx, dword ptr [_dFCPL]
|
|
inc ecx
|
|
|
|
inc byte ptr [_bFCLL]
|
|
mov dword ptr [edx], 20746573h ;; set_
|
|
mov ah, byte ptr [_bFCLL]
|
|
mov dword ptr [edx+04h], 3d207871h ;; qx_=
|
|
mov byte ptr [edx+06h], ah
|
|
add edx, 08h
|
|
|
|
_lFNPPxII_01:
|
|
mov ah, byte ptr [ecx]
|
|
mov byte ptr [edx], ah
|
|
mov byte ptr [ecx], 20h
|
|
cmp ebx, ecx
|
|
jne _lFNPPxII_SC
|
|
mov dword ptr [ebp], edx
|
|
sub ebp, 04h
|
|
mov ebx, dword ptr [ebp]
|
|
|
|
_lFNPPxII_SC:
|
|
inc edx
|
|
inc ecx
|
|
cmp ecx, edi
|
|
jne _lFNPPxII_01
|
|
|
|
mov ah, byte ptr [_bFCLL]
|
|
mov word ptr [edx-01h], 0a0dh
|
|
mov dword ptr [edi-04h], 5d207871h ;; qx*]
|
|
inc edx
|
|
mov byte ptr [edi-02h], ah
|
|
|
|
mov dword ptr [_dFCPL], edx
|
|
pop ebx
|
|
;;----------------
|
|
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; norm
|
|
_lFNPPxNorm:
|
|
mov edx, edi
|
|
movsb ;; =
|
|
mov ecx, esi
|
|
_lFNPPxEX:
|
|
inc ecx
|
|
cmp word ptr [ecx], 0a0dh
|
|
jne _lFNPPxEX
|
|
mov word ptr [ecx], 3101h ;; #1
|
|
lea ecx, [edi-01h]
|
|
_lFNPPxSX:
|
|
dec edx
|
|
cmp dword ptr [edx-04h], 20746573h ;; set_
|
|
jne _lFNPPxSX
|
|
_lFNPPxDX:
|
|
mov ah, byte ptr [edx]
|
|
mov byte ptr [edi], ah
|
|
inc edx
|
|
inc edi
|
|
cmp edx, ecx
|
|
jb _lFNPPxDX
|
|
mov byte ptr [edi], al
|
|
mov byte ptr [edi+01h], 28h
|
|
add edi, 02h
|
|
xor eax, eax
|
|
jmp _lFNPCopyParseNext
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lbl:
|
|
cmp cl, 0eh ;; ;
|
|
jne _next
|
|
|
|
mov dword ptr [_dVarParams], edi
|
|
mov dword ptr [edi], 0a0dh ;; nl
|
|
dec esi
|
|
add edi, 02h
|
|
mov byte ptr [esi], 0ch ;; ;
|
|
test ebx, 01b
|
|
jp _lFNPLine
|
|
jmp _lFNPIncDecSTX
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp cx, 0a0dh ;; new line
|
|
jne _next
|
|
mov dword ptr [edi], 0a0dh ;; new line
|
|
inc esi
|
|
add edi, 02h
|
|
test ebx, 01b
|
|
jp _lFNPLine
|
|
|
|
;;----------------
|
|
;; ++ -- in stack
|
|
_lFNPIncDecSTX:
|
|
mov dword ptr [_dBuffer], esi
|
|
mov esi, edi
|
|
mov edi, dword ptr [_dFCB]
|
|
|
|
_lFNPIncDecSTXNext:
|
|
cmp dword ptr [esp], 00h
|
|
je _lFNPIncDecSTXEnd
|
|
|
|
pop ebp
|
|
xor eax, eax
|
|
xor edx, edx
|
|
mov al, byte ptr [ebp]
|
|
mov ecx, ebp ;; ecx = operation position
|
|
|
|
cmp byte ptr [_bAscii_03+eax], ah
|
|
jz _lFNPIDS_00p
|
|
|
|
;;----------------
|
|
;; pref
|
|
|
|
;;----------------
|
|
;; scan
|
|
_lFNPIDS_00:
|
|
inc ecx
|
|
mov al, byte ptr [ecx]
|
|
|
|
cmp al, 5bh ;; [
|
|
jne _lFNPIDS_01
|
|
inc edx
|
|
jmp _lFNPIDS_00
|
|
|
|
_lFNPIDS_01:
|
|
cmp al, 28h ;; (
|
|
jne _lFNPIDS_02
|
|
mov al, byte ptr [ecx-01h]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
jne _lFNPIDEI
|
|
jmp _lFNPIDS_00
|
|
|
|
_lFNPIDS_02:
|
|
cmp al, 5dh ;; ]
|
|
jne _lFNPIDS_03
|
|
test edx, edx
|
|
jz _lFNPIDS_04
|
|
dec edx
|
|
jnz _lFNPIDS_00
|
|
jmp _lFNPIDS_04
|
|
|
|
_lFNPIDS_03:
|
|
cmp byte ptr [_bAscii_03+eax], ah
|
|
jne _lFNPIDS_00
|
|
|
|
_lFNPIDS_04:
|
|
mov ecx, ebp
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; norm
|
|
_lFNPIncDecSTX_Norm:
|
|
mov dword ptr [edi], 20746573h ;; set_
|
|
add edi, 04h
|
|
jmp _lFNPIncDecSTXPre
|
|
|
|
_lFNPIncDecSTXPreNext:
|
|
inc ebp
|
|
_lFNPIncDecSTXPre:
|
|
mov al, byte ptr [ebp]
|
|
cmp al, 5bh ;; [
|
|
jne _lFNPIncDecSTXPre_00
|
|
inc edx
|
|
jmp _lFNPIncDecSTXPre_02
|
|
_lFNPIncDecSTXPre_00:
|
|
test edx, edx
|
|
jnz _lFNPIncDecSTXPre_03
|
|
cmp byte ptr [_bAscii_03+eax], ah
|
|
jne _lFNPIncDecSTXPre_02
|
|
_lFNPIncDecSTXPre_01:
|
|
mov edx, ecx
|
|
sub ecx, ebp
|
|
neg ecx
|
|
|
|
mov ebp, edi
|
|
mov byte ptr [edi], 3dh ;; =
|
|
inc edi
|
|
|
|
_lFNPIncDecSTXCopyNext:
|
|
mov al, byte ptr [edx]
|
|
inc edx
|
|
mov byte ptr [edi], al
|
|
inc edi
|
|
dec ecx
|
|
jnz _lFNPIncDecSTXCopyNext
|
|
pop eax
|
|
or eax, 0a0d3100h ;; x 1 new line
|
|
mov dword ptr [edi], eax
|
|
add edi, 04h
|
|
jmp _lFNPIncDecSTXNext
|
|
|
|
_lFNPIncDecSTXPre_02:
|
|
mov byte ptr [edi], al
|
|
inc edi
|
|
jmp _lFNPIncDecSTXPreNext
|
|
|
|
_lFNPIncDecSTXPre_03:
|
|
cmp al, 5dh ;; ]
|
|
jne _lFNPIncDecSTXPre_02
|
|
dec edx
|
|
jmp _lFNPIncDecSTXPre_02
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ex index
|
|
_lFNPIDEI:
|
|
inc byte ptr [_bFCLL]
|
|
mov ecx, ebp
|
|
xor edx, edx
|
|
mov al, byte ptr [_bFCLL]
|
|
|
|
mov dword ptr [edi], 20746573h ;; set_
|
|
mov dword ptr [edi+04h], 3d207871h ;; qx_=
|
|
mov byte ptr [edi+06h], al
|
|
add edi, 08h
|
|
|
|
_lFNPIDEIndexSet:
|
|
inc ecx
|
|
cmp byte ptr [ecx], 5bh ;; [
|
|
jne _lFNPIDEIndexSet
|
|
inc ecx
|
|
|
|
_lFNPIDEIndexSetEX:
|
|
mov ah, byte ptr [ecx]
|
|
cmp ah, 5bh ;; [
|
|
jne _lFNPIDEIndexSetFX
|
|
inc edx
|
|
jmp _lFNPIDEIndexSetCopy
|
|
|
|
_lFNPIDEIndexSetFX:
|
|
cmp ah, 5dh ;; ]
|
|
jne _lFNPIDEIndexSetCopy
|
|
dec edx
|
|
jns _lFNPIDEIndexSetCopy
|
|
|
|
mov word ptr [edi], 0a0dh ;; nl
|
|
mov word ptr [ecx-03h], 7871h ;; qx
|
|
mov byte ptr [ecx-01h], al
|
|
add edi, 02h
|
|
xor edx, edx
|
|
mov ecx, ebp
|
|
xor eax, eax
|
|
jmp _lFNPIncDecSTX_Norm
|
|
|
|
_lFNPIDEIndexSetCopy:
|
|
mov byte ptr [ecx], 20h ;; bs
|
|
mov byte ptr [edi], ah
|
|
inc ecx
|
|
inc edi
|
|
jmp _lFNPIDEIndexSetEX
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; post
|
|
|
|
;;----------------
|
|
;; scan
|
|
_lFNPIDS_00p:
|
|
dec ecx
|
|
mov al, byte ptr [ecx]
|
|
|
|
cmp al, 5dh ;; ]
|
|
jne _lFNPIDS_01p
|
|
inc edx
|
|
jmp _lFNPIDS_00p
|
|
|
|
_lFNPIDS_01p:
|
|
cmp al, 5bh ;; [
|
|
jne _lFNPIDS_02p
|
|
test edx, edx
|
|
jz _lFNPIDS_04p
|
|
dec edx
|
|
js _lFNPIDS_04p
|
|
jmp _lFNPIDS_00p
|
|
|
|
_lFNPIDS_02p:
|
|
cmp al, 28h ;; (
|
|
jne _lFNPIDS_03p
|
|
test edx, edx
|
|
jz _lFNPIDS_04p
|
|
mov al, byte ptr [ecx-01h]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
je _lFNPIDS_00p
|
|
jmp _lFNPIDEIp
|
|
|
|
_lFNPIDS_03p:
|
|
cmp byte ptr [_bAscii_03+eax], ah
|
|
jne _lFNPIDS_00p
|
|
test edx, edx
|
|
jnz _lFNPIDS_00p
|
|
|
|
_lFNPIDS_04p:
|
|
mov ecx, ebp
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; norm
|
|
_lFNPIncDecSTXPost:
|
|
mov byte ptr [_bCodePosOp], 01h ;; post operation = 1
|
|
_lFNPIncDecSTXPostNext:
|
|
dec ebp
|
|
mov al, byte ptr [ebp]
|
|
cmp al, 5dh ;; ]
|
|
jne _lFNPIncDecSTXPost_00
|
|
inc edx
|
|
jmp _lFNPIncDecSTXPostNext
|
|
_lFNPIncDecSTXPost_00:
|
|
cmp byte ptr [_bAscii_03+eax], ah
|
|
jnz _lFNPIncDecSTXPostNext
|
|
test edx, edx
|
|
jz _lFNPIncDecSTXPost_01
|
|
cmp al, 5bh ;; [
|
|
jne _lFNPIncDecSTXPostNext
|
|
dec edx
|
|
jmp _lFNPIncDecSTXPostNext
|
|
|
|
_lFNPIncDecSTXPost_01:
|
|
inc ebp
|
|
sub ecx, ebp
|
|
lea edx, [ecx+01h]
|
|
mov dword ptr [esi], 20746573h ;; set_
|
|
add esi, 04h
|
|
|
|
_lFNPIncDecSTXCopyEX:
|
|
mov al, byte ptr [ebp]
|
|
inc ebp
|
|
mov byte ptr [esi], al
|
|
mov byte ptr [esi+edx], al
|
|
inc esi
|
|
dec ecx
|
|
jnz _lFNPIncDecSTXCopyEX
|
|
mov byte ptr [esi], 3dh ;; =
|
|
add esi, edx
|
|
pop eax
|
|
or eax, 0a0d3100h ;; x 1 new line
|
|
mov dword ptr [esi], eax
|
|
add esi, 04h
|
|
jmp _lFNPIncDecSTXNext
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ex index
|
|
_lFNPIDEIpEX:
|
|
inc edx
|
|
_lFNPIDEIp:
|
|
dec ecx
|
|
cmp byte ptr [ecx], 5dh ;; ]
|
|
je _lFNPIDEIpEX
|
|
cmp byte ptr [ecx], 5bh ;; [
|
|
jne _lFNPIDEIp
|
|
dec edx
|
|
jnz _lFNPIDEIp
|
|
|
|
inc byte ptr [_bFCLL]
|
|
; push edi
|
|
mov al, byte ptr [_bFCLL]
|
|
; mov edi, dword ptr [_dFCPL]
|
|
|
|
mov dword ptr [edi], 20746573h ;; set_
|
|
mov dword ptr [edi+04h], 3d207871h ;; qx_=
|
|
mov byte ptr [edi+06h], al
|
|
add edi, 08h
|
|
lea edx, [ebp-01h]
|
|
|
|
_lFNPIDEIndexSetp:
|
|
inc ecx
|
|
mov ah, byte ptr [ecx]
|
|
mov byte ptr [edi], ah
|
|
inc edi
|
|
mov byte ptr [ecx], 20h ;; bs
|
|
cmp ecx, edx
|
|
jne _lFNPIDEIndexSetp
|
|
|
|
inc ecx
|
|
mov word ptr [edi-01h], 0a0dh
|
|
mov dword ptr [ebp-04h], 5d207871h ;; qx*]
|
|
inc edi
|
|
mov byte ptr [ebp-02h], al
|
|
xor eax, eax
|
|
; mov dword ptr [_dFCPL], edi
|
|
; pop edi
|
|
xor edx, edx
|
|
jmp _lFNPIncDecSTXPost
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; copy code
|
|
_lFNPIncDecSTXEnd:
|
|
|
|
;;----------------
|
|
cmp byte ptr [_bCodeSys], 00h
|
|
je _lFNPIncDecSTXEndDD
|
|
|
|
cmp byte ptr [_bCodePosOp], 00h
|
|
je _lFNPIncDecSTXEndFL
|
|
|
|
mov eax, offset _bFuncCodeOneLine
|
|
|
|
cmp word ptr [eax], 6669h ;; if
|
|
jne _lFNPEXExit
|
|
|
|
;;----------------
|
|
;; if
|
|
mov byte ptr [_bTempBool], 01h
|
|
mov dword ptr [eax], 20746573h ;; set_
|
|
mov dword ptr [eax+04h], 765f6a63h ;; cj_v
|
|
mov dword ptr [eax+08h], 5f363636h ;; 666_
|
|
mov word ptr [eax+0ch], 3d62h ;; b=
|
|
|
|
mov dword ptr [esi], 63206669h ;; if_c
|
|
mov dword ptr [esi+04h], 36765f6ah ;; j_v6
|
|
mov dword ptr [esi+08h], 625f3636h ;; 66_b
|
|
mov dword ptr [esi+0ch], 65687420h ;; _the
|
|
mov dword ptr [esi+10h], 000a0d6eh ;; en__
|
|
|
|
add esi, 13h
|
|
|
|
_lFNPIncDecSTXEndRemThen:
|
|
inc eax
|
|
cmp dword ptr [eax], 6e656874h ;; then
|
|
jne _lFNPIncDecSTXEndRemThen
|
|
cmp word ptr [eax+04h], 0a0dh ;; nl
|
|
jne _lFNPIncDecSTXEndRemThen
|
|
mov dword ptr [eax], 20202020h ;; bs
|
|
jmp _lFNPIncDecSTXEndFL
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; exitwhen
|
|
_lFNPEXExit:
|
|
cmp dword ptr [eax], 74697865h ;; exit
|
|
jne _lFNPEXRetn
|
|
|
|
mov dword ptr [eax], 20746573h ;; set_
|
|
mov dword ptr [eax+04h], 765f6a63h ;; cj_v
|
|
mov dword ptr [eax+08h], 5f363636h ;; 666_
|
|
mov word ptr [eax+0ch], 3d62h ;; b=
|
|
|
|
mov byte ptr [_bTempBool], 01h
|
|
|
|
mov dword ptr [esi], 74697865h ;; exit
|
|
mov dword ptr [esi+04h], 6e656877h ;; when
|
|
mov dword ptr [esi+08h], 5f6a6320h ;; _cj_
|
|
mov dword ptr [esi+0ch], 36363677h ;; v666
|
|
mov dword ptr [esi+10h], 0a0d625fh ;; _b__
|
|
|
|
add esi, 14h
|
|
|
|
jmp _lFNPIncDecSTXEndFL
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; return
|
|
_lFNPEXRetn:
|
|
mov byte ptr [_bTempType], 01h
|
|
mov dword ptr [eax], 20746573h ;; set_
|
|
mov dword ptr [eax+04h], 765f6a63h ;; cj_v
|
|
mov dword ptr [eax+08h], 5f363636h ;; 666_
|
|
mov word ptr [eax+0ch], 3d72h ;; r=
|
|
|
|
mov dword ptr [esi], 75746572h ;; retu
|
|
mov dword ptr [esi+04h], 63206e72h ;; rn_c
|
|
mov dword ptr [esi+08h], 36765f6ah ;; j_v6
|
|
mov dword ptr [esi+0ch], 725f3636h ;; 66_r
|
|
mov word ptr [esi+10h], 0a0dh ;; nl
|
|
|
|
add esi, 12h
|
|
;;----------------
|
|
|
|
_lFNPIncDecSTXEndFL:
|
|
mov byte ptr [_bCodeSys], 00h
|
|
;;----------------
|
|
|
|
;;----------------
|
|
_lFNPIncDecSTXEndDD:
|
|
mov edx, esi
|
|
|
|
mov ecx, dword ptr [_dFCPL]
|
|
mov esi, offset _bFuncPostEX
|
|
sub ecx, esi
|
|
rep movsb
|
|
mov dword ptr [_dFCPL], offset _bFuncPostEX
|
|
|
|
;;----------------
|
|
;; locals
|
|
cmp dword ptr [_bFuncCodeOneLine], 61636f6ch ;; loca
|
|
jne _lFNPIncDecSTXEndSFXD_Pre
|
|
cmp word ptr [_bFuncCodeOneLine+04h], 206ch ;; l_
|
|
jne _lFNPIncDecSTXEndSFXD_Pre
|
|
|
|
mov dword ptr [_dFCB], edi
|
|
mov edi, dword ptr [_dFCL]
|
|
mov esi, offset _bFuncCodeOneLine
|
|
cmp dword ptr [_dFCB], offset _bFuncCodeBase
|
|
jne _lFNPLoc_02
|
|
|
|
;;----------------
|
|
;; norm
|
|
_lFNPLoc_00:
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
je _lFNPLoc_01
|
|
movsb
|
|
jmp _lFNPLoc_00
|
|
|
|
_lFNPLoc_01:
|
|
movsw
|
|
mov dword ptr [_dFCL], edi
|
|
mov edi, dword ptr [_dFCB]
|
|
jmp _lFNPIncDecSTXEndSFXD
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; ex
|
|
_lFNPLoc_02:
|
|
cmp word ptr [esi], 0a0dh ;; nl
|
|
je _lFNPLoc_00
|
|
cmp byte ptr [esi], 3dh ;; =
|
|
je _lFNPLoc_03
|
|
|
|
movsb
|
|
jmp _lFNPLoc_02
|
|
|
|
;;----------------
|
|
;; scan
|
|
_lFNPLoc_03:
|
|
mov ecx, esi
|
|
xor eax, eax
|
|
|
|
_lFNPLoc_03_AX:
|
|
inc ecx
|
|
|
|
_lFNPLoc_03_AXX:
|
|
cmp word ptr [ecx], 0a0dh
|
|
je _lFNPLoc_00
|
|
|
|
_lFNPLoc_03_BX:
|
|
mov al, byte ptr [ecx]
|
|
cmp al, 22h ;; "
|
|
je _lFNPLoc_03_Str
|
|
|
|
cmp al, 30h
|
|
jb _lFNPLoc_03_AX
|
|
cmp al, 3ah
|
|
jb _lFNPLoc_03_Dgt
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
je _lFNPLoc_03_AX
|
|
|
|
;;----------------
|
|
;; check word
|
|
mov ebp, offset _sCodeConst
|
|
push ecx
|
|
|
|
_lFNPLoc_03_Word:
|
|
mov al, byte ptr [ecx]
|
|
cmp byte ptr [ebp], al
|
|
jne _lFNPLoc_03_WordNext
|
|
inc ecx
|
|
inc ebp
|
|
jmp _lFNPLoc_03_Word
|
|
|
|
_lFNPLoc_03_WordNext:
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
jne _lFNPLoc_03_WordNextFX
|
|
cmp byte ptr [ebp], ah
|
|
jne _lFNPLoc_03_WordNextFX
|
|
|
|
add esp, 04h
|
|
jmp _lFNPLoc_03_AXX
|
|
|
|
_lFNPLoc_03_WordNextFX:
|
|
mov ecx, dword ptr [esp]
|
|
_lFNPLoc_03_WordNextEX:
|
|
inc ebp
|
|
cmp byte ptr [ebp], ah
|
|
jne _lFNPLoc_03_WordNextEX
|
|
|
|
inc ebp
|
|
cmp byte ptr [ebp], 00h
|
|
jne _lFNPLoc_03_Word
|
|
|
|
pop ecx
|
|
jmp _lFNPLoc_05
|
|
;;----------------
|
|
|
|
_lFNPLoc_03_Dgt:
|
|
inc ecx
|
|
mov al, byte ptr [ecx]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
jne _lFNPLoc_03_Dgt
|
|
jmp _lFNPLoc_03_AXX
|
|
|
|
_lFNPLoc_03_Str:
|
|
inc ecx
|
|
cmp byte ptr [ecx], 5ch ;; \
|
|
jne _lFNPLoc_03_StrEX
|
|
add ecx, 02h
|
|
_lFNPLoc_03_StrEX:
|
|
cmp byte ptr [ecx], 22h ;; "
|
|
jne _lFNPLoc_03_Str
|
|
jmp _lFNPLoc_03_AX
|
|
;;----------------
|
|
|
|
_lFNPLoc_05:
|
|
mov word ptr [edi], 0a0dh
|
|
add edi, 02h
|
|
mov dword ptr [_dFCL], edi
|
|
mov edi, dword ptr [_dFCB]
|
|
mov dword ptr [edi], 20746573h ;; set_
|
|
add edi, 04h
|
|
|
|
_lFNPLoc_04:
|
|
dec esi
|
|
cmp byte ptr [esi-01h], 20h ;; bs
|
|
jne _lFNPLoc_04
|
|
jmp _lFNPIncDecSTXEndSFXD
|
|
;;----------------
|
|
;;----------------
|
|
|
|
_lFNPIncDecSTXEndSFXD_Pre:
|
|
mov esi, offset _bFuncCodeOneLine
|
|
|
|
_lFNPIncDecSTXEndSFXD:
|
|
mov ecx, edx
|
|
sub ecx, esi
|
|
rep movsb
|
|
|
|
mov al, byte ptr [_bFCLL]
|
|
cmp byte ptr [_bFCLLMAX], al
|
|
jg _lFNPIncDecSTXEndXX
|
|
mov byte ptr [_bFCLLMAX], al
|
|
_lFNPIncDecSTXEndXX:
|
|
mov byte ptr [_bFCLL], 40h
|
|
;;----------------
|
|
|
|
mov esi, dword ptr [_dBuffer]
|
|
|
|
mov dword ptr [_dFCB], edi
|
|
jmp _lFNPLine
|
|
;;----------------
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp cl, 06h ;; ex bs
|
|
je _lFNPCopyParseNext
|
|
|
|
_lbl:
|
|
cmp cl, 01h ;; #
|
|
jne _lFNPCopyParseCX
|
|
|
|
;;----------------
|
|
;; parse #
|
|
cmp cx, 3001h ;; #0
|
|
jne _next
|
|
mov word ptr [esi-01h], 0a0dh ;; new line
|
|
inc esi
|
|
mov dword ptr [edi], 65687420h ;; _the
|
|
mov dword ptr [edi+04h], 000a0d6eh ;; n new line
|
|
add edi, 07h ;; !
|
|
jmp _lFNPIncDecSTX
|
|
|
|
_lbl:
|
|
cmp cx, 3101h ;; #1
|
|
jne _next
|
|
mov word ptr [esi-01h], 0a0dh ;; new line
|
|
mov dword ptr [edi], 000a0d29h ;; )__x
|
|
inc esi
|
|
add edi, 03h ;; !!!
|
|
jmp _lFNPIncDecSTX
|
|
|
|
_lbl:
|
|
cmp cx, 6601h ;; #f
|
|
jne _next
|
|
inc esi
|
|
mov dword ptr [edi], 6e650a0dh ;; nl en
|
|
mov dword ptr [edi+04h], 6f6f6c64h ;; dloo
|
|
mov dword ptr [edi+08h], 000a0d70h ;; p nl
|
|
add edi, 0bh
|
|
jmp _lFNPIncDecSTX
|
|
|
|
;;----------------
|
|
;; func name
|
|
_lbl:
|
|
cmp cx, 3801h ;; #8
|
|
jne _next
|
|
|
|
inc esi
|
|
sub edi, 02h
|
|
xor eax, eax
|
|
mov ecx, dword ptr [_dLastFuncName]
|
|
|
|
_lFNPFuncNameCopy:
|
|
mov al, byte ptr [ecx]
|
|
cmp byte ptr [_bAscii_00+eax], ah
|
|
je _lFNPCopyParseNext
|
|
stosb
|
|
inc ecx
|
|
jmp _lFNPFuncNameCopy
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp cx, 3301h ;; #3
|
|
jne _next
|
|
mov word ptr [esi-01h], 0a0dh ;; new line
|
|
inc esi
|
|
mov dword ptr [edi], 6e650a0dh ;; __en
|
|
mov dword ptr [edi+04h], 6f6c6764h ;; dglo
|
|
mov dword ptr [edi+08h], 736c6162h ;; bals
|
|
mov word ptr [edi+0ch], 0a0dh ;; __
|
|
add edi, 0eh
|
|
jmp _lFNPLine
|
|
|
|
_lbl:
|
|
cmp cx, 7801h ;; #x
|
|
je _lFNPUnBlockErr
|
|
|
|
_lbl:
|
|
cmp cx, 7001h ;; #p
|
|
jne _next
|
|
mov al, 2bh ;; +
|
|
|
|
;;----------------
|
|
;; inc/dec
|
|
_lFNPIncDec:
|
|
|
|
;;----------------
|
|
;; scan
|
|
cmp byte ptr [edi-01h], 5dh ;; ]
|
|
jne _lFNPIncDecNormJJ
|
|
|
|
mov edx, edi
|
|
xor ecx, ecx
|
|
|
|
_lFNPIncDecFXScan:
|
|
dec edx
|
|
|
|
cmp byte ptr [edx], 28h ;; (
|
|
jne _lFNPIncDecFXScan_00
|
|
mov cl, byte ptr [edx-01h]
|
|
cmp byte ptr [_bAscii_00+ecx], ch
|
|
je _lFNPIncDecFXScan
|
|
|
|
;;----------------
|
|
;; ex index
|
|
_lFNPIncDecEXI_00:
|
|
dec edx
|
|
cmp dword ptr [edx-04h], 20746573h ;; set_
|
|
jne _lFNPIncDecEXI_00
|
|
|
|
_lFNPIncDecEXI_01:
|
|
inc edx
|
|
cmp byte ptr [edx], 5bh ;; [
|
|
jne _lFNPIncDecEXI_01
|
|
|
|
mov ebp, esp
|
|
push ebx
|
|
mov ebx, dword ptr [ebp]
|
|
|
|
mov ecx, dword ptr [_dFCPL]
|
|
inc edx
|
|
|
|
inc byte ptr [_bFCLL]
|
|
mov dword ptr [ecx], 20746573h ;; set_
|
|
mov ah, byte ptr [_bFCLL]
|
|
mov dword ptr [ecx+04h], 3d207871h ;; qx_=
|
|
mov byte ptr [ecx+06h], ah
|
|
add ecx, 08h
|
|
|
|
_lFNPIncDecEXI_02:
|
|
mov ah, byte ptr [edx]
|
|
mov byte ptr [ecx], ah
|
|
mov byte ptr [edx], 20h
|
|
cmp ebx, edx
|
|
jne _lFNPIncDecEXI_03
|
|
mov dword ptr [ebp], ecx
|
|
sub ebp, 04h
|
|
mov ebx, dword ptr [ebp]
|
|
|
|
_lFNPIncDecEXI_03:
|
|
inc ecx
|
|
inc edx
|
|
cmp edx, edi
|
|
jne _lFNPIncDecEXI_02
|
|
|
|
mov ah, byte ptr [_bFCLL]
|
|
mov word ptr [ecx-01h], 0a0dh ;; nl
|
|
mov dword ptr [edi-04h], 5d207871h ;; qx*]
|
|
inc ecx
|
|
mov byte ptr [edi-02h], ah
|
|
|
|
mov dword ptr [_dFCPL], ecx
|
|
pop ebx
|
|
|
|
jmp _lFNPIncDecNormJJ
|
|
;;----------------
|
|
|
|
_lFNPIncDecFXScan_00:
|
|
cmp word ptr [edx], 0a0dh ;; nl
|
|
jne _lFNPIncDecFXScan
|
|
;;----------------
|
|
|
|
_lFNPIncDecNormJJ:
|
|
mov edx, edi
|
|
mov ecx, edi
|
|
_lFNPIncDecEX:
|
|
dec edx
|
|
cmp dword ptr [edx-04h], 20746573h ;; set_
|
|
jne _lFNPIncDecEX
|
|
mov byte ptr [edi], 3dh ;; =
|
|
inc edi
|
|
_lFNPIncDecSX:
|
|
mov ah, byte ptr [edx]
|
|
mov byte ptr [edi], ah
|
|
inc edx
|
|
inc edi
|
|
cmp edx, ecx
|
|
jb _lFNPIncDecSX
|
|
mov byte ptr [edi], al
|
|
mov dword ptr [edi+01h], 000a0d31h ;; 1__x
|
|
add edi, 04h
|
|
add esi, 03h ;; !!!
|
|
jmp _lFNPIncDecSTX
|
|
;;----------------
|
|
|
|
_lbl:
|
|
cmp cx, 6d01h ;; #m
|
|
;;jne _next
|
|
mov al, 2dh ;; -
|
|
jmp _lFNPIncDec
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; multidefined variables
|
|
_lFNPVarX:
|
|
inc esi
|
|
mov edx, esi ;; store esi
|
|
mov esi, dword ptr [_dVarParams]
|
|
; mov word ptr [edi], 0a0dh
|
|
; add edi, 02h
|
|
_lbl: ;; search begin of parsed line
|
|
dec esi
|
|
cmp word ptr [esi-02h], 0a0dh
|
|
je _lNPVarXKeyPreX
|
|
cmp byte ptr [esi-01h], 00h
|
|
jne _prew
|
|
|
|
_lNPVarXKeyPreX:
|
|
mov eax, dword ptr [esi]
|
|
|
|
cmp eax, 61636f6ch ;; loca
|
|
jne _next
|
|
cmp word ptr [esi+04h], 206ch ;; l_
|
|
jne _next
|
|
movsd
|
|
movsw
|
|
jmp _lNPVarXKeyPreX
|
|
|
|
_lbl:
|
|
cmp eax, 76697270h ;; priv
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 20657461h ;; ate_
|
|
jne _next
|
|
movsd
|
|
movsd
|
|
jmp _lNPVarXKeyPreX
|
|
|
|
_lbl:
|
|
cmp eax, 6c627570h ;; publ
|
|
jne _next
|
|
cmp word ptr [esi+04h], 6369h ;; ic
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 20h ;; _
|
|
jne _next
|
|
movsd
|
|
movsw
|
|
movsb
|
|
jmp _lNPVarXKeyPreX
|
|
|
|
_lbl:
|
|
cmp eax, 74617473h ;; stat
|
|
jne _next
|
|
cmp word ptr [esi+04h], 6369h ;; ic
|
|
jne _next
|
|
cmp byte ptr [esi+06h], 20h ;; _
|
|
jne _next
|
|
movsd
|
|
movsw
|
|
movsb
|
|
jmp _lNPVarXKeyPreX
|
|
|
|
_lbl:
|
|
cmp eax, 736e6f63h ;; cons
|
|
jne _next
|
|
cmp dword ptr [esi+04h], 746e6174h ;; tant
|
|
jne _next
|
|
cmp byte ptr [esi+08h], 20h ;; _
|
|
jne _next
|
|
movsd
|
|
movsd
|
|
movsb
|
|
jmp _lNPVarXKeyPreX
|
|
|
|
_lbl:
|
|
cmp eax, 75626564h ;; debu
|
|
jne _next
|
|
cmp word ptr [esi+04h], 2067h ;; g_
|
|
jne _next
|
|
movsd
|
|
movsw
|
|
jmp _lNPVarXKeyPreX
|
|
|
|
_lbl:
|
|
movsb ;; copy type
|
|
cmp byte ptr [esi-01h], 20h
|
|
jne _prew
|
|
|
|
_lbl: ;; search next word
|
|
cmp dword ptr [esi], 61727261h ;; arra
|
|
jne _next
|
|
cmp word ptr [esi+04h], 2079h ;; y_
|
|
jne _next
|
|
mov dword ptr [edi], 61727261h ;; arra
|
|
mov word ptr [edi+04h], 2079h ;; y_
|
|
add edi, 06h
|
|
_lbl:
|
|
mov esi, edx ;; restore esi
|
|
xor eax, eax
|
|
jmp _lFNPCopyParseNext
|
|
;;----------------
|
|
;;----------------
|
|
;;----------------
|
|
|
|
_lFNPEnd:
|
|
cmp word ptr [edi-02h], 0a0dh ;; new line
|
|
jne _next
|
|
sub edi, 02h
|
|
_lbl:
|
|
|
|
;;----------------
|
|
add esi, 04h
|
|
mov esp, _dStackPos ;; restore esp
|
|
sub edi, esi ;; edi = new script size
|
|
add esp, 04h
|
|
|
|
;;----------------
|
|
mov _dCurrStr, offset _sProg_05
|
|
mov eax, 64h
|
|
call _lSetProg
|
|
;;----------------
|
|
|
|
retn
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; parse endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;;-------------------------------------------------------------------------
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; proc codep
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
_lOpenMapCode:
|
|
|
|
push THREAD_PRIORITY_TIME_CRITICAL
|
|
push dword ptr [_hTrd]
|
|
call _imp__SetThreadPriority@8
|
|
|
|
mov dword ptr [_dPreStackPos], esp ;; for error
|
|
|
|
push 0ffh
|
|
push 04h
|
|
push offset _sMapPath
|
|
call _imp__MpqOpenArchiveForUpdate@12
|
|
|
|
test eax, eax
|
|
jnz _lCodep_00
|
|
|
|
;;----------------
|
|
;; error
|
|
push MB_ICONERROR
|
|
push offset _sWinName
|
|
push offset _sErr_Arch
|
|
push dword ptr [_hWnd]
|
|
call _imp__MessageBoxA@16
|
|
push 01h
|
|
call _imp__ExitProcess@4
|
|
;;----------------
|
|
|
|
_lCodep_00:
|
|
push offset _sAttr
|
|
push eax
|
|
|
|
push offset _fScr
|
|
push 00h
|
|
push offset _sWJ
|
|
push eax
|
|
call _imp__SFileOpenFileEx@16
|
|
|
|
test eax, eax
|
|
jnz _next
|
|
|
|
;;----------------
|
|
;; error
|
|
push MB_ICONERROR
|
|
push offset _sWinName
|
|
push offset _sErr_Code
|
|
push dword ptr [_hWnd]
|
|
call _imp__MessageBoxA@16
|
|
push 01h
|
|
call _imp__ExitProcess@4
|
|
;;----------------
|
|
|
|
_lbl:
|
|
push 00h
|
|
push _fScr
|
|
call _imp__SFileGetFileSize@8
|
|
mov ebx, eax
|
|
|
|
shl eax, 06h
|
|
add eax, 00800000h ;; add 8 megabyte to include
|
|
push eax
|
|
push GMEM_ZEROINIT
|
|
call _imp__GlobalAlloc@8
|
|
push eax ;; SrcMem handle
|
|
|
|
push eax
|
|
call _imp__GlobalLock@4
|
|
mov esi, eax ;; esi = SrcMem address
|
|
push eax
|
|
lea edi, [eax+ebx+04h] ;; edi = DestMem address
|
|
|
|
push edi
|
|
|
|
push 00h
|
|
push 00h
|
|
push edi
|
|
push esi
|
|
push _fScr
|
|
call _imp__SFileReadFile@20
|
|
|
|
;;----------------
|
|
;; start code processing
|
|
call dword ptr [_dMapProcCode]
|
|
add esp, 04h
|
|
;;----------------
|
|
|
|
push dword ptr [_dfilename]
|
|
call _imp__DeleteFileA@4
|
|
|
|
push 00h
|
|
push FILE_ATTRIBUTE_ARCHIVE
|
|
push CREATE_ALWAYS
|
|
push 00h
|
|
push FILE_SHARE_WRITE
|
|
push GENERIC_WRITE
|
|
push dword ptr [_dfilename]
|
|
call _imp__CreateFileA@28
|
|
|
|
push eax ;; ---> _imp__CloseHandle@4
|
|
|
|
push 00h
|
|
push offset _dBuffer
|
|
push edi ;; <--- !!! byter to write
|
|
push esi
|
|
push eax
|
|
call _imp__WriteFile@20
|
|
|
|
call _imp__CloseHandle@4
|
|
|
|
call _imp__GlobalUnlock@4
|
|
call _imp__GlobalFree@4
|
|
|
|
mov ebp, dword ptr [esp]
|
|
call _imp__MpqDeleteFile@8
|
|
|
|
push 09h
|
|
push 02h ;; 08h
|
|
push 0201h ;; MAFA_REPLACE_EXISTING
|
|
push offset _sWJ
|
|
push dword ptr [_dfilename];offset _sWJ
|
|
push ebp
|
|
call _imp__MpqAddFileToArchiveEx@24
|
|
|
|
push ebp
|
|
call _imp__MpqCompactArchive@4
|
|
|
|
push 00h
|
|
push ebp
|
|
call _imp__MpqCloseUpdatedArchive@8
|
|
|
|
_lOpenMapCodeEnd:
|
|
push 00h
|
|
push 00h
|
|
push WM_PROCEND
|
|
push _hWnd
|
|
call _imp__PostMessageA@16
|
|
|
|
xor eax, eax
|
|
retn
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; codep endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;;-------------------------------------------------------------------------
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; proc main
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
start: ;; <---
|
|
|
|
;;----------------
|
|
;; command line
|
|
call _imp__GetCommandLineA@0
|
|
mov ebx, eax
|
|
dec ebx
|
|
|
|
_lCLScanStart:
|
|
inc ebx
|
|
cmp byte ptr [ebx], 00h
|
|
je _lCLAbout
|
|
cmp byte ptr [ebx], 2fh
|
|
jne _lCLScanStart
|
|
|
|
;;----------------
|
|
;; do not remove unused code
|
|
cmp dword ptr [ebx+01h], 20706f6eh ;; nop
|
|
jne _lCLScanVerEX
|
|
|
|
mov dword ptr [_dWarVerSL], 00h
|
|
add ebx, 05h
|
|
|
|
jmp _lCLScanMap
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; version
|
|
_lCLScanVerEX:
|
|
cmp dword ptr [ebx+01h], 20333276h ;; v23
|
|
jne _lCLScanVer
|
|
|
|
add ebx, 05h
|
|
mov dword ptr [_dWarVerSL], offset _sVer23
|
|
jmp _lCLScanDbg
|
|
|
|
_lCLScanVer:
|
|
cmp dword ptr [ebx+01h], 20343276h ;; v24
|
|
jne _lCLScanDbg
|
|
|
|
add ebx, 05h
|
|
mov dword ptr [_dWarVerSL], offset _sVer24
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; debug mode?
|
|
_lCLScanDbg:
|
|
cmp dword ptr [ebx+01h], 20676264h ;; dbg_
|
|
jne _lCLScanMap
|
|
add ebx, 05h
|
|
mov dword ptr [_dDbgOff], offset _lCRDebugAdd
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; parse mappath
|
|
_lCLScanMap:
|
|
cmp dword ptr [ebx+01h], 6f70616dh ;; mapo ;; mapoptz="..."
|
|
jne _lCLScanMapEX
|
|
mov dword ptr [_dMapProcCode], offset _lMapOptimizeCode
|
|
mov dword ptr [_dfilename], offset _sWJO
|
|
jmp _lCLMapScanSX
|
|
|
|
_lCLScanMapEX:
|
|
cmp dword ptr [ebx+01h], 7070616dh ;; mapp ;; mappars="..."
|
|
jne _lCLAbout
|
|
mov dword ptr [_dMapProcCode], offset _lMapParseCode
|
|
|
|
_lCLMapScanSX:
|
|
mov edi, offset _sMapPath
|
|
lea esi, [ebx+0ah]
|
|
|
|
_lCLScanMapNext:
|
|
mov al, byte ptr [esi]
|
|
cmp al, 22h
|
|
je _lCLScanMapEnd
|
|
|
|
mov byte ptr [edi], al
|
|
mov byte ptr [edi+_dMapPathToEX], al
|
|
inc esi
|
|
inc edi
|
|
jmp _lCLScanMapNext
|
|
|
|
;;----------------
|
|
;; find map directory
|
|
_lCLScanMapEnd:
|
|
add edi, _dMapPathToEX
|
|
_lCLFindMapDirr:
|
|
dec edi
|
|
cmp byte ptr [edi], 5ch
|
|
jne _lCLFindMapDirr
|
|
mov dword ptr [_dMapPathEnd], edi
|
|
jmp _lCLSetCurrDir
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; about
|
|
_lCLAbout:
|
|
mov dword ptr [_hWndCls], CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
|
|
mov dword ptr [_hWndCls+04h], offset _lInfoStart
|
|
mov dword ptr [_hWndCls+18h], 00h
|
|
mov dword ptr [_dBuffer], 00ff0000h
|
|
mov dword ptr [_dWndStlEx], WS_VISIBLE or WS_CAPTION or WS_SYSMENU
|
|
|
|
push IDC_ARROW
|
|
push 00h
|
|
call _imp__LoadCursorA@8
|
|
mov dword ptr [_dStdCursor], eax
|
|
|
|
push 40h
|
|
push 00400000h
|
|
call _imp__LoadCursorA@8
|
|
mov dword ptr [_dExCursor], eax
|
|
|
|
push offset _xWWWFont
|
|
call _imp__CreateFontIndirectA@4
|
|
mov dword ptr [_dWWWFont], eax
|
|
|
|
jmp _lSrartEX
|
|
;;----------------
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; set legal current directory
|
|
_lCLSetCurrDir:
|
|
mov edi, offset _sCurrDir
|
|
push edi
|
|
push edi
|
|
push 0200h
|
|
call _imp__GetCurrentDirectoryA@8
|
|
add edi, eax
|
|
cmp dword ptr [edi-04h], 7265706ch ;; lper
|
|
je _next
|
|
mov dword ptr [edi], 6964415ch ;; \Adi
|
|
mov dword ptr [edi+04h], 6c654863h ;; cHel
|
|
mov dword ptr [edi+08h], 00726570h ;; per_
|
|
add edi, 0bh
|
|
call _imp__SetCurrentDirectoryA@4
|
|
_lbl:
|
|
mov dword ptr [edi], 62696c5ch ;; \lib
|
|
mov byte ptr [edi+04h], 5ch ;; \
|
|
add edi, 04h ;; !!!
|
|
mov _dCurrDirEnd, edi
|
|
;;----------------
|
|
|
|
_lSrartEX:
|
|
xor ebx, ebx
|
|
;;push ebx ;; ebx ---> ExitProcess
|
|
|
|
;;----------------
|
|
;; load gui font
|
|
;;push 11h
|
|
;;call _imp__GetStockObject@4
|
|
push offset _xGuiFont
|
|
call _imp__CreateFontIndirectA@4
|
|
mov dword ptr [_dGuiFont], eax
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; create main window
|
|
push 20h
|
|
push 400000h
|
|
call _imp__LoadIconA@8
|
|
mov dword ptr [_hWndCls+14h], eax
|
|
mov dword ptr [_hErrCls+14h], eax
|
|
;; mov dword ptr [_hIconCJ], eax
|
|
|
|
push offset _hWndCls
|
|
call _imp__RegisterClassA@4
|
|
|
|
push ebx
|
|
push 400000h
|
|
push ebx
|
|
push ebx
|
|
push 79h
|
|
push 0192h
|
|
push SM_CYSCREEN
|
|
call _imp__GetSystemMetrics@4
|
|
shr eax, 01h
|
|
sub eax, 4bh
|
|
push eax
|
|
push SM_CXSCREEN
|
|
call _imp__GetSystemMetrics@4
|
|
shr eax, 01h
|
|
sub eax, 00c9h
|
|
push eax
|
|
push dword ptr [_dWndStlEx]
|
|
push offset _sWinName
|
|
push offset _sWJ
|
|
push ebx
|
|
call _imp__CreateWindowExA@48
|
|
mov _hWnd, eax
|
|
|
|
push SW_SHOWNORMAL or SW_RESTORE
|
|
push eax
|
|
call _imp__ShowWindow@8
|
|
;;----------------
|
|
|
|
cmp dword ptr [_dMapProcCode], 00h
|
|
jz _lExitButton
|
|
|
|
;;----------------
|
|
;; create progress bar
|
|
push ebx ;; 02h ;; control id
|
|
push dword ptr [_hWnd]
|
|
push 12h
|
|
push 016ah
|
|
push 3eh
|
|
push 10h
|
|
push WS_CHILD or WS_VISIBLE or PBS_SMOOTH
|
|
push ebx
|
|
push offset _sProgBar
|
|
push ebx
|
|
call _imp__CreateWindowExA@48
|
|
mov dword ptr [_hPrg], eax
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; create thread
|
|
push offset _hTrd
|
|
push ebx
|
|
push ebx
|
|
push offset _lOpenMapCode
|
|
push 0800h
|
|
push ebx
|
|
call _imp__CreateThread@24
|
|
|
|
push eax
|
|
call _imp__CloseHandle@4
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; message loop
|
|
_lWndLS:
|
|
push ebx
|
|
push ebx
|
|
push ebx
|
|
push offset _hWndCls
|
|
call _imp__GetMessageA@16
|
|
push offset _hWndCls
|
|
call _imp__DispatchMessageA@4
|
|
jmp _lWndLS
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; add exit button
|
|
_lExitButton:
|
|
push ebx
|
|
push dword ptr [_hWnd]
|
|
push 16h
|
|
push 72h
|
|
push 3ch
|
|
push 90h
|
|
push WS_CHILD or WS_VISIBLE
|
|
push offset _sExit
|
|
push offset _sButton
|
|
push ebx
|
|
call _imp__CreateWindowExA@48
|
|
|
|
push eax ;; ---> _imp__SetFocus
|
|
|
|
push ebx
|
|
push dword ptr [_dGuiFont]
|
|
push WM_SETFONT
|
|
push eax
|
|
|
|
call _imp__SendMessageA@16
|
|
|
|
call _imp__SetFocus@4
|
|
|
|
jmp _lWndLS
|
|
;;----------------
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; main endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; proc wnd
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
_hWndProc:
|
|
mov eax, dword ptr [esp+08h]
|
|
|
|
cmp eax, WM_PAINT
|
|
je _wmPaint
|
|
|
|
cmp eax, WM_PROCEND
|
|
je _wmEnd
|
|
|
|
cmp eax, WM_CJ_ERROR
|
|
je _wmErrS
|
|
|
|
jmp _imp__DefWindowProcA@16
|
|
|
|
_wmEnd:
|
|
push 00h
|
|
call _imp__ExitProcess@4
|
|
ret 10h
|
|
|
|
_wmPaint:
|
|
push offset _xPntStr
|
|
push dword ptr [esp+08h]
|
|
|
|
push dword ptr [esp+04h]
|
|
push dword ptr [esp+04h]
|
|
|
|
call _imp__BeginPaint@8
|
|
mov ebx, eax
|
|
|
|
push dword ptr [_dGuiFont]
|
|
push ebx
|
|
call _imp__SelectObject@8
|
|
|
|
push TRANSPARENT
|
|
push ebx
|
|
call _imp__SetBkMode@8
|
|
|
|
push DT_LEFT or DT_SINGLELINE or DT_PATH_ELLIPSIS
|
|
push offset _xRect_01
|
|
push 0ffffffffh
|
|
push _dCurrStr
|
|
push ebx
|
|
call _imp__DrawTextA@20
|
|
|
|
push DT_LEFT or DT_SINGLELINE or DT_PATH_ELLIPSIS
|
|
push offset _xRect_00
|
|
push 0ffffffffh
|
|
push offset _sMapPath
|
|
push ebx
|
|
call _imp__DrawTextA@20
|
|
|
|
call _imp__EndPaint@8
|
|
ret 10h
|
|
|
|
_wmErrS:
|
|
push dword ptr [_hWnd]
|
|
call _imp__DestroyWindow@4
|
|
ret 10h
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; wnd endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; proc infownd
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
_dSiteAdrXM equ 0174h
|
|
_dSiteArdXN equ 0118h ;;0162h-50h
|
|
_dSiteAdrYM equ 1ch
|
|
_dSiteAdrYN equ 10h
|
|
|
|
_lInfoStart:
|
|
mov eax, dword ptr [esp+08h]
|
|
|
|
cmp eax, WM_MOUSEMOVE
|
|
je _iwmMove
|
|
|
|
cmp eax, WM_PAINT
|
|
je _iwmPaint
|
|
|
|
cmp eax, WM_LBUTTONDOWN
|
|
je _iwmClick
|
|
|
|
cmp eax, WM_COMMAND
|
|
je _iwmClose
|
|
|
|
;; cmp eax, WM_KEYDOWN
|
|
;; je _iwmKey
|
|
|
|
cmp eax, WM_DESTROY
|
|
je _iwmClose
|
|
|
|
jmp _imp__DefWindowProcA@16
|
|
|
|
_iwmClose:
|
|
push 00h
|
|
call _imp__ExitProcess@4
|
|
|
|
;; _iwmKey:
|
|
;; cmp dword ptr [esp+0ch], 1bh ;; esc
|
|
;; je _iwmClose
|
|
;; cmp dword ptr [esp+0ch], 0dh ;; enter
|
|
;; je _iwmClose
|
|
;; retn 10h
|
|
|
|
_iwmMove:
|
|
mov eax, dword ptr [esp+10h]
|
|
|
|
cmp ax, _dSiteAdrXM
|
|
jg _next
|
|
cmp ax, _dSiteArdXN
|
|
jb _next
|
|
|
|
shr eax, 10h
|
|
|
|
cmp al, _dSiteAdrYN
|
|
jb _next
|
|
cmp al, _dSiteAdrYM
|
|
jg _next
|
|
|
|
cmp dword ptr [_dBuffer], 00ff4040h
|
|
je _iwmRet
|
|
mov dword ptr [_dBuffer], 00ff4040h
|
|
push dword ptr [_dExCursor]
|
|
jmp _iwmReDraw
|
|
_iwmRet:
|
|
retn 10h
|
|
|
|
_lbl:
|
|
cmp dword ptr [_dBuffer], 00ff0000h
|
|
je _iwmRet
|
|
mov dword ptr [_dBuffer], 00ff0000h
|
|
push dword ptr [_dStdCursor]
|
|
_iwmReDraw:
|
|
call _imp__SetCursor@4
|
|
|
|
push RDW_INVALIDATE or RDW_ERASE
|
|
push 00h
|
|
push offset _xRect_toRedraw
|
|
push _hWnd
|
|
call _imp__RedrawWindow@16
|
|
|
|
retn 10h
|
|
|
|
_iwmPaint:
|
|
push offset _xPntStr
|
|
push dword ptr [esp+08h]
|
|
|
|
push dword ptr [esp+04h]
|
|
push dword ptr [esp+04h]
|
|
|
|
call _imp__BeginPaint@8
|
|
mov ebx, eax
|
|
|
|
;; push dword ptr [_hIconCJ]
|
|
;; push 0034h
|
|
;; push 0138h
|
|
;; push ebx
|
|
;; call _imp__DrawIcon@16
|
|
|
|
;; push dword ptr [_hIconCJ]
|
|
;; push 34h
|
|
;; push 40h
|
|
;; push ebx
|
|
;; call _imp__DrawIcon@16
|
|
|
|
push dword ptr [_dGuiFont]
|
|
push ebx
|
|
call _imp__SelectObject@8
|
|
|
|
push TRANSPARENT
|
|
push ebx
|
|
call _imp__SetBkMode@8
|
|
|
|
push DT_LEFT
|
|
push offset _xRect_00
|
|
push 0ffffffffh
|
|
push offset _sTollInfo
|
|
push ebx
|
|
call _imp__DrawTextA@20
|
|
|
|
push dword ptr [_dBuffer]
|
|
push ebx
|
|
call _imp__SetTextColor@8
|
|
|
|
push dword ptr [_dWWWFont]
|
|
push ebx
|
|
call _imp__SelectObject@8
|
|
|
|
push DT_RIGHT
|
|
push offset _xRect_00
|
|
push 0ffffffffh
|
|
push offset _sSiteAdr
|
|
push ebx
|
|
call _imp__DrawTextA@20
|
|
|
|
call _imp__EndPaint@8
|
|
retn 10h
|
|
|
|
_iwmClick:
|
|
mov eax, dword ptr [esp+10h]
|
|
|
|
cmp ax, _dSiteAdrXM
|
|
jg _next
|
|
cmp ax, _dSiteArdXN
|
|
jb _next
|
|
|
|
shr eax, 10h
|
|
|
|
cmp al, _dSiteAdrYN
|
|
jb _next
|
|
cmp al, _dSiteAdrYM
|
|
jg _next
|
|
|
|
push 00h
|
|
push 00h
|
|
push 00h
|
|
push offset _sSiteAdr
|
|
push offset _sOpen
|
|
push _hWnd
|
|
call _imp__ShellExecuteA@24
|
|
|
|
_lbl:
|
|
retn 10h
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; infownd endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; set progress proc
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
_lSetProg:
|
|
push 00h
|
|
push eax
|
|
push PBM_SETPOS
|
|
push _hPrg
|
|
call _imp__SendMessageA@16
|
|
|
|
_lRedraw:
|
|
push RDW_INVALIDATE or RDW_ERASE
|
|
push 00h
|
|
push 00h
|
|
push _hWnd
|
|
call _imp__RedrawWindow@16
|
|
|
|
retn
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; set progress endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;;-------------------------------------------------------------------------
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; proc error
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
_lErrIn:
|
|
xor ebx, ebx
|
|
mov esi, dword ptr [_imp__SendMessageA@16]
|
|
|
|
;;----------------
|
|
;; destroy old window
|
|
push ebx
|
|
push ebx
|
|
push WM_CJ_ERROR
|
|
push dword ptr [_hWnd]
|
|
call esi ;; _imp__SendMessageA@16
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; beep
|
|
push 0ffffffffh
|
|
call _imp__MessageBeep@4
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; create new window
|
|
push offset _hErrCls
|
|
call _imp__RegisterClassA@4
|
|
|
|
push ebx
|
|
push 400000h
|
|
push ebx
|
|
push ebx
|
|
push 0300h ;; height
|
|
push 0400h ;; width
|
|
push SM_CYSCREEN
|
|
call _imp__GetSystemMetrics@4
|
|
shr eax, 01h
|
|
sub eax, 0180h
|
|
push eax
|
|
push SM_CXSCREEN
|
|
call _imp__GetSystemMetrics@4
|
|
shr eax, 01h
|
|
sub eax, 0200h
|
|
push eax
|
|
push WS_VISIBLE or WS_OVERLAPPEDWINDOW
|
|
push offset _sSynErr
|
|
push dword ptr [esp]
|
|
push ebx
|
|
call _imp__CreateWindowExA@48
|
|
mov _hWnd, eax
|
|
;;----------------
|
|
|
|
;; push SW_SHOWNORMAL or SW_RESTORE
|
|
;; push eax
|
|
;; call _imp__ShowWindow@8
|
|
|
|
;;----------------
|
|
;; edit
|
|
push ebx
|
|
push 400000h
|
|
push ebx ;; control id
|
|
push eax ;; own window
|
|
push 0210h
|
|
push 03d5h
|
|
push 20h
|
|
push 10h
|
|
push WS_CHILD or WS_VISIBLE or ES_LEFT or ES_MULTILINE or ES_READONLY or WS_HSCROLL or WS_VSCROLL or ES_NOHIDESEL
|
|
push ebx
|
|
push offset _sEditWnd
|
|
push WS_EX_CLIENTEDGE
|
|
call _imp__CreateWindowExA@48
|
|
mov dword ptr [_hPrg], eax
|
|
|
|
push ebx
|
|
push offset _xOutFont
|
|
call _imp__CreateFontIndirectA@4
|
|
push eax
|
|
push eax
|
|
call _imp__CloseHandle@4
|
|
push WM_SETFONT
|
|
push dword ptr [_hPrg]
|
|
call esi ;; _imp__SendMessageA@16
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; list
|
|
push ebx
|
|
push 400000h
|
|
push ebx
|
|
push dword ptr [_hWnd]
|
|
push 90h
|
|
push 0280h
|
|
push 0240h
|
|
push 10h
|
|
push WS_CHILD or WS_VISIBLE or WS_TABSTOP or LBS_NOINTEGRALHEIGHT or LBS_HASSTRINGS or LBS_NOTIFY
|
|
push ebx
|
|
push offset _sListWnd
|
|
push WS_EX_CLIENTEDGE
|
|
call _imp__CreateWindowExA@48
|
|
mov dword ptr [_hList], eax
|
|
|
|
push ebx
|
|
push dword ptr [_dGuiFont]
|
|
push WM_SETFONT
|
|
push eax
|
|
call esi ;; _imp__SendMessageA@16
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; exit button
|
|
push ebx
|
|
push dword ptr [_hWnd]
|
|
push 16h
|
|
push 72h
|
|
push 02bah ;; - 46h
|
|
push 0373h ;; - 62h
|
|
push WS_CHILD or WS_VISIBLE
|
|
push offset _sExit
|
|
push offset _sButton
|
|
push ebx
|
|
call _imp__CreateWindowExA@48
|
|
mov dword ptr [_hBtn], eax
|
|
|
|
push ebx
|
|
push dword ptr [_dGuiFont]
|
|
push WM_SETFONT
|
|
push eax
|
|
call esi ;; _imp__SendMessageA@16
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; veiw code
|
|
mov ecx, dword ptr [_dErrorCodeStart]
|
|
|
|
push ecx
|
|
push dword ptr [_hPrg]
|
|
jmp _lErrCStart
|
|
|
|
;;----------------
|
|
;; process code
|
|
_lErrCStartEX:
|
|
inc ecx
|
|
|
|
_lErrCStart:
|
|
mov eax, dword ptr [ecx]
|
|
|
|
;;----------------
|
|
;; add stdef
|
|
cmp al, 08h
|
|
jne _next
|
|
|
|
mov dword ptr [ecx], 64746573h ;; setd
|
|
mov word ptr [ecx+04h], 6665h ;; ef
|
|
add ecx, 06h
|
|
jmp _lErrCStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; add backspaces
|
|
_lbl:
|
|
cmp al, 06h
|
|
jne _next
|
|
|
|
_lErrCAddBS:
|
|
mov byte ptr [ecx], 20h
|
|
inc ecx
|
|
jmp _lErrCStart
|
|
|
|
_lbl:
|
|
cmp al, 07h
|
|
je _lErrCAddBS
|
|
cmp al, 05h
|
|
je _lErrCAddBS
|
|
cmp al, 04h
|
|
je _lErrCAddBS
|
|
cmp al, 03h
|
|
je _lSRNL
|
|
cmp al, 02h
|
|
je _lErrCAddBS
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; blocks
|
|
cmp ax, 7801h ;; #x
|
|
jne _next
|
|
mov word ptr [ecx], 0a0dh ;; nl
|
|
mov dword ptr [ecx+02h], 0a0d207bh ;; {_nl
|
|
add ecx, 06h
|
|
jmp _lErrCStart
|
|
|
|
_lbl:
|
|
cmp ax, 7901h ;; #x
|
|
jne _next
|
|
_lSRNLEX:
|
|
mov word ptr [ecx], 207dh ;; }_
|
|
mov dword ptr [ecx+02h], 20202020h ;; ____
|
|
add ecx, 06h
|
|
jmp _lErrCStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; add nl
|
|
_lSRNL:
|
|
cmp word ptr [ecx-02h], 0a0dh
|
|
je _lSRNLEX
|
|
mov byte ptr [ecx], 0dh
|
|
jmp _lErrCStartEX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; error
|
|
_lbl:
|
|
cmp ax, 6701h ;; #g
|
|
jne _next
|
|
|
|
mov dword ptr [ecx], 72726523h ;; #err
|
|
add ecx, 04h
|
|
jmp _lErrCStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; #
|
|
_lbl:
|
|
cmp al, 01h
|
|
jne _next
|
|
|
|
;;----------------
|
|
;; single lined definr
|
|
cmp ax, 6301h ;; #c
|
|
jne _lErrSSX_00
|
|
|
|
cmp eax, 6d756301h ;; #cum
|
|
jne _lErrDefEX
|
|
|
|
mov word ptr [ecx], 6e65h ;; en
|
|
add ecx, 02h
|
|
jmp _lErrCStart
|
|
|
|
_lErrDefEX:
|
|
mov word ptr [ecx], 6564h ;; de
|
|
add ecx, 02h
|
|
jmp _lErrCStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; multilined define
|
|
_lErrSSX_00:
|
|
cmp eax, 6d756401h ;; #dum
|
|
jne _lErrSSX_02
|
|
|
|
mov word ptr [ecx], 6e65h ;; en
|
|
add ecx, 04h
|
|
jmp _lErrCStart
|
|
|
|
_lErrSSX_02:
|
|
cmp ax, 6401h ;; #d
|
|
jne _lErrSSX_01
|
|
|
|
cmp dword ptr [ecx+02h], 656e6966h ;; fine
|
|
jne _lErrSSX_00_EX
|
|
|
|
mov word ptr [ecx], 6564h ;; de
|
|
add ecx, 02h
|
|
jmp _lErrCStart
|
|
|
|
_lErrSSX_00_EX:
|
|
mov word ptr [ecx], 0a0dh ;; nl
|
|
add ecx, 02h
|
|
jmp _lErrCStart
|
|
;;----------------
|
|
|
|
_lErrSSX_01:
|
|
mov word ptr [ecx], 2020h ;; __
|
|
add ecx, 02h
|
|
jmp _lErrCStart
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; null
|
|
_lbl:
|
|
cmp al, 00h ;; 00h
|
|
jne _lErrCStartEX
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; add info
|
|
;;mov dword ptr [ecx], 2a2a2a20h ;; _***
|
|
;;----------------
|
|
;;----------------
|
|
call _imp__SetWindowTextA@8
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; select first error
|
|
mov eax, _dErrorCodeStart
|
|
sub dword ptr [_xErrorTable+08h], eax
|
|
sub dword ptr [_xErrorTable+04h], eax
|
|
sub dword ptr [_xErrorTable+18h], eax
|
|
sub dword ptr [_xErrorTable+14h], eax
|
|
|
|
push dword ptr [_xErrorTable+08h]
|
|
push dword ptr [_xErrorTable+04h]
|
|
push EM_SETSEL
|
|
push dword ptr [_hPrg]
|
|
call esi ;; _imp__SendMessageA@16
|
|
|
|
push ebx
|
|
push ebx
|
|
push EM_SCROLLCARET
|
|
push dword ptr [_hPrg]
|
|
call esi ;; _imp__SendMessageA@16
|
|
|
|
push dword ptr [_xErrorTable]
|
|
push ebx
|
|
push LB_ADDSTRING
|
|
push dword ptr [_hList]
|
|
call esi ;; _imp__SendMessageA@16
|
|
|
|
cmp dword ptr [_xErrorTable+10h], 00h
|
|
je _next
|
|
push dword ptr [_xErrorTable+10h]
|
|
push ebx
|
|
push LB_ADDSTRING
|
|
push dword ptr [_hList]
|
|
call esi ;; _imp__SendMessageA@16
|
|
_lbl:
|
|
;;----------------
|
|
|
|
_lErrLS:
|
|
push ebx
|
|
push ebx
|
|
push ebx
|
|
push offset _hErrCls
|
|
call _imp__GetMessageA@16
|
|
push offset _hErrCls
|
|
call _imp__DispatchMessageA@4
|
|
jmp _lErrLS
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; error endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; proc wnd_err
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
_hErrProc:
|
|
mov eax, dword ptr [esp+08h]
|
|
|
|
cmp eax, WM_SIZE
|
|
je _ewmSize
|
|
|
|
cmp eax, WM_SIZING
|
|
je _ewmCSize
|
|
|
|
cmp eax, WM_PAINT
|
|
je _ewmPaint
|
|
|
|
cmp eax, WM_COMMAND
|
|
je _ewmCmd
|
|
|
|
cmp eax, WM_DESTROY
|
|
je _ewmClose
|
|
|
|
jmp _imp__DefWindowProcA@16
|
|
|
|
;;----------------
|
|
;; close
|
|
_ewmClose:
|
|
push 01h
|
|
call _imp__ExitProcess@4
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; command
|
|
_ewmCmd:
|
|
mov ebx, dword ptr [esp+0ch]
|
|
shr ebx, 10h
|
|
cmp ebx, BN_CLICKED
|
|
je _ewmClose
|
|
cmp ebx, LBN_SELCHANGE
|
|
jne _next
|
|
|
|
mov esi, _imp__SendMessageA@16
|
|
|
|
push 00h
|
|
push 00h
|
|
push LB_GETCURSEL
|
|
push dword ptr [_hList]
|
|
call esi ;; _imp__SendMessageA@16
|
|
|
|
shl eax, 04h
|
|
|
|
push dword ptr [_xErrorTable+08h+eax]
|
|
push dword ptr [_xErrorTable+04h+eax]
|
|
push EM_SETSEL
|
|
push dword ptr [_hPrg]
|
|
call esi ;; _imp__SendMessageA@16
|
|
|
|
push ebx
|
|
push ebx
|
|
push EM_SCROLLCARET
|
|
push dword ptr [_hPrg]
|
|
call esi ;; _imp__SendMessageA@16
|
|
|
|
_lbl:
|
|
retn 10h
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; sizing
|
|
_ewmCSize:
|
|
mov ecx, dword ptr [esp+10h]
|
|
mov ebx, dword ptr [esp+0ch]
|
|
|
|
dec ebx ;; WMSZ_LEFT
|
|
jnz _next
|
|
call _ewmCSizeLeft
|
|
retn 10h
|
|
|
|
_lbl:
|
|
dec ebx ;; WMSZ_RIGHT
|
|
jnz _next
|
|
call _ewmCSizeRight
|
|
retn 10h
|
|
|
|
_lbl:
|
|
dec ebx ;; WMSZ_TOP
|
|
jnz _next
|
|
call _ewmCSizeTop
|
|
retn 10h
|
|
|
|
_lbl:
|
|
dec ebx ;; WMSZ_TOPLEFT
|
|
jnz _next
|
|
call _ewmCSizeTop
|
|
call _ewmCSizeLeft
|
|
retn 10h
|
|
|
|
_lbl:
|
|
dec ebx ;; WMSZ_TOPRIGHT
|
|
jnz _next
|
|
call _ewmCSizeTop
|
|
call _ewmCSizeRight
|
|
retn 10h
|
|
|
|
_lbl:
|
|
dec ebx ;; WMSZ_BOTTOM
|
|
jnz _next
|
|
call _ewmCSizeBottom
|
|
retn 10h
|
|
|
|
_lbl:
|
|
dec ebx ;; WMSZ_BOTTOMLEFT
|
|
jnz _next
|
|
call _ewmCSizeBottom
|
|
call _ewmCSizeLeft
|
|
retn 10h
|
|
|
|
_lbl:
|
|
;; dec edx ;; WMSZ_BOTTOMRIGHT
|
|
;; jnz _next
|
|
call _ewmCSizeBottom
|
|
call _ewmCSizeRight
|
|
retn 10h
|
|
|
|
_ewmCSizeBottom:
|
|
mov edi, dword ptr [ecx+0ch]
|
|
mov esi, dword ptr [ecx+04h]
|
|
sub edi, esi
|
|
cmp edi, 0300h
|
|
jg _next
|
|
add esi, 0300h
|
|
mov dword ptr [ecx+0ch], esi
|
|
_lbl:
|
|
retn
|
|
|
|
_ewmCSizeRight:
|
|
mov edi, dword ptr [ecx+08h]
|
|
mov esi, dword ptr [ecx]
|
|
sub edi, esi
|
|
cmp edi, 0400h
|
|
jg _next
|
|
add esi, 0400h
|
|
mov dword ptr [ecx+08h], esi
|
|
_lbl:
|
|
retn
|
|
|
|
_ewmCSizeTop:
|
|
mov edi, dword ptr [ecx+0ch]
|
|
mov esi, dword ptr [ecx+04h]
|
|
sub edi, esi
|
|
cmp edi, 0300h
|
|
jg _next
|
|
mov edi, dword ptr [ecx+0ch]
|
|
sub edi, 0300h
|
|
mov dword ptr [ecx+04h], edi
|
|
_lbl:
|
|
retn
|
|
|
|
_ewmCSizeLeft:
|
|
mov edi, dword ptr [ecx+08h]
|
|
mov esi, dword ptr [ecx]
|
|
sub edi, esi
|
|
cmp edi, 0400h
|
|
jg _next
|
|
mov edi, dword ptr [ecx+08h]
|
|
sub edi, 0400h
|
|
mov dword ptr [ecx], edi
|
|
_lbl:
|
|
retn
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; paint
|
|
_ewmPaint:
|
|
push offset _xPntStr
|
|
push dword ptr [esp+08h]
|
|
|
|
push dword ptr [esp+04h]
|
|
push dword ptr [esp+04h]
|
|
|
|
call _imp__BeginPaint@8
|
|
mov ebx, eax
|
|
|
|
push dword ptr [_dGuiFont]
|
|
push ebx
|
|
call _imp__SelectObject@8
|
|
|
|
push TRANSPARENT
|
|
push ebx
|
|
call _imp__SetBkMode@8
|
|
|
|
push DT_LEFT
|
|
push offset _xRect_02
|
|
push 0ffffffffh
|
|
push offset _sErr_Title
|
|
push ebx
|
|
call _imp__DrawTextA@20
|
|
|
|
call _imp__EndPaint@8
|
|
retn 10h
|
|
;;----------------
|
|
|
|
;;----------------
|
|
;; size
|
|
_ewmSize:
|
|
cmp dword ptr [esp+0ch], SIZE_MINIMIZED
|
|
je _ewmReSize
|
|
|
|
mov edi, dword ptr [esp+10h]
|
|
mov esi, edi
|
|
and edi, 0000ffffh ;; x
|
|
shr esi, 10h ;; y
|
|
sub edi, 20h
|
|
sub esi, 00d7h
|
|
|
|
push 01h
|
|
push esi
|
|
push edi
|
|
push 20h
|
|
push 10h
|
|
push dword ptr [_hPrg]
|
|
call _imp__MoveWindow@24 ;; move edit box
|
|
|
|
push 01h
|
|
push 90h
|
|
push 0280h
|
|
add esi, 30h
|
|
push esi
|
|
push 10h
|
|
push dword ptr [_hList]
|
|
call _imp__MoveWindow@24 ;; move list box
|
|
|
|
push 01h
|
|
push 16h
|
|
push 72h
|
|
add esi, 7ah
|
|
push esi
|
|
sub edi, 62h
|
|
push edi
|
|
push dword ptr [_hBtn]
|
|
call _imp__MoveWindow@24 ;; move button
|
|
|
|
_ewmReSize:
|
|
retn 10h
|
|
;;----------------
|
|
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
;; wnd_err endp
|
|
;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
end start
|
|
;;------------------------------------------------------------------------- |