From f428f0b18b2d73416afc5b0ce7d3cb213aff7840 Mon Sep 17 00:00:00 2001 From: savelij13 Date: Tue, 29 Jul 2025 21:58:48 +0300 Subject: [PATCH] =?UTF-8?q?FileEditor.flx=201.10=20-=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D1=83=D1=82=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BD?= =?UTF-8?q?=D0=BE=D0=BF=D0=BA=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B6=D0=B0=D1=82=D0=B8=D0=B9=20=D0=BC=D1=8B=D1=88=D1=8C=D1=8E?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20F7=20=D0=B8=20F9.=20FileViewer.flx=201.?= =?UTF-8?q?06=20-=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=B4=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20HEX=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=D0=B0.=20FlexN?= =?UTF-8?q?avigaror=201.16.01=20-=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=B2=D1=8B=D0=BB=D0=B5=D1=82=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BF=D0=BE=20Shift+F4=20=D0=B8=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80=20=D1=81=20=20?= =?UTF-8?q?=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=BE=D0=BC=20=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=20=D0=BF=D0=BE=20Shift+F3,=20=D0=BF=D0=BB=D0=B0?= =?UTF-8?q?=D0=B3=D0=B8=D0=BD=20=D0=B1=D1=8B=D0=BB=20=D0=BD=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B6=D0=B5=D0=BD.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/fn_api_0.5.txt | 63 +-- docs/history.txt | 21 +- fn/flx/fneditor.flx | Bin 11780 -> 11675 bytes fn/flx/fnviewer.flx | Bin 7006 -> 6459 bytes fn/flx/help.flx | Bin 6361 -> 6364 bytes fn/fn.exe | Bin 48565 -> 48659 bytes fn/history.txt | 21 +- fn_const.a80 | 35 +- fn_version.a80 | 8 +- fnmain.a80 | 5 +- fnwork.a80 | 36 +- plugins/fneditor/{femain.a80 => build.a80} | 5 +- plugins/fneditor/build.bat | 4 +- plugins/fneditor/feditor.a80 | 515 ++++++++++++--------- plugins/fneditor/fedos.a80 | 58 +-- plugins/fneditor/fehex.a80 | 4 +- plugins/fneditor/feprn.a80 | 26 +- plugins/fneditor/fesetup.a80 | 6 +- plugins/fneditor/fetext.a80 | 226 +++++---- plugins/fnviewer/{fvmain.a80 => build.a80} | 5 +- plugins/fnviewer/build.bat | 4 +- plugins/fnviewer/fvhex.a80 | 320 +++++++------ plugins/fnviewer/fviewer.a80 | 477 +++++++++---------- plugins/fnviewer/fvprn.a80 | 69 ++- plugins/fnviewer/fvtext.a80 | 54 +-- readme.md | 30 +- 26 files changed, 1082 insertions(+), 910 deletions(-) rename plugins/fneditor/{femain.a80 => build.a80} (78%) rename plugins/fnviewer/{fvmain.a80 => build.a80} (80%) diff --git a/docs/fn_api_0.5.txt b/docs/fn_api_0.5.txt index db053bf..8c8d2da 100644 --- a/docs/fn_api_0.5.txt +++ b/docs/fn_api_0.5.txt @@ -1,7 +1,7 @@ []========================================================================[] * * * Описание Flex Navigator API v1.xx для разработчиков Flx-Plugins * -* doc v0.5 от 31.03.2025 (в процессе) * +* doc v0.5 от 26.07.2025 (в процессе) * * * []========================================================================[] @@ -57,7 +57,7 @@ далее идут об'екты окна в формате: +00 (1) тип объекта - +01 ... описатели обекта + +01 ... описатели объекта об'екты окна: 0. +00 (1) == 0 - конец списка об'ектов. после этого оконная @@ -128,6 +128,13 @@ +01 (2) смещение x от начала окна (0 - 639) +03 (2) смещение y от начала окна (0 - 255) + 12. +00 (2) == 12 - текстовая строка + +01 (2) смещение x от начала окна (0 - 639) + +03 (2) смещение y от начала окна (0 - 255) + +05 (1) цвет печати + (d7-d4 цвет background, d3-d0 цвет foreground) + +06 (2) адрес текстовой строки (конец строки - 0) + []------------------------------------------------------------------------[] JUMPS.InvertRectan - процедура замены цвета прямоугольной плоскости @@ -271,17 +278,9 @@ +0C ... сама строка процедуры для таблицы элементов экрана: - InpLnExtN - процедура нормального выхода из редакции - InpLnExtC - процедура выхода из редакции по cancel - (восстанавливает изначальную строку) - -[]------------------------------------------------------------------------[] - - JUMPS.InpLnExtN - -[]------------------------------------------------------------------------[] - - JUMPS.InpLnExtC + JUMPS.InpLnExtN - процедура нормального выхода из редакции + JUMPS.InpLnExtC - процедура выхода из редакции по cancel + (восстанавливает изначальную строку) []------------------------------------------------------------------------[] @@ -294,7 +293,7 @@ []------------------------------------------------------------------------[] - JUMPS.InitScrBar - процедура инициализации описателя скроллбара + JUMPS.InitScrollBar - процедура инициализации описателя скроллбара на вход: IX - адрес описателя скроллбара @@ -305,7 +304,7 @@ +00 (2) X позиция скролбара (0-639) +02 (2) Y позиция скролбара (0-255) +04 (2) длина скролбара - +06 (2) текущая длина скролбара (инициализируется в InitScrBar) + +06 (2) текущая длина скролбара (инициализируется в InitScrollBar) +08 (2) адрес ячейки, куда запишется начальная координата бара если 0, то не используется (используется для таблицы элементов экрана) @@ -365,15 +364,7 @@ []------------------------------------------------------------------------[] - JUMPS.InitScrollBar - -[]------------------------------------------------------------------------[] - - JUMPS.MenuWork - -[]------------------------------------------------------------------------[] - - 3 команд перехода (12 байт) зарезервированы и заполнены + 5 команд перехода (12 байт) зарезервированы и заполнены командой RET (12 байт 0xC9) []------------------------------------------------------------------------[] @@ -408,7 +399,7 @@ если +00 == 0x8000 это считается концом таблицы элементов зкрана - флаги элемента: + флаги элемента (номер бита): d00 - элемент кнопка d01 - рабочая кнопка d02 - инверт @@ -483,7 +474,13 @@ []------------------------------------------------------------------------[] - JUMPS.ConvNumTxt40 + JUMPS.ConvNumTxt40 - процедура конвертации беззнакового числа + 40 bit в текст + + на входе: + ABCHL - число + DE - адрес буфера + на выходе: []------------------------------------------------------------------------[] @@ -662,10 +659,14 @@ []------------------------------------------------------------------------[] - JUMPS.Resident + JUMPS.Resident - вызов процедур в странице + + на входе: + DE - адрес вызова + C - адрес порта окна страницы + A - номер страницы + на выходе: + портится регистр BС (используется при вызове для хранения + старого значения номера страницы для восстановления) []------------------------------------------------------------------------[] - -13 july 2002 -Anton Enin (C) Copyright 2002 R-lab -если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме. diff --git a/docs/history.txt b/docs/history.txt index c274bbc..ce19b20 100644 --- a/docs/history.txt +++ b/docs/history.txt @@ -1,15 +1,20 @@ -FN - FlexNavigator -FV - FileViewer -FE - FileEditor +29.07.2025 +FileEditor.flx 1.10 +- устранено перепутанные кнопки для нажатий мышью для F7 и F9. +FileViewer.flx 1.06 +- добавлено переключение кодировки в режиме HEX просмотра. +FlexNavigaror 1.16.01 +- исправлен вылет при создании нового файла по Shift+F4 или просмотр с + вводом имени по Shift+F3, плагин был не загружен. 25.07.2025 CDplayer.flx 1.1: - плагин доделан, описание/history в cdplayer.txt рядом с плагином. -FE 1.09 +FileEditor.flx 1.09 - исправлено: при выходе из редактора с несохраненным файлом и запросе на сохранение клавиша Enter теперь работает как подтверждение сохранения. -FN 1.16 +FlexNavigator 1.16 - исправлен возрат текущей директории после загрузки плагина. - встроенный editor переехал в плагин откуда и запускается по F4, из FN удален. - встроенный viewer переехал в плагин откуда и запускается по F3, из FN удален. @@ -25,9 +30,13 @@ FN 1.16 - исправлена потеря цвета при печати текста по указанному адресу. - текстовым файлам вернул кодировку CP866, readme.md оставлен в кодировке UTF8. +FN - FlexNavigator +FV - FileViewer +FE - FileEditor + 27.06.2025 FN 1.15.01 -- в паре мест испралена data на date. +- в паре мест исправлена data на date. 25.06.2025 FN 1.15 diff --git a/fn/flx/fneditor.flx b/fn/flx/fneditor.flx index 2a81c37d916585cd2bbc1eba48c1bab866b45287..3827b0389b1a545fc434e2c51544f8189227a225 100644 GIT binary patch delta 6721 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 Avj6}9 literal 7006 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 diff --git a/fn/fn.exe b/fn/fn.exe index 7e5619a3b77fec8a62d56f2868ed0ed6003d6e79..edcbf2be2abe80f3235d2c8d50e3addff7312d3d 100644 GIT binary patch delta 8084 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 bHtBHHg+FwfFvIYCdGHXNXL$3|;o^S*A?#ti delta 8048 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 aj1Re7h+N3h(-OtrpMr33N$2Nb9{&r9882 JP InitProcess ; 8633->99DA JP PrnProcess ; 8636->9A39 - JP InitScrollBar - DB JUMPS.JUMPSIZE * 4 DUP 0xC9 + DB JUMPS.JUMPSIZE * 5 DUP 0xC9 JP ResFire ; 8648->9B01 JP TestCoords ; 864B->9B10 diff --git a/fnwork.a80 b/fnwork.a80 index d2ad17e..948e32d 100644 --- a/fnwork.a80 +++ b/fnwork.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 25.07.2025 savelij +; LAST UPDATE: 29.07.2025 savelij ;[]===========================================================[] CursUp LD A,(IY + PANEL.FILES_ALL) @@ -2001,6 +2001,21 @@ View1: CALL ResInvert PUSH IY LD HL,PrevFile LD DE,(RunFLX.FLXexec) + LD A,D + OR E + JR NZ,.L1 +; если плагин не загружен, загружаем + PUSH HL + CALL LOADFLX4RUN + DZ FILENAME.VIEW_FLX + POP HL + JR NC,.L1 +; если плагин не загружен/не найден + POP IY + LD A,FNinternal.PlugNotFound + JP DOSError + +.L1 LD DE,(RunFLX.FLXexec) LD A,(RunFLX.FLXmode) AND FLXMODES.M_ADRORG LD C,WINSP.CPU1 ; окно запуска с адреса 0x4000 @@ -2013,6 +2028,8 @@ View1: CALL ResInvert LD A,(RAMPAGES.FLX) ENDIF CALL Resident + LD HL,0 + LD (RunFLX.FLXexec),HL ; при выходе из плагина глушим адрес загрузки POP IY RET C SETPORT BORDER,0 @@ -2151,6 +2168,21 @@ Edit1: CALL ResInvert PUSH IY LD HL,PrevFile LD DE,(RunFLX.FLXexec) + LD A,D + OR E + JR NZ,.L1 +; если плагин не загружен, загружаем + PUSH HL + CALL LOADFLX4RUN + DZ FILENAME.EDIT_FLX + POP HL + JR NC,.L1 +; если плагин не загружен/не найден + POP IY + LD A,FNinternal.PlugNotFound + JP DOSError + +.L1 LD DE,(RunFLX.FLXexec) LD A,(RunFLX.FLXmode) AND FLXMODES.M_ADRORG LD C,WINSP.CPU1 ; окно запуска с адреса 0x4000 @@ -2163,6 +2195,8 @@ Edit1: CALL ResInvert LD A,(RAMPAGES.FLX) ENDIF CALL Resident + LD HL,0 + LD (RunFLX.FLXexec),HL ; при выходе из плагина глушим адрес загрузки POP IY RET C SETPORT BORDER,0 diff --git a/plugins/fneditor/femain.a80 b/plugins/fneditor/build.a80 similarity index 78% rename from plugins/fneditor/femain.a80 rename to plugins/fneditor/build.a80 index b975033..13d1710 100644 --- a/plugins/fneditor/femain.a80 +++ b/plugins/fneditor/build.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 18.07.2025 savelij +; LAST UPDATE: 26.07.2025 savelij include macros.a80 include fn_const.a80 @@ -12,7 +12,8 @@ include dss_sp.a80 include bios_sp.a80 include mouse_sp.a80 + include errors_sp.a80 - HDR_FLX "-EDIT",,,;FLXMODES.M_ADRORG + HDR_FLX "-EDIT" include feditor.a80 diff --git a/plugins/fneditor/build.bat b/plugins/fneditor/build.bat index 8d12807..5df0239 100644 --- a/plugins/fneditor/build.bat +++ b/plugins/fneditor/build.bat @@ -6,8 +6,8 @@ set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\;d:\yad call ..\..\setpath_includes set includes=%includes%;..\..\ -asl -U -L -C -x -olist tmp\fneditor.lst -i %includes% femain.a80 || goto error -p2bin femain.p ..\fneditor.flx -r $-$ -k +asl -U -L -C -x -olist tmp\fneditor.lst -i %includes% build.a80 || goto error +p2bin build.p ..\fneditor.flx -r $-$ -k echo ######################## echo # -= End Compile Ok =- # diff --git a/plugins/fneditor/feditor.a80 b/plugins/fneditor/feditor.a80 index 435ec51..1c692da 100644 --- a/plugins/fneditor/feditor.a80 +++ b/plugins/fneditor/feditor.a80 @@ -1,37 +1,35 @@ -; LAST UPDATE: 18.07.2025 savelij +; LAST UPDATE: 29.07.2025 savelij + +ENABLE_CODEPAGE EQU 0 INIT_VAR - SETVAR CursorX ;EQU 0x00 - SETVAR StringX ;EQU 0x01 - SETVAR CursAddX ;EQU 0x02 - SETVAR CursorY ;EQU 0x03 - SETVAR LenString ;EQU 0x04 - SETVAR PrvLenStr ;EQU 0x05 - SETVAR ReadyStr ;EQU 0x06 - SETVAR ReadyFile ;EQU 0x07 + SETVAR CursorX + SETVAR StringX + SETVAR CursAddX + SETVAR CursorY + SETVAR LenString + SETVAR PrvLenStr + SETVAR ReadyStr + SETVAR ReadyFile LineBuffer := WorkBuffer+0x200 TempBuffer := WorkBuffer+0x300 ;[]==========================================================[] - JP FileEditor - - DZ FLEX_VERS.EDITOR - -FileEditor CALL FELoadFile + CALL FELoadFile RET C call ReadEditorIni LD IY,EditData SUB A LD (EditMode),A LD (HEXmode),A - LD (IY+CursorX),A - LD (IY+StringX),A - LD (IY+CursAddX),A - LD (IY+CursorY),A - LD (IY+ReadyStr),A - LD (IY+ReadyFile),A + LD (IY + EDBUF_.CursorX),A + LD (IY + EDBUF_.StringX),A + LD (IY + EDBUF_.CursAddX),A + LD (IY + EDBUF_.CursorY),A + LD (IY + EDBUF_.ReadyStr),A + LD (IY + EDBUF_.ReadyFile),A INC A LD (FECrTimer),A LD HL,0x0000 @@ -43,185 +41,167 @@ EditorBegin CALL InitStatus CALL InitFile CALL PrintPage EditorLoop CALL FEChCursor - LD A,(EditMode) + LD A,(EditMode) ; режим редактирования OR A JP NZ,HEditLoop +; режим редактирования текст TEditLoop LD IX,FEASCIItab CALL JUMPS.TestCoords - SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиш + SPDSS DSSF.SCANKEY ; Ожидаем нажатия клавиш JR Z,EditorLoop LD A,D - CP 0x44 + CP SC.F10 JP Z,EditorExit - LD A,E ;Е-ASCII код - CP 0x1B ;Esc + LD A,E ; Е-ASCII код + CP 0x1B ; Esc JP Z,EditorExit LD HL,EditorLoop PUSH HL OR A - JP NZ,TInsertSymbol + JP NZ,TInsertSymbol ; какой то печатный символ? LD A,D - CP 0x3B + CP SC.F1 JP Z,FEAbout - CP 0x3C + CP SC.F2 JP Z,SaveFile - CP 0x3E - JP Z,ChEditor ;Просмотр в HEX - CP 0x41 + CP SC.F4 + JP Z,ChEditor ; Просмотр в HEX + CP SC.F7 JP Z,FEPrintFile - CP 0x43 + IF ENABLE_CODEPAGE + CP SC.F8 + JP Z,ChCodePage + ENDIF + CP SC.F9 JP Z,EditorSetup - CP 0x4F + CP SC.XDEL JP Z,TDeleteSymbol - CP 0x54 + CP SC.X4 JP Z,TCursorLeft - CP 0x56 + CP SC.X6 JP Z,TCursorRight - CP 0x58 + CP SC.X8 JP Z,TCursorUp - CP 0x52 + CP SC.X2 JP Z,TCursorDown - CP 0x57 ;Home + CP SC.X7 ; Home JP Z,THomeString - CP 0x51 ;End + CP SC.X1 ; End JP Z,TEndString - CP 0x59 ;PageUp + CP SC.X9 ; PageUp JP Z,FETPageUp - CP 0x53 ;PageDown + CP SC.X3 ; PageDown JP Z,TPageDown LD A,B - AND 0x30 - CP 0x30 + AND KEYBSTAT.M_ALT + KEYBSTAT.M_CTRL + CP KEYBSTAT.M_ALT + KEYBSTAT.M_CTRL RET Z - bit 4,b ;При нажатом Alt + bit KEYBSTAT.B_ALT,B ; При нажатом Alt jr z,.ctrl ld a,d - and 0x7f - CP 0x54 ;Alt+< + and %01111111 + CP SC.X4 ; Alt+< JP Z,THomeString - CP 0x56 ;Alt+> + CP SC.X6 ; Alt+> JP Z,TEndString ret -.ctrl: BIT 5,B ;При нажатом Ctrl +.ctrl: BIT KEYBSTAT.B_CTRL,B ; При нажатом Ctrl RET Z LD A,D - AND 0x7F - CP 0x0E + AND %01111111 + CP SC.BKSP JP Z,TDeleteWord - CP 0x15 ;Ctrl+Y - Delete String + CP SC.Y ; Ctrl+Y - Delete String JP Z,TDeleteString - CP 0x1E ;Ctrl+S + CP SC.S ; Ctrl+S JP Z,SaveFile - CP 0x1F ;Ctrl+D + CP SC.D ; Ctrl+D JP Z,TDoubleString - CP 0x19 ;Ctrl+P + CP SC.P ; Ctrl+P JP Z,FEPrintFile - cp 0x2a ;Ctrl+Z + cp SC.Z ; Ctrl+Z jp z,Undo - CP 0x54 + CP SC.X4 JP Z,TWordLeft - CP 0x56 + CP SC.X6 JP Z,TWordRight - CP 0x58 + CP SC.X8 JP Z,TScrollUp - CP 0x52 + CP SC.X2 JP Z,TScrollDown - CP 0x57 ;Ctrl+Home - JP Z,FETBegFile ;в начало файла - CP 0x51 ;Ctrl+PageEnd - JP Z,FETEndFile ;в конец файла + CP SC.X7 ; Ctrl+Home + JP Z,FETBegFile ; в начало файла + CP SC.X1 ; Ctrl+PageEnd + JP Z,FETEndFile ; в конец файла RET +; режим редактирования HEX HEditLoop LD IX,FEHEXtab CALL JUMPS.TestCoords - SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиш + SPDSS DSSF.SCANKEY ; Ожидаем нажатия клавиш JP Z,EditorLoop - LD A,D ; - CP 0x44 ;F10 + LD A,D + CP SC.F10 ; F10 JP Z,EditorExit - LD A,E ;Е-ASCII код - CP 0x1B ;Esc + LD A,E ; Е-ASCII код + CP 0x1B ; Esc JP Z,EditorExit LD HL,EditorLoop PUSH HL OR A JP NZ,HPutSymbol LD A,D - CP 0x3B + CP SC.F1 JP Z,FEAbout - CP 0x3C + CP SC.F2 JP Z,SaveFile - CP 0x9E ;Ctrl+S + CP SC.S + 0x80 ; Ctrl+S JP Z,SaveFile - CP 0x3E ;F4 - JP Z,ChEditor ;Просмотр в тексте - CP 0x3F ;F5 - JP Z,FEHGoTo ;Переход на адрес пользователя - CP 0x41 + CP SC.F4 ; F4 + JP Z,ChEditor ; Просмотр в тексте + CP SC.F5 ; F5 + JP Z,FEHGoTo ; Переход на адрес пользователя + CP SC.F7 JP Z,FEPrintFile - CP 0x43 + CP SC.F9 JP Z,EditorSetup - CP 0x54 + CP SC.X4 JP Z,HCursorLeft - CP 0x56 + CP SC.X6 JP Z,HCursorRight - CP 0x57 ;Home + CP SC.X7 ; Home JP Z,HHomeString - CP 0x51 ;End + CP SC.X1 ; End JP Z,HEndString - CP 0x58 ;Стрелка вверх + CP SC.X8 ; Стрелка вверх JP Z,HCursorUp - CP 0x52 ;Стрелка вниз + CP SC.X2 ; Стрелка вниз JP Z,HCursorDown - CP 0x59 ;PageUp + CP SC.X9 ; PageUp JP Z,FEHPageUp - CP 0x53 ;PageDown + CP SC.X3 ; PageDown JP Z,FEHPageDown LD A,B - AND 0x30 - CP 0x30 + AND KEYBSTAT.M_ALT + KEYBSTAT.M_CTRL + CP KEYBSTAT.M_ALT + KEYBSTAT.M_CTRL RET Z - BIT 5,B + BIT KEYBSTAT.B_CTRL,B RET Z LD A,D - AND 0x7F - CP 0x58 + AND %01111111 + CP SC.X8 JP Z,HScrollUp - CP 0x52 + CP SC.X2 JP Z,HScrollDown - CP 0x57 ;Ctrl+PageUp - JP Z,FEHBegFile ;в начало файла - CP 0x51 ;Ctrl+PageDown - JP Z,FEHEndFile ;в конец файла - CP 0x19 ;Ctrl+P + CP SC.X7 ; Ctrl+PageUp + JP Z,FEHBegFile ; в начало файла + CP SC.X1 ; Ctrl+PageDown + JP Z,FEHEndFile ; в конец файла + CP SC.P ; Ctrl+P JP Z,FEPrintFile RET -;[]==========================================================[] -EditingFile DUPL 0x30,0 -EditMode DEFB 0x00 -HEXmode DEFB 0x00 -EditData DEFB 0x00 ;Cursor X - DEFB 0x00 ;String X - DEFB 0x00 ;Cursor add X - DEFB 0x00 ;Cursor Y - DEFB 0x00 ;Len String - DEFB 0x00 ;Previos Len String - DEFB 0x00 ;Ready String - DEFB 0x00 ;Ready File -CurLine DEFW 0x0000 -EquipLines DEFW 0x0000 -LineShift DEFW 0x0000 -FEPageShift DEFW 0x0000 -FETempShift DEFW 0x0000 -FEFileLenght DEFW 0x0000 ;Длина файла (16бит) -FEEmptyLines DEFB 0x00 -FEMemIndef DEFB 0x00 -FEFHandle DEFB 0x00 -FEReadLen -SaveLen DEFW 0x0000 - ;[]==========================================================[] ChEditor LD HL,EditorBegin EX (SP),HL @@ -230,7 +210,7 @@ ChEditor LD HL,EditorBegin LD (EditMode),A JR NZ,HEXEdit ASCIIEdit LD HL,(LineShift) - LD E,(IY+CursorX) + LD E,(IY + EDBUF_.CursorX) SRL E LD D,0x00 ADD HL,DE @@ -240,8 +220,8 @@ ASCIIEdit LD HL,(LineShift) LD (LineShift),HL LD (FEPageShift),HL SUB A - LD (IY+StringX),A - LD (IY+CursorY),A + LD (IY + EDBUF_.StringX),A + LD (IY + EDBUF_.CursorY),A PUSH HL CALL GetString POP DE @@ -249,39 +229,39 @@ ASCIIEdit LD HL,(LineShift) OR A SBC HL,DE LD A,L - CP (IY+LenString) + CP (IY + EDBUF_.LenString) JR C,.L1 - LD A,(IY+LenString) + LD A,(IY + EDBUF_.LenString) .L1 DEC A - LD (IY+StringX),A + LD (IY + EDBUF_.StringX),A JP TCursorRight HEXEdit CALL PutString LD HL,(LineShift) - LD A,(IY+StringX) - CP (IY+LenString) + LD A,(IY + EDBUF_.StringX) + CP (IY + EDBUF_.LenString) JR C,.L1 - LD A,(IY+LenString) + LD A,(IY + EDBUF_.LenString) .L1 LD E,A LD D,0x00 ADD HL,DE LD A,L AND 0x0F ADD A,A - LD (IY+CursorX),A + LD (IY + EDBUF_.CursorX),A LD A,L AND 0xF0 LD L,A LD (LineShift),HL LD (FEPageShift),HL SUB A - LD (IY+CursorY),A + LD (IY + EDBUF_.CursorY),A RET ;[]==========================================================[] EditorExit CALL PutString CALL FEResCursor - LD A,(IY+ReadyFile) + LD A,(IY + EDBUF_.ReadyFile) OR A JP Z,QuitAsk;EditorE MAKEWINDOW WINSUBOBJ.STORE @@ -392,7 +372,7 @@ FEInitScreen CP (HL) JR NZ,.L1 DEC HL - LD A,0x5C + LD A,'\\' CP (HL) INC HL JR Z,.L2 @@ -420,11 +400,14 @@ FEInitScreen LD B,0x08 EXX LD A,0x02 - CALL JUMPS.SetCMOSPrint - RET + JP JUMPS.SetCMOSPrint ;[]==========================================================[] -InitStatus LD A,(EditMode) +InitStatus + IF ENABLE_CODEPAGE + CALL InitCodePage + ENDIF + LD A,(EditMode) OR A JP NZ,InitHEXStatus MAKEWINDOW WINSUBOBJ.WOBIND @@ -442,8 +425,16 @@ InitStatus LD A,(EditMode) W_TEXT 100,245,COLORP.HIGHGRAY,"F2 Save" W_BUTTON 160,242,80,14 W_TEXT 184,245,COLORP.HIGHGRAY,"F4 Hex" + IF ENABLE_CODEPAGE + W_BUTTON 340,242,80,14 + W_TEXT 362,245,COLORP.HIGHGRAY,"F7 Print" + W_BUTTON 420,242,60,14 + W_ADRTEXT 432,245,COLORP.HIGHGRAY,0 +ASCIIenc1 EQU $ - 2 + ELSE W_BUTTON 400,242,80,14 W_TEXT 422,245,COLORP.HIGHGRAY,"F7 Print" + ENDIF W_BUTTON 480,242,80,14 W_TEXT 492,245,COLORP.HIGHGRAY,"F9 Settings" W_BUTTON 560,242,80,14 @@ -466,8 +457,16 @@ InitHEXStatus W_TEXT 182,245,COLORP.HIGHGRAY,"F4 ASCII" W_BUTTON 240,242,80,14 W_TEXT 258,245,COLORP.HIGHGRAY,"F5 Go to" + IF ENABLE_CODEPAGE + W_BUTTON 340,242,80,14 + W_TEXT 362,245,COLORP.HIGHGRAY,"F7 Print" + W_BUTTON 420,242,60,14 + W_ADRTEXT 432,245,COLORP.HIGHGRAY,0 +ASCIIenc2 EQU $ - 2 + ELSE W_BUTTON 400,242,80,14 W_TEXT 422,245,COLORP.HIGHGRAY,"F7 Print" + ENDIF W_BUTTON 480,242,80,14 W_TEXT 492,245,COLORP.HIGHGRAY,"F9 Settings" W_BUTTON 560,242,80,14 @@ -503,17 +502,16 @@ InitAlp PUSH HL LD HL,TBarD LD (BarPgD),HL LD IX,EditVBar - CALL JUMPS.InitScrBar + CALL JUMPS.InitScrollBar LD HL,0x00F0 LD (CScrnX),HL LD IX,EditHBar - CALL JUMPS.InitScrBar + CALL JUMPS.InitScrollBar LD HL,0xFFFF LD (CLine),HL LD H,0x00 LD (CAddX),HL - CALL JUMPS.SetMouse - RET + JP JUMPS.SetMouse InitFileHex LD HL,(FEFileLenght) LD A,L @@ -545,29 +543,29 @@ InitFileHex LD HL,(FEFileLenght) LD HL,HBarD LD (BarPgD),HL LD IX,EditVBar - CALL JUMPS.InitScrBar + CALL JUMPS.InitScrollBar LD HL,0xFFFF LD (CLine),HL RET -EditVBar DEFW 0x0270 ;X позиция скролбара - DEFW 0x0024 ;Y позиция скролбара - DEFW 0x00B8 ;Max длина скролбара - DEFW 0x0000 ;тек.длина скролбара -BarPgU DEFW 0x0000 ;Адрес ячейки BarLeft -BarPgD DEFW 0x0000 ;Адрес ячейки BarRight - DEFW 0x0019 ;Кол-во строк на странице -ELines DEFW 0x0000 ;Общее кол-во строк -CLine DEFW 0x0000 ;Первая строка на странице -EditHBar DEFW 0x0010 ;X позиция скролбара - DEFW 0x00E4 ;Y позиция скролбара - DEFW 0x0250 ;Max длина скролбара - DEFW 0x0000 ;тек.длина скролбара - DEFW TBarL ;Адрес ячейки BarLeft - DEFW TBarR ;Адрес ячейки BarRight - DEFW 0x004E ;Кол-во строк на странице -CScrnX DEFW 0x0000 ;Общее кол-во строк -CAddX DEFW 0x0000 ;Первая строка на странице +EditVBar DW 624 ; X позиция скролбара + DW 36 ; Y позиция скролбара + DW 184 ; Max длина скролбара + DW 0 ; тек.длина скролбара +BarPgU DW 0 ; Адрес ячейки BarLeft +BarPgD DW 0 ; Адрес ячейки BarRight + DW 25 ; Кол-во строк на странице +ELines DW 0 ; Общее кол-во строк +CLine DW 0 ; Первая строка на странице +EditHBar DW 16 ; X позиция скролбара + DW 228 ; Y позиция скролбара + DW 592 ; Max длина скролбара + DW 0 ; тек.длина скролбара + DW TBarL ; Адрес ячейки BarLeft + DW TBarR ; Адрес ячейки BarRight + DW 78 ; Кол-во строк на странице +CScrnX DW 0 ; Общее кол-во строк +CAddX DW 0 ; Первая строка на странице ;[]==========================================================[] PrintPage LD A,(EditMode) @@ -692,11 +690,6 @@ ResCurs SETPORT WINSP.CPU1,,0 RET -FECrTimer DEFB 0x01 -FECurCursor DEFB 0x00 -CursorPos DEFW 0x0000 -FECursBuffer DUPL 8,0 - ;[]==========================================================[] FEAbout CALL FEResCursor MAKEWINDOW WINSUBOBJ.STORE @@ -766,6 +759,46 @@ FEScrlSCRDnUp DI EI RET + IF ENABLE_CODEPAGE +InitCodePage: LD A,0 +CodePage EQU $-1 + LD L,A + ADD A,A ; *2 + ADD A,L ; *3 + ADD A,A ; *6 + ADD A,L ; *7 + LD HL,EncDos + ADD A,L + LD L,A + ADC A,H + SUB L + LD H,A + LD (ASCIIenc1),HL + LD (ASCIIenc2),HL + LD A, (CodePage) + AND A + JR NZ,.next + LD HL,0 +.call: LD (PutLineA2),A + LD (PutLineA2 + 1),HL + LD (InsSymbol),A + LD (InsSymbol + 1),HL + RET + +.next: DEC A + LD HL,Table866 + JR Z,.next1 + LD HL,TableKoi +.next1: LD (DecodeSymbol.table),HL + LD HL,DecodeSymbol + LD A,0xCD + JR .call + +EncDos: DZ "F8 DOS" +EncWin: DZ "F8 WIN" +EncKoi: DZ "F8 KOI" + ENDIF + ;[]==========================================================[] include fedos.a80 include fetext.a80 @@ -774,76 +807,118 @@ FEScrlSCRDnUp DI include fesetup.a80 ;[]==========================================================[] -FEASCIItab: DW 0x0000,0x0270,0x001C,0x00E4,0x00,0x0000, TNewCrPos, 0x0000 - DW 0x0000,0x0050,0x00F2,0x0100,0x01,0x0000, FEAbout, 0x0000 - DW 0x0050,0x00A0,0x00F2,0x0100,0x01,0x0000, SaveFile, 0x0000 - DW 0x00A0,0x00F0,0x00F2,0x0100,0x01,0x0000, ChEditor, 0x0000 - DW 0x0190,0x01E0,0x00F2,0x0100,0x01,0x0000, EditorSetup, 0x0000 - DW 0x01E0,0x0230,0x00F2,0x0100,0x01,0x0000, FEPrintFile, 0x0000 - DW 0x0230,0x0280,0x00F2,0x0100,0x21,0x0000, EditorExit, 0x0000 - DW 0x0270,0x0280,0x001C,0x0024,0x03,0x0000, TCursorUp, 0x0000 - DW 0x0270,0x0280,0x00DC,0x00E4,0x03,0x0000, TCursorDown, 0x0000 +FEASCIItab: DW 0,624, 28,228,%0000000000000000,%0000000000000000,TNewCrPos,0 + DW 0, 80,242,256,%0000000000000001,%0000000000000000,FEAbout,0 ; F1 + DW 80,160,242,256,%0000000000000001,%0000000000000000,SaveFile,0 ; F2 + DW 160,240,242,256,%0000000000000001,%0000000000000000,ChEditor,0 ; F4 + IF ENABLE_CODEPAGE + DW 340,420,242,256,%0000000000000001,%0000000000000000,FEPrintFile,0 ; F7 + DW 420,480,242,256,%0000000000000001,%0000000000000000,ChCodePage,0 ; F8 + ELSE + DW 400,480,242,256,%0000000000000001,%0000000000000000,FEPrintFile,0 + ENDIF + DW 480,560,242,256,%0000000000000001,%0000000000000000,EditorSetup,0 ; F9 + DW 560,640,242,256,%0000000000100001,%0000000000000000,EditorExit,0 ; F10 + DW 624,640, 28, 36,%0000000000000011,%0000000000000000,TCursorUp,0 + DW 624,640,220,228,%0000000000000011,%0000000000000000,TCursorDown,0 TBarU EQU $+6 - DW 0x0270,0x0280,0x001C,0x0000,0x00,0x0000, FETPageUp, 0x0000 + DW 624,640, 28, 0,%0000000000000000,%0000000000000000,FETPageUp,0 TBarD EQU $+4 - DW 0x0270,0x0280,0x0000,0x00E4,0x00,0x0000, TPageDown, 0x0000 - DW 0x0000,0x0010,0x00E4,0x00EC,0x03,0x0000, TCursorLeft, 0x0000 - DW 0x0260,0x0270,0x00E4,0x00EC,0x03,0x0000, TCursorRight, 0x0000 + DW 624,640, 0,228,%0000000000000000,%0000000000000000,TPageDown,0 + DW 0, 16,228,236,%0000000000000011,%0000000000000000,TCursorLeft,0 + DW 608,624,228,236,%0000000000000011,%0000000000000000,TCursorRight,0 TBarL EQU $+2 - DW 0x0010,0x0000,0x00E4,0x00EC,0x00,0x0000, TCursorLeft, 0x0000 -TBarR: DW 0x0000,0x0260,0x00E4,0x00EC,0x00,0x0000, TCursorRight, 0x0000 - DEFW 0x8000 + DW 16, 0,228,236,%0000000000000000,%0000000000000000,TCursorLeft,0 +TBarR: DW 0,608,228,236,%0000000000000000,%0000000000000000,TCursorRight,0 + DW 0x8000 -FEHEXtab: DW 0x0000,0x0050,0x00F2,0x0100,0x01,0x0000, FEAbout, 0x0000 - DW 0x0050,0x00A0,0x00F2,0x0100,0x01,0x0000, SaveFile, 0x0000 - DW 0x00A0,0x00F0,0x00F2,0x0100,0x01,0x0000, ChEditor, 0x0000 - DW 0x00F0,0x0140,0x00F2,0x0100,0x01,0x0000, FEHGoTo, 0x0000 - DW 0x0190,0x01E0,0x00F2,0x0100,0x01,0x0000, EditorSetup, 0x0000 - DW 0x01E0,0x0230,0x00F2,0x0100,0x01,0x0000, FEPrintFile, 0x0000 - DW 0x0230,0x0280,0x00F2,0x0100,0x21,0x0000, EditorExit, 0x0000 +FEHEXtab: DW 0, 80,242,256,%0000000000000001,%0000000000000000,FEAbout,0 ; F1 + DW 80,160,242,256,%0000000000000001,%0000000000000000,SaveFile,0 ; F2 + DW 160,240,242,256,%0000000000000001,%0000000000000000,ChEditor,0 ; F4 + DW 240,320,242,256,%0000000000000001,%0000000000000000,FEHGoTo,0 ; F5 + IF ENABLE_CODEPAGE + DW 340,420,242,256,%0000000000000001,%0000000000000000,FEPrintFile,0 ; F7 + DW 420,480,242,256,%0000000000000001,%0000000000000000,ChCodePage,0 ; F8 + ELSE + DW 400,480,242,256,%0000000000000001,%0000000000000000,FEPrintFile,0 + ENDIF + DW 480,560,242,256,%0000000000000001,%0000000000000000,EditorSetup,0 ; F9 + DW 560,640,242,256,%0000000000100001,%0000000000000000,EditorExit,0 ; F10 - DW 0x0270,0x0280,0x001C,0x0024,0x03,0x0000, HCursorUp, 0x0000 - DW 0x0270,0x0280,0x00DC,0x00E4,0x03,0x0000, HCursorDown, 0x0000 - DW 0x0048,0x01D8,0x001C,0x00E4,0x00,0x0000, HNewHEXPos, 0x0000 - DW 0x01E8,0x0268,0x001C,0x00E4,0x00,0x0000, HNewASCPos, 0x0000 + DW 624,640, 28, 36,%0000000000000011,%0000000000000000,HCursorUp,0 + DW 624,640,220,228,%0000000000000011,%0000000000000000,HCursorDown,0 + DW 72,472, 28,228,%0000000000000000,%0000000000000000,HNewHEXPos,0 + DW 488,616, 28,228,%0000000000000000,%0000000000000000,HNewASCPos,0 HBarU EQU $+6 - DW 0x0270,0x0280,0x001C,0x0000,0x00,0x0000, FEHPageUp, 0x0000 + DW 624,640, 28, 0,%0000000000000000,%0000000000000000,FEHPageUp,0 HBarD EQU $+4 - DW 0x0270,0x0280,0x0000,0x00E4,0x00,0x0000, FEHPageDown, 0x0000 - DEFW 0x8000 + DW 624,640, 0,228,%0000000000000000,%0000000000000000,FEHPageDown,0 + DW 0x8000 -FEAboutTab: DEFW 0x011C,0x0164,0x008A,0x0098,0x21,0x0000, FEAboutExt, 0x0000 - DEFW 0x0000,0x00A0,0x0000,0x0100,0x20,0x0000, FEAboutExt, 0x0000 - DEFW 0x01E0,0x0280,0x0000,0x0100,0x20,0x0000, FEAboutExt, 0x0000 - DEFW 0x0000,0x0280,0x0000,0x0048,0x20,0x0000, FEAboutExt, 0x0000 - DEFW 0x0000,0x0280,0x009D,0x0100,0x20,0x0000, FEAboutExt, 0x0000 - DEFW 0x8000 +FEAboutTab: DW 284,356,138,152,%0000000000100001,%0000000000000000,FEAboutExt,0 + DW 0,160, 0,256,%0000000000100000,%0000000000000000,FEAboutExt,0 + DW 480,640, 0,256,%0000000000100000,%0000000000000000,FEAboutExt,0 + DW 0,640, 0, 72,%0000000000100000,%0000000000000000,FEAboutExt,0 + DW 0,640,157,256,%0000000000100000,%0000000000000000,FEAboutExt,0 + DW 0x8000 -SureTab: DEFW 0x00F0,0x0138,0x007A,0x0088,0x021,0x0000, SureOkey, 0x0000 - DEFW 0x0148,0x0190,0x007A,0x0088,0x021,0x0000, SureExit, 0x0000 - DEFW 0x0000,0x00D0,0x0000,0x0100,0x120,0x0000, EditorLoop, 0x0000 - DEFW 0x01B0,0x0280,0x0000,0x0100,0x120,0x0000, EditorLoop, 0x0000 - DEFW 0x0000,0x0280,0x0000,0x0050,0x120,0x0000, EditorLoop, 0x0000 - DEFW 0x0000,0x0280,0x008C,0x0100,0x120,0x0000, EditorLoop, 0x0000 - DEFW 0x8000 +SureTab: DW 240,312,122,136,%0000000000100001,%0000000000000000,SureOkey,0 + DW 328,400,122,136,%0000000000100001,%0000000000000000,SureExit,0 + DW 0,208, 0,256,%0000000100100000,%0000000000000000,EditorLoop,0 + DW 432,640, 0,256,%0000000100100000,%0000000000000000,EditorLoop,0 + DW 0,640, 0, 80,%0000000100100000,%0000000000000000,EditorLoop,0 + DW 0,640,140,256,%0000000100100000,%0000000000000000,EditorLoop,0 + DW 0x8000 -NewFileTab: DEFW 0x00F0,0x0138,0x0082,0x0090,0x021,0x0000, NewFExitO, 0x0000 - DEFW 0x0148,0x0190,0x0082,0x0090,0x021,0x0000, NewFExitC, 0x0000 - DEFW 0x0000,0x00C0,0x0000,0x0100,0x020,0x0000, NewFExitC, 0x0000 - DEFW 0x01C0,0x0280,0x0000,0x0100,0x020,0x0000, NewFExitC, 0x0000 - DEFW 0x0000,0x0280,0x0000,0x0058,0x020,0x0000, NewFExitC, 0x0000 - DEFW 0x0000,0x0280,0x0094,0x0100,0x020,0x0000, NewFExitC, 0x0000 - DEFW 0x8000 +NewFileTab: DW 240,312,130,144,%0000000000100001,%0000000000000000,NewFExitO,0 + DW 328,400,130,144,%0000000000100001,%0000000000000000,NewFExitC,0 + DW 0,192, 0,256,%0000000000100000,%0000000000000000,NewFExitC,0 + DW 448,640, 0,256,%0000000000100000,%0000000000000000,NewFExitC,0 + DW 0,640, 0, 88,%0000000000100000,%0000000000000000,NewFExitC,0 + DW 0,640,148,256,%0000000000100000,%0000000000000000,NewFExitC,0 + DW 0x8000 -FEQuitTab: DW 0x00F0,0x0138,0x0078,0x0086,0x21,0x0000, SureExit, 0x0000 - DW 0x0148,0x0190,0x0078,0x0086,0x21,0x0000, FEQuitAbort, 0x0000 - DW 0x0000,0x00D0,0x0000,0x0100,0x20,0x0000, FEQuitAbort, 0x0000 - DW 0x01B0,0x0280,0x0000,0x0100,0x20,0x0000, FEQuitAbort, 0x0000 - DW 0x0000,0x0280,0x0000,0x0058,0x20,0x0000, FEQuitAbort, 0x0000 - DW 0x0000,0x0280,0x008A,0x0100,0x20,0x0000, FEQuitAbort, 0x0000 +FEQuitTab: DW 240,312,120,134,%0000000000100001,%0000000000000000,SureExit,0 + DW 328,400,120,134,%0000000000100001,%0000000000000000,FEQuitAbort,0 + DW 0,208, 0,256,%0000000000100000,%0000000000000000,FEQuitAbort,0 + DW 432,640, 0,256,%0000000000100000,%0000000000000000,FEQuitAbort,0 + DW 0,640, 0, 88,%0000000000100000,%0000000000000000,FEQuitAbort,0 + DW 0,640,138,256,%0000000000100000,%0000000000000000,FEQuitAbort,0 DW 0x8000 SettingsFileName: DZ FILENAME.FNEDIT_INI ;[]==========================================================[] +FECrTimer DB 1 + +EDBUF STRUCT +.CursorX DB ? ; Cursor X +.StringX DB ? ; String X +.CursAddX DB ? ; Cursor add X +.CursorY DB ? ; Cursor Y +.LenString DB ? ; Len String +.PrevLenString DB ? ; Previos Len String +.ReadyStr DB ? ; Ready String +.ReadyFile DB ? ; Ready File +EDBUF ENDSTRUCT + +EditData EDBUF + INIT_VAR $ + SETVAR CurLine, WORD + SETVAR EquipLines, WORD + SETVAR LineShift, WORD + SETVAR FEPageShift, WORD + SETVAR FETempShift, WORD + SETVAR FEFileLenght, WORD ; Длина файла (16бит) + SETVAR FEEmptyLines, BYTE + SETVAR FEMemIndef, BYTE + SETVAR FEFHandle, BYTE + SETVAR FEReadLen, 0 + SETVAR SaveLen, WORD + SETVAR EditMode, BYTE + SETVAR HEXmode, BYTE + SETVAR FECurCursor, BYTE + SETVAR CursorPos, WORD + SETVAR FECursBuffer, 8 + SETVAR EditingFile, 0x30 diff --git a/plugins/fneditor/fedos.a80 b/plugins/fneditor/fedos.a80 index ae65e91..34da050 100644 --- a/plugins/fneditor/fedos.a80 +++ b/plugins/fneditor/fedos.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 27.05.2025 savelij +; LAST UPDATE: 29.07.2025 savelij ;[]==========================================================[] FELoadFile CALL JUMPS.SetClock @@ -22,7 +22,7 @@ FELoadFile CALL JUMPS.SetClock LD A,H AND 0xC0 CP 0xC0 - LD A,0x1E + LD A,ERR_DSS.NOT_ENOUGH_MEMORY PUSH AF CALL Z,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти POP AF @@ -31,7 +31,7 @@ FELoadFile CALL JUMPS.SetClock LD (FEFileLenght),HL LD A,(IX+30) OR (IX+31) - LD A,0x1E + LD A,ERR_DSS.NOT_ENOUGH_MEMORY PUSH AF CALL NZ,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти POP AF @@ -51,11 +51,11 @@ FELoadFile CALL JUMPS.SetClock AND 0xC0 RLCA RLCA - LD (IX+PROC.MAXL1),A + LD (IX+PROC.MAX_PAGES),A SUB A - LD (IX+PROC.MAXH1),A - LD (IX+PROC.MAXL2),A - LD (IX+PROC.MAXH2),A + LD (IX+PROC.MAX_PAGES + 1),A + LD (IX+PROC.MAX_PAGES + 2),A + LD (IX+PROC.MAX_PAGES + 3),A CALL JUMPS.InitProcess MAKEWINDOW WINSUBOBJ.STORE W_MAIN 160,88,320,48 @@ -320,11 +320,11 @@ SaveFile CALL PutString OR L JR Z,.L1 INC B -.L1 LD (IX+PROC.MAXL1),B +.L1 LD (IX+PROC.MAX_PAGES),B SUB A - LD (IX+PROC.MAXH1),A - LD (IX+PROC.MAXL2),A - LD (IX+PROC.MAXH2),A + LD (IX+PROC.MAX_PAGES + 1),A + LD (IX+PROC.MAX_PAGES + 2),A + LD (IX+PROC.MAX_PAGES + 3),A CALL JUMPS.InitProcess MAKEWINDOW WINSUBOBJ.STORE W_MAIN 160,88,320,48 @@ -448,32 +448,32 @@ SaveAbort POP HL ;[]----------------------------------------------------------[] FENextProcess LD IX,ProcessEdit - LD L,(IX+PROC.CURL1) - LD H,(IX+PROC.CURH1) + LD L,(IX+PROC.CURR_PAGE) + LD H,(IX+PROC.CURR_PAGE + 1) INC HL - LD (IX+PROC.CURL1),L - LD (IX+PROC.CURH1),H + LD (IX+PROC.CURR_PAGE),L + LD (IX+PROC.CURR_PAGE + 1),H LD A,H OR L JR NZ,.NextPr1 - LD L,(IX+PROC.CURL2) - LD H,(IX+PROC.CURH2) + LD L,(IX+PROC.CURR_PAGE + 2) + LD H,(IX+PROC.CURR_PAGE + 3) INC HL - LD (IX+PROC.CURL2),L - LD (IX+PROC.CURH2),H + LD (IX+PROC.CURR_PAGE + 2),L + LD (IX+PROC.CURR_PAGE + 3),H .NextPr1 CALL JUMPS.PrnProcess RET -ProcessEdit DEFW 0x00B2 - DEFW 0x0075 - DEFW 0x011C - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFB 0x4F +ProcessEdit DW 178 + DW 117 + DW 284 + DW 0 + DW 0 + DW 0 + DW 0 + DW 0 + DW 0 + DB COLORP.BLUE + COLORI.WHITE ;FECorrBigChar CP 0x41 ; RET C diff --git a/plugins/fneditor/fehex.a80 b/plugins/fneditor/fehex.a80 index 9614b07..b4cafe8 100644 --- a/plugins/fneditor/fehex.a80 +++ b/plugins/fneditor/fehex.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 20.03.2025 savelij +; LAST UPDATE: 26.07.2025 savelij ;[]==========================================================[] ;Процедура печати страницы дампа с тек.смещ. от начала файла @@ -265,7 +265,7 @@ PrnHEXinfo LD HL,LineH SBC HL,DE JR Z,TstLinH LD (ELines),DE - CALL JUMPS.InitScrBar + CALL JUMPS.InitScrollBar LD HL,(CurLine) LD (CLine),HL CALL JUMPS.PrnVScrBar diff --git a/plugins/fneditor/feprn.a80 b/plugins/fneditor/feprn.a80 index e38224d..592eef7 100644 --- a/plugins/fneditor/feprn.a80 +++ b/plugins/fneditor/feprn.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 20.03.2025 savelij +; LAST UPDATE: 26.07.2025 savelij ;[]==========================================================[] FEPrintFile CALL FEResCursor @@ -22,10 +22,10 @@ FEPrintFile CALL FEResCursor OR A JR Z,.InitPrn INC HL -.InitPrn LD (IX+PROC.MAXL1),L - LD (IX+PROC.MAXH1),H - LD (IX+PROC.MAXL2),0X00 - LD (IX+PROC.MAXH2),0x00 +.InitPrn LD (IX+PROC.MAX_PAGES),L + LD (IX+PROC.MAX_PAGES + 1),H + LD (IX+PROC.MAX_PAGES + 2),0x00 + LD (IX+PROC.MAX_PAGES + 3),0x00 CALL JUMPS.InitProcess LD A,(EditMode) OR A @@ -278,19 +278,19 @@ FENxtPrnProc LD A,E EXX PUSH DE LD IX,FEProcessPrn - LD L,(IX+PROC.CURL1) - LD H,(IX+PROC.CURH1) + LD L,(IX+PROC.CURR_PAGE) + LD H,(IX+PROC.CURR_PAGE + 1) INC HL - LD (IX+PROC.CURL1),L - LD (IX+PROC.CURH1),H + LD (IX+PROC.CURR_PAGE),L + LD (IX+PROC.CURR_PAGE + 1),H LD A,H OR L JR NZ,.NxtProc - LD L,(IX+PROC.CURL2) - LD H,(IX+PROC.CURH2) + LD L,(IX+PROC.CURR_PAGE + 2) + LD H,(IX+PROC.CURR_PAGE + 3) INC HL - LD (IX+PROC.CURL2),L - LD (IX+PROC.CURH2),H + LD (IX+PROC.CURR_PAGE + 2),L + LD (IX+PROC.CURR_PAGE + 3),H .NxtProc CALL JUMPS.PrnProcess POP DE EXX diff --git a/plugins/fneditor/fesetup.a80 b/plugins/fneditor/fesetup.a80 index d835197..5588899 100644 --- a/plugins/fneditor/fesetup.a80 +++ b/plugins/fneditor/fesetup.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 16.07.2025 savelij +; LAST UPDATE: 26.07.2025 savelij FECSign: DB "FEC" HomeKeyFlag: DB 0 @@ -30,7 +30,7 @@ ReadEditorIni: ld a,0 PUSH AF LD A,(JUMPS.FNREZ2) SETPORT WINSP.CPU1,,0 - LD HL,ADDR.FlexDIRECTORY + LD HL,BUF_REZ2.FlexDIRECTORY PUSH IY SPDSS DSSF.CHDIR POP IY @@ -246,7 +246,7 @@ FESetupOkey: ld a,(ExitDlgFlag) PUSH AF LD A,(JUMPS.FNREZ2) SETPORT WINSP.CPU1,,0 - LD HL,ADDR.FlexDIRECTORY + LD HL,BUF_REZ2.FlexDIRECTORY SPDSS DSSF.CHDIR EX AF,AF' POP AF diff --git a/plugins/fneditor/fetext.a80 b/plugins/fneditor/fetext.a80 index 4d30f77..0784f82 100644 --- a/plugins/fneditor/fetext.a80 +++ b/plugins/fneditor/fetext.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 20.03.2025 savelij +; LAST UPDATE: 29.07.2025 savelij ;[]==========================================================[] FEPrnASCIIpage LD HL,PrnASCIIinfo @@ -8,9 +8,9 @@ FEPrnASCIIpage LD HL,PrnASCIIinfo LD (FETempShift),HL LD B,0x1C FEPrnASCIIlp PUSH BC - CALL PrnASCIIline ;Выводим строку в буф и на экран + CALL PrnASCIIline ; Выводим строку в буф и на экран POP BC - JR C,FillASCII ;CY-Закончились байты для печати + JR C,FillASCII ; CY-Закончились байты для печати LD A,B ADD A,0x08 LD B,A @@ -21,14 +21,13 @@ FEPrnASCIIlp PUSH BC LD E,(IY+CursorX) LD D,(IY+CursorY) CALL FESetCursor - CALL GetString - RET + JP GetString -;Процедура отчистки нижней области экрана +; Процедура очистки нижней области экрана FillASCII LD A,0xE4 SUB B LD (FEFLenASC),A - JR Z,FEFASCIIe ;Z-нет отчистки + JR Z,FEFASCIIe ; Z-нет отчистки LD A,B LD (FEFPosASC),A MAKEWINDOW WINSUBOBJ.WOBIND @@ -66,9 +65,9 @@ RefrASCIIpage LD HL,PrnASCIIinfo LD (FETempShift),HL JR .L1 -.RfASCII CALL PrnASCIIline ;Выводим строку в буф и на экран +.RfASCII CALL PrnASCIIline ; Выводим строку в буф и на экран .L1 POP BC - RET C ;CY-Закончились байты для печати + RET C ; CY-Закончились байты для печати DEC C LD A,B ADD A,0x08 @@ -78,7 +77,7 @@ RefrASCIIpage LD HL,PrnASCIIinfo RET ;[]----------------------------------------------------------[] -;Процедура печати тек.строки в буфер и на экран +; Процедура печати тек.строки в буфер и на экран PrnASCIIline LD IXH,B LD C,0xF0 LD HL,(FEFileLenght) @@ -98,25 +97,25 @@ PutASCIIln LD HL,TempBuffer GETPORT WINSP.CPU1 PUSH AF LD DE,(FETempShift) - LD A,D ;Выделяем номер страницы + LD A,D ; Выделяем номер страницы AND 0xC0 RLCA RLCA EXX - LD E,A ;DE - Адрес страницы в списке + LD E,A ; DE - Адрес страницы в списке LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX - RES 7,D ;Вкл.с 0x4000 + RES 7,D ; Вкл.с 0x4000 SET 6,D PutASCIIlnLp BIT 7,D JR Z,PutLnA1 RES 7,D SET 6,D EXX - INC E ;DE - Адрес страницы в списке - LD A,(DE) ;Тек.страница + INC E ; DE - Адрес страницы в списке + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX PutLnA1 LD A,(DE) @@ -127,9 +126,9 @@ PutLnA1 LD A,(DE) JR Z,PutLnA2 RES 7,D SET 6,D - EXX - INC E ;DE - Адрес страницы в списке - LD A,(DE) ;Тек.страница + EXX + INC E ; DE - Адрес страницы в списке + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX PutLnA2 LD A,(DE) @@ -156,8 +155,8 @@ PutLnEA0 BIT 7,D RES 7,D SET 6,D EXX - INC E ;DE - Адрес страницы в списке - LD A,(DE) ;Тек.страница + INC E ; DE - Адрес страницы в списке + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX PutLEA1 LD A,(DE) @@ -169,7 +168,11 @@ PutLEA1 LD A,(DE) PutLnEA1 DJNZ PutLnEA0 JR PutLineA3 -PutLineA2 LD (HL),A +PutLineA2 + IF ENABLE_CODEPAGE + CALL DecodeSymbol + ENDIF + LD (HL),A INC L LD A,L CP C @@ -180,8 +183,8 @@ PutLineA3 BIT 7,D RES 7,D SET 6,D EXX - INC E ;DE - Адрес страницы в списке - LD A,(DE) ;Тек.страница + INC E ; DE - Адрес страницы в списке + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX PutLnA3 LD A,(DE) @@ -285,8 +288,7 @@ PrASCIIex1 CALL FEResCursor CALL JUMPS.PrnTxtLnNormC LD E,(IY+CursorX) LD D,(IY+CursorY) - CALL FESetCursor - RET + JP FESetCursor ;[]==========================================================[] FESearchUp LD B,0xF0 @@ -300,14 +302,14 @@ FESearchUp LD B,0xF0 .SearchUpBeg PUSH HL GETPORT WINSP.CPU1 PUSH AF - LD A,H ;Выделяем номер страницы + LD A,H ; Выделяем номер страницы AND 0xC0 RLCA RLCA LD E,A LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница - SETPORT WINSP.CPU1,,0 + LD A,(DE) ; Тек.страница + SETPORT WINSP.CPU1,,0 RES 7,H SET 6,H LD C,0x00 @@ -323,7 +325,7 @@ FESearchUp LD B,0xF0 SET 6,H .SrchUp0 LD A,(HL) CP 0x0A - JR NZ,FESrchUp1+1 + JR NZ,FESrchUp1 + 1 LD A,B OR A JR Z,FESrchUpEx @@ -395,13 +397,13 @@ FESearchDown LD B,0xF0 .SearchDnBeg PUSH HL GETPORT WINSP.CPU1 PUSH AF - LD A,H ;Выделяем номер страницы + LD A,H ; Выделяем номер страницы AND 0xC0 RLCA RLCA LD E,A LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 RES 7,H SET 6,H @@ -485,25 +487,25 @@ GetLine LD HL,LineBuffer JR Z,GetLnE1 GETPORT WINSP.CPU1 PUSH AF - LD A,D ;Выделяем номер страницы + LD A,D ; Выделяем номер страницы AND 0xC0 RLCA RLCA EXX - LD E,A ;DE - Адрес страницы в списке + LD E,A ; DE - Адрес страницы в списке LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX - RES 7,D ;Вкл.с 0x4000 + RES 7,D ; Вкл.с 0x4000 SET 6,D GetLnLoop BIT 7,D JR Z,GetLn1 RES 7,D SET 6,D EXX - INC E ;DE - Адрес страницы в списке - LD A,(DE) ;Тек.страница + INC E ; DE - Адрес страницы в списке + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX GetLn1 LD A,(DE) @@ -569,25 +571,25 @@ PutStrN SUB A GETPORT WINSP.CPU1 PUSH AF LD DE,(LineShift) - LD A,D ;Выделяем номер страницы + LD A,D ; Выделяем номер страницы AND 0xC0 RLCA RLCA EXX - LD E,A ;DE - Адрес страницы в списке + LD E,A ; DE - Адрес страницы в списке LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX - RES 7,D ;Вкл.с 0x4000 + RES 7,D ; Вкл.с 0x4000 SET 6,D PutStringLp BIT 7,D JR Z,PutStr3 RES 7,D SET 6,D EXX - INC E ;DE - Адрес страницы в списке - LD A,(DE) ;Тек.страница + INC E ; DE - Адрес страницы в списке + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX PutStr3 LD A,(HL) @@ -754,7 +756,7 @@ PrnASCIIinfo LD HL,LineT LD DE,ColT LD BC,FreeT LD A,0x01 - REPT 0x04 + REPT 4 LD (HL),A INC HL LD (DE),A @@ -811,7 +813,7 @@ PrnASCIIinfo LD HL,LineT SBC HL,DE JR Z,TstLine LD (ELines),DE - CALL JUMPS.InitScrBar + CALL JUMPS.InitScrollBar LD HL,(CurLine) LD (CLine),HL CALL JUMPS.PrnVScrBar @@ -832,8 +834,7 @@ TstAddX LD A,(CAddX) ADD A,(IY+CursAddX) LD (CAddX),A LD IX,EditHBar - CALL JUMPS.PrnHScrBar - RET + JP JUMPS.PrnHScrBar ReadyNo DEFB 0x01,0 ReadyYes DEFB "*",0 @@ -850,7 +851,11 @@ TInsertSymbol CP 0x20 JP Z,Enter CP 0x09 RET NZ -InsSymbol: push af +InsSymbol: + IF ENABLE_CODEPAGE + CALL DecodeSymbol + ENDIF + push af call Insert call TCursorRight pop bc @@ -872,13 +877,13 @@ AutoBrackets EQU $-1 db "(){}[]<>" cp b jr nz,Insert - cp '\"' ; #22 + cp '\"' ret nz jp Insert CanInsertBrackets: - LD A,(IY+LenString) ;InpytSymb - CP 240 ;Max len + LD A,(IY+LenString) ; InpytSymb + CP 240 ; Max len RET Z LD H,HIGH (LineBuffer) LD L,(IY+StringX) @@ -893,13 +898,13 @@ CanInsertBrackets: ret Insert EX AF,AF' - LD A,(IY+LenString) ;InpytSymb - CP 240 ;Max len + LD A,(IY+LenString) ; InpytSymb + CP 240 ; Max len RET Z SUB (IY+StringX) JR C,.NotInsert JR Z,.NotInsert -;Ввод в середину текста +; Ввод в середину текста LD C,A LD B,0x00 LD L,(IY+LenString) @@ -922,10 +927,10 @@ Insert EX AF,AF' ret ;[]----------------------------------------------------------[] -;Подстановка a по списку за call. -;первый байт списка содержит число -;следующих далее пар образец-заменитель. -;Вход: a. Выход: a +; Подстановка a по списку за call. +; первый байт списка содержит число +; следующих далее пар образец-заменитель. +; Вход: a. Выход: a ; BXOД: A,List ; BЫXOД: A Subst: ex (sp),hl @@ -945,11 +950,11 @@ Subst2: inc hl ret ;[]----------------------------------------------------------[] -;DoubleString +; DoubleString TDoubleString: ld l,(iy+LenString) ld a,l and a - adc a,a ;будет превышен буфер в 256 символов + adc a,a ; будет превышен буфер в 256 символов ret c adc a,2 ret c @@ -984,7 +989,7 @@ TDoubleString: ld l,(iy+LenString) jp TCursorDown ;[]----------------------------------------------------------[] -;Enter +; Enter Enter LD A,(IY+LenString) SUB (IY+StringX) jr nc,.less @@ -1080,7 +1085,7 @@ Undo: xor a jp PrnASCIIinfo ;[]----------------------------------------------------------[] -;BackSpace +; BackSpace BackSpace LD A,(IY+StringX) OR A RET Z @@ -1137,8 +1142,7 @@ TDeleteSymbol LD A,(IY+LenString) LD (IY+ReadyFile),A DEC (IY+LenString) CALL PrnASCIIstring - CALL PrnASCIIinfo - RET + JP PrnASCIIinfo AddString CALL PutStr2 LD A,(IY+StringX) @@ -1153,13 +1157,13 @@ AddString CALL PutStr2 ADD HL,DE GETPORT WINSP.CPU1 PUSH AF - LD A,H ;Выделяем номер страницы + LD A,H ; Выделяем номер страницы AND 0xC0 RLCA RLCA LD E,A LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 RES 7,H SET 6,H @@ -1199,11 +1203,10 @@ AddStr2 POP AF LD HL,(EquipLines) DEC HL LD (EquipLines),HL - CALL FEPrnASCIIpage - RET + JP FEPrnASCIIpage ;[]----------------------------------------------------------[] -;Delete word +; Delete word TDeleteWord LD A,(IY+StringX) OR A RET Z @@ -1287,7 +1290,7 @@ TDeleteWord LD A,(IY+StringX) JP TCursorLeft ;[]----------------------------------------------------------[] -;Курсор влево на одно место +; Курсор влево на одно место TCursorLeft LD A,(IY+StringX) OR A RET Z @@ -1341,8 +1344,9 @@ CursLf6 DEC HL DEC (IY+LenString) DJNZ CursLf6 RET + ;[]----------------------------------------------------------[] -;Курсор вправо на одно место +; Курсор вправо на одно место TCursorRight LD A,(IY+CursorX) ADD A,(IY+CursAddX) CP 240 @@ -1393,8 +1397,7 @@ CursRg6 CALL FEResCursor LD E,(IY+CursorX) LD D,(IY+CursorY) CALL FESetCursor - CALL PrnASCIIinfo - RET + JP PrnASCIIinfo ;[]----------------------------------------------------------[] ;Word left @@ -1435,6 +1438,7 @@ TWordLeft LD A,(IY+StringX) .skip LD (IY+StringX),C INC (IY+StringX) JP TCursorLeft + ;[]----------------------------------------------------------[] ;Word right TWordRight LD A,(IY+LenString) @@ -1702,8 +1706,7 @@ CursEx5 LD (IY+CursorX),A LD E,(IY+CursorX) LD D,(IY+CursorY) CALL FESetCursor - CALL PrnASCIIinfo - RET + JP PrnASCIIinfo ;[]----------------------------------------------------------[] FETPageUp CALL PutString @@ -1801,8 +1804,8 @@ PagePr4 LD A,C JR PagePr4 PagePr5 LD (IY+CursorX),A - CALL FEPrnASCIIpage - RET + JP FEPrnASCIIpage + ;[]----------------------------------------------------------[] FETBegFile CALL PutString LD HL,(LineShift) @@ -1942,5 +1945,68 @@ NewPos6 LD A,C LD D,(IY+CursorY) CALL FESetCursor CALL PrnASCIIinfo - CALL JUMPS.ResFire - RET + JP JUMPS.ResFire + + IF ENABLE_CODEPAGE +; перекдючение кодировки +ChCodePage: LD HL,EditorBegin + EX (SP),HL + LD A,(CodePage) + INC A + CP 3 + JR C,.L1 + XOR A +.L1 LD (CodePage),A + RET + +; преобразование символа в зависимости от выбранной кодировки +DecodeSymbol: CP 0x80 + RET C + PUSH HL + SUB 0x80 + LD HL,Table866 +.table EQU $-2 + ADD A,L + LD L,A + ADC A,H + SUB L + LD H,A + LD A,(HL) + POP HL + RET + +; CP866 +Table866: db 0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8 + db 0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F + db 0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D + db 0x3F,0x54,0x3F,0x3E,0x3F,0x3F,0x3F,0x3F + db 0xFF,0xF6,0xF7,0x3F,0xFD,0x3F,0xB3,0x15 + db 0xF0,0x63,0xF2,0x3C,0xBF,0x2D,0x52,0xF4 + db 0xF8,0x2B,0x49,0x69,0x3F,0xE7,0x14,0xFA + db 0xF1,0xFC,0xF3,0x3E,0x3F,0x3F,0x3F,0xF5 + db 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87 + db 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F + db 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97 + db 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F + db 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7 + db 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF + db 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7 + db 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF +; KOI8-R +TableKoi: db 0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4 + db 0xC2,0xC1,0xC5,0xDF,0xDC,0xDB,0xDD,0xDE + db 0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7 + db 0xF3,0xF2,0xFF,0xF5,0xF8,0xFD,0xFA,0xF6 + db 0xCD,0xBA,0xD5,0xF1,0xD6,0xC9,0xB8,0xB7 + db 0xBB,0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6 + db 0xC7,0xCC,0xB5,0xF0,0xB6,0xB9,0xD1,0xD2 + db 0xCB,0xCF,0xD0,0xCA,0xD8,0xD7,0xCE,0xFC + db 0xEE,0xA0,0xA1,0xE6,0xA4,0xA5,0xE4,0xA3 + db 0xE5,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE + db 0xAF,0xEF,0xE0,0xE1,0xE2,0xE3,0xA6,0xA2 + db 0xEC,0xEB,0xA7,0xE8,0xED,0xE9,0xE7,0xEA + db 0x9E,0x80,0x81,0x96,0x84,0x85,0x94,0x83 + db 0x95,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E + db 0x8F,0x9F,0x90,0x91,0x92,0x93,0x86,0x82 + db 0x9C,0x9B,0x87,0x98,0x9D,0x99,0x97,0x9A + ENDIF diff --git a/plugins/fnviewer/fvmain.a80 b/plugins/fnviewer/build.a80 similarity index 80% rename from plugins/fnviewer/fvmain.a80 rename to plugins/fnviewer/build.a80 index 8536e66..f072daf 100644 --- a/plugins/fnviewer/fvmain.a80 +++ b/plugins/fnviewer/build.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 18.07.2025 savelij +; LAST UPDATE: 26.07.2025 savelij include macros.a80 @@ -14,7 +14,8 @@ include mouse_sp.a80 include fat_dir_sp.a80 include macros_sp.a80 + include errors_sp.a80 - HDR_FLX "-VIEW",,,;FLXMODES.M_ADRORG + HDR_FLX "-VIEW" include fviewer.a80 diff --git a/plugins/fnviewer/build.bat b/plugins/fnviewer/build.bat index 82de503..675b0ff 100644 --- a/plugins/fnviewer/build.bat +++ b/plugins/fnviewer/build.bat @@ -6,8 +6,8 @@ set path=d:\yad\svn\pentevo\tools\asl\bin\;d:\yad\svn\pentevo\tools\mhmt\ call ..\..\setpath_includes set includes=%includes%;..\..\ -asl -U -L -C -x -olist tmp\fviewer.lst -i %includes% fvmain.a80 || goto error -p2bin fvmain.p ..\fnviewer.flx -r $-$ -k +asl -U -L -C -x -olist tmp\fviewer.lst -i %includes% build.a80 || goto error +p2bin build.p ..\fnviewer.flx -r $-$ -k echo ######################## echo # -= End Compile Ok =- # diff --git a/plugins/fnviewer/fvhex.a80 b/plugins/fnviewer/fvhex.a80 index f6ed6a8..2ada502 100644 --- a/plugins/fnviewer/fvhex.a80 +++ b/plugins/fnviewer/fvhex.a80 @@ -1,11 +1,11 @@ -; LAST UPDATE: 20.03.2025 savelij +; LAST UPDATE: 28.07.2025 savelij ;-------------------------------------------------------------- -;Процедура печати страницы дампа с тек.смещ. от начала файла -;На вход: +; Процедура печати страницы дампа с тек.смещ. от начала файла +; На вход: ; None -;На выход: +; На выход: ; None PrnHEXpage LD HL,PrintVProc PUSH HL @@ -14,7 +14,7 @@ PrnHEXpage LD HL,PrintVProc AND 0xF0 LD L,A LD (FileShift),HL - LD (TempShift),HL ;Запоминаем тек.смещение + LD (TempShift),HL ; Запоминаем тек.смещение LD HL,(FileShift+2) LD (TempShift+2),HL LD HL,LineBuffer @@ -22,13 +22,13 @@ PrnHEXpage LD HL,PrintVProc .L1 LD (HL),C INC L DJNZ .L1 - LD B,0x1C ;Изнач.позиция печати + LD B,0x1C ; Изнач.позиция печати PrnHEXl PUSH BC - CALL PutHLine ;Выводим строку в буфер и на экран + CALL PutHLine ; Выводим строку в буфер и на экран POP BC - JR C,FillDwnHex ;CY-Закончились байты для печати + JR C,FillDwnHex ; CY-Закончились байты для печати LD HL,(TempShift) - LD DE,0x0010 ;Адрес дампа+16 + LD DE,0x0010 ; Адрес дампа+16 ADD HL,DE LD (TempShift),HL LD HL,(TempShift+2) @@ -42,10 +42,10 @@ PrnHEXl PUSH BC JR NZ,PrnHEXl RET -;Процедура отчистки нижней области экрана +; Процедура отчистки нижней области экрана FillDwnHex LD A,B CP 0xE4 - RET Z ;Z-нет отчистки + RET Z ; Z-нет отчистки LD (FPosHex),A LD A,0xE4 SUB B @@ -57,7 +57,7 @@ FLenHex EQU $ - 3 W_END RET -;Процедура печати тек.строки в буфер и на экран +; Процедура печати тек.строки в буфер и на экран PutHLine LD IXL,0x00 LD IXH,B LD HL,(FileLenght) @@ -85,31 +85,33 @@ PutHLn GETPORT WINSP.CPU1 PUSH AF CALL InitFPages - LD HL,LineBuffer+1 ;буфер строки + LD HL,LineBuffer+1 ; буфер строки EXX - LD HL,LineBuffer+0x3F ;место для ASCII кодов + LD HL,LineBuffer+0x3F ; место для ASCII кодов EXX - LD A,(TempShift+3) ;Кладем смещение - CALL PutHexNumb ;от начала фаила +; 32-х битное смещение + LD A,(TempShift+3) ; Кладем смещение + CALL PutHexNumb ; от начала фаила LD A,(TempShift+2) CALL PutHexNumb LD A,(TempShift+1) CALL PutHexNumb LD A,(TempShift) CALL PutHexNumb - LD (HL),":" + LD (HL),':' INC L INC L PutHLoop CALL TestFPages LD A,(DE) INC DE - EXX - LD (HL),A + EXX +DECODE4HEX CALL DecodeSymbol + LD (HL),A ; символ для отображения INC L EXX - CALL PutHexNumb ;Процедура конверта + CALL PutHexNumb ; Процедура конверта INC L - INC IXL ;Увелич.кол-во введенных байтов + INC IXL ; Увелич.кол-во введенных байтов LD A,IXL CP 0x04 JR Z,.PtHNx1 @@ -121,9 +123,9 @@ PutHLoop CALL TestFPages .L1 DJNZ PutHLoop POP AF SETPORT WINSP.CPU1,,0 -;Процедура очистки закончившихся байтов -FillHex LD A,0x10 ;Макс.байтов - SUB IXL ;Тек.кол-во байтов +; Процедура очистки закончившихся байтов +FillHex LD A,0x10 ; Макс.байтов + SUB IXL ; Тек.кол-во байтов JR Z,.FillE2 LD B,A LD C,0x20 @@ -137,7 +139,7 @@ FillHex LD A,0x10 ; INC L EXX INC IXL - LD A,IXL ;В центре 2 пробела + LD A,IXL ; В центре 2 пробела CP 0x04 JR Z,.FlHNx1 CP 0x08 @@ -153,28 +155,22 @@ FillHex LD A,0x10 ; LD A,COLORP.PANEL + COLORI.FILES CALL JUMPS.PrnTxtLnNormC OR A - RET ;CY-была последняя строка + RET ; CY-была последняя строка -;Процедура преобразования 8битовых чисел в шестнадц. текст -;На вход: +; Процедура преобразования 8битовых чисел в шестнадц. текст +; На вход: ; HL - адрес буфера ; А - байт -;На выход: +; На выход: ; буфер с текст.числом PutHexNumb PUSH AF RRCA RRCA RRCA RRCA - AND 0x0F - ADD A,0x90 - DAA - ADC A,0x40 - DAA - LD (HL),A - INC L + CALL .L1 POP AF - AND 0x0F +.L1 AND 0x0F ADD A,0x90 DAA ADC A,0x40 @@ -184,8 +180,8 @@ PutHexNumb PUSH AF RET ;-------------------------------------------------------------- -;Процедуры обработки View -;На строку вверх +; Процедуры обработки View +; На строку вверх HLineUpMs CALL FVHLineUp RET C LD B,0x0A @@ -205,17 +201,17 @@ HUpMs2 CALL FVHLineUp FVHLineUp LD HL,(FileShift) LD DE,(FileShift+2) - LD A,H ;Проверяем на начало файла + LD A,H ; Проверяем на начало файла OR D OR L OR E SCF - RET Z ;Z-начало файла + RET Z ; Z-начало файла LD BC,0x0010 OR A SBC HL,BC - LD (FileShift),HL ;FileShift-16байт(предид.строка) - LD (TempShift),HL ;Запоминаем тек.смещение + LD (FileShift),HL ; FileShift-16байт(предид.строка) + LD (TempShift),HL ; Запоминаем тек.смещение LD C,B EX DE,HL SBC HL,BC @@ -223,12 +219,12 @@ FVHLineUp LD HL,(FileShift) LD (TempShift+2),HL CALL ScrollSCRdown LD B,0x1C - CALL PutHLine ;Создаем и печатаем строку + CALL PutHLine ; Создаем и печатаем строку CALL PrintVProc OR A RET -;На строку вниз +; На строку вниз HLineDwnMs CALL HLineDwn RET C LD B,0x0A @@ -250,14 +246,14 @@ HLineDwn LD HL,(FileShift) LD BC,(FileShift+2) LD DE,0x0190 ADD HL,DE - LD (TempShift),HL ;Запоминаем тек.смещение - JR NC,.L1 ;Прибавляем к смещению страницу - INC BC ;байтов (480б) + LD (TempShift),HL ; Запоминаем тек.смещение + JR NC,.L1 ; Прибавляем к смещению страницу + INC BC ; байтов (480б) .L1 LD (TempShift+2),BC EX DE,HL LD HL,(FileLenght) OR A - SBC HL,DE ;Проверяем на конец файла + SBC HL,DE ; Проверяем на конец файла EX DE,HL LD HL,(FileLenght+2) SBC HL,BC @@ -266,7 +262,7 @@ HLineDwn LD HL,(FileShift) LD A,D OR E SCF - RET Z ;Z - конец + RET Z ; Z - конец .L2 LD HL,(FileShift) LD DE,(FileShift+2) LD BC,0x0010 @@ -277,12 +273,12 @@ HLineDwn LD HL,(FileShift) LD (FileShift+2),DE CALL ScrollSCRup LD B,0xDC - CALL PutHLine ;Создаем и печатаем строку + CALL PutHLine ; Создаем и печатаем строку CALL PrintVProc OR A RET -;На страницу вверх +; На страницу вверх HPageUpMs CALL FVHPageUp RET C LD B,0x0A @@ -302,30 +298,30 @@ HUpMs2p CALL FVHPageUp FVHPageUp LD HL,(FileShift) LD BC,(FileShift+2) - LD A,H ;Проверяем на начало файла + LD A,H ; Проверяем на начало файла OR B OR L OR C SCF RET Z - LD DE,0x0190 ;Отнимаем от тек.смещ. страницу байтов + LD DE,0x0190 ; Отнимаем от тек.смещ. страницу байтов OR A SBC HL,DE JR NC,.HPgUp1 LD A,B OR C - DEC BC ;Проверяем,что не вывалились за - JR NZ,.HPgUp1 ;начало файла Z - вывалились + DEC BC ; Проверяем,что не вывалились за + JR NZ,.HPgUp1 ; начало файла Z - вывалились INC BC - LD L,C ;Тогда смещение = 0 + LD L,C ; Тогда смещение = 0 LD H,B .HPgUp1 LD (FileShift),HL LD (FileShift+2),BC - CALL PrnHEXpage ;Печатаем страницу + CALL PrnHEXpage ; Печатаем страницу OR A RET -;На страницу вниз +; На страницу вниз HPageDwnMs CALL HPageDwn RET C LD B,0x0A @@ -345,50 +341,49 @@ HDnMs2p CALL HPageDwn HPageDwn LD HL,(FileShift) LD BC,(FileShift+2) - LD DE,0x0190 ;Плюсуем к тек.смещ. - ADD HL,DE ;страницу байтов + LD DE,0x0190 ; Плюсуем к тек.смещ. + ADD HL,DE ; страницу байтов PUSH HL JR NC,.L1 INC BC .L1 PUSH BC EX DE,HL - LD HL,(FileLenght) ;Проверяем,что страница - OR A ;последняя + LD HL,(FileLenght) ; Проверяем,что страница + OR A ; последняя SBC HL,DE EX DE,HL LD HL,(FileLenght+2) SBC HL,BC POP BC POP HL - RET C ;С - нет + RET C ; С - нет JR NZ,.L2 LD A,D OR E SCF - RET Z ;Z - нет + RET Z ; Z - нет .L2 LD (FileShift),HL LD (FileShift+2),BC - CALL PrnHEXpage ;Печатаем страницу + CALL PrnHEXpage ; Печатаем страницу OR A RET -;В начало файла +; В начало файла HBegFile LD HL,JUMPS.ResFire PUSH HL LD HL,(FileShift) LD BC,(FileShift+2) - LD A,H ;Проверяем на начало файла + LD A,H ; Проверяем на начало файла OR B OR L OR C - RET Z ;Z - Начало - LD HL,0x0000 ;Смещение = 0000 + RET Z ; Z - Начало + LD HL,0x0000 ; Смещение = 0000 LD (FileShift),HL LD (FileShift+2),HL - CALL PrnHEXpage ;Печатаем страницу - RET + JP PrnHEXpage ; Печатаем страницу -;В конец файла +; В конец файла HEndFile LD HL,JUMPS.ResFire PUSH HL LD HL,(FileShift) @@ -398,8 +393,8 @@ HEndFile LD HL,JUMPS.ResFire JR NC,.L1 INC BC .L1 EX DE,HL - LD HL,(FileLenght) ;Проверяем,что мы на последней - PUSH HL ;странице + LD HL,(FileLenght) ; Проверяем,что мы на последней + PUSH HL ; странице OR A SBC HL,DE EX DE,HL @@ -408,17 +403,17 @@ HEndFile LD HL,JUMPS.ResFire SBC HL,BC POP BC POP HL - RET C ;С - в конце + RET C ; С - в конце JR NZ,.L2 LD A,D OR E - RET Z ;Z - в конце + RET Z ; Z - в конце .L2 LD DE,0x0190 OR A - SBC HL,DE ;Просчитываем смещение последней страницы + SBC HL,DE ; Просчитываем смещение последней страницы JR NC,.L3 DEC BC -.L3 LD A,L ;Смещение кратно 16 +.L3 LD A,L ; Смещение кратно 16 AND 0x0F JR Z,.HEnd1 LD A,L @@ -430,75 +425,74 @@ HEndFile LD HL,JUMPS.ResFire INC BC .HEnd1 LD (FileShift),HL LD (FileShift+2),BC - CALL PrnHEXpage ;Печатаем страницу - RET + JP PrnHEXpage ; Печатаем страницу ;-------------------------------------------------------------- -;Процедура ввода нового указателя смещения в файле +; Процедура ввода нового указателя смещения в файле HGoTo LD HL,(FileLenght) LD DE,(FileLenght+2) - LD A,H ;Проверяем,что длина - OR D ;файла больше 16 байт + LD A,H ; Проверяем,что длина + OR D ; файла больше 16 байт OR E JR NZ,HGoToOk LD A,L CP 0x11 - RET C ;меньше 16байт -HGoToOk LD HL,NewShift ;Буфер для ввода нового указ. + RET C ; меньше 16байт +HGoToOk LD HL,NewShift ; Буфер для ввода нового указ. SUB A - LD (CursPos+1),A ;Позиция ввода в буфере + LD (CursPos+1),A ; Позиция ввода в буфере INC A LD (BuffFlg),A LD A,(FileShift+3) - CALL PutHexNumb ;Заносим в буфер текущее смещ. - LD A,(FileShift+2) ;в текстовом виде + CALL PutHexNumb ; Заносим в буфер текущее смещ. + LD A,(FileShift+2) ; в текстовом виде CALL PutHexNumb LD A,(FileShift+1) CALL PutHexNumb LD A,(FileShift) CALL PutHexNumb -;Выводим на экран буфер и -HGoToRet CALL PrintHGT ;печатаем курсор -HGoToLp HALT ;Ожидаем прерывание - CALL ChangeCurs ;проверям на смену курсора +; Выводим на экран буфер и +HGoToRet CALL PrintHGT ; печатаем курсор +HGoToLp HALT ; Ожидаем прерывание + CALL ChangeCurs ; проверям на смену курсора SPMOUSE MOUSEF.READ_STATE BIT 0,A JP NZ,HGTescape - SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиши - JR Z,HGoToLp ;Z - не нажата + SPDSS DSSF.SCANKEY ; Ожидаем нажатия клавиши + JR Z,HGoToLp ; Z - не нажата LD A,B AND 0x3F JR NZ,HGoToLp LD A,E OR A - JR Z,HGoToSys ;A=0 сист.клавиша + JR Z,HGoToSys ; A=0 сист.клавиша CP 0x0D - JP Z,HGTenter ;нажат Enter + JP Z,HGTenter ; нажат Enter CP 0x08 - JR Z,HGTdelete ;нажат BackSpace + JR Z,HGTdelete ; нажат BackSpace CP 0x1B - JP Z,HGTescape ;нажат Esc + JP Z,HGTescape ; нажат Esc CP 0x20 - JR C,HGoToLp ;код<0x20 нам не подходит - LD C,A ;сохр. ASCII код + JR C,HGoToLp ; код<0x20 нам не подходит + LD C,A ; сохр. ASCII код LD A,0x00 BuffFlg EQU $-1 OR A CALL NZ,ClearBuff -CursPos LD A,0x00 ;тек.позиция печати в буфере - LD B,A ;сохр.тек.поз. - LD HL,NewShift ;Смещ.от начала буфера +CursPos LD A,0x00 ; тек.позиция печати в буфере + LD B,A ; сохр.тек.поз. + LD HL,NewShift ; Смещ.от начала буфера ADD A,L LD L,A JR NC,.L1 INC H -.L1 LD (HL),C ;Заносим код в буфер - LD A,B ;тек.поз. - CP 0x07 ;Позиция в буфере (7-последняя) - JR Z,HGoToRet ;печатаем строку и курсор - INC A ;след.позиция +.L1 LD (HL),C ; Заносим код в буфер + LD A,B ; тек.поз. + CP 0x07 ; Позиция в буфере (7-последняя) + JR Z,HGoToRet ; печатаем строку и курсор + INC A ; след.позиция LD (CursPos+1),A - JR HGoToRet ;печатаем строку и курсор + JR HGoToRet ; печатаем строку и курсор ClearBuff LD HL,NewShift LD B,0x08 @@ -510,56 +504,56 @@ ClearBuff LD HL,NewShift LD (BuffFlg),A RET -;Забой +; Забой HGTdelete SUB A LD (BuffFlg),A - LD A,(CursPos+1) ;Тек.позиция в буфере + LD A,(CursPos+1) ; Тек.позиция в буфере OR A - JR Z,HGoToLp ;0 - выходим + JR Z,HGoToLp ; 0 - выходим DEC A - LD (CursPos+1),A ;предид.позиция + LD (CursPos+1),A ; предид.позиция LD HL,NewShift - ADD A,L ;смещ.в буфере + ADD A,L ; смещ.в буфере LD L,A JR NC,.L1 INC H -.L1 LD (HL)," " ;Забиваем пробелом +.L1 LD (HL)," " ; Забиваем пробелом JR HGoToRet -;системная клавиша +; системная клавиша HGoToSys LD A,D - CP 0x54 ;<- + CP 0x54 ; <- JR Z,HGTleft - CP 0x56 ;-> + CP 0x56 ; -> JR Z,HGTright JR HGoToLp -;Курсор влево +; Курсор влево HGTleft SUB A LD (BuffFlg),A - LD A,(CursPos+1) ;Тек.позиция в буфере + LD A,(CursPos+1) ; Тек.позиция в буфере OR A - JP Z,HGoToLp ;0 - выходим + JP Z,HGoToLp ; 0 - выходим DEC A - LD (CursPos+1),A ;Уменьш.поз. + LD (CursPos+1),A ; Уменьш.поз. JP HGoToRet HGTright SUB A LD (BuffFlg),A - LD A,(CursPos+1) ;Тек.позиция в буфере + LD A,(CursPos+1) ; Тек.позиция в буфере CP 0x07 - JP Z,HGoToLp ;7 - последняя + JP Z,HGoToLp ; 7 - последняя INC A - LD (CursPos+1),A ;Увелич.поз. + LD (CursPos+1),A ; Увелич.поз. JP HGoToRet -;Процедура вывода строки и курсора +; Процедура вывода строки и курсора PrintHGT LD HL,NewShift LD DE,0x0008 LD BC,0x081C LD A,COLORP.PANEL + COLORI.FILES CALL JUMPS.PrnTxtLnNormC - LD A,(CursPos+1) ;Позиция вывода курсора + LD A,(CursPos+1) ; Позиция вывода курсора INC A LD L,A LD H,0x00 @@ -572,76 +566,76 @@ PrintHGT LD HL,NewShift LD BC,0x011C LD A,COLORP.PANEL + COLORI.FILES CALL JUMPS.PrnTxtLnNormC - LD A,0x01 ;Номер выведенного курсора + LD A,0x01 ; Номер выведенного курсора LD (CurCurs),A - LD A,0x06 ;Ожидание для смены курсора + LD A,0x06 ; Ожидание для смены курсора LD (CurWait),A RET -;Процедура смены курсора -ChangeCurs LD A,0x00 ;Задержка между сменой курсора +; Процедура смены курсора +ChangeCurs LD A,0x00 ; Задержка между сменой курсора CurWait EQU $-1 DEC A LD (CurWait),A - RET NZ ;еще не время + RET NZ ; еще не время LD A,(CursPos+1) INC A LD L,A - LD H,0x00 ;Тек.знакоместо + LD H,0x00 ; Тек.знакоместо ADD HL,HL ADD HL,HL ADD HL,HL EX DE,HL - LD HL,NewShift ;Смещ.в буфере + LD HL,NewShift ; Смещ.в буфере LD A,(CursPos+1) ADD A,L LD L,A JR NC,.L2 INC H -.L2 LD A,0x00 ;Номер текущего курсора +.L2 LD A,0x00 ; Номер текущего курсора CurCurs EQU $-1 - XOR 0x01 ;Меняем курсор + XOR 0x01 ; Меняем курсор LD (CurCurs),A LD A,(HL) - JR Z,.L1 ;Печатаем + JR Z,.L1 ; Печатаем LD A,0xAB;"<" .L1 LD HL,TCursor LD (HL),A LD BC,0x011C LD A,COLORP.PANEL + COLORI.FILES CALL JUMPS.PrnTxtLnNormC - LD A,0x0C ;Ожидание для смены курсора + LD A,0x0C ; Ожидание для смены курсора LD (CurWait),A RET TCursor DEFB " " -;Клавиша ENTER -HGTenter SUB A ;При ошибке вернемся с курсором - LD (CursPos+1),A ;в нулевой позиции - LD BC,NewShift ;Буфер строки - CALL GetHexNum32 ;Переводим текст в 32бит число - JP C,HGoToRet ;CY - синтакс.ошибка +; Клавиша ENTER +HGTenter SUB A ; При ошибке вернемся с курсором + LD (CursPos+1),A ; в нулевой позиции + LD BC,NewShift ; Буфер строки + CALL GetHexNum32 ; Переводим текст в 32бит число + JP C,HGoToRet ; CY - синтакс.ошибка LD C,E LD B,D - LD A,L ;Адрес кратный 16 + LD A,L ; Адрес кратный 16 AND 0xF0 LD L,A - EX DE,HL ;Смещ.в BC+DE - LD HL,(FileLenght) ;Проверяем,что смещение в - OR A ;пределах файла + EX DE,HL ; Смещ.в BC+DE + LD HL,(FileLenght) ; Проверяем,что смещение в + OR A ; пределах файла SBC HL,DE LD HL,(FileLenght+2) SBC HL,BC - JR C,HGTent ;CY-за пределами - JR NZ,HGTent1 ;NZ-в пределах + JR C,HGTent ; CY-за пределами + JR NZ,HGTent1 ; NZ-в пределах LD A,D OR E - JR NZ,HGTent1 ;NZ-в пределах + JR NZ,HGTent1 ; NZ-в пределах HGTent LD HL,(FileLenght) LD BC,0x0010 OR A - SBC HL,BC ;смещ.=последняя строка файла 16 байт + SBC HL,BC ; смещ.=последняя строка файла 16 байт EX DE,HL LD HL,(FileLenght+2) JR NC,.L1 @@ -650,13 +644,12 @@ HGTent LD HL,(FileLenght) LD B,H HGTent1 LD (FileShift),DE LD (FileShift+2),BC - CALL PrnHEXpage ;Печатаем страницу - RET + JP PrnHEXpage ; Печатаем страницу -;Нажат Escape -HGTescape LD HL,NewShift ;Буфер строки +; Нажат Escape +HGTescape LD HL,NewShift ; Буфер строки PUSH HL - LD A,(FileShift+3) ;Заносим тек.смещение + LD A,(FileShift+3) ; Заносим тек.смещение CALL PutHexNumb LD A,(FileShift+2) CALL PutHexNumb @@ -669,16 +662,15 @@ HGTescape LD HL,NewShift ; LD BC,0x081C LD A,COLORP.PANEL + COLORI.FILES CALL JUMPS.PrnTxtLnNormC - CALL JUMPS.ResFire - RET ;Выходим + JP JUMPS.ResFire ; Выходим NewShift DEFB " ",0 -;Процедура конвертирования 32битового шестн.текстового числа -;На вход: +; Процедура конвертирования 32битового шестн.текстового числа +; На вход: ; BC - Адрес буфера с текстом (0-конец буфера) -;На выход: -; DE+HL - Число 32бит +; На выход: +; DEHL - Число 32бит ; CY - синтаксическая ошибка GetHexNum32 LD HL,0x0000 LD E,L diff --git a/plugins/fnviewer/fviewer.a80 b/plugins/fnviewer/fviewer.a80 index bd94ed7..3c70714 100644 --- a/plugins/fnviewer/fviewer.a80 +++ b/plugins/fnviewer/fviewer.a80 @@ -1,20 +1,17 @@ -; LAST UPDATE: 31.05.2025 savelij +; LAST UPDATE: 28.07.2025 savelij LineBuffer := WorkBuffer+0x300 ;[]==========================================================[] - JP FileViewer - - DZ FLEX_VERS.VIEWER - -FileViewer CALL LoadFile + CALL LoadFile RET C LD IX,ViewingFile SUB A LD (ViewMode),A LD (ASCIIaddX),A - LD HL,0x0000 + LD H,A + LD L,A LD (FileShift),HL LD (FileShift+2),HL LD L,(IX+28) @@ -27,109 +24,113 @@ FileViewer CALL LoadFile ViewerBegin CALL InitStatusLine CALL InitVProc CALL PrintVPage -ViewerLoop LD A,(ViewMode) +ViewerLoop LD A,(ViewMode) ; режим просмотра? OR A JR NZ,HViewLoop +; режим просмотра текст TViewLoop LD IX,ASCIItab CALL JUMPS.TestCoords - SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиш + SPDSS DSSF.SCANKEY ; Ожидаем нажатия клавиш JR Z,TViewLoop - LD A,E ;Е-ASCII код - CP 0x1B ;Esc + LD A,E ; Е-ASCII код + CP 0x1B ; Esc JP Z,ViewerExit OR A - JR NZ,TViewLoop ;Ждем функцион.клавиши + JR NZ,TViewLoop ; Ждем функцион.клавиши LD A,D - CP 0x44 + CP SC.F10;0x44 JP Z,ViewerExit LD HL,TViewLoop PUSH HL - CP 0x3B + CP SC.F1;0x3B JP Z,About - CP 0x3C + CP SC.F2;0x3C JP Z,ChASCIImode - CP 0x3E - JP Z,ChViewer ;Просмотр в HEX - CP 0x42 - JP Z,ChCodePage ;Смена кодовой страницы WIN/DOS/KOI - CP 0x41 + CP SC.F4;0x3E + JP Z,ChViewer ; Просмотр в HEX + CP SC.F8;0x42 + JP Z,ChCodePage ; Смена кодовой страницы WIN/DOS/KOI + CP SC.F7;0x41 JP Z,FVPrintFile - CP 0x54 + CP SC.X4;0x54 JP Z,ScrollLeft - CP 0x56 + CP SC.X6;0x56 JP Z,ScrollRght - CP 87 ;Home + CP SC.X7;87 ; Home JP Z,THome - CP 81 ;End + CP SC.X1;81 ; End JP Z,TEnd - CP 88 ;Стрелка вверх + CP SC.X8;88 ; Стрелка вверх JP Z,TLineUp - CP 82 ;Стрелка вниз + CP SC.X2;82 ; Стрелка вниз JP Z,TLineDwn - CP 89 ;PageUp + CP SC.X9;89 ; PageUp JP Z,TPageUp - CP 83 ;PageDown + CP SC.X3;83 ; PageDown JP Z,TPageDwn LD A,B - AND 0x30 - CP 0x30 + AND KEYBSTAT.M_ALT + KEYBSTAT.M_CTRL;0x30 + CP KEYBSTAT.M_ALT + KEYBSTAT.M_CTRL;0x30 RET Z - BIT 5,B + BIT KEYBSTAT.B_CTRL,B;5,B RET Z LD A,D - AND 0x7F - CP 0x57 ;Ctrl+PageUp - JP Z,TBegFile ;в начало файла - CP 0x51 ;Ctrl+PageDown - JP Z,TEndFile ;в конец файла - CP 0x19 ;Ctrl+P + AND %01111111;0x7F + CP SC.X7;0x57 ; Ctrl+PageUp + JP Z,TBegFile ; в начало файла + CP SC.X1;0x51 ; Ctrl+PageDown + JP Z,TEndFile ; в конец файла + CP SC.P;0x19 ; Ctrl+P JP Z,FVPrintFile RET ;-------------------------------------------------------------- +; режим просмотра HEX HViewLoop LD IX,HEXtab CALL JUMPS.TestCoords - SPDSS DSSF.SCANKEY ;Ожидаем нажатия клавиш + SPDSS DSSF.SCANKEY ; Ожидаем нажатия клавиш JR Z,HViewLoop - LD A,E ;Е-ASCII код - CP 0x1B ;Esc + LD A,E ; Е-ASCII код + CP 0x1B ; Esc JP Z,ViewerExit OR A - JR NZ,HViewLoop ;Ждем функцион.клавиши - LD A,D ; - CP 0x44 ;F10 + JR NZ,HViewLoop ; Ждем функцион.клавиши + LD A,D + CP SC.F10;0x44 ; F10 JP Z,ViewerExit LD HL,HViewLoop PUSH HL - CP 0x3B + CP SC.F1;0x3B JP Z,About - CP 0x3E ;F4 - JP Z,ChViewer ;Просмотр в тексте - CP 0x3F ;F5 - JP Z,HGoTo ;Переход на адрес пользователя - CP 0x41 + CP SC.F4;0x3E ; F4 + JP Z,ChViewer ; Просмотр в тексте + CP SC.F8;0x42 + JP Z,ChCodePage ; Смена кодовой страницы WIN/DOS/KOI + CP SC.F5;0x3F ; F5 + JP Z,HGoTo ; Переход на адрес пользователя + CP SC.F7;0x41 JP Z,FVPrintFile - CP 88 ;Стрелка вверх + CP SC.X8;88 ; Стрелка вверх JP Z,FVHLineUp - CP 82 ;Стрелка вниз + CP SC.X2;82 ; Стрелка вниз JP Z,HLineDwn - CP 89 ;PageUp + CP SC.X9;89 ; PageUp JP Z,FVHPageUp - CP 83 ;PageDown + CP SC.X3;83 ; PageDown JP Z,HPageDwn LD A,B - AND 0x30 - CP 0x30 + AND KEYBSTAT.M_ALT + KEYBSTAT.M_CTRL;0x30 + CP KEYBSTAT.M_ALT + KEYBSTAT.M_CTRL;0x30 RET Z - BIT 5,B + BIT KEYBSTAT.B_CTRL,B;5,B RET Z LD A,D - AND 0x7F - CP 0x57 ;Ctrl+PageUp - JP Z,HBegFile ;в начало файла - CP 0x51 ;Ctrl+PageDown - JP Z,HEndFile ;в конец файла - CP 0x19 ;Ctrl+P + AND %01111111;0x7F + CP SC.X7;0x57 ; Ctrl+PageUp + JP Z,HBegFile ; в начало файла + CP SC.X1;0x51 ; Ctrl+PageDown + JP Z,HEndFile ; в конец файла + CP SC.P;0x19 ; Ctrl+P JP Z,FVPrintFile RET @@ -160,20 +161,6 @@ PrintVPage LD A,(ViewMode) JP NZ,PrnHEXpage JP PrnASCIIpage -;[]==========================================================[] -ViewingFile DUPL 0x30,0 -ViewMode DEFB 0x00 -ASCIImode DEFB 0x01 -ASCIIaddX DEFB 0x00 -EmptyLines DEFB 0x00 -FileLenght DUPL 4,0 ; Длина файла (32бит) -FileShift DUPL 4,0 ; Смещение от начала файла (32бит) -TempShift DUPL 4,0 ; Временная ячейка смещения (32бит) -FVNextShift DUPL 4,0 ; Следующая страница для ASCII (32бит) -FVMemIndef DEFB 0x00 -FHandle DEFB 0x00 -FVReadLen DUPL 4,0 - ;[]==========================================================[] ViewerExit LD A,(FVMemIndef) SPDSS DSSF.FREEMEM @@ -183,7 +170,6 @@ ViewerExit LD A,(FVMemIndef) ;[]==========================================================[] LoadFile CALL JUMPS.SetClock LD DE,ViewingFile -; SPDSS DSSF.F_FIRST,1,0x37 SPDSS DSSF.F_FIRST,1, DIR.M_Archive + \ DIR.M_Dir + \ DIR.M_System + \ @@ -226,7 +212,7 @@ LoadFile CALL JUMPS.SetClock INC HL LoadFl1 LD A,D OR E - LD A,0x1E + LD A,ERR_DSS.NOT_ENOUGH_MEMORY PUSH AF CALL NZ,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти POP AF @@ -239,7 +225,7 @@ LoadFl1 LD A,D LD H,B OR A SBC HL,DE - LD A,0x1E + LD A,ERR_DSS.NOT_ENOUGH_MEMORY PUSH DE PUSH AF CALL C,JUMPS.DOSError ;!!!!!!!!!!!! Нет памяти @@ -247,11 +233,11 @@ LoadFl1 LD A,D POP DE JP C,LoadExit LD IX,ProcessView - LD (IX+PROC.MAXL1),E - LD (IX+PROC.MAXH1),D + LD (IX+PROC.MAX_PAGES),E + LD (IX+PROC.MAX_PAGES + 1),D SUB A - LD (IX+PROC.MAXL2),A - LD (IX+PROC.MAXH2),A + LD (IX+PROC.MAX_PAGES + 2),A + LD (IX+PROC.MAX_PAGES + 3),A PUSH DE CALL JUMPS.InitProcess POP DE @@ -270,10 +256,10 @@ LoadFl1 LD A,D W_END SPDSS DSSF.CURDISK LD HL,WorkBuffer - ADD A,"A" + ADD A,'A' LD (HL),A INC HL - LD (HL),":" + LD (HL),':' INC HL PUSH HL SPDSS DSSF.CURDIR @@ -283,7 +269,7 @@ LoadFl1 LD A,D CP (HL) JR NZ,.L2 DEC HL - LD A,0x5C + LD A,'\\' CP (HL) INC HL JR Z,.L3 @@ -385,33 +371,32 @@ NoRead LD A,(FVMemIndef) JR LoadExit FVNextProcess LD IX,ProcessView - LD L,(IX+PROC.CURL1) - LD H,(IX+PROC.CURH1) + LD L,(IX+PROC.CURR_PAGE) + LD H,(IX+PROC.CURR_PAGE + 1) INC HL - LD (IX+PROC.CURL1),L - LD (IX+PROC.CURH1),H + LD (IX+PROC.CURR_PAGE),L + LD (IX+PROC.CURR_PAGE + 1),H LD A,H OR L JR NZ,.NextPr1 - LD L,(IX+PROC.CURL2) - LD H,(IX+PROC.CURH2) + LD L,(IX+PROC.CURR_PAGE + 2) + LD H,(IX+PROC.CURR_PAGE + 3) INC HL - LD (IX+PROC.CURL2),L - LD (IX+PROC.CURH2),H -.NextPr1 CALL JUMPS.PrnProcess - RET + LD (IX+PROC.CURR_PAGE + 2),L + LD (IX+PROC.CURR_PAGE + 3),H +.NextPr1 JP JUMPS.PrnProcess ;[]----------------------------------------------------------[] -ProcessView DEFW 0x00B2 - DEFW 0x0075 - DEFW 0x011C - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFB 0x4F +ProcessView DW 178 + DW 117 + DW 284 + DW 0 + DW 0 + DW 0 + DW 0 + DW 0 + DW 0 + DB COLORP.BLUE + COLORI.WHITE ;FVCorrBigChar CP 0x41 ; RET C @@ -469,7 +454,7 @@ InitViewScr LD HL,FVFLen LD C,(IX+32) LD B,0x08 InitVS0 RL C - LD A,"-" + LD A,'-' JR NC,.L3 LD A,(HL) .L3 LD (DE),A @@ -514,7 +499,7 @@ FVFAttrib EQU $ - STRLEN(" ") - 1 CP (HL) JR NZ,.L4 DEC HL - LD A,0x5C + LD A,'\\' CP (HL) INC HL JR Z,.L5 @@ -542,12 +527,11 @@ FVFAttrib EQU $ - STRLEN(" ") - 1 LD B,0x08 EXX LD A,0x02 - CALL JUMPS.SetCMOSPrint - RET + JP JUMPS.SetCMOSPrint FVFAtributs DEFB "--ad-shr" -;Дата +; Дата FVGetData EX DE,HL LD A,(IX+24) AND 0x1F @@ -564,19 +548,19 @@ FVGetData EX DE,HL CALL FVGet8Bit LD (HL),"." INC HL - LD A,(IX+25) ;Год + LD A,(IX+25) ; Год SRL A ADD A,80 .L2 SUB 100 JR NC,.L2 - ADD A,100 ;Год + ADD A,100 ; Год CALL FVGet8Bit EX DE,HL RET -;Время +; Время FVGetTime EX DE,HL - LD A,(IX+23) ;Часы + LD A,(IX+23) ; Часы AND 0xF8 RRA RRA @@ -610,21 +594,19 @@ FVGet8Bit LD B,0x2F FVBytes DEFB "bytes" ;[]==========================================================[] -InitStatusLine LD A,(ViewMode) +InitStatusLine CALL InitCodePage + LD A,(ViewMode) OR A JP NZ,HEXstatus ASCIIstatus LD HL,UnWrapT - LD DE,0x005E + LD DE,94 LD A,(ASCIImode) OR A JR Z,.L1 LD HL,WrapT - LD DE,0x0064 -.L1 LD (ASCIIx),DE - LD DE,ASCIIm - LD BC,0x0009 - LDIR - CALL InitCodePage + LD DE,100 +.L1 LD (ASCIIx),DE ; позиция печати по X + LD (ASCIIm),HL ; адрес текста который печатать MAKEWINDOW WINSUBOBJ.WOBIND W_HORIZLINE 0,241,640 W_FILL 2,243,636,12,COLORI.HIGHGRAY @@ -632,26 +614,23 @@ ASCIIstatus LD HL,UnWrapT W_BUTTON 0,242,80,14 W_TEXT 18,245,COLORP.HIGHGRAY,"F1 About" W_BUTTON 80,242,80,14 - W_TEXT 94,245,COLORP.HIGHGRAY,"F2 UnWrap" -ASCIIx: EQU $ - STRLEN("F2 UnWrap") - 6 -ASCIIm: EQU $ - STRLEN("F2 UnWrap") - 1 + W_ADRTEXT 94,245,COLORP.HIGHGRAY,0 +ASCIIx: EQU $ - 7 +ASCIIm: EQU $ - 2 W_BUTTON 160,242,80,14 W_TEXT 184,245,COLORP.HIGHGRAY,"F4 Hex" W_BUTTON 400,242,80,14 W_TEXT 422,245,COLORP.HIGHGRAY,"F7 Print" W_BUTTON 480,242,80,14 - W_TEXT 504,245,COLORP.HIGHGRAY,"F8 DOS" -ASCIIenc: EQU $ - STRLEN("DOS") - 1 + W_ADRTEXT 504,245,COLORP.HIGHGRAY,0 +ASCIIenc1: EQU $ - 2 W_BUTTON 560,242,80,14 W_TEXT 580,245,COLORP.HIGHGRAY,"F10 Quit" W_END RET -UnWrapT DEFB "F2 UnWrap" -WrapT DEFB "F2 Wrap " -EncDos: DEFB "DOS" -EncWin: DEFB "WIN" -EncKoi: DEFB "KOI" +UnWrapT DZ "F2 UnWrap" +WrapT DZ "F2 Wrap " HEXstatus MAKEWINDOW WINSUBOBJ.WOBIND @@ -666,6 +645,9 @@ HEXstatus W_TEXT 258,245,COLORP.HIGHGRAY,"F5 Go to" W_BUTTON 400,242,80,14 W_TEXT 422,245,COLORP.HIGHGRAY,"F7 Print" + W_BUTTON 480,242,80,14 + W_ADRTEXT 504,245,COLORP.HIGHGRAY,0 +ASCIIenc2: EQU $ - 2 W_BUTTON 560,242,80,14 W_TEXT 580,245,COLORP.HIGHGRAY,"F10 Quit" W_END @@ -678,7 +660,7 @@ About W_FILL 4,2,312,10,COLORP.BLACK W_TEXT 144,3,COLORI.WHITE,"About" W_TEXT 96,18,COLORP.HIGHGRAY,"Flex Navigator File Viewer" - W_TEXT 144,28,COLORP.HIGHGRAY,"v\{FLEX_VERS.VIEWER}" + W_TEXT 96,28,COLORP.HIGHGRAY,"v\{FLEX_VERS.VIEWER} build \{BUILDDATE}" W_TEXT 18,40,COLORP.HIGHGRAY,"Programming: (C)2000 Enin Anton" W_TEXT 92,50,COLORP.HIGHGRAY,"(C)2021 Mikhaltchenkov Dmitry" W_BUTTON 124,66,72,14 @@ -697,7 +679,7 @@ AboutLoop LD IX,FVAboutTab CP 0x0D JR Z,AboutExt RES 5,A - CP "O" + CP 'O' JR NZ,AboutLoop AboutExt WINDOWCLOSE @@ -708,7 +690,7 @@ ScrollSCRup LD DE,0x241C JR ScrlSCRDnUp ScrollSCRdown LD DE,0x1C24 -;На вход: +; На вход: ; D - Y откуда ; Е - Y куда ScrlSCRDnUp DI @@ -747,19 +729,19 @@ ScSCRN1 LD A,D InitFPages PUSH HL LD DE,(TempShift) LD HL,(TempShift+2) - LD A,D ;Выделяем номер страницы + LD A,D ; Выделяем номер страницы RLA RL L RLA RL L LD A,L EXX - LD E,A ;DE - Адрес страницы в списке + LD E,A ; DE - Адрес страницы в списке LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX - RES 7,D ;Вкл.с 0x4000 + RES 7,D ; Вкл.с 0x4000 SET 6,D POP HL RET @@ -769,8 +751,8 @@ TestFPages BIT 7,D RES 7,D SET 6,D EXX - INC E ;DE - Адрес страницы в списке - LD A,(DE) ;Тек.страница + INC E ; DE - Адрес страницы в списке + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 EXX RET @@ -799,13 +781,13 @@ GetFPages PUSH HL RET ;[]==========================================================[] -;Процедура инициализация таблицы процентов +; Процедура инициализация таблицы процентов InitVProc LD A,0x01 - LD (ProcFlag),A ;Флаг вывода процентов + LD (ProcFlag),A ; Флаг вывода процентов LD A,(ViewMode) OR A JR NZ,InProcHex -;Проценты для TextWrap +; Проценты для TextWrap InProcASCII LD HL,(FileLenght) LD DE,(FileLenght+2) LD B,0x19 @@ -816,7 +798,7 @@ InProcA PUSH BC DJNZ InProcA JR InitProc -;Проценты для Hex +; Проценты для Hex InProcHex LD HL,(FileLenght) LD DE,(FileLenght+2) LD BC,0x0190 @@ -832,21 +814,21 @@ InProcHex LD HL,(FileLenght) OR D OR E RET Z -;Процедура инициализации таблицы процентов -;На вход: -; DE+HL - Длина файла-1страница +; Процедура инициализации таблицы процентов +; На вход: +; DEHL - Длина файла - 1 страница InitProc PUSH HL PUSH DE EX DE,HL - LD BC,100 ;Длина файла/100 (%) + LD BC,100 ; Длина файла/100 (%) CALL JUMPS.Divis32 - LD (Coeff1+1),DE ;Получаем кол-во байт на - LD (Coeff2+1),HL ;один процент + LD (Coeff1+1),DE ; Получаем кол-во байт на + LD (Coeff2+1),HL ; один процент LD IX,ProcentTab LD HL,0x0000 LD E,L LD D,H - LD BC,0x6300 ;Генерим таблицу + LD BC,0x6300 ; Генерим таблицу LD (IX+0x00),L INC IX LD (IX+0x00),H @@ -858,7 +840,7 @@ InitProc PUSH HL LD (IX+0x00),C INC IX INC C -;для каждого процента +; для каждого процента CoeffLoop PUSH BC Coeff1 LD BC,0x0000 ADD HL,BC @@ -881,7 +863,7 @@ Coeff2 LD BC,0x0000 DJNZ CoeffLoop POP DE POP HL - LD (IX+0x00),L ;Макс.процент + LD (IX+0x00),L ; Макс.процент INC IX LD (IX+0x00),H INC IX @@ -895,55 +877,55 @@ Coeff2 LD BC,0x0000 RET ;[]----------------------------------------------------------[] -;Процедура просчета и печати проценто +; Процедура просчета и печати проценто PrintVProc LD HL,PutProcent - PUSH HL ;Выходим на печать + PUSH HL ; Выходим на печать LD A,(ProcFlag) OR A LD A,100 - RET NZ ;Уже все 100% - LD IX,ProcentTab+250 ;Серидина таблицы проц.50% - LD HL,(FileShift) ;Текущее смещение + RET NZ ; Уже все 100% + LD IX,ProcentTab+250 ; Серидина таблицы проц.50% + LD HL,(FileShift) ; Текущее смещение LD DE,(FileShift+2) - CALL TestProcent ;В какой половине наход.? - JR C,LowTest ;<50% + CALL TestProcent ; В какой половине наход.? + JR C,LowTest ; <50% LD A,(IX+0x04) - RET Z ;=50% - LD IX,ProcentTab+375 ;Таблица с 75% - CALL TestProcent ;В какой половине наход.? - JR C,Test2 ;50%% +; Процедура поиска процента вниз по таблице +Test2 LD A,(IX+0x04) ; Текущий процент + RET Z ; X=% + RET NC ; X>% OR A RET Z - LD BC,-0x0005 ;Ищем вниз по таблице - ADD IX,BC ;Нужный процент + LD BC,-0x0005 ; Ищем вниз по таблице + ADD IX,BC ; Нужный процент CALL TestProcent JR Test2 -;X<50% -LowTest LD IX,ProcentTab+125 ;Таблица с 25% - CALL TestProcent ;В какой половине наход.? - JR C,Test2 ;01%процент @@ -966,7 +948,7 @@ TestProcent PUSH HL POP HL RET -;Процедура вывода процентов +; Процедура вывода процентов PutProcent LD HL,ProcText PUSH HL LD BC,0x2F00 @@ -976,7 +958,7 @@ PutProcent LD HL,ProcText ADD A,100 EX AF,AF' LD A,B - CP "0" + CP '0' JR Z,.L2 SET 0,C .L2 BIT 0,C @@ -992,7 +974,7 @@ PutProcent LD HL,ProcText ADD A,10 EX AF,AF' LD A,B - CP "0" + CP '0' JR Z,.L5 SET 0,C .L5 BIT 0,C @@ -1001,33 +983,37 @@ PutProcent LD HL,ProcText .L6 LD (HL),A INC HL EX AF,AF' - ADD A,"0" + ADD A,'0' LD (HL),A POP HL LD DE,0x0250 LD BC,0x0011 LD A,0x80 - CALL JUMPS.PrnTxtLnNorm - RET + JP JUMPS.PrnTxtLnNorm InitCodePage: LD A,0 CodePage EQU $-1 LD L,A - LD H,0 - ADD HL,HL - ADD A,L - LD L,A - LD DE,EncDos - ADD HL,DE - LD DE,ASCIIenc - LD BC,3 - LDIR - LD A, (CodePage) + ADD A,A + ADD A,L + ADD A,A + ADD A,L + LD HL,EncDos + ADD A,L + LD L,A + ADC A,H + SUB L + LD H,A + LD (ASCIIenc1),HL + LD (ASCIIenc2),HL + LD A,(CodePage) AND A JR NZ,.next LD HL,0 .call: LD (PutLine2),A - LD (PutLine2 + 1),HL + LD (PutLine2 + 1),HL ; для режима просмотра TEXT + LD (DECODE4HEX),A + LD (DECODE4HEX + 1),HL ; для режима просмотра HEX RET .next: DEC A @@ -1036,12 +1022,16 @@ CodePage EQU $-1 LD HL,TableKoi .next1: LD (DecodeSymbol.table),HL LD HL,DecodeSymbol - LD A, 0xCD + LD A,0xCD JR .call -ProcText DEFB " %",0 -ProcFlag DEFB 0x00 -ProcentTab DUPL 505,0 +EncDos: DZ "F8 DOS" +EncWin: DZ "F8 WIN" +EncKoi: DZ "F8 KOI" + +ProcText DZ " %" +ProcFlag DB 0 +ASCIImode DB 1 ; при запуске режим TEXT ;[]==========================================================[] include fvtext.a80 @@ -1049,33 +1039,48 @@ ProcentTab DUPL 505,0 include fvprn.a80 ;[]==========================================================[] -ASCIItab: DEFW 0x0050,0x0230,0x001C,0x007F,0x00,0x0000,TLineUpMs,TBegFile - DEFW 0x0050,0x0230,0x0080,0x00E4,0x00,0x0000,TLineDwnMs,TEndFile - DEFW 0x0000,0x0050,0x001C,0x00E4,0x00,0x0000,TPageUpMs,ScrollLeft - DEFW 0x0230,0x0280,0x001C,0x00E4,0x00,0x0000,TPageDwnMs,ScrollRght - DEFW 0x0000,0x0050,0x00F2,0x0100,0x01,0x0000,About,0x0000 - DEFW 0x0050,0x00A0,0x00F2,0x0100,0x01,0x0000,ChASCIImode,0x0000 - DEFW 0x00A0,0x00F0,0x00F2,0x0100,0x01,0x0000,ChViewer,0x0000 - DEFW 0x0190,0x01E0,0x00F2,0x0100,0x01,0x0000,ChCodePage,0x0000 - DEFW 0x01E0,0x0230,0x00F2,0x0100,0x01,0x0000,FVPrintFile,0x0000 - DEFW 0x0230,0x0280,0x00F2,0x0100,0x21,0x0000,ViewerExit,0x0000 - DEFW 0x8000 +ASCIItab: DW 80,560, 28,127,%0000000000000000,%0000000000000000,TLineUpMs,TBegFile + DW 80,560,128,228,%0000000000000000,%0000000000000000,TLineDwnMs,TEndFile + DW 0, 80, 28,228,%0000000000000000,%0000000000000000,TPageUpMs,ScrollLeft + DW 560,640, 28,228,%0000000000000000,%0000000000000000,TPageDwnMs,ScrollRght + DW 0, 80,242,256,%0000000000000001,%0000000000000000,About,0 + DW 80,160,242,256,%0000000000000001,%0000000000000000,ChASCIImode,0 + DW 160,240,242,256,%0000000000000001,%0000000000000000,ChViewer,0 + DW 400,480,242,256,%0000000000000001,%0000000000000000,FVPrintFile,0 + DW 480,560,242,256,%0000000000000001,%0000000000000000,ChCodePage,0 + DW 560,640,242,256,%0000000000100001,%0000000000000000,ViewerExit,0 + DW 0x8000 -HEXtab: DEFW 0x0050,0x0230,0x001C,0x007F,0x00,0x0000,HLineUpMs,HBegFile - DEFW 0x0050,0x0230,0x0080,0x00E4,0x00,0x0000,HLineDwnMs,HEndFile - DEFW 0x0000,0x0050,0x001C,0x00E4,0x00,0x0000,HPageUpMs,0x0000 - DEFW 0x0230,0x0280,0x001C,0x00E4,0x00,0x0000,HPageDwnMs,0x0000 - DEFW 0x0000,0x0050,0x00F2,0x0100,0x01,0x0000,About,0x0000 - DEFW 0x00A0,0x00F0,0x00F2,0x0100,0x01,0x0000,ChViewer,0x0000 - DEFW 0x00F0,0x0140,0x00F2,0x0100,0x01,0x0000,HGoTo,0x0000 - DEFW 0x01E0,0x0230,0x00F2,0x0100,0x01,0x0000,FVPrintFile,0x0000 - DEFW 0x0230,0x0280,0x00F2,0x0100,0x21,0x0000,ViewerExit,0x0000 - DEFW 0x8000 +HEXtab: DW 80,560, 28,127,%0000000000000000,%0000000000000000,HLineUpMs,HBegFile + DW 80,560,128,228,%0000000000000000,%0000000000000000,HLineDwnMs,HEndFile + DW 0, 80, 28,228,%0000000000000000,%0000000000000000,HPageUpMs,0 + DW 560,640, 28,228,%0000000000000000,%0000000000000000,HPageDwnMs,0 + DW 0, 80,242,256,%0000000000000001,%0000000000000000,About,0 + DW 160,240,242,256,%0000000000000001,%0000000000000000,ChViewer,0 + DW 240,320,242,256,%0000000000000001,%0000000000000000,HGoTo,0 + DW 400,480,242,256,%0000000000000001,%0000000000000000,FVPrintFile,0 + DW 480,560,242,256,%0000000000000001,%0000000000000000,ChCodePage,0 + DW 560,640,242,256,%0000000000100001,%0000000000000000,ViewerExit,0 + DW 0x8000 -FVAboutTab: DEFW 0x011C,0x0164,0x008A,0x0098,0x21,0x0000,AboutExt,0x0000 - DEFW 0x0000,0x00A0,0x0000,0x0100,0x20,0x0000,AboutExt,0x0000 - DEFW 0x01E0,0x0280,0x0000,0x0100,0x20,0x0000,AboutExt,0x0000 - DEFW 0x0000,0x0280,0x0000,0x0048,0x20,0x0000,AboutExt,0x0000 - DEFW 0x0000,0x0280,0x009D,0x0100,0x20,0x0000,AboutExt,0x0000 - DEFW 0x8000 +FVAboutTab: DW 284,356,138,152,%0000000000100001,%0000000000000000,AboutExt,0 + DW 0,160, 0,256,%0000000000100000,%0000000000000000,AboutExt,0 + DW 480,640, 0,256,%0000000000100000,%0000000000000000,AboutExt,0 + DW 0,640, 0, 72,%0000000000100000,%0000000000000000,AboutExt,0 + DW 0,640,157,256,%0000000000100000,%0000000000000000,AboutExt,0 + DW 0x8000 ;[]==========================================================[] + + INIT_VAR $ + SETVAR ViewingFile, 0x30 + SETVAR ViewMode, BYTE + SETVAR ASCIIaddX, BYTE + SETVAR EmptyLines, BYTE + SETVAR FileLenght, DWORD ; Длина файла (32бит) + SETVAR FileShift, DWORD ; Смещение от начала файла (32бит) + SETVAR TempShift, DWORD ; Временная ячейка смещения (32бит) + SETVAR FVNextShift, DWORD ; Следующая страница для ASCII (32бит) + SETVAR FVMemIndef, BYTE + SETVAR FHandle, BYTE + SETVAR FVReadLen, DWORD + SETVAR ProcentTab, 505 diff --git a/plugins/fnviewer/fvprn.a80 b/plugins/fnviewer/fvprn.a80 index f3c397a..34bceeb 100644 --- a/plugins/fnviewer/fvprn.a80 +++ b/plugins/fnviewer/fvprn.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 24.03.2025 savelij +; LAST UPDATE: 28.07.2025 savelij ;[]==========================================================[] FVPrintFile @@ -28,10 +28,10 @@ FVPrintFile OR L JR NZ,.InitPrn INC E -.InitPrn LD (IX+PROC.MAXL1),L - LD (IX+PROC.MAXH1),H - LD (IX+PROC.MAXL2),E - LD (IX+PROC.MAXH2),0x00 +.InitPrn LD (IX+PROC.MAX_PAGES),L + LD (IX+PROC.MAX_PAGES + 1),H + LD (IX+PROC.MAX_PAGES + 2),E + LD (IX+PROC.MAX_PAGES + 3),0x00 CALL JUMPS.InitProcess LD A,(ViewMode) OR A @@ -82,7 +82,7 @@ PrintHEX LD HL,0x0000 PrintHEXlp CALL PrnHEXline JR C,PrintHEXext LD HL,(TempShift) - LD DE,0x0010 ;Адрес дампа+16 + LD DE,0x0010 ; Адрес дампа+16 ADD HL,DE LD (TempShift),HL LD HL,(TempShift+2) @@ -130,19 +130,19 @@ PrnHLn GETPORT WINSP.CPU1 PUSH AF CALL InitFPages - LD HL,LineBuffer+1 ;буфер строки + LD HL,LineBuffer+1 ; буфер строки EXX - LD HL,LineBuffer+0x3F ;место для ASCII кодов + LD HL,LineBuffer+0x3F ; место для ASCII кодов EXX - LD A,(TempShift+3) ;Кладем смещение - CALL PutHexNumb ;от начала фаила + LD A,(TempShift+3) ; Кладем смещение + CALL PutHexNumb ; от начала фаила LD A,(TempShift+2) CALL PutHexNumb LD A,(TempShift+1) CALL PutHexNumb LD A,(TempShift) CALL PutHexNumb - LD (HL),":" + LD (HL),':' INC L INC L PrnHLoop CALL TestFPages @@ -155,7 +155,7 @@ PrnHLoop CALL TestFPages EXX CP 0x20 JR NC,.L1 - LD A,"." + LD A,'.' .L1 LD (HL),A INC L EXX @@ -186,7 +186,7 @@ PrnHLoop CALL TestFPages INC L EXX INC IXL - LD A,IXL ;В центре 2 пробела + LD A,IXL ; В центре 2 пробела CP 0x04 JR Z,.FlPNx1 CP 0x08 @@ -207,8 +207,7 @@ PrnHEX LD A,(HL) CALL FVPrintCHAR RET C LD A,0x0A - CALL FVPrintCHAR - RET + JP FVPrintCHAR FVPrintCHAR LD IXL,A PUSH IX @@ -260,8 +259,8 @@ FVPrnCHAR PUSH HL HALT JR FVPrintCHAR -PrintTab DEFW 0x011C,0x0164,0x0080,0x008E,0x01,0x0000,FVStopPrint,0x0000 - DEFW 0x8000 +PrintTab DW 284,356,128,142,%0000000000000001,%0000000000000000,FVStopPrint,0 + DW 0x8000 FVNxtPrnProc LD A,E OR A @@ -272,19 +271,19 @@ FVNxtPrnProc LD A,E EXX PUSH DE LD IX,ProcessPrn - LD L,(IX+PROC.CURL1) - LD H,(IX+PROC.CURH1) + LD L,(IX+PROC.CURR_PAGE) + LD H,(IX+PROC.CURR_PAGE + 1) INC HL - LD (IX+PROC.CURL1),L - LD (IX+PROC.CURH1),H + LD (IX+PROC.CURR_PAGE),L + LD (IX+PROC.CURR_PAGE + 1),H LD A,H OR L JR NZ,.NxtProc - LD L,(IX+PROC.CURL2) - LD H,(IX+PROC.CURH2) + LD L,(IX+PROC.CURR_PAGE + 2) + LD H,(IX+PROC.CURR_PAGE + 3) INC HL - LD (IX+PROC.CURL2),L - LD (IX+PROC.CURH2),H + LD (IX+PROC.CURR_PAGE + 2),L + LD (IX+PROC.CURR_PAGE + 3),H .NxtProc CALL JUMPS.PrnProcess POP DE EXX @@ -322,13 +321,13 @@ EndJob: PUSH AF SCF RET -ProcessPrn DEFW 0x00BA - DEFW 0x0071 - DEFW 0x010C - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFW 0x0000 - DEFB 0x4F +ProcessPrn DW 186 + DW 113 + DW 268 + DW 0 + DW 0 + DW 0 + DW 0 + DW 0 + DW 0 + DB COLORP.BLUE + COLORI.WHITE diff --git a/plugins/fnviewer/fvtext.a80 b/plugins/fnviewer/fvtext.a80 index 154c095..3b87b99 100644 --- a/plugins/fnviewer/fvtext.a80 +++ b/plugins/fnviewer/fvtext.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 25.03.2025 savelij +; LAST UPDATE: 28.07.2025 savelij ;[]---------------------------------------------------------[] PrnASCIIpage LD HL,PrintVProc @@ -10,9 +10,9 @@ PrnASCIIpage LD HL,PrintVProc LD (TempShift+2),HL LD B,0x1C PrnASCIIlp PUSH BC - CALL PutASCIIline ;Выводим строку в буф и на экран + CALL PutASCIIline ; Выводим строку в буф и на экран POP BC - JR C,FillASCIIdn ;CY-Закончились байты для печати + JR C,FillASCIIdn ; CY-Закончились байты для печати LD A,B ADD A,0x08 LD B,A @@ -26,11 +26,11 @@ PrnASCIIlp PUSH BC LD (EmptyLines),A RET -;Процедура отчистки нижней области экрана +; Процедура отчистки нижней области экрана FillASCIIdn LD A,0xE4 SUB B LD (FLenASC),A - JR Z,FASCIIe ;Z-нет отчистки + JR Z,FASCIIe ; Z-нет отчистки LD A,B LD (FPosASC),A MAKEWINDOW WINSUBOBJ.WOBIND @@ -50,7 +50,7 @@ FASCIIe LD HL,(TempShift) LD (EmptyLines),A RET -;Процедура печати тек.строки в буфер и на экран +; Процедура печати тек.строки в буфер и на экран PutASCIIline LD IXH,B LD A,(ASCIImode) OR A @@ -105,7 +105,7 @@ PutTab LD (HL),0x20 JR NZ,PutTab JR PutLine3 -PutLine2 CALL DecodeSymbol ; заменяется на NOP, если не нужна перекодировка +PutLine2 CALL DecodeSymbol ; заменяется на NOP, если не нужна перекодировка LD (HL),A LD A,L CP C @@ -155,9 +155,10 @@ DecodeSymbol: CP 0x80 .table EQU $-2 ADD A,L LD L,A - JR NC,.L1 - INC H -.L1 LD A,(HL) + ADC A,H + SUB L + LD H,A + LD A,(HL) POP HL RET @@ -253,8 +254,7 @@ ScrollLeft LD A,(ASCIImode) RET Z DEC A LD (ASCIIaddX),A - CALL PrnASCIIpage - RET + JP PrnASCIIpage ;[]----------------------------------------------------------[] ScrollRght LD A,(ASCIImode) @@ -265,8 +265,7 @@ ScrollRght LD A,(ASCIImode) RET Z INC A LD (ASCIIaddX),A - CALL PrnASCIIpage - RET + JP PrnASCIIpage ;[]----------------------------------------------------------[] THome LD A,(ASCIImode) @@ -277,8 +276,7 @@ THome LD A,(ASCIImode) RET Z SUB A LD (ASCIIaddX),A - CALL PrnASCIIpage - RET + JP PrnASCIIpage ;[]----------------------------------------------------------[] TEnd LD A,(ASCIImode) @@ -289,8 +287,7 @@ TEnd LD A,(ASCIImode) RET Z LD A,0xA0 LD (ASCIIaddX),A - CALL PrnASCIIpage - RET + JP PrnASCIIpage ;[]----------------------------------------------------------[] TLineUpMs CALL TLineUp @@ -335,7 +332,7 @@ TLineUp LD HL,(FileShift) LD (FVNextShift+2),DE TLineU1 CALL ScrollSCRdown LD B,0x1C - CALL PutASCIIline ;Создаем и печатаем строку + CALL PutASCIIline ; Создаем и печатаем строку CALL PrintVProc OR A RET @@ -379,7 +376,7 @@ TLineDwn LD HL,(FVNextShift) LD (TempShift+2),DE CALL ScrollSCRup LD B,0xDC - CALL PutASCIIline ;Создаем и печатаем строку + CALL PutASCIIline ; Создаем и печатаем строку LD HL,(TempShift) LD DE,(TempShift+2) LD (FVNextShift),HL @@ -475,8 +472,7 @@ TBegFile LD HL,JUMPS.ResFire LD HL,0x0000 LD (FileShift),HL LD (FileShift+2),HL - CALL PrnASCIIpage - RET + JP PrnASCIIpage ;[]----------------------------------------------------------[] TEndFile LD HL,JUMPS.ResFire @@ -500,8 +496,7 @@ TEndFl1 PUSH BC DJNZ TEndFl1 LD (FileShift),HL LD (FileShift+2),DE - CALL PrnASCIIpage - RET + JP PrnASCIIpage ;[]==========================================================[] SearchUp LD B,0xF0 @@ -520,13 +515,13 @@ SearchUp LD B,0xF0 PUSH AF PUSH HL PUSH DE - LD A,H ;Выделяем номер страницы + LD A,H ; Выделяем номер страницы RLA RL E RLA RL E LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 RES 7,H SET 6,H @@ -667,13 +662,13 @@ SrchDE EQU $-2 PUSH AF PUSH HL PUSH DE - LD A,H ;Выделяем номер страницы + LD A,H ; Выделяем номер страницы RLA RL E RLA RL E LD D,HIGH (PagesList) - LD A,(DE) ;Тек.страница + LD A,(DE) ; Тек.страница SETPORT WINSP.CPU1,,0 RES 7,H SET 6,H @@ -745,6 +740,7 @@ SrchEEx POP DE OR A RET +; CP866 Table866: db 0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8 db 0x3F,0x25,0x3F,0x3C,0x3F,0x3F,0x3F,0x3F db 0x3F,0x27,0x27,0x22,0x22,0x07,0x2D,0x2D @@ -761,7 +757,7 @@ Table866: db 0x3F,0x3F,0x27,0x3F,0x22,0x3A,0xC5,0xD8 db 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF db 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7 db 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF -; koi8-r +; KOI8-R TableKoi: db 0xC4,0xB3,0xDA,0xBF,0xC0,0xD9,0xC3,0xB4 db 0xC2,0xC1,0xC5,0xDF,0xDC,0xDB,0xDD,0xDE db 0xB0,0xB1,0xB2,0xF4,0xFE,0xF9,0xFB,0xF7 diff --git a/readme.md b/readme.md index 4a542df..df72dbf 100644 --- a/readme.md +++ b/readme.md @@ -3,26 +3,10 @@ Flex Navigator ╨┤╨╗╤П ╨║╨╛╨╝╨┐╤М╤О╤В╨╡╤А╨░ Sprinter ╨б╨╛╨▒╤А╨░╨╜╨╜╤Л╨╡ ╤Д╨░╨╣╨╗╤Л ╨╖╨░╨▒╨╕╤А╨░╤В╤М ╨╕╨╖ ╨┐╨░╨┐╨║╨╕ fn - -`CDplayer.flx 1.1:` -- ╨┐╨╗╨░╨│╨╕╨╜ ╨┤╨╛╨┤╨╡╨╗╨░╨╜, ╨╛╨┐╨╕╤Б╨░╨╜╨╕╨╡/history ╨▓ cdplayer.txt ╤А╤П╨┤╨╛╨╝ ╤Б ╨┐╨╗╨░╨│╨╕╨╜╨╛╨╝. - -`FE 1.09:` -- ╨╕╤Б╨┐╤А╨░╨▓╨╗╨╡╨╜╨╛: ╨┐╤А╨╕ ╨▓╤Л╤Е╨╛╨┤╨╡ ╨╕╨╖ ╤А╨╡╨┤╨░╨║╤В╨╛╤А╨░ ╤Б ╨╜╨╡╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╜╤Л╨╝ ╤Д╨░╨╣╨╗╨╛╨╝ ╨╕ ╨╖╨░╨┐╤А╨╛╤Б╨╡ ╨╜╨░ - ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╨╡ ╨║╨╗╨░╨▓╨╕╤И╨░ Enter ╤В╨╡╨┐╨╡╤А╤М ╤А╨░╨▒╨╛╤В╨░╨╡╤В ╨║╨░╨║ ╨┐╨╛╨┤╤В╨▓╨╡╤А╨╢╨┤╨╡╨╜╨╕╨╡ ╤Б╨╛╤Е╤А╨░╨╜╨╡╨╜╨╕╤П. - -`FN 1.16:` -- ╨╕╤Б╨┐╤А╨░╨▓╨╗╨╡╨╜ ╨▓╨╛╨╖╤А╨░╤В ╤В╨╡╨║╤Г╤Й╨╡╨╣ ╨┤╨╕╤А╨╡╨║╤В╨╛╤А╨╕╨╕ ╨┐╨╛╤Б╨╗╨╡ ╨╖╨░╨│╤А╤Г╨╖╨║╨╕ ╨┐╨╗╨░╨│╨╕╨╜╨░. -- ╨▓╤Б╤В╤А╨╛╨╡╨╜╨╜╤Л╨╣ editor ╨┐╨╡╤А╨╡╨╡╤Е╨░╨╗ ╨▓ ╨┐╨╗╨░╨│╨╕╨╜ ╨╛╤В╨║╤Г╨┤╨░ ╨╕ ╨╖╨░╨┐╤Г╤Б╨║╨░╨╡╤В╤Б╤П ╨┐╨╛ F4, ╨╕╨╖ FN ╤Г╨┤╨░╨╗╨╡╨╜. -- ╨▓╤Б╤В╤А╨╛╨╡╨╜╨╜╤Л╨╣ viewer ╨┐╨╡╤А╨╡╨╡╤Е╨░╨╗ ╨▓ ╨┐╨╗╨░╨│╨╕╨╜ ╨╛╤В╨║╤Г╨┤╨░ ╨╕ ╨╖╨░╨┐╤Г╤Б╨║╨░╨╡╤В╤Б╤П ╨┐╨╛ F3, ╨╕╨╖ FN ╤Г╨┤╨░╨╗╨╡╨╜. -- ╨▓╤Б╤В╤А╨╛╨╡╨╜╨╜╤Л╨╣ help ╨┐╨╡╤А╨╡╨╡╤Е╨░╨╗ ╨▓ ╨┐╨╗╨░╨│╨╕╨╜ ╨╛╤В╨║╤Г╨┤╨░ ╨╕ ╨╖╨░╨┐╤Г╤Б╨║╨░╨╡╤В╤Б╤П ╨┐╤А╨╕ ╨╜╨░╨╢╨░╤В╨╕╨╕ F1, - ╨╕╨╖ FN ╤Г╨┤╨░╨╗╨╡╨╜. -- ╨╖╨░╨│╤А╤Г╨╖╨║╨░ ╨┐╨╗╨░╨│╨╕╨╜╨░ ╨╛╤В╨┤╨╡╨╗╨╡╨╜╨░ ╨╛╤В ╨╖╨░╨┐╤Г╤Б╨║╨░, ╤В╨╡╨┐╨╡╤А╤М ╨╝╨╛╨╢╨╜╨╛ ╨╖╨░╨┐╤Г╤Б╨║╨░╤В╤М ╨┐╨╗╨░╨│╨╕╨╜╤Л ╨╜╨╡ - ╤В╨╛╨╗╤М╨║╨╛ ╨╕╨╖ ╨┐╨░╨╜╨╡╨╗╨╕ FN. -- ╨┤╨╛╨▒╨░╨▓╨╗╨╡╨╜ ╨╝╨░╨║╤А╨╛╤Б ╤Д╨╛╤А╨╝╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨╖╨░╨│╨╛╨╗╨╛╨▓╨║╨░ ╨┤╨╗╤П ╨┐╨╗╨░╨│╨╕╨╜╨╛╨▓. -- ╨┤╨╛╨▒╨░╨▓╨╗╨╡╨╜╨░ ╨┐╨╛╨┤╨┤╨╡╤А╨╢╨║╨░ ╤А╨░╨▒╨╛╤В╤Л ╨┐╨╗╨░╨│╨╕╨╜╨╛╨▓ ╨▓ ╨░╨┤╤А╨╡╤Б╨░ 0x4000-0x7FFF (╨╛╨║╨╜╨╛ 1) ╨▓ - ╨┤╨╛╨┐╨╛╨╗╨╜╨╡╨╜╨╕╨╡ ╨║ ╤Б╤В╨░╤А╤Л╨╝ 0xC000-0xBFFF (╨╛╨║╨╜╨╛ 3), ╨┐╨╛╨║╨░ ╨╕╤Б╨┐╨╛╨╗╤М╨╖╤Г╨╡╤В╤Б╤П ╨▓ ╨┐╨╗╨░╨│╨╕╨╜╨╡ - cdplayer. -- ╨▓ ╨╛╨║╨╜╨░╤Е ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣ ╨┐╨╡╤А╨╡╨┤╨╡╨╗╨░╨╜ ╨╜╨░ 2 ╤В╨╕╨┐╨░ ╨╛╨║╨╛╨╜ ╨▓╨╝╨╡╤Б╤В╨╛ ╨╝╨╜╨╛╨│╨╕╤Е ╨┐╨╛╨┤ ╨║╨░╨╢╨┤╤Г╤О ╨╛╤И╨╕╨▒╨║╤Г. -- ╨╕╤Б╨┐╤А╨░╨▓╨╗╨╡╨╜╨░ ╨┐╨╛╤В╨╡╤А╤П ╤Ж╨▓╨╡╤В╨░ ╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤В╨╡╨║╤Б╤В╨░ ╨┐╨╛ ╤Г╨║╨░╨╖╨░╨╜╨╜╨╛╨╝╤Г ╨░╨┤╤А╨╡╤Б╤Г. -- ╤В╨╡╨║╤Б╤В╨╛╨▓╤Л╨╝ ╤Д╨░╨╣╨╗╨░╨╝ ╨▓╨╡╤А╨╜╤Г╨╗ ╨║╨╛╨┤╨╕╤А╨╛╨▓╨║╤Г CP866, readme.md ╨╛╤Б╤В╨░╨▓╨╗╨╡╨╜ ╨▓ ╨║╨╛╨┤╨╕╤А╨╛╨▓╨║╨╡ UTF8. +`FileEditor.flx 1.10:` +- ╤Г╤Б╤В╤А╨░╨╜╨╡╨╜╨╛ ╨┐╨╡╤А╨╡╨┐╤Г╤В╨░╨╜╨╜╤Л╨╡ ╨║╨╜╨╛╨┐╨║╨╕ ╨┤╨╗╤П ╨╜╨░╨╢╨░╤В╨╕╨╣ ╨╝╤Л╤И╤М╤О ╨┤╨╗╤П F7 ╨╕ F9. +`FileViewer.flx 1.06:` +- ╨┤╨╛╨▒╨░╨▓╨╗╨╡╨╜╨╛ ╨┐╨╡╤А╨╡╨║╨╗╤О╤З╨╡╨╜╨╕╨╡ ╨║╨╛╨┤╨╕╤А╨╛╨▓╨║╨╕ ╨▓ ╤А╨╡╨╢╨╕╨╝╨╡ HEX ╨┐╤А╨╛╤Б╨╝╨╛╤В╤А╨░. +`FlexNavigaror 1.16.01:` +- ╨╕╤Б╨┐╤А╨░╨▓╨╗╨╡╨╜ ╨▓╤Л╨╗╨╡╤В ╨┐╤А╨╕ ╤Б╨╛╨╖╨┤╨░╨╜╨╕╨╕ ╨╜╨╛╨▓╨╛╨│╨╛ ╤Д╨░╨╣╨╗╨░ ╨┐╨╛ Shift+F4 ╨╕╨╗╨╕ ╨┐╤А╨╛╤Б╨╝╨╛╤В╤А ╤Б + ╨▓╨▓╨╛╨┤╨╛╨╝ ╨╕╨╝╨╡╨╜╨╕ ╨┐╨╛ Shift+F3, ╨┐╨╗╨░╨│╨╕╨╜ ╨▒╤Л╨╗ ╨╜╨╡ ╨╖╨░╨│╤А╤Г╨╢╨╡╨╜.