home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 March / pcx08_9703.iso / melyviz / pcx-user / t&t / charedit / charedit.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-12-13  |  8.2 KB  |  294 lines

  1. (**************************************************************************)
  2. (**                                                                      **)
  3. (**                                                                      **)
  4. (**                               László József                          **)
  5. (**                                                                      **)
  6. (**                        A VGA kártya  programozása                    **)
  7. (**                        Pascal és Assembly nyelven                    **)
  8. (**                                                                      **)
  9. (**                         c. könyv lemezmelléklete                     **)
  10. (**                                                                      **)
  11. (**                                                                      **)
  12. (**       Karakterkészlet szerkesztö program. ( 8x16-os készlet )        **)
  13. (**                                                                      **)
  14. (**************************************************************************)
  15.               {A szerzôi jogok László József tulajdonát képezik !}
  16.  
  17. {$DEFINE SeqRESET}
  18. uses Crt;
  19.  
  20. type
  21.   ChrData = Array[0..4095] of Byte;
  22.  
  23. var
  24.   i, j, k, l: Integer;
  25.   cx, cy    : Byte;
  26.   px, py    : Byte;
  27.   C         : Char;
  28.   Charset   : ChrData;
  29.   F         : File of ChrData;
  30.   E_Buff    : Array[0..15] of Byte;
  31.   From, Count, m, d: Byte;
  32.  
  33. const
  34.    FName   = 'char8x16.dat';
  35.    Bits    : Array[0..7] of byte=(128,64,32,16,8,4,2,1);
  36.    Helptxt : Array[0..11] of string[20]=(
  37.                'F1 - Lehívás        ',
  38.                'F2 - Definiálás     ',
  39.                'Up - Kurzor fel     ',
  40.                'Dn - Kurzor le      ',
  41.                'Lf - Kurzor balra   ',
  42.                'Rg - Kurzor jobbra  ',
  43.                'Shift+Crsr: Karakter',
  44.                'PgUp - 8 pixeles mód',
  45.                'PgDn - 9 pixeles mód',
  46.                'Delete - mezô törlés',
  47.                'SPACE - Pont ki/be  ',
  48.                'ESC - Ment és kilép ');
  49.  
  50. function Shift: Boolean;        { A Shift gombok állapotát kérdezi le }
  51. begin
  52.   Shift:=Mem[$0000:$0417] and 3 <> 0;
  53. end;
  54.  
  55. procedure CharLoad;            { Betölti a CHAR8x16.DAT karakterkészletet }
  56. begin
  57.   Assign(F, FName);
  58.   Reset(F);
  59.   Read(F, Charset);
  60.   Close(F);
  61. end;
  62.  
  63. procedure CharSave;            { Kimenti a CHAR8x16.DAT karakterkészletet }
  64. begin
  65.   Assign(F, Fname);
  66.   Rewrite(F);
  67.   Write(F, Charset);
  68.   Close(F);
  69. end;
  70.  
  71.                         { Egy vagy több karakter bedefiniálása a készletbe }
  72. procedure CharOn(Adr: Pointer; Num, Off: Word); Assembler;
  73. asm
  74.   push bp
  75.   push es
  76.   mov  ax, 1100h
  77.   mov  cx, Num
  78.   mov  dx, Off
  79.   mov  bx, 1000h
  80.   les  bp, adr
  81.   int  10h
  82.   pop  es
  83.   pop  bp
  84. end;
  85.                       { A C kódú Z színü karakter kiírása az X,Y pozícióba }
  86. procedure PrintXY(X, Y, C, Z: Byte); Assembler;
  87. asm
  88.   push es
  89.   mov  ax, 0B800h
  90.   mov  es, ax
  91.   mov  al, Y
  92.   mov  ah, 160
  93.   mul  ah
  94.   mov  dl, X
  95.   xor  dh, dh
  96.   shl  dx, 1
  97.   add  ax, dx
  98.   mov  di, ax
  99.   mov  al, C
  100.   mov  ah, Z
  101.   stosw
  102.   pop  es
  103. end;
  104.                     { A villogás kikapcsolása, 16 háttérszín engedélyezése }
  105. procedure Disable_Blink; Assembler;
  106. asm
  107.   mov  dx, 03DAh
  108.   in   al, dx
  109.   mov  dx, 03C0h
  110.   mov  al, 10h
  111.   out  dx, al
  112.   mov  al, 04h
  113.   out  dx, al
  114.   mov  al, 20h
  115.   out  dx, al
  116. end;
  117.                             { A 8 pixel széles karakteres mód bekapcsolása }
  118. procedure Box8; Assembler;
  119. asm
  120.   mov  al, 063h
  121.   mov  dx, 03C2h
  122.   out  dx, al
  123.   mov  dx, 03C4h
  124. {$IFDEF SeqRESET}
  125.   mov  ax, 0100h
  126.   out  dx, ax
  127. {$ENDIF}
  128.   mov  ax, 0101h
  129.   out  dx, ax
  130. {$IFDEF SeqRESET}
  131.   mov  ax, 0300h
  132.   out  dx, ax
  133. {$ENDIF}
  134.   mov  dx, 3DAh
  135.   in   al, dx
  136.   mov  dx, 3C0h
  137.   mov  al, 13h
  138.   out  dx, al
  139.   xor  al, al
  140.   out  dx, ax
  141.   mov  al, 20h
  142.   out  dx, al
  143. end;
  144.                             { A 9 pixel széles karakteres mód bekapcsolása }
  145. procedure Box9; Assembler;
  146. asm
  147.   mov  al, 067h
  148.   mov  dx, 03C2h
  149.   out  dx, al
  150.   mov  dx, 03C4h
  151. {$IFDEF SeqRESET}
  152.   mov  ax, 0100h
  153.   out  dx, ax
  154. {$ENDIF}
  155.   mov  ax, 0001h
  156.   out  dx, ax
  157. {$IFDEF SeqRESET}
  158.   mov  ax, 0300h
  159.   out  dx, ax
  160. {$ENDIF}
  161.   mov  dx, 3DAh
  162.   in   al, dx
  163.   mov  dx, 3C0h
  164.   mov  al, 13h
  165.   out  dx, al
  166.   mov  al, 8
  167.   out  dx, ax
  168.   mov  al, 20h
  169.   out  dx, al
  170. end;
  171.                               { A karakterkészlet kurzorának megjelenítése }
  172. procedure CharCursor(dX, dY: Shortint);
  173. begin
  174.   Mem[$B800 : cX*2+cY*160+1]:=$0E;
  175.   Inc(cX, dX); cX:=cX and 31;
  176.   Inc(cY, dY); cY:=cY and  7;
  177.   Mem[$B800 : cX*2+cY*160+1]:=$FC;
  178. end;
  179.                                { A szerkesztömezö kurzorának megjelenítése }
  180. procedure PixelCursor(dX, dY: Shortint);
  181. begin
  182.   if Shift 
  183.   then CharCursor(dX, dY)
  184.   else begin
  185.          Mem[$B800 : 410+px*4+py*160+1]:=$91;
  186.          Mem[$B800 : 410+px*4+py*160+3]:=$91;
  187.          Inc(pX,dX); pX:=pX and  7;
  188.          Inc(pY,dY); pY:=pY and 15;
  189.          Mem[$B800 : 410+px*4+py*160+1]:=$BC;
  190.          Mem[$B800 : 410+px*4+py*160+3]:=$BC;
  191.        end;
  192. end;
  193.                    { Egy karakter lehívása a készletböl a szerkesztömezöbe }
  194. procedure GetChar;
  195. begin
  196.   l:=(cY*32+cX) shl 4;
  197.   for i:=0 to 15 do
  198.   begin
  199.     E_Buff[i]:=Charset[l+i];
  200.     for j:=0 to 7 do
  201.     begin
  202.       if Charset[l+i] and Bits[j]=bits[j] then k:=$DB 
  203.                                           else k:=$20;
  204.       Mem[$B800 : 410+j*4+i*160]:=k;
  205.       Mem[$B800 : 410+j*4+i*160+2]:=k;
  206.     end;
  207.   end;
  208. end;
  209.                     { Egy karakter beírása a készletbe a szerkesztömezöböl }
  210. procedure PutChar;
  211. begin
  212.   l:=(cY*32+cX) shl 4;
  213.   for i:=0 to 15 do Charset[l+i]:=E_Buff[i];
  214.     CharOn(Addr(Charset[l]),1,cY*32+cX);
  215. end;
  216.                          { Egy pixel ki/be kapcsolása a szerekesztömezöben }
  217. procedure PutPixel;
  218. begin
  219.   Mem[$B800 : 410+px*4+py*160]:=Mem[$B800 : 410+px*4+py*160] xor $FB;
  220.   Mem[$B800 : 410+px*4+py*160+2]:=Mem[$B800 : 410+px*4+py*160+2] xor $FB;
  221.   E_Buff[py]:=E_Buff[py] xor Bits[px];
  222. end;
  223.                                                 { A szerkesztömezö törlése }
  224. procedure ClearChar;
  225. begin
  226.   for i:=0 to 15 do
  227.   begin
  228.     E_Buff[i]:=0;
  229.     for j:=0 to 7 do
  230.     begin
  231.       k:=$20;
  232.       Mem[$B800 : 410+j*4+i*160]:=k;
  233.       Mem[$B800 : 410+j*4+i*160+2]:=k;
  234.     end;
  235.   end;
  236. end;
  237.  
  238. BEGIN
  239.  
  240.   Textmode(c80);                 { A 80x25-ös mód bekapcsolása              }
  241.   Disable_Blink;                 { A villogás kikapcsolása                  }
  242.   CharLoad;                      { A készlet betöltése a memóriába          }
  243.   CharOn(Addr(Charset), 256, 0); { A készlet bekapcsolása                   }
  244.  
  245.   Textattr:=10;
  246.   for i:=0 to 11 do              { A HELP szöveg kiírása a képre            }
  247.   begin
  248.     GotoXY(5, 14+i);
  249.     Writeln(Helptxt[i]);
  250.   end;
  251.  
  252.   PrintXY(79, 24, 0, 0);         { Ez a két utasítás a kurzort eltünteti     }
  253.   GotoXY(80, 25);
  254.  
  255.   for i:=0 to 7 do
  256.     for j:=0 to 31 do
  257.       PrintXY(J, I, I*32+j, $0E);   { A készlet kiírása a képre                 }
  258.  
  259.   for i:=0 to 15 do             { A szerkesztömezö megjelenítése             }
  260.    for j:=0 to 15 do
  261.       PrintXY(45+I, J+2, 32, $91);
  262.  
  263.   pX:=0; pY:=0; cX:=0; cY:=0;
  264.   PixelCursor(0, 0);            { A kurzorok bekapcsolása                    }
  265.   CharCursor(0, 0);
  266.  
  267.   { Program föciklus: Az ESC leütésekor lép ki ebböl                         }
  268.   repeat
  269.     C:=UpCase(Readkey);          { Vár egy gombnyomást                       }
  270.     case C of
  271.       #0:
  272.       begin
  273.         C:=Readkey;
  274.         case C of
  275.           #75: PixelCursor(-1,0);  { Balra  }
  276.           #77: PixelCursor(+1,0);  { Jobbra }
  277.           #72: PixelCursor(0,-1);  { Fel    }
  278.           #80: PixelCursor(0,+1);  { Le     }
  279.           #73: Box8;               { PageUp }
  280.           #81: Box9;               { PageDn }
  281.           #59: GetChar;            { F1     }
  282.           #60: PutChar;            { F2     }
  283.           #83: ClearChar;          { Delete }
  284.         end;
  285.       end;
  286.       #32: Putpixel;               { Space  }
  287.     end;
  288.   until C = #27;                   { Az ESC billentyüre kilép                }
  289.   
  290.   Textattr:=7;
  291.   ClrScr;
  292.   CharSave;  
  293.   Write('Bye !');                  { Kilépés                                 }
  294. END.