📄 helpscrn.pas
字号:
INC BX
JMP @@1
@@2: MOV [SI].MaxRow,BX
POP DS
end;
procedure THelpTopic.FindExample; assembler;
asm
PUSH DS
LDS SI,Self
MOV CX,[SI].TopicSize
LES DI,[SI].Buffer
MOV AL,5
SUB BX,BX
CLD
JCXZ @@1
REPNE SCASB
JNE @@1
INC BX
@@1: MOV [SI].HasExample,bl
POP DS
end;
procedure THelpTopic.Reset;
begin
BufPtr := Buffer;
CurRow := 0;
CurIndex := 0;
InExample := False;
end;
procedure THelpTopic.GoBack(Amount: Word);
begin
if CurRow <= Amount then
Reset
else
asm
PUSH DS
LDS SI,Self
LES DI,[SI].BufPtr
SUB AH,AH
SUB DX,DX
MOV BX,Amount
STD
INC BX
DEC DI
DEC DI
JMP @@7
@@1: MOV CX,0FFFFH
SUB AL,AL
REPNZ SCASB
NOT CX
PUSH DI
ADD DI,CX
DEC CX
JCXZ @@6
MOV AL,2
PUSH CX
PUSH DI
JMP @@3
@@2: INC DX
@@3: REPNE SCASB
JE @@2
MOV AL,5
POP DI
POP CX
JMP @@5
@@4: INC AH
@@5: REPNE SCASB
JE @@4
@@6: POP DI
@@7: DEC BX
JNZ @@1
AND AH,1
XOR [SI].InExample,AH
SHR DX,1
SUB [SI].CurIndex,DX
INC DI
INC DI
MOV [SI].BufPtr.Word[0],DI
MOV AX,Amount
SUB [SI].CurRow,AX
POP DS
CLD
end;
end;
procedure THelpTopic.GoForward(Amount: Word);
begin
if CurRow + Amount >= MaxRow then
Amount := MaxRow - CurRow - 1;
asm
PUSH DS
LDS SI,Self
LES DI,[SI].BufPtr
SUB AH,AH
SUB DX,DX
MOV BX,Amount
CLD
INC BX
JMP @@7
@@1: MOV CX,0FFFFH
SUB AL,AL
REPNZ SCASB
NOT CX
PUSH DI
SUB DI,CX
DEC CX
JCXZ @@6
MOV AL,2
PUSH CX
PUSH DI
JMP @@3
@@2: INC DX
@@3: REPNE SCASB
JE @@2
MOV AL,5
POP DI
POP CX
JMP @@5
@@4: INC AH
@@5: REPNE SCASB
JE @@4
@@6: POP DI
@@7: DEC BX
JNZ @@1
AND AH,1
XOR [SI].InExample,AH
SHR DX,1
ADD [SI].CurIndex,DX
MOV [SI].BufPtr.Word[0],DI
MOV AX,Amount
ADD [SI].CurRow,AX
POP DS
end;
end;
procedure THelpTopic.GoRow(Row: Word);
begin
if Row < CurRow then
if Row < CurRow shr 1 then
begin
Reset;
GoForward(Row)
end else
GoBack(CurRow - Row)
else if Row > CurRow then
GoForward(Row - CurRow);
end;
procedure THelpTopic.GetRow(Row: Word; var Text: PChar;var Index: Word;
var Example: Boolean);
begin
THelpScreen.GetRow(Row, Text, Index, Example);
if Row < MaxRow then
begin
GoRow(Row);
Text := BufPtr;
Index := CurIndex;
Example := InExample;
end;
end;
function THelpTopic.Format(Width: Word; var P; N: Word): Boolean; assembler;
var
SaveSP, IndexStart, Row: Word;
RowLen: byte;
NewMaxRow: Word;
HasControlChars: Boolean;
WordBuf: string[79];
WordLen: byte;
RowEnd: Word;
CurPosPtr: PPosArray;
TargetRow: Word;
TargetCol: Byte;
InKeyword: byte;
asm
PUSH DS
MOV SaveSP,SP
PUSH P.Word[2]
PUSH P.Word[0]
PUSH N
CALL SortPos
SUB AX,AX
MOV Row,AX
MOV NewMaxRow,AX
MOV HasControlChars,AL
SUB Width,1
LES AX,P
MOV CurPosPtr.Word[2],ES
SUB AX,4
MOV CurPosPtr.Word[0],AX
LDS SI,Self
LES DI,[SI].Buffer
MOV AX,DI
MOV CX,[SI].TopicSize
ADD AX,CX
DEC AX
ADD DI,[SI].BufSize
SUB DI,[SI].MaxIndex
SUB DI,[SI].MaxIndex
MOV IndexStart,DI
DEC DI
XCHG AX,SI
PUSH ES
POP DS
STD
REP MOVSB
CLD
XCHG SI,DI
INC SI
INC DI
CALL @@19
@@1: CMP SI,IndexStart
JAE @@30
@@2: MOV AL,[SI]
AND AL,AL
JZ @@3
CMP AL,' '
JNE @@6
@@3: CMP HasControlChars,0
JE @@4
CALL @@18
@@4: MOV AX,Row
CMP AX,TargetRow
JNE @@5
PUSH DS
PUSH SI
LDS SI,CurPosPtr
LDS SI,[SI]
MOV AX,NewMaxRow
MOV [SI].TPos.Row,AX
POP SI
POP DS
CALL @@19
JMP @@4
@@5: XCHG SI,DI
SUB AX,AX
MOV CX,0FFFFh
REPNZ SCASB
NOT CX
SUB DI,CX
XCHG SI,DI
REP MOVSB
INC NewMaxRow
JMP @@16
@@6: MOV RowLen,1
@@7: MOV AX,Row
CMP AX,TargetRow
JNE @@13
@@8: CMP BYTE PTR [SI],0
JE @@11
MOV AL,RowLen
CMP AL,1
JE @@9
CMP AL,TargetCol
JA @@11
@@9: CALL @@21
MOV AL,HasControlChars
AND AL,AL
JZ @@10
ADD AL,WordLen
CBW
CMP AX,Width
JBE @@10
CALL @@18
@@10: CALL @@28
JMP @@8
@@11: PUSH DS
PUSH SI
LDS SI,CurPosPtr
LDS SI,[SI]
MOV AX,NewMaxRow
MOV [SI].TPos.Row,AX
MOV AL,TargetCol
CMP AL,RowLen
JBE @@12
MOV RowLen,AL
@@12: MOV AL,HasControlChars
ADD AL,1
SUB AL,RowLen
ADD AL,TargetCol
MOV [SI].TPos.Col,AL
POP SI
POP DS
CALL @@19
JMP @@7
@@13: CMP BYTE PTR [SI],0
JE @@15
CALL @@21
MOV AL,HasControlChars
AND AL,AL
JZ @@14
ADD AL,WordLen
CBW
CMP AX,Width
JBE @@14
CALL @@18
@@14: CALL @@28
JMP @@13
@@15: INC SI
@@16: INC Row
JMP @@1
@@17: MOV SP,SaveSP
SUB AX,AX
JMP @@32
@@18: SUB AX,AX
STOSB
CMP DI,SI
JAE @@17
MOV HasControlChars,AL
INC NewMaxRow
RETN
@@19: MOV AX,N
AND AX,AX
MOV AX,-1
JZ @@20
DEC N
ADD CurPosPtr.Word[0],4
PUSH DS
PUSH SI
LDS SI,CurPosPtr
LDS SI,[SI]
MOV AL,[SI].TPos.Col
MOV TargetCol,AL
MOV AX,[SI].TPos.Row
POP SI
POP DS
@@20: MOV TargetRow,AX
RETN
@@21: PUSH ES
PUSH DI
SUB AX,AX
MOV WordLen,AL
MOV InKeyword,AL
MOV AX,SS
MOV ES,AX
LEA DI,WordBuf
@@22: MOV AL,[SI]
AND AL,AL
JZ @@25
CMP AL,' '
JNE @@23
TEST InKeyword,1
JZ @@26
@@23: INC SI
STOSB
CMP AL,7
JB @@24
INC WordLen
INC RowLen
JMP @@22
@@24: CMP AL,2
JNE @@22
XOR InKeyword,1
JMP @@22
@@25: MOV AL,' '
STOSB
INC RowLen
JMP @@27
@@26: MOV AL,' '
STOSB
INC SI
INC RowLen
CMP [SI],AL
JE @@26
@@27: MOV RowEnd,DI
POP DI
POP ES
RETN
@@28: PUSH DS
PUSH SI
MOV AX,SS
MOV DS,AX
LEA SI,WordBuf
MOV CX,RowEnd
SUB CX,SI
@@29: LODSB
STOSB
CMP AL,7
SBB HasControlChars,-1
LOOP @@29
POP SI
POP DS
RETN
@@30: CMP HasControlChars,0
JE @@31
CALL @@18
@@31: LDS SI,Self
SUB DI,[SI].Buffer.Word[0]
MOV [SI].TopicSize,DI
MOV AX,NewMaxRow
MOV [SI].MaxRow,AX
POP AX
PUSH DS
PUSH SI
MOV DS,AX
CALL Reset
PUSH DS
MOV AX,1
@@32: POP DS
end;
procedure THelpTopic.GetPos(Index: Word; var Row, Col: Integer; var Len: Word);
begin
if Index >= MaxIndex then
Index := MaxIndex - 1;
while (CurIndex <= Index) and (CurRow < MaxRow - 1) do
GoForward(1);
while CurIndex > Index do
GoBack(1);
Row := CurRow;
asm
PUSH DS
LDS SI,Self
MOV CX,Index
SUB CX,[SI].CurIndex
SHL CX,1
INC CX
LDS SI,[SI].BufPtr
MOV DX,1
@@1: LODSB
INC DX
CMP AL,7
JAE @@1
DEC DX
CMP AL,2
JNE @@1
LOOP @@1
@@2: LODSB
INC CX
CMP AL,2
JNE @@2
DEC CX
LDS SI,Col
MOV [SI],DX
LDS SI,Len
MOV [SI],CX
POP DS
end;
end;
function THelpTopic.GetIndex(var S: string; var Len: Word): Word; assembler;
asm
PUSH DS
LDS SI,Self
LES DI,[SI].Buffer
MOV CX,0FFFFh
MOV DX,[SI].MaxIndex
MOV AL,2
MOV DS,S.Word[2]
INC DX
CLD
@@1: DEC DX
JZ @@7
REPNE SCASB
JNZ @@7
MOV SI,S.Word[0]
MOV BH,[SI]
INC SI
SUB BL,BL
@@2: MOV AH,ES:[DI]
INC DI
INC BX
CMP AH,' '
JE @@2
DEC BX
INC BH
JMP @@5
@@3: CMP AH,'a'
JB @@4
CMP AH,'z'
JA @@4
AND AH,0DFH
@@4: CMP AH,[SI]
JNE @@6
INC SI
MOV AH,ES:[DI]
INC DI
INC BX
@@5: DEC BH
JNZ @@3
LDS SI,Self
MOV AX,[SI].MaxIndex
SUB AX,DX
LDS SI,Len
SUB BH,BH
MOV [SI],BX
JMP @@8
@@6: CMP AH,AL
JE @@1
REPNE SCASB
JZ @@1
@@7: MOV AX,0FFFEH
@@8: POP DS
end;
function THelpTopic.GetContext(Index: Word): Integer; assembler;
asm
PUSH DS
LDS SI,Self
MOV AX,[SI].MaxIndex
MOV BX,Index
CMP BX,AX
JB @@1
SUB AX,AX
JMP @@2
@@1: LES DI,[SI].Buffer
ADD DI,[SI].BufSize
SHL AX,1
SUB DI,AX
SHL BX,1
MOV AX,ES:[BX+DI]
@@2: POP DS
end;
procedure THelpTopic.FindPos(Ofs: Word; var P: TPos);
begin
if Ofs = $FFFF then
with P do
begin
Row := 0;
Col := 0
end else
asm
PUSH DS
STD
LDS SI,Self
LES DI,[SI].Buffer
MOV AX,Ofs
XCHG AX,DI
SUB AX,DI
NEG AX
XCHG AX,CX
SUB BX,BX
MOV DL,1
JCXZ @@3
@@1: DEC DI
MOV AL,ES:[DI]
CMP AL,7
SBB DL,-1
AND AL,AL
LOOPNZ @@1
JNZ @@3
INC CX
SUB AL,AL
@@2: JCXZ @@3
REPNZ SCASB
JNZ @@3
INC BX
JMP @@2
@@3: LDS SI,P
MOV [SI].TPos.Col,DL
MOV [SI].TPos.Row,BX
CLD
POP DS
end;
end;
function THelpTopic.FindChar(Num: Integer; C: Char): Word; assembler;
asm
PUSH DS
CLD
LDS SI,Self
LES DI,[SI].Buffer
MOV CX,[SI].TopicSize
MOV AL,C
MOV DX,Num
AND DX,DX
JZ @@2
@@1: JCXZ @@2
REPNE SCASB
JZ @@3
@@2: MOV AX,0FFFFH
JMP @@4
@@3: DEC DX
JNZ @@1
XCHG AX,DI
DEC AX
@@4: POP DS
end;
procedure THelpTopic.GetExample(var StartPos, EndPos: TPos);
begin
FindPos(FindChar(1, #5), StartPos);
FindPos(FindChar(2, #5), EndPos);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -