home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / TEXTVEC.ZIP / TEXTRIX.INC < prev    next >
Encoding:
Text File  |  1995-11-12  |  9.2 KB  |  430 lines

  1. { Tricks used with textmode }
  2.  
  3. Type
  4.   CharType = Array[0..15] of Byte;
  5.   CharSetType = Array[0..255] of CharType;
  6.   TwoCharSet = Array[0..511] of CharType;
  7.  
  8. Const
  9.   ColorLookup : Array[0..14] of Byte = (0, 1, 2, 3, 4, 20, 6, 56, 57,
  10.                                         58, 59, 60, 61, 62, 63);
  11.   CharOffsets : Array[0..7] of Word = ($0000, $4000, $8000, $C000,
  12.                                        $2000, $6000, $A000, $E000);
  13.  
  14. Var
  15.   CharSet : TwoCharSet;
  16.   OldCharSet : CharSetType;
  17.   Buffer : Array[0..160*25] of Byte;
  18.  
  19. Procedure VSync; Assembler;
  20. { wait for vertical retrace, including thr entire retrace}
  21.  
  22. Asm
  23.   Mov  dx,$3da
  24.  @NotVSync:
  25.   In   al,dx
  26.   And  al,8
  27.   Jz  @NotVSync
  28.  @VSync:
  29.   In   al,dx
  30.   And  al,8
  31.   Jnz @VSync
  32. End;
  33.  
  34. Procedure Copy386(Var Source, Dest; Amnt : Word); Assembler;
  35. { dword copy }
  36.  
  37. Asm
  38.   Push  ds
  39.   Lds   si,Source
  40.   Les   di,Dest
  41.   Mov   cx,Amnt
  42.   Shr   cx,2
  43.   db 66h; Rep Movsw
  44.   Pop   ds
  45. End;
  46.  
  47. Procedure SelectCharMap(Map0, Map1 : Byte);
  48. { Map0 - attribute bit 3 is clear }
  49. { Map1 - attribute bit 3 is set   }
  50.  
  51.  
  52. Begin
  53.   PortW[$3c4] := $03 + ((Map0 And 3) + ((Map0 And 4) Shl 2) +
  54.                 ((Map1 And 3) Shl 2 + (Map1 and 4) Shl 3)) Shl 8;
  55. End;
  56.  
  57. Procedure SetCharWidth(Width : Byte);
  58. { Sets the character width. Either 8-bit or 9-bit }
  59. { in: Width - either 8 or 9. 9 is standsrd VGA    }
  60.  
  61. Var
  62.   Temp : Word;
  63.   x : Word;
  64.  
  65. Begin
  66.   If Width = 8
  67.     Then Temp := $0001
  68.     Else Temp := $0800;
  69.   x := Port[$3cc] And $F3;
  70.   If Width = 9
  71.     Then x := x Or 4;
  72.   Port[$3c2] := x;
  73.   Inline($Fa);  { Cli }
  74.   PortW[$3c4] := $0100;
  75.   PortW[$3c4] := $01 + Temp Shl 8;
  76.   PortW[$3c4] := $0300;
  77.   Inline($Fb);  { Sti }
  78.   Asm
  79.     Mov  ax,$1000
  80.     Mov  bx,Temp
  81.     Mov  bl,$13
  82.     Int  $10
  83.   End;
  84. End;
  85.  
  86. Procedure PutPixel(X, Y : Integer);
  87. { puts a pixel }
  88.  
  89. Var
  90.   Clx, Cly : Integer;
  91.   Slx, Sly : Integer;
  92.   Index : Integer;
  93.   Temp : Integer;
  94.  
  95. Begin
  96.   Slx := X Shr 3;               { Position on text screen  }
  97.   Sly := Y Shr 4;               { Y char                   }
  98.   Clx := 7 - (X And $07);       { Position in character    }
  99.   Cly := Y And $0F;             { Y Position in Character  }
  100.   Temp := (Slx Shl 1)+Sly*160;      { Temporary index variable }
  101.   If Buffer[Temp] = 0
  102.     Then Begin
  103.       CharCount := CharCount + 1;
  104.       Buffer[Temp] := CharCount;
  105.       If CharCount > 255
  106.         Then Buffer[Temp+1] := $0B
  107.         Else Buffer[Temp+1] := $03;
  108.       Index := CharCount;
  109.     End
  110.     Else Index := Buffer[Temp];
  111.   CharSet[Index][Cly] := CharSet[Index][Cly] Or (1 Shl Clx);
  112. End;
  113.  
  114. Procedure Set400Textmode;
  115. { sets 400 scanline 80x25 textmode }
  116.  
  117. Begin
  118.   Asm
  119.     Mov  ax,3                      { Set Regular 80x25 text mode }
  120.     Int  10h
  121.   End;
  122.   Port[$3c2] := (Port[$3cc] And 63) or 64;   { Set 400 line mode }
  123. End;
  124.  
  125. Procedure SetCharSet(Var CSet1, CSet2; Which1, Which2 : Integer); Assembler;
  126. { sets the characters sets directly in memory }
  127.  
  128. Asm
  129.   Mov  dx,$03c4
  130.   Mov  ax,$0402;  Out  dx,ax    { Access bit plane 2                  }
  131.   Mov  ax,$0704;  Out  dx,ax    { Restrict access to bit plane 2 only }
  132.   Mov  dx,$03ce
  133.   Mov  ax,$0204;  Out  dx,ax
  134.   Mov  ax,$0005;  Out  dx,ax
  135.   Mov  ax,$0006;  Out  dx,ax
  136.  
  137. { First Char Set }
  138.  
  139.   Push ds
  140.  
  141.   Mov  bx,Which1
  142.   Shl  bx,1
  143.   Mov  bx,Word Ptr [CharOffsets+bx]
  144.  
  145.   Lds  si,CSet1
  146.   Mov  ax,$A000
  147.   Mov  es,ax
  148.   Mov  dx,0
  149.  
  150.  @Looper1:
  151.   Mov  di,dx
  152.   Shl  di,5
  153.   Add  di,bx
  154.   Mov  cx,4
  155.   db 66h; Rep  Movsw   { Rep Movsd }
  156.   Inc  dx
  157.   Cmp  dx,256
  158.   Jnz  @Looper1
  159.  
  160.   Pop  ds
  161.   Push ds
  162.   Mov  bx,Which2
  163.   Shl  bx,1
  164.   Mov  bx,Word Ptr [CharOffsets+bx]
  165.  
  166. { Second CharSet }
  167.   Lds  si,CSet2
  168.   Mov  dx,0
  169.  @Looper2:
  170.   Mov  di,dx
  171.   Shl  di,5
  172.   Add  di,bx
  173.   Mov  cx,4
  174.   db 66h; Rep  Movsw   { Rep Movsd }
  175.   Inc  dx
  176.   Cmp  dx,256
  177.   Jnz  @Looper2
  178.   Pop  ds
  179.  
  180.   Mov  dx,$03c4
  181.   Mov  ax,$0302;  Out  dx,ax
  182.   Mov  ax,$0304;  Out  dx,ax
  183.   Mov  dx,$03ce
  184.   Mov  ax,$0004;  Out  dx,ax
  185.   Mov  ax,$1005;  Out  dx,ax
  186.   Mov  ax,$0e06;  Out  dx,ax
  187. End;
  188.  
  189. Procedure SaveOldCharSet;
  190. { saves the origional character set to be restored when done }
  191.  
  192. Var
  193.   X : Integer;
  194.  
  195. Begin
  196.   InLine($fa);   { CLI }
  197.   PortW[$03c4]:=$0402;
  198.   PortW[$03c4]:=$0704;
  199.   PortW[$03ce]:=$0204;
  200.   PortW[$03ce]:=$0005;
  201.   PortW[$03ce]:=$0006;
  202.   For x := 0 to 255 do
  203.     Move(Mem[$A000:x Shl 5], OldCharSet[x], 16);
  204.   PortW[$03c4]:=$0302;
  205.   PortW[$03c4]:=$0304;
  206.   PortW[$03ce]:=$0004;
  207.   PortW[$03ce]:=$1005;
  208.   PortW[$03ce]:=$0e06;
  209.   InLine($fb);   { STI }
  210. End;
  211.  
  212.  
  213. Procedure Line(X1, Y1, X2, Y2 : Integer; Var ScBuffer, CSet);
  214.  
  215. Var
  216.   XDiff, YDiff : Integer;
  217.   XUnit, YUnit : Integer;
  218.   XLoc, YLoc : Integer;
  219.   Count : Integer;
  220.   Error : Integer;
  221.   Slx, Sly : Integer;
  222.   Clx, Cly : Integer;
  223.   Index    : Integer;
  224.   Temp : Word;
  225.  
  226. Begin
  227.   YDiff := Y2 - Y1;
  228.   If YDiff < 0
  229.     Then Begin
  230.       YDiff := -YDiff;
  231.       YUnit := -1;
  232.     End
  233.     Else YUnit := 1;
  234.   XDiff := X2 - X1;
  235.   If XDiff < 0
  236.     Then Begin
  237.       XDiff := -XDiff;
  238.       XUnit := -1;
  239.     End
  240.     Else XUnit := 1;
  241.   Error := 0;
  242.   XLoc := X1;
  243.   YLoc := Y1;
  244.   If XDiff > YDiff
  245.     Then Begin
  246.      Asm
  247.        Mov  cx,XDiff
  248.             Inc  cx
  249.            @LineLooper:
  250.             Push cx
  251.  
  252.             Mov  ax,XLoc
  253.             Mov  bx,ax
  254.             Shr  ax,3
  255.             Mov  dx,ax
  256.             And  bx,7
  257.             Mov  cx,7
  258.             Sub  cx,bx
  259.             Mov  Clx,cx
  260.             Add  dx,dx
  261.  
  262.             Mov  ax,YLoc
  263.             Mov  bx,ax
  264.             Shr  ax,4
  265.             And  bx,$0f
  266.             Mov  Cly,bx
  267.             Mov  bx,ax
  268.             Shl  bx,7
  269.             Shl  ax,5
  270.             Add  dx,bx
  271.             Add  dx,ax
  272.  
  273.             Les  di,ScBuffer
  274.             Add  di,dx
  275.             Mov  al,es:[di]
  276.             Cmp  al,0
  277.             Jne @GetOldChar
  278.               Inc  Word Ptr [CharCount]
  279.               Mov  si,CharCount
  280.               Mov  dx,si
  281.               Mov  es:[di],dl
  282.               Mov  dl,03h
  283.               Cmp  si,255
  284.               Jle @Skip0B
  285.               Mov  dl,0bh
  286.              @Skip0b:
  287.               Mov  es:[di+1],dl
  288.               Jmp @StoreChar
  289.            @GetOldChar:
  290.               Xor  dh,dh
  291.               Mov  dl,es:[di]
  292.               Mov  al,es:[di+1]
  293.               Cmp  al,03h
  294.               Jle @SkipHiChar
  295.               Mov  dh,1
  296.              @SkipHiChar:
  297.               Mov  si,dx
  298.            @StoreChar:
  299.  
  300.             Les  di,CSet
  301.             Shl  si,4
  302.             Add  di,si
  303.             Add  di,Cly
  304.             Mov  cx,Clx
  305.             Mov  al,1
  306.             Shl  al,cl
  307.             Mov  bl,es:[di]
  308.             Or   bl,al
  309.             Mov  es:[di],bl
  310.  
  311.             Mov  ax,XLoc
  312.             Mov  bx,YLoc
  313.             Mov  cx,Error
  314.  
  315.             Add  ax,XUnit
  316.             Add  cx,YDiff
  317.             Cmp  cx,XDiff
  318.             Jle @StoreNewLocs
  319.             Sub  cx,XDiff
  320.             Add  bx,YUnit
  321.            @StoreNewLocs:
  322.             Mov  XLoc,ax
  323.             Mov  YLoc,bx
  324.             Mov  Error,cx
  325.  
  326.             Pop  cx
  327.             Dec  cx
  328.             Jnz @LineLooper
  329.         End;
  330.     End
  331.     Else Begin
  332.           Asm
  333.             Mov  ax,ss
  334.             Mov  es,ax
  335.             Mov  cx,YDiff
  336.             Inc  cx
  337.            @LineLooper:
  338.             Push cx
  339.  
  340.             Mov  ax,XLoc
  341.             Mov  bx,ax
  342.             Shr  ax,3
  343.             Mov  dx,ax
  344.             And  bx,7
  345.             Mov  cx,7
  346.             Sub  cx,bx
  347.             Mov  Clx,cx
  348.             Add  dx,dx
  349.  
  350.             Mov  ax,YLoc
  351.             Mov  bx,ax
  352.             Shr  ax,4
  353.             And  bx,$0f
  354.             Mov  Cly,bx
  355.             Mov  bx,ax
  356.             Shl  bx,7
  357.             Shl  ax,5
  358.             Add  dx,bx
  359.             Add  dx,ax
  360.  
  361.             Les  di,ScBuffer
  362.             Add  di,dx
  363.             Mov  al,es:[di]
  364.             Cmp  al,0
  365.             Jne @GetOldChar
  366.               Inc  Word Ptr [CharCount]
  367.               Mov  si,CharCount
  368.               Mov  dx,si
  369.               Mov  es:[di],dl
  370.               Mov  dl,03h
  371.               Cmp  si,255
  372.               Jle @Skip0B
  373.               Mov  dl,0bh
  374.              @Skip0b:
  375.               Mov  es:[di+1],dl
  376.               Jmp @StoreChar
  377.            @GetOldChar:
  378.               Xor  dh,dh
  379.               Mov  dl,es:[di]
  380.               Mov  al,es:[di+1]
  381.               Cmp  al,03h
  382.               Jle @SkipHiChar
  383.               Mov  dh,1
  384.              @SkipHiChar:
  385.               Mov  si,dx
  386.            @StoreChar:
  387.  
  388.             Les  di,CSet
  389.             Shl  si,4
  390.             Add  di,si
  391.             Add  di,Cly
  392.             Mov  cx,Clx
  393.             Mov  al,1
  394.             Shl  al,cl
  395.             Mov  bl,es:[di]
  396.             Or   bl,al
  397.             Mov  es:[di],bl
  398.  
  399.             Mov  ax,XLoc
  400.             Mov  bx,YLoc
  401.             Mov  cx,Error
  402.             Add  bx,YUnit
  403.             Add  cx,XDiff
  404.             Cmp  cx,0
  405.             Jle @JumpStore
  406.             Sub  cx,YDiff
  407.             Add  ax,XUnit
  408.            @JumpStore:
  409.             Mov  XLoc,ax
  410.             Mov  YLoc,bx
  411.             Mov  Error,cx
  412.  
  413.             Pop  cx
  414.             Dec  cx
  415.             Jnz  @LineLooper
  416.         End;
  417.     End;
  418. End;
  419.  
  420.  
  421. Procedure SetRGB(Color, R, G, B : Byte);
  422.  
  423. Begin
  424.   Port[$3c8] := ColorLookUp[Color];
  425.   Port[$3c9] := R;
  426.   Port[$3c9] := G;
  427.   Port[$3c9] := B;
  428. End;
  429.  
  430.