[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]

    {
    > Could someone send me a fast line drawing source?
    }

    Procedure Line(X1,Y1,X2,Y2:Word; Color:Byte); Assembler;

    Var DeX,DeY  : Integer;
        IncF     : Integer;
        Offset   : Word;

    Asm
        Mov  AX,[X2]
        Sub  AX,[X1]
        JNC  @@Dont1
        Neg  AX
      @@Dont1:
        Mov  [DeX],AX
        Mov  AX,[Y2]
        Sub  AX,[Y1]
        JNC  @@Dont2
        Neg  AX
      @@Dont2:
        Mov  [DeY],AX

        Cmp  AX,[DeX]
        JBE  @@OtherLine

        Mov  AX,[Y1]
        Cmp  AX,[Y2]
        JBE  @@DontSwap1
        Mov  BX,[Y2]
        Mov  [Y1],BX
        Mov  [Y2],AX
        Mov  AX,[X1]
        Mov  BX,[X2]
        Mov  [X1],BX
        Mov  [X2],AX
      @@DontSwap1:
        Mov  [IncF],1
        Mov  AX,[X1]
        Cmp  AX,[X2]
        JBE  @@SkipNegate1
        Neg  [IncF]
      @@SkipNegate1:
        Mov  AX,[Y1]
        Mov  BX,320
        Mul  BX
        Mov  DI,AX
        Add  DI,[X1]        {Offset in DI}
        Mov  BX,[DeY]       {RefVar in BX}
        Mov  CX,BX
        Mov  AX,$A000
        Mov  ES,AX          {Video segment}
        Mov  DL,[Color]
        Mov  SI,[DeX]
      @@DrawLoop1:
        Mov  ES:[DI],DL
        Add  DI,320
        Sub  BX,SI
        JNC  @@GoOn1
        Add  BX,[DeY]
        Add  DI,[IncF]
      @@GoOn1:
        Loop @@DrawLoop1
        Jmp  @@ExitLine

      @@OtherLine:
        Mov  AX,[X1]
        Cmp  AX,[X2]
        JBE  @@DontSwap2
        Mov  BX,[X2]
        Mov  [X1],BX
        Mov  [X2],AX
        Mov  AX,[Y1]
        Mov  BX,[Y2]
        Mov  [Y1],BX
        Mov  [Y2],AX
      @@DontSwap2:
        Mov  [IncF],320
        Mov  AX,[Y1]
        Cmp  AX,[Y2]
        JBE  @@SkipNegate2
        Neg  [IncF]
      @@SkipNegate2:
        Mov  AX,[Y1]
        Mov  BX,320
        Mul  BX
        Mov  DI,AX
        Add  DI,[X1]        {Offset in DI}
        Mov  BX,[DeX]       {RefVar in BX}
        Mov  CX,BX
        Mov  AX,$A000
        Mov  ES,AX          {Video segment}
        Mov  DL,[Color]
        Mov  SI,[DeY]
      @@DrawLoop2:
        Mov  ES:[DI],DL
        Inc  DI
        Sub  BX,SI
        JNC  @@GoOn2
        Add  BX,[DeX]
        Add  DI,[IncF]
      @@GoOn2:
        Loop @@DrawLoop2

      @@ExitLine:
    End;

    {
    It assumes video-mode 13h. It's hardly commented, but hey! It works, so....
    Some test-results:

    On my 286-12Mhz the routine draws: 1300 random lines per second.
                                       650  lines from (0,0)-(319,199) per second.
    }

[Back to EGAVGA SWAG index] [Back to Main SWAG index] [Original]