⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 helpscrn.pas

📁 Turbo Pascal 6.0编译器源码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
        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 + -