; LAST UPDATE: 25.07.2025 savelij ;[]==========================================================[] DOSline SUB A LD (HistCurrent),A SPDSS DSSF.TESTKEY BIT KEYBSTAT.B_ALT,B JR Z,DOSln0 LD A,D AND 0x7F CP SC.1 ; 0x02 JR C,DOSlnEx CP SC.BKSP ; 0x0E JP C,RESIDENT.QSearch CP SC.Q ; 0x10 JR C,DOSlnEx CP SC.QSKOBKAL ; 0x1A JP C,RESIDENT.QSearch CP SC.A ; 0x1D JR C,DOSlnEx CP SC.DOTZAP ; 0x26 JP C,RESIDENT.QSearch CP SC.Z ; 0x2A JR C,DOSlnEx CP SC.ZAP ; 0x31 JP C,RESIDENT.QSearch JR DOSlnEx DOSln0 LD A,E CP 0x0D JP Z,RunDOSline CP 0x1B JP Z,ClrDOSln1 CP '!' ; 0x21 JR NC,DOSloop CP ' ' ; 0x20 JR NZ,DOSln1 LD A,(DOSstr.slen) OR A JR NZ,DOSloop ; пометка файла по SPACE SPDSS DSSF.SCANKEY JP RESIDENT.MarkFile DOSln1 LD A,D CP SC.ENTER | SC.RUS ; 0xA8 JR Z,DOSloop CP SC.QSKOBKAL | SC.RUS ; 0x9A JR Z,DOSloop CP SC.QSKOBKAR | SC.RUS ; 0x9B JR Z,DOSloop CP SC.E | SC.RUS ; 0x92 JR Z,DOSloop DOSlnEx SPDSS DSSF.SCANKEY RET DOSloop SUB A LD (HistCurrent),A LD IX,DOSstr LD HL,DOSTab CALL DOSInputLine RET C JR Z,RunDOSline SPDSS DSSF.TESTKEY LD A,E CP 0x1B RET NZ LD A,(DOSstr.slen) OR A RET Z CALL ClearDOSline SPDSS DSSF.SCANKEY JR DOSloop ;[]----------------------------------------------------------[] ClrDOSln1 SPDSS DSSF.SCANKEY LD A,(DOSstr.slen) OR A JP Z,ShowDOSscreen ClearDOSline SUB A LD (HistCurrent),A LD A,(DOSstr.slen) OR A RET Z LD HL,DOSinp SUB A LD B,0x80 .L1 LD (HL),A INC HL DJNZ .L1 LD (DOSstr.slen),A LD (DOSstr.posX),A LD (DOSstr.addX),A MAKEWINDOW WINSUBOBJ.WOBIND W_FILL 254,229,380,10,COLORI.PANEL W_END RET ;[]----------------------------------------------------------[] RunDOSline SPDSS DSSF.SCANKEY LD A,(DOSstr.slen) OR A JP Z,OpenFile CALL SaveDOSline LD HL,DOSinp LD A,(HL) CP ' ' JP Z,ClearDOSline LD A,(DOSstr.slen) LD B,A LD C,0x00 LD A,' ' RunDLn0 CP (HL) JR Z,RunDLine INC HL INC C DJNZ RunDLn0 RunDLine DEC HL LD A,'\\' CP (HL) JP NZ,RunDOSexe LD HL,DOSinp LD DE,WorkBuffer PUSH DE LD B,0x00 LDIR SUB A LD (DE),A CALL ClearDOSline POP HL LD A,(DOSinp + 1) CP ':' JR NZ,.L1 LD (IY + PANEL.CURR_PATH),0x00 .L1 CALL NewDIRECTORY LD A,(TreeFlag) OR A RET Z BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) RET NZ PUSH IY BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD IY,LeftPanel LD HL,RightPanel JR NZ,.L2 LD IY,RightPanel LD HL,LeftPanel .L2 LD DE,PANEL.CURR_PATH ADD HL,DE INC HL INC HL IF TREE_REZID CALL RESIDENT.FindTreeDIR ELSE CALL FindTreeDIRR ENDIF CALL PrintDIR CALL PrnFileInfo PUSH IY POP IX LD DE,PANEL.BAR_X ADD IX,DE CALL PrnVScrBar POP IY RET RunDOSexe LD HL,DOSinp - 1 RunDE1 INC HL LD A,(HL) CP '!' JR C,RunDOSexe1 CP '.' JR NZ,RunDE1 INC HL LD A,(HL) RES 5,A CP 'F' JR NZ,RunDOSexe1 INC HL LD A,(HL) RES 5,A CP 'L' JR NZ,RunDOSexe1 INC HL LD A,(HL) RES 5,A CP 'X' JR NZ,RunDOSexe1 LD HL,DOSinp LD DE,WorkBuffer SUB A .L1 LDI CP (HL) JR NZ,.L1 LD (DE),A CALL ClearDOSline CALL RunFLX JP C,DOSError RET RunDOSexe1 ld hl,WorkBuffer ld de,WorkBuffer + 1 ld bc,0x0100 ld (hl),0 ldir LD DE,WorkBuffer call GetFileName jp c,.error ld hl,DOSinp call SkipWord ld a,(hl) and a jr z,.endOfLine dec hl ld de,WorkBuffer call STRCAT .endOfLine: ld hl,WorkBuffer ld de,WorkBuffer + 0x0100 SPDSS DSSF.EX_PATH,4 jr c,.error and 2 jr z,.unknown ld hl,(WorkBuffer + 0x0100) ld de,'XE' ;0x5845 - 'EX' sbc hl,de jr nz,.noExe ld a,(WorkBuffer + 0x0102) cp 'E' jr nz,.noExe ;!TODO место для специфичного запуска exe? ; ... ... ... ; .unknown: ld hl,WorkBuffer ld de,WorkBuffer + 0x0100 ld bc,0x0100 ldir jr .noBatch .noExe: ld hl,ShellFile ;копируем путь к шеллу ld de,WorkBuffer + 0x0100 call STRCPY ld hl,WorkBuffer call STRCAT .noBatch: CALL ResDrivers SUB A CALL ClearScreen CALL ResVideoMode LD HL,ReStartPoint EX (SP),HL LD HL,WorkBuffer + 0x0100 SPDSS DSSF.EXEC,0 RET NC PUSH AF SETPORT BORDER,0 CALL InitVideoMode CALL InitDrivers CALL InitScreen CALL ClearDOSline SUB A CALL InitPanels POP AF .error: CALL DOSError LD HL,MainLoop EX (SP),HL RET ; вставка из буфера ввода ком.строки имени исполняемого файла ; если указан абсолютный путь к файлу с именем диска, то он копируется целиком ; если просто имя файла, то производится попытка поиска файла в ; каталоге текущей панели и подставляется его абсолютный путь, если нет, то просто имя файла ; DE - буфер для имени файла GetFileName: LD A,(DOSinp + 1) ; в ком.строке указан абсолютный путь к файлу (с диском) CP ':' JR nz,.panelSearch .notFound: ld hl,DOSinp ;копируем буфер ком.строки в буфер jp CopyWord .panelSearch: ex hl,de ld (.str),hl bit PANELFLAG.B_SIDE,(iy + PANEL.PANELFLAG) ld hl,RightPanel + PANEL.CURR_PATH jr nz,.next ld hl,LeftPanel + PANEL.CURR_PATH .next: ld de,WorkBuffer + 0x0100 call STRCPY ld a,'\\' ld (de),a inc de ; Выделить имя файла из строки ld hl,DOSinp ; откуда SPDSS DSSF.EX_PATH,3 ret c ; имя файла не найдено bit 1,a jr z,.noExt ; имя исполняемого файла указано с расширением, искать не нужно ld hl,EndOfString jr .found1 .noExt: ld hl,BATExtension call PrepareFilename call SearchFilename jr nc,.found ld hl,EXEExtension .found1: call PrepareFilename call SearchFilename .found: ld de,0 .str EQU $-2 jr c,.notFound ld hl,WorkBuffer + 0200h jp STRCPY ;Подготовка имени файла для поиска PrepareFilename: ld de,WorkBuffer + 0200h push hl ld hl,WorkBuffer + 0x0100 call STRCPY pop hl jp STRCAT ;поиск файла SearchFilename: ld hl,WorkBuffer + 0200h ;поиск файла в каталоге текущей панели ld de,WorkBuffer + 0300h SPDSS DSSF.F_FIRST,1,DIR.M_Archive + DIR.M_ReadOnly ret ;[]----------------------------------------------------------[] SaveDOSline GETPORT WINSP.CPU1 PUSH AF LD A,(RAMPAGES.FNREZ3) SETPORT WINSP.CPU1,,0 SETPORT WINSP.Y_PORT,0xC0 LD IX,DOSstr LD HL,(HistSpace) LD C,(IX + DOSstr.slen - DOSstr) LD B,0x00 .L4 OR A SBC HL,BC JR C,.L1 JR NZ,.L3 .L1 LD A,(HistCount) DEC A LD (HistCount),A PUSH BC CALL FindHistory POP BC LD DE,DOShistory + DOShistory_Size OR A EX DE,HL SBC HL,DE JR .L4 .L3 DEC HL LD (HistSpace),HL PUSH BC LD A,(HistCount) CALL FindHistory LD E,L LD D,H ADD HL,BC INC HL EX DE,HL PUSH HL LD BC,DOShistory OR A SBC HL,BC LD C,L LD B,H POP HL LD A,B OR C JR Z,.L2 DEC HL DEC DE LDDR .L2 POP BC LD HL,DOSinp LD DE,DOShistory LD A,C INC A LD (DE),A INC DE LDIR SUB A LD (HistCurrent),A POP AF SETPORT WINSP.CPU1,,0 LD HL,HistCount INC (HL) RET GetDOShistory LD IX,DOSstr LD HL,HistCount LD A,(HistCurrent) INC (HL) DEC (HL) JP Z,ClearDOSline CP (HL) RET Z EX AF,AF' GETPORT WINSP.CPU1 PUSH AF LD A,(RAMPAGES.FNREZ3) SETPORT WINSP.CPU1,,0 EX AF,AF' PUSH AF CALL FindHistory LD DE,DOSinp LD A,(HL) INC HL DEC A LD (IX + DOSstr.slen - DOSstr),A LD (IX + DOSstr.posX - DOSstr),A LD C,A LD B,0x00 LDIR SUB A LD (IX + DOSstr.addX - DOSstr),A POP AF INC A LD (HistCurrent),A POP AF SETPORT WINSP.CPU1,,0 RET FindHistory LD HL,DOShistory OR A RET Z LD B,A LD D,0x00 .L1 LD E,(HL) ADD HL,DE DJNZ .L1 RET ;[]----------------------------------------------------------[] DOSInputLine LD (InpLnData),IX LD (InputLine.InpMous),HL RES 7,(IX + 0x01) SET 6,(IX + 0x01) SPDSS DSSF.TESTKEY JR NZ,.L1 RES 6,(IX + 0x01) .L1 CALL InsInpLnCol PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX + 0x04) ADD HL,DE LD (HL),D CALL PrintInpLn + 3 DOSLineLp HALT CALL ChCursor LD IX,(InputLine.InpMous) CALL TestCoords SPDSS DSSF.TESTKEY JR Z,DOSLineLp RES 7,D BIT KEYBSTAT.B_ALT,B JR NZ,DOSLineLp1;DOSLineLp ; выход, здесь нет комбинаций с ALT LD IX,DOSTable2 ; комбинация с CTRL BIT KEYBSTAT.B_CTRL,B JR NZ,DOSKeys LD IX,DOSTable1 ; ввод без модификаторов DOSKeys LD L,(IX + 0x00) ; ASCII code INC IX INC L JR Z,DOSLineLp1 DEC L LD H,(IX + 0x00) ; position code INC IX LD C,(IX + 0x00) ; adr LOW INC IX LD B,(IX + 0x00) ; adr HIGH INC IX OR A SBC HL,DE JR NZ,DOSKeys LD IX,(InpLnData) RES 6,(IX + 0x01) LD A,E CP 0x1B JR NZ,DOSLnNx CALL ResCursor LD A,0x01 OR A RET DOSLnNx LD HL,DOSLineLp PUSH HL PUSH BC PUSH IX SPDSS DSSF.SCANKEY POP IX RET DOSLineLp1 LD IX,(InpLnData) LD A,E CP 0x20 JR NC,DOSLineLp2 BIT 6,(IX + 0x01) JR Z,DOSLnE0 PUSH IX SPDSS DSSF.SCANKEY POP IX DOSLnE0 CALL ResCursor LD A,0x01 OR A RET DOSLineLp2 RES 6,(IX + 0x01) LD HL,DOSLineLp PUSH HL PUSH IX SPDSS DSSF.SCANKEY POP IX LD A,E JP InsertSymbol DOSLnExtN POP HL LD IX,(InpLnData) CALL ResCursor XOR A RET DOSLnExtC POP HL LD IX,(InpLnData) CALL ResCursor SCF RET DOSTable1 DW SC.ESC << 8 | 0x1B, InputLine.InpLnExtC ; 0x011B,InpLnExtC DW SC.ENTER << 8 | 0x0D,InputLine.InpLnExtN ; 0x280D,InpLnExtN DW SC.X4 << 8, ILleft ; 0x5400,ILleft DW SC.X6 << 8, ILright ; 0x5600,ILright DW SC.BKSP << 8 | 8, ILdelet ; 0x0E08,ILdelet DW SC.XDEL << 8, IL_del_ ; 0x4F00,IL_del_ DW SC.X7 << 8, ILhome ; 0x5700,ILhome DW SC.X1 << 8, ILend ; 0x5100,ILend DB 0xFF DOSTable2 DW SC.X4 << 8, ILwordL ; 0x5400,ILwordL DW SC.X6 << 8, ILwordR ; 0x5600,ILwordR DW SC.BKSP << 8, ILdelWR ; 0x0E00,ILdelWR DW SC.ENTER << 8, InsFileName ; 0x2800,InsFileName DW SC.QSKOBKAL << 8, InsLeftPath ; 0x1A00,InsLeftPath DW SC.QSKOBKAR << 8, InsRightPath ; 0x1B00,InsRightPath DW SC.E << 8, InsHistory ; 0x1200,InsHistory DB 0xFF InsFileName GETPORT WINSP.CPU1 PUSH AF BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L1 LD A,(RAMPAGES.RIGHTPANEL) .L1 SETPORT WINSP.CPU1,,0 LD L,(IY + PANEL.FIRST_FILE) LD H,(IY + PANEL.FIRST_FILE + 1) LD E,(IY + PANEL.CURR_FILE) LD D,(IY + PANEL.CURR_FILE + 1) ADD HL,DE BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) JR Z,InsFN1 ADD HL,HL ADD HL,HL ADD HL,HL ADD HL,HL SET 6,H INC HL INC HL LD DE,TempName LD BC,0x000D LDIR JR InsFN2 InsFN1 ADD HL,HL ADD HL,HL ADD HL,HL LD E,L LD D,H ADD HL,HL ADD HL,DE SET 6,H INC HL LD DE,TempName CALL MakeDOSname InsFN2 POP AF SETPORT WINSP.CPU1,,0 LD HL,TempName LD A,(HL) CP '.' RET Z CP '\\' RET Z PUSH HL SUB A LD C,A .L1 INC C INC HL CP (HL) JR NZ,.L1 LD (HL),0x20 INC HL LD (HL),A INC C POP HL JP InsertWord TempName DB 14 DUP 0 InsLeftPath LD HL,LeftPanel + PANEL.CURR_PATH JR InsPath InsRightPath LD HL,RightPanel + PANEL.CURR_PATH InsPath LD DE,WorkBuffer + 0x100 PUSH DE SUB A LD C,A .L1 LDI CP (HL) JR NZ,.L1 DEC HL LD A,'\\' CP (HL) JR Z,.L2 LD (DE),A INC DE DEC C .L2 SUB A SUB C LD C,A POP HL JP InsertWord InsertWord LD A,(IX + 0x04) ;InpytSymb ADD A,C RET C SUB (IX + 0x00) ;Max len RET NC PUSH HL LD A,(IX + 0x04) SUB (IX + 0x02) JR Z,NotInsWord ; Ввод в середину текста PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX + 0x04) ADD HL,DE LD E,L LD D,H LD B,0x00 ADD HL,BC EX DE,HL DEC HL DEC DE PUSH BC LD C,A LDDR POP BC NotInsWord PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX + 0x02) ADD HL,DE EX DE,HL POP HL PUSH BC LD B,0x00 LDIR POP BC LD A,(IX + 0x04) ADD A,C LD (IX + 0x04),A LD A,(IX + 0x02) ADD A,C LD (IX + 0x02),A JP PrintInpLn InsHistory CALL GetDOShistory JP PrintInpLn ;[]----------------------------------------------------------[] ShellFile: db "X:\\SYSTEM.EXE /C ",0 ; шелл BATExtension: db ".BAT",0 EXEExtension: db ".EXE" EndOfString: db 0 DOSstr DB 0x80,0x00 .posX DB 0x00 .addX DB 0x00 .slen DB 0x00 DW 256,231,376 DB COLORP.PANEL + COLORI.FILES DOSinp DB 0x81 DUP 0 HistSpace DEFW 0x200 HistCount DEFB 0x00 HistCurrent DEFB 0x00 ;[]----------------------------------------------------------[]