; LAST UPDATE: 20.03.2025 savelij ;[]----------------------------------------------------------[] InputLine LD (InpLnData),IX LD (.InpMous),HL SET 7,(IX+0x01) SUB A LD (IX+0x02),A LD (IX+0x03),A CALL InsInpLnCol PUSH IX POP HL LD DE,LenInpData ADD HL,DE PUSH HL LD E,(IX+0x04) ADD HL,DE LD (HL),D LD (IX+0x02),E POP HL LD DE,WorkBuffer LD A,(IX+0x02) LD (DE),A INC DE LD A,(IX+0x03) LD (DE),A INC DE LD A,(IX+0x04) LD (DE),A INC DE LD C,A LD B,0x00 OR B JR Z,.L1 LDIR .L1 CALL PrintInpLn.L1 .InpLineLp HALT CALL ChCursor LD IX,0x0000 .InpMous EQU $-2 CALL TestCoords SPDSS DSSF.TESTKEY JR Z,.InpLineLp RES 7,D BIT KEYBSTAT.B_ALT,B JR NZ,.InpLineLp LD IX,InpTable2 BIT KEYBSTAT.B_CTRL,B JR NZ,.NextInpKeys LD IX,InpTable1 .NextInpKeys LD L,(IX+0x00) INC L JR Z,.InpLineLp1 INC IX DEC L LD H,(IX+0x00) INC IX LD C,(IX+0x00) INC IX LD B,(IX+0x00) INC IX OR A SBC HL,DE JR NZ,.NextInpKeys LD IX,(InpLnData) LD HL,.InpLineLp PUSH HL PUSH BC PUSH IX SPDSS DSSF.SCANKEY POP IX RET .InpLineLp1 LD IX,(InpLnData) LD HL,.InpLineLp PUSH HL PUSH IX SPDSS DSSF.SCANKEY POP IX LD A,E JR InsertSymbol .InpLnExtN POP HL LD IX,(InpLnData) CALL ResCursor XOR A RET .InpLnExtC POP HL LD IX,(InpLnData) CALL ResCursor PUSH IX POP HL LD DE,LenInpData ADD HL,DE EX DE,HL LD HL,WorkBuffer LD A,(HL) INC HL LD (IX+0x02),A LD A,(HL) INC HL LD (IX+0x03),A LD A,(HL) INC HL LD (IX+0x04),A LD C,A LD B,0x00 LD A,B OR C SCF RET Z LDIR RET InpLnData DEFW 0x0000 ; Адрес описателя строки ; +00 Максимальная длина строки ; +01 Флаг готовности ; +02 текущая X позиция курсора ; +03 текущая AddX ; +04 количество введенных символов ; +05 X позиция строки на экране ; +07 Y позиция строки на экране ; +09 X длина строки на экране ; +0B Цвет строки ; +0C ...сама строка InpTable1 DW SC.ESC << 8 | 0x1B, InputLine.InpLnExtC DW SC.ENTER << 8 | 0x0D, InputLine.InpLnExtN DW SC.XENTER << 8 | 0x0D, InputLine.InpLnExtN DW SC.X4 << 8, ILleft DW SC.X6 << 8, ILright DW SC.BKSP << 8 | 0x08, ILdelet DW SC.XDEL << 8, IL_del_ DW SC.X7 << 8, ILhome DW SC.X1 << 8, ILend DB 0xFF InpTable2 DW SC.X4 << 8, ILwordL DW SC.X6 << 8, ILwordR DW SC.BKSP << 8, ILdelWR DB 0xFF InsertSymbol CP ' ' RET C EX AF,AF' BIT 7,(IX+0x01) ; ready CALL NZ,ClearInpLn LD A,(IX+0x04) ; InpytSymb SUB (IX+0x00) ; Max len RET NC LD A,(IX+0x04) SUB (IX+0x02) JR Z,NotInsert ; Ввод в середину текста LD C,A LD B,0x00 PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX+0x04) ADD HL,DE LD E,L LD D,H DEC HL LDDR NotInsert PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX+0x02) ADD HL,DE EX AF,AF' LD (HL),A INC (IX+0x04) INC (IX+0x02) JP PrintInpLn ; Clear Buffer ClearInpLn RES 7,(IX+0x01) PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD B,(IX+0x00) SUB A .L1 LD (HL),A INC HL DJNZ .L1 LD (IX+0x02),A LD (IX+0x03),A LD (IX+0x04),A JP PrintInpLn ; Курсор влево на одно место ILleft RES 7,(IX+0x01) LD A,(IX+0x02) DEC A RET M LD (IX+0x02),A JP PrintInpLn ; Курсор вправо на одно место ILright RES 7,(IX+0x01) LD A,(IX+0x02) CP (IX+0x04) RET Z INC (IX+0x02) JP PrintInpLn ; delete ILdelet BIT 7,(IX+0x01) ; ready CALL NZ,ClearInpLn LD A,(IX+0x02) OR A RET Z PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX+0x02) ADD HL,DE LD E,L LD D,H DEC DE LD A,(IX+0x04) SUB (IX+0x02) JR Z,ILDel1 LD C,A LD B,0x00 LDIR SUB A ILDel1 LD (DE),A DEC (IX+0x02) DEC (IX+0x04) JP PrintInpLn ; Delete Char in Current Position IL_del_ BIT 7,(IX+0x01) ; ready CALL NZ,ClearInpLn PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX+0x02) ADD HL,DE INC HL LD E,L LD D,H DEC DE LD A,(IX+0x04) SUB (IX+0x02) RET Z LD C,A LD B,0x00 LDIR SUB A LD (DE),A DEC (IX+0x04) JP PrintInpLn ; Home ILhome RES 7,(IX+0x01) LD A,(IX+0x02) OR A RET Z SUB A LD (IX+0x02),A JP PrintInpLn ; End string ILend RES 7,(IX+0x01) LD A,(IX+0x04) CP (IX+0x02) RET Z LD (IX+0x02),A JP PrintInpLn ; Word right ILwordR RES 7,(IX+0x01) LD A,(IX+0x04) SUB (IX+0x02) RET Z LD B,A PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX+0x02) ADD HL,DE LD C,E .L2 LD A,(HL) CP ' ' JR Z,.L3 CP ',' JR Z,.L3 CP '.' JR Z,.L3 CP '\\' JR Z,.L3 INC HL INC C DJNZ .L2 JR .L4 .L3 LD A,(HL) CP ' ' JR Z,.L1 CP ',' JR Z,.L1 CP '.' JR Z,.L1 CP '\\' JR NZ,.L4 .L1 INC HL INC C DJNZ .L3 .L4 LD (IX+0x02),C JP PrintInpLn ; Word left ILwordL RES 7,(IX+0x01) LD A,(IX+0x02) OR A RET Z LD B,A LD C,B PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,C ADD HL,DE .L3 DEC HL DEC C LD A,(HL) CP ' ' JR Z,.L2 CP ',' JR Z,.L2 CP '.' JR Z,.L2 CP 0x5C JR Z,.L2 DJNZ .L3 JR .L5 .L2 LD A,(HL) CP ' ' JR Z,.L1 CP ',' JR Z,.L1 CP '.' JR Z,.L1 CP '\\' JR NZ,.L4 .L1 DEC HL DEC C DJNZ .L2 .L4 INC C .L5 LD (IX+0x02),C JP PrintInpLn ; Delete word ILdelWR RES 7,(IX+0x01) LD A,(IX+0x02) OR A RET Z LD B,A LD C,B PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,C ADD HL,DE LD A,(IX+0x04) SUB B LD E,A PUSH HL DEC HL DEC C LD A,(HL) CP ' ' JR Z,.L4 CP ',' JR Z,.L4 CP '.' JR Z,.L4 CP '\\' JR Z,.L4 DEC B JR Z,.L6 .L3 DEC HL DEC C LD A,(HL) CP ' ' JR Z,.L2 CP ',' JR Z,.L2 CP '.' JR Z,.L2 CP '\\' JR Z,.L2 DJNZ .L3 JR .L6 .L4 LD A,(HL) CP ' ' JR Z,.L1 CP ',' JR Z,.L1 CP '.' JR Z,.L1 CP '\\' JR NZ,.L2 .L1 DEC HL DEC C DJNZ .L4 .L2 INC HL INC C .L6 LD A,(IX+0x02) LD (IX+0x02),C SUB C LD C,A EX AF,AF' LD A,(IX+0x04) SUB C LD (IX+0x04),A LD C,E LD B,0x00 EX DE,HL POP HL LD A,C OR A JR Z,.L7 LDIR .L7 EX DE,HL EX AF,AF' LD B,A SUB A .L5 LD (HL),A INC HL DJNZ .L5 JP PrintInpLn ;[]----------------------------------------------------------[] InsInpLnCol LD L,(IX+0x07) LD H,(IX+0x08) LD (FillILy),HL LD A,(IX+0x0B) AND 0x0F ; INK LD C,A RLCA RLCA RLCA RLCA OR C LD HL,PrnINKl ; INK буфер LD B,0x08 CPL .L1 LD (HL),A INC HL DJNZ .L1 LD B,A LD A,(IX+0x0B) AND 0xF0 ; PAPER LD C,A RRCA RRCA RRCA RRCA LD (FillILc),A OR C XOR B LD HL,PrnPAPl ; PAPER буфер LD B,0x08 .L2 LD (HL),A INC HL DJNZ .L2 RET PrintInpLn CALL ResCursor .L1 LD A,(IX+0x02) SUB (IX+0x03) JR NC,PrnInpLn1 LD A,(IX+0x03) SUB Step LD (IX+0x03),A JR PrintInpLn.L1 PrnInpLn1 PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX+0x03) ADD HL,DE OR A CALL NZ,TstInpLnLen ; На вход: HL-начало вывода ; А -кол.симв.до курсора PUSH IY PUSH IX LD A,(IX+0x07) LD IYL,A ; Y координата LD A,(IX+0x04) LD IYH,A GETPORT WINSP.Y_PORT ; Сохраняем Y порт PUSH AF EXX LD HL,PrnPAPl LD DE,PrnINKl LD C,(IX+0x05) LD B,(IX+0x06) SRL B RR C SET 6,B EXX LD C,(IX+0x09) LD B,(IX+0x0A) SRL B RR C LD IXL,C LD C,L ; Адрес строки LD B,H GETPORT WINSP.CPU1 LD IXH,A DI GETPORT WINSP.CPU0 PUSH AF LD A,(RAMPAGES.FNFONT) SETPORT WINSP.CPU0,,0 ACCEL ACCELCMD.SET_BUFFER LD A,0x08 ACCEL ACCELCMD.OFF LD A,IYH OR A JR Z,PrnInpE LD A,(BC) INC BC PInpLnP LD L,A LD H,HIGH (FONT_RAW)-0xC0 PUSH BC LD B,(HL) ; длина символа INC H LD E,(HL) INC H LD D,(HL) LD HL,0x0008 EX DE,HL SETPORT WINSP.CPU1,0x50 PrnLoopInp ACCEL ACCELCMD.COPY LD A,(HL) ACCEL ACCELCMD.OFF EXX LD A,IYL SETPORT WINSP.Y_PORT,,0 ACCEL ACCELCMD.COPY OR (HL) EX DE,HL XOR (HL) ACCEL ACCELCMD.COPY_VERT LD (BC),A ACCEL ACCELCMD.OFF EX DE,HL INC BC EXX ADD HL,DE DEC IXL JR Z,.L1 DJNZ PrnLoopInp .L1 POP BC LD A,IXH SETPORT WINSP.CPU1,,0 LD A,IXL OR A JR Z,PrnInpE DEC IYH JR Z,PrnInpE LD A,(BC) INC BC OR A JR NZ,PInpLnP PrnInpE POP AF SETPORT WINSP.CPU0,,0 EI POP AF SETPORT WINSP.Y_PORT,,0 LD A,IXL OR A JR Z,PrnInE1 LD L,A LD H,0x00 ADD HL,HL LD (FillILl),HL EXX PUSH BC EXX POP HL RES 6,H ADD HL,HL LD (FillILx),HL MAKEWINDOW WINSUBOBJ.WOBIND W_FILL 0x0000,0x0000,0x0000,8,0x00 W_END FillILx EQU $-10 FillILy EQU $-8 FillILl EQU $-6 FillILc EQU $-2 PrnInE1 POP IX POP IY JP SetCursor PrnINKl DB 8 DUP 0 PrnPAPl DB 8 DUP 0 TstInpLnLen PUSH IY LD IYL,A LD IYH,A DI GETPORT WINSP.CPU0 PUSH AF LD A,(RAMPAGES.FNFONT) SETPORT WINSP.CPU0,,0 LD D,HIGH (FONT_RAW)-0xC0 TstInpLn PUSH HL LD BC,0x0000 TstInpL LD E,(HL) INC HL LD A,(DE) ADD A,A ADD A,C LD C,A LD A,B ADC A,0x00 LD B,A DEC IYL JR NZ,TstInpL LD L,(IX+0x09) LD H,(IX+0x0A) OR A SBC HL,BC JR NC,TstInpE POP HL LD BC,Step ADD HL,BC LD A,(IX+0x03) ADD A,C LD (IX+0x03),A LD A,IYH SUB C LD IYH,A LD IYL,A JR TstInpLn TstInpE POP HL POP AF SETPORT WINSP.CPU0,,0 EI POP IY RET SetCursor PUSH IX POP HL LD DE,LenInpData ADD HL,DE LD E,(IX+0x03) ADD HL,DE LD BC,0x0000 LD A,(IX+0x02) SUB E JR Z,StCurs1 EX AF,AF' DI GETPORT WINSP.CPU0 PUSH AF LD A,(RAMPAGES.FNFONT) SETPORT WINSP.CPU0,,0 LD D,HIGH (FONT_RAW)-0xC0 EX AF,AF' StCurs0 EX AF,AF' LD E,(HL) INC HL LD A,(DE) ADD A,A ADD A,C LD C,A LD A,B ADC A,0x00 LD B,A EX AF,AF' DEC A JR NZ,StCurs0 POP AF SETPORT WINSP.CPU0,,0 EI StCurs1 LD (CurShiftX),BC LD A,0x01 LD (CurCursor),A LD A,CursTimer LD (CrTimer),A SetCr LD L,(IX+0x05) LD H,(IX+0x06) LD BC,(CurShiftX) ADD HL,BC SRL H RR L SET 6,H GETPORT WINSP.CPU1 LD C,A GETPORT WINSP.Y_PORT LD B,A PUSH BC LD DE,CursBuffer LD C,(IX+0x07) DEC C LD A,(IX+0x0B) AND 0x0F LD B,A RLCA RLCA RLCA RLCA OR B LD B,A SETPORT WINSP.CPU1,0x50 DI LD A,C SETPORT WINSP.Y_PORT,,0 ACCEL ACCELCMD.SET_BUFFER LD A,0x09 ACCEL ACCELCMD.COPY_VERT LD A,(HL) ACCEL ACCELCMD.COPY LD (DE),A ACCEL ACCELCMD.OFF LD A,C SETPORT WINSP.Y_PORT,,0 ACCEL ACCELCMD.FILL_VERT LD (HL),B ACCEL ACCELCMD.OFF EI POP BC LD A,B SETPORT WINSP.Y_PORT,,0 LD A,C SETPORT WINSP.CPU1,,0 RET ResCursor LD L,(IX+0x05) LD H,(IX+0x06) LD BC,(CurShiftX) ADD HL,BC SRL H RR L SET 6,H GETPORT WINSP.CPU1 LD C,A GETPORT WINSP.Y_PORT LD B,A PUSH BC LD DE,CursBuffer LD B,(IX+0x07) DEC B LD C,WINSP.Y_PORT SETPORT WINSP.CPU1,0x50 DI ACCEL ACCELCMD.SET_BUFFER LD A,0x09 ACCEL ACCELCMD.COPY LD A,(DE) OUT (C),B ACCEL ACCELCMD.COPY_VERT LD (HL),A ACCEL ACCELCMD.OFF EI POP BC LD A,B SETPORT WINSP.Y_PORT,,0 LD A,C SETPORT WINSP.CPU1,,0 RET ChCursor LD HL,CrTimer DEC (HL) RET NZ LD (HL),CursTimer LD IX,(InpLnData) LD A,(CurCursor) XOR 0x01 LD (CurCursor),A JR Z,ResCursor JP SetCr CurShiftX DEFW 0x00 CrTimer DEFB 0x00 CurCursor DEFB 0x00 CursBuffer DB 9 DUP 0