home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_GEN / TCYBER.ZIP / VGA.PAS < prev    next >
Pascal/Delphi Source File  |  1994-01-15  |  18KB  |  187 lines

  1. {
  2. Turbo Vision CyberTools 1.0
  3. (C) 1994 Steve Goldsmith
  4. All Rights Reserved
  5.  
  6. Color VGA low level access routines.  Check display type before using any
  7. VGA dependent routines!  If you don't know how to program the VGA display
  8. then be extra careful!  Some settings could harm your VGA display!
  9. }
  10.  
  11. UNIT VGA;{$I APP.INC}INTERFACE USES MEMORY;CONST VGAATTRINDEX=$03c0;VGAATTRDATA=$03c1;VGAATTRMODE=$10;
  12. VGAATTROVERSCAN=$11;VGAATTRCPENABLE=$12;VGAATTRHORZPELPAN=$13;VGAATTRCOLORSEL=$14;VGAMISCOUTWRITE=$03c2;
  13. VGASEQINDEX=$03c4;VGASEQRESET=$00;VGASEQCLOCKMODE=$01;VGASEQMAPMASK=$02;VGASEQCHRMAPSEL=$03;VGASEQMEMMODE=$04
  14. ;VGADACPELMASK=$03c6;VGADACREAD=$03c7;VGADACWRITE=$03c8;VGADACPELDATA=$03c9;VGAMISCOUTREAD=$03cc;
  15. VGAGRAPHINDEX=$03ce;VGAGRAPHRESET=$00;VGAGRAPHENABLE=$01;VGAGRAPHCOLORCMP=$02;VGAGRAPHFUNCSEL=$03;
  16. VGAGRAPHREADMAP=$04;VGAGRAPHMODE=$05;VGAGRAPHMISC=$06;VGAGRAPHDONTCARE=$07;VGAGRAPHBITMASK=$08;
  17. VGACRTINDEX=$03d4;VGACRTHORZTOTAL=$00;VGACRTHORZDISPEND=$01;VGACRTSTARTHORZBLANK=$02;VGACRTENDHORZBLANK=$03;
  18. VGACRTSTARTHORZRESCAN=$04;VGACRTENDHORZRESCAN=$05;VGACRTVERTTOTAL=$06;VGACRTOVERFLOW=$07;VGACRTVERTPELPAN=$08;
  19. VGACRTMAXSCANLINE=$09;VGACRTCURSTART=$0a;VGACRTCUREND=$0b;VGACRTSTARTADDRHI=$0c;VGACRTSTARTADDRLO=$0d;
  20. VGACRTCURLOCHI=$0e;VGACRTCURLOCLO=$0f;VGACRTSTARTVERTRESCAN=$10;VGACRTENDVERTRESCAN=$11;VGACRTVERTDISPEND=$12;
  21. VGACRTOFFSET=$13;VGACRTUNDERLINELOC=$14;VGACRTSTARTVERTBLANK=$15;VGACRTENDVERTBLANK=$16;VGACRTMODECONTROL=$17;
  22. VGACRTLINECOMPARE=$18;VGACRTSTATUS=$03da;VGARGBMAX=2;VGADACREGMAX=255;VGAPALETTESIZE=768;VGAFADEINC=4;
  23. VGAPAGEOFSLOC:ARRAY[0..7]OF WORD=($0000,$0800,$1000,$1800,$2000,$2800,$3000,$3800);
  24. VGAPAGELOCOFS:ARRAY[0..7]OF WORD=($0000,$1000,$2000,$3000,$4000,$5000,$6000,$7000);
  25. VGASCRWIDTH=80;VGASCRSIZE25=2000;VGASCRSIZE50=4000;VGAMAXCHRTABLES=8;VGAMAXCHRHEIGHT=32;VGAMAXCHRS=256;
  26. VGACHRTABLESIZE=8192;VGAROM8X14=2;VGAROM8X8=3;VGAROMALT8X8=4;VGAROMALT9X14=5;VGAROM8X16=6;VGAROMALT9X16=7;
  27. VGACHRTABLELOCOFS:ARRAY[0..7]OF WORD=($0000,$4000,$8000,$c000,$2000,$6000,$a000,$e000);
  28. VGACHRTABLEMAP1:ARRAY[0..7]OF BYTE=($00,01,$02,$03,$10,$11,$12,$13);VGACHRTABLEMAP2:ARRAY[0 ..
  29. 7]OF BYTE=($00,$04,$08,$0c,$20,$24,$28,$2c);VGANOCARD=0;VGAMDAMDA=1;VGACGACGA=2;VGAEGAEGA=4;
  30. VGAEGAMDA=5;VGAVGAMONO=7;VGAVGACOLOR=8;VGAMCGACGA=10;VGAMCGAMONO=11;VGAMCGACOLOR=12;VGADATABUFMAX=65519;
  31. TYPE VGADATABUFPTR=^VGADATABUF;VGADATABUF=ARRAY[0..VGADATABUFMAX]OF BYTE;VGAPALETTEPTR=^VGAPALETTE;
  32. VGAPALETTE=ARRAY[0..VGADACREGMAX,0..VGARGBMAX]OF BYTE;VGACHRTABLEPTR=^VGACHRTABLE;VGACHRTABLE=ARRAY[0
  33. .. VGACHRTABLESIZE-1]OF BYTE;PROCEDURE SETSEQCONT(INDEXREG,DATAREG:BYTE);FUNCTION GETSEQCONT
  34. (INDEXREG:BYTE):BYTE;PROCEDURE SETCRTCONT(INDEXREG,DATAREG:BYTE);FUNCTION GETCRTCONT(INDEXREG:BYTE):BYTE;
  35. PROCEDURE SETGRAPHCONT(INDEXREG,DATAREG:BYTE);FUNCTION GETGRAPHCONT(INDEXREG:BYTE):BYTE;PROCEDURE SETATTRCONT
  36. (INDEXREG,DATAREG:BYTE);FUNCTION GETATTRCONT(INDEXREG:BYTE):BYTE;PROCEDURE SETMISCOUTPUT(DATAREG:BYTE);
  37. FUNCTION GETMISCOUTPUT:BYTE;PROCEDURE WAITVERTSYNC;PROCEDURE WAITDISPENABLE;PROCEDURE SETCHRWIDTH8;
  38. PROCEDURE SETCHRWIDTH9;FUNCTION ISCHRWIDTH9:BOOLEAN;PROCEDURE SETPAGE(STARTOFS:WORD);PROCEDURE COPYSCRMEM
  39. (SRC,DEST:POINTER;LEN:WORD);PROCEDURE SETDAC(REGNUM,R,G,B:BYTE);PROCEDURE GETDAC(REGNUM:BYTE;
  40. VAR R,G,B:BYTE);PROCEDURE SETDACBLOCK(PALPTR:POINTER;STARTREG,REGCNT:WORD);PROCEDURE GETDACBLOCK
  41. (PALPTR:POINTER;STARTREG,REGCNT:WORD);PROCEDURE FADEOUTDAC;PROCEDURE FADEINDAC(DEFPAL:VGAPALETTEPTR);
  42. PROCEDURE ACCESSFONTMEM;PROCEDURE ACCESSSCREENMEM;PROCEDURE FONTMAPSELECT(FONT1,FONT2:BYTE);PROCEDURE FONTMAPVAL
  43. (MAPSEL:BYTE;VAR FONT1,FONT2:BYTE);PROCEDURE FONTTABLELOC(MAPSEL:BYTE;VAR FONT1PTR,FONT2PTR:POINTER);
  44. PROCEDURE SETRAMTABLE(STARTCHR,TOTALCHRS,HEIGHT:WORD;BUFADDR,CHRADDR:VGACHRTABLEPTR);FUNCTION GETRAMTABLE
  45. (STARTCHR,TOTALCHRS,HEIGHT:WORD;CHRADDR:VGACHRTABLEPTR):VGACHRTABLEPTR;PROCEDURE SETTABLEPIX
  46. (X,Y,XLEN,HEIGHT:WORD;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);PROCEDURE DRAWTABLELINE
  47. (X1,Y1,X2,Y2,XLEN,HEIGHT:INTEGER;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);PROCEDURE DRAWTABLEELLIPSE
  48. (XC,YC,A,B,XLEN,HEIGHT:INTEGER;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);FUNCTION VGACARDACTIVE:BOOLEAN;
  49. PROCEDURE BIOSSETPALREG(REGNUM,REGDATA:BYTE);FUNCTION BIOSGETPALREG(REGNUM:BYTE):BYTE;PROCEDURE BIOSSETDAC
  50. (REGNUM,R,G,B:BYTE);PROCEDURE BIOSGETDAC(REGNUM:BYTE;VAR R,G,B:BYTE);PROCEDURE BIOSSETDACBLOCK(PALPTR:POINTER;
  51. STARTREG,REGCNT:WORD);PROCEDURE BIOSGETDACBLOCK(PALPTR:POINTER;STARTREG,REGCNT:WORD);PROCEDURE BIOSFONTMAPSELECT
  52. (FONT1,FONT2:BYTE);FUNCTION BIOSGETCHRHEIGHT:BYTE;FUNCTION BIOSGETROMTABLEPTR(INFO:BYTE):POINTER;
  53. FUNCTION BIOSCOPYROMTABLE(INFO:BYTE):VGACHRTABLEPTR;PROCEDURE BIOSSETCHRTABLE(CHRTABLE:BYTE);
  54. PROCEDURE BIOSLOADFONT(CHRDATA:POINTER;CHRTABLE,CHRHEIGHT:BYTE;STARTCHR,NUMCHRS:WORD);PROCEDURE BIOSSETFONT
  55. (CHRDATA:POINTER;CHRTABLE,CHRHEIGHT:BYTE;STARTCHR,NUMCHRS:WORD);PROCEDURE BIOSLOAD8X8FONT(CHRTABLE:BYTE);
  56. PROCEDURE BIOSLOAD8X14FONT(CHRTABLE:BYTE);PROCEDURE BIOSLOAD8X16FONT(CHRTABLE:BYTE);PROCEDURE BIOSSET8X8FONT
  57. (CHRTABLE:BYTE);PROCEDURE BIOSSET8X14FONT(CHRTABLE:BYTE);PROCEDURE BIOSSET8X16FONT(CHRTABLE:BYTE);
  58. VAR VGAPAGELOC:ARRAY[0..7]OF POINTER;VGACHRTABLELOC:ARRAY[0..7]OF POINTER;
  59. IMPLEMENTATION PROCEDURE SETSEQCONT(INDEXREG,DATAREG:BYTE);ASSEMBLER;ASM{}MOV DX,VGASEQINDEX{}MOV AL,INDEXREG{}
  60. MOV AH,DATAREG{}OUT DX,AX{}END;FUNCTION GETSEQCONT(INDEXREG:BYTE):BYTE;ASSEMBLER;ASM{}MOV DX,VGASEQINDEX{}
  61. MOV AL,INDEXREG{}OUT DX,AL{}INC DX{}IN AL,DX{}END;PROCEDURE SETCRTCONT(INDEXREG,DATAREG:BYTE);ASSEMBLER;
  62. ASM{}MOV DX,VGACRTINDEX{}MOV AL,INDEXREG{}MOV AH,DATAREG{}OUT DX,AX{}END;FUNCTION GETCRTCONT
  63. (INDEXREG:BYTE):BYTE;ASSEMBLER;ASM{}MOV DX,VGACRTINDEX{}MOV AL,INDEXREG{}OUT DX,AL{}INC DX{}IN AL,DX{}
  64. END;PROCEDURE SETGRAPHCONT(INDEXREG,DATAREG:BYTE);ASSEMBLER;ASM{}MOV DX,VGAGRAPHINDEX{}MOV AL,INDEXREG{}
  65. MOV AH,DATAREG{}OUT DX,AX{}END;FUNCTION GETGRAPHCONT(INDEXREG:BYTE):BYTE;ASSEMBLER;ASM{}
  66. MOV DX,VGAGRAPHINDEX{}MOV AL,INDEXREG{}OUT DX,AL{}INC DX{}IN AL,DX{}END;PROCEDURE SETATTRCONT
  67. (INDEXREG,DATAREG:BYTE);ASSEMBLER;ASM{}CALL WAITVERTSYNC{}MOV DX,VGAATTRINDEX{}MOV AL,INDEXREG{}OUT DX,AL{}
  68. MOV AL,DATAREG{}OUT DX,AL{}MOV DX,VGACRTSTATUS{}IN AL,DX{}MOV DX,VGAATTRINDEX{}MOV AL,20h{}
  69. OUT DX,AL{}CALL WAITDISPENABLE{}END;FUNCTION GETATTRCONT(INDEXREG:BYTE):BYTE;ASSEMBLER;ASM{}CALL WAITVERTSYNC{}
  70. MOV DX,VGAATTRINDEX{}MOV AL,INDEXREG{}OUT DX,AL{}MOV DX,VGAATTRDATA{}IN AL,DX{}XCHG AL,AH{}
  71. MOV DX,VGACRTSTATUS{}IN AL,DX{}MOV DX,VGAATTRINDEX{}MOV AL,20h{}OUT DX,AL{}CALL WAITDISPENABLE{}
  72. XCHG AL,AH{}END;PROCEDURE SETMISCOUTPUT(DATAREG:BYTE);ASSEMBLER;ASM{}MOV DX,VGAMISCOUTWRITE{}MOV AL,DATAREG{}
  73. OUT DX,AL{}END;FUNCTION GETMISCOUTPUT:BYTE;ASSEMBLER;ASM{}MOV DX,VGAMISCOUTREAD{}IN AL,DX{}END;
  74. PROCEDURE WAITVERTSYNC;ASSEMBLER;ASM{}MOV DX,VGACRTSTATUS{}@rep1:{}IN AL,DX{}TEST AL,08h{}JZ @rep1{}
  75. END;PROCEDURE WAITDISPENABLE;ASSEMBLER;ASM{}MOV DX,VGACRTSTATUS{}@rep1:{}IN AL,DX{}TEST AL,08h{}
  76. JNZ @rep1{}END;PROCEDURE SETCHRWIDTH8;BEGIN SETMISCOUTPUT(GETMISCOUTPUT AND $f3);SETSEQCONT(VGASEQRESET,$01);
  77. SETSEQCONT(VGASEQCLOCKMODE,$01);SETSEQCONT(VGASEQRESET,$03);SETATTRCONT(VGAATTRHORZPELPAN,$00)END;
  78. PROCEDURE SETCHRWIDTH9;BEGIN SETMISCOUTPUT(GETMISCOUTPUT OR $04);SETSEQCONT(VGASEQRESET,$01);SETSEQCONT
  79. (VGASEQCLOCKMODE,$00);SETSEQCONT(VGASEQRESET,$03);SETATTRCONT(VGAATTRHORZPELPAN,$08)END;FUNCTION ISCHRWIDTH9
  80. :BOOLEAN;BEGIN ISCHRWIDTH9:=(GETMISCOUTPUT AND $0c)=$04 END;PROCEDURE SETPAGE(STARTOFS:WORD);ASSEMBLER;ASM{}
  81. MOV BL,VGACRTSTARTADDRLO{}MOV BH,BYTE PTR STARTOFS{}MOV CL,VGACRTSTARTADDRHI{}MOV CH,BYTE PTR STARTOFS+ 1{}
  82. CALL WAITDISPENABLE{}MOV DX,VGACRTINDEX{}MOV AX,BX{}OUT DX,AX{}MOV AX,CX{}OUT DX,AX{}END;
  83. PROCEDURE COPYSCRMEM(SRC,DEST:POINTER;LEN:WORD);ASSEMBLER;ASM{}PUSH DS{}LDS SI,SRC{}LES DI,DEST{}
  84. MOV CX,LEN{}CLD{}REP MOVSW{}POP DS{}END;PROCEDURE SETDAC(REGNUM,R,G,B:BYTE);ASSEMBLER;ASM{}
  85. CALL WAITVERTSYNC{}MOV DX,VGADACWRITE{}MOV AL,REGNUM{}OUT DX,AL{}INC DX{}MOV AL,R{}OUT DX,AL{}
  86. MOV AL,G{}OUT DX,AL{}MOV AL,B{}OUT DX,AL{}CALL WAITDISPENABLE{}END;PROCEDURE GETDAC(REGNUM:BYTE;
  87. VAR R,G,B:BYTE);ASSEMBLER;ASM{}CALL WAITVERTSYNC{}MOV DX,VGADACREAD{}MOV AL,REGNUM{}OUT DX,AL{}
  88. MOV DX,VGADACPELDATA{}IN AL,DX{}LES DI,R{}MOV ES:[DI],AL{}IN AL,DX{}LES DI,G{}
  89. MOV ES:[DI],AL{}IN AL,DX{}LES DI,B{}MOV ES:[DI],AL{}CALL WAITDISPENABLE{}END;
  90. PROCEDURE SETDACBLOCK(PALPTR:POINTER;STARTREG,REGCNT:WORD);ASSEMBLER;ASM{}LES SI,PALPTR{}MOV BL,3{}
  91. MOV AX,STARTREG{}MOV DX,VGADACWRITE{}OUT DX,AL{}@rep1:{}MOV CX,REGCNT{}CALL WAITVERTSYNC{}
  92. MOV DX,VGADACPELDATA{}@rep2:{}MOV AL,ES:[SI]{}OUT DX,AL{}INC SI{}LOOP @rep2{}CALL WAITDISPENABLE{}
  93. DEC BL{}JNZ @rep1{}END;PROCEDURE GETDACBLOCK(PALPTR:POINTER;STARTREG,REGCNT:WORD);ASSEMBLER;ASM{}LES SI,PALPTR{}
  94. MOV BL,3{}MOV AX,STARTREG{}MOV DX,VGADACREAD{}OUT DX,AL{}@rep1:{}MOV CX,REGCNT{}CALL WAITVERTSYNC{}
  95. MOV DX,VGADACPELDATA{}@rep2:{}IN AL,DX{}MOV ES:[SI],AL{}INC SI{}LOOP @rep2{}CALL WAITDISPENABLE{}
  96. DEC BL{}JNZ @rep1{}END;PROCEDURE FADEOUTDAC;VAR O10100I1l0l1I:BOOLEAN;OI10Illl01l,OI11I0I0ll0:BYTE;
  97. OI11l0101I0:VGAPALETTE;BEGIN GETDACBLOCK(@ OI11l0101I0,0,256);REPEAT O10100I1l0l1I:=TRUE;FOR OI11I0I0ll0:=0 TO
  98. VGADACREGMAX DO FOR OI10Illl01l:=0 TO VGARGBMAX DO IF OI11l0101I0[OI11I0I0ll0,OI10Illl01l]>= VGAFADEINC THEN
  99. BEGIN DEC(OI11l0101I0[OI11I0I0ll0,OI10Illl01l],VGAFADEINC);O10100I1l0l1I:=FALSE END ELSE OI11l0101I0[
  100. OI11I0I0ll0,OI10Illl01l]:=0;SETDACBLOCK(@ OI11l0101I0,0,256)UNTIL O10100I1l0l1I END;PROCEDURE FADEINDAC
  101. (DEFPAL:VGAPALETTEPTR);VAR O10100I1l0l1I:BOOLEAN;OI10Illl01l,OI11I0I0ll0:BYTE;OI11l0101I0:VGAPALETTE;BEGIN GETDACBLOCK(@
  102. OI11l0101I0,0,256);REPEAT O10100I1l0l1I:=TRUE;FOR OI11I0I0ll0:=0 TO VGADACREGMAX DO FOR OI10Illl01l:=0 TO
  103. VGARGBMAX DO IF OI11l0101I0[OI11I0I0ll0,OI10Illl01l]<= DEFPAL ^[OI11I0I0ll0,OI10Illl01l]-VGAFADEINC THEN
  104. BEGIN INC(OI11l0101I0[OI11I0I0ll0,OI10Illl01l],VGAFADEINC);O10100I1l0l1I:=FALSE END ELSE OI11l0101I0[
  105. OI11I0I0ll0,OI10Illl01l]:=DEFPAL ^[OI11I0I0ll0,OI10Illl01l];SETDACBLOCK(@ OI11l0101I0,0,256)UNTIL
  106. O10100I1l0l1I END;PROCEDURE ACCESSFONTMEM;BEGIN WAITVERTSYNC;SETSEQCONT(VGASEQRESET,$01);SETSEQCONT(VGASEQMAPMASK
  107. ,$04);SETSEQCONT(VGASEQMEMMODE,$07);SETSEQCONT(VGASEQRESET,$03);SETGRAPHCONT(VGAGRAPHREADMAP,$02);
  108. SETGRAPHCONT(VGAGRAPHMODE,$00);SETGRAPHCONT(VGAGRAPHMISC,$04)END;PROCEDURE ACCESSSCREENMEM;BEGIN WAITVERTSYNC;
  109. SETSEQCONT(VGASEQRESET,$01);SETSEQCONT(VGASEQMAPMASK,$03);SETSEQCONT(VGASEQMEMMODE,$03);SETSEQCONT
  110. (VGASEQRESET,$03);SETGRAPHCONT(VGAGRAPHREADMAP,$00);SETGRAPHCONT(VGAGRAPHMODE,$10);SETGRAPHCONT(VGAGRAPHMISC
  111. ,$0e)END;PROCEDURE FONTMAPSELECT(FONT1,FONT2:BYTE);BEGIN SETSEQCONT(VGASEQCHRMAPSEL,FONT1 OR FONT2)END;
  112. PROCEDURE FONTMAPVAL(MAPSEL:BYTE;VAR FONT1,FONT2:BYTE);BEGIN FONT1:=((MAPSEL AND $10)SHR 2)OR(MAPSEL AND $03);
  113. FONT2:=((MAPSEL AND $20)SHR 3)OR((MAPSEL AND $0c)SHR 2)END;PROCEDURE FONTTABLELOC(MAPSEL:BYTE;
  114. VAR FONT1PTR,FONT2PTR:POINTER);VAR OI1I1lIII0l1,Ol001O10llII:BYTE;BEGIN FONTMAPVAL(MAPSEL,OI1I1lIII0l1,Ol001O10llII
  115. );FONT1PTR:=VGACHRTABLELOC[OI1I1lIII0l1];FONT2PTR:=VGACHRTABLELOC[Ol001O10llII]END;PROCEDURE SETRAMTABLE
  116. (STARTCHR,TOTALCHRS,HEIGHT:WORD;BUFADDR,CHRADDR:VGACHRTABLEPTR);VAR O1lI0111OIIl,OI110Il1III1:WORD;
  117. BEGIN FOR O1lI0111OIIl:=0 TO TOTALCHRS-1 DO FOR OI110Il1III1:=0 TO HEIGHT-1 DO CHRADDR ^[(O1lI0111OIIl +
  118. STARTCHR)* VGAMAXCHRHEIGHT+OI110Il1III1]:=BUFADDR ^[O1lI0111OIIl*HEIGHT+OI110Il1III1]END;
  119. FUNCTION GETRAMTABLE(STARTCHR,TOTALCHRS,HEIGHT:WORD;CHRADDR:VGACHRTABLEPTR):VGACHRTABLEPTR;
  120. VAR O1lI0111OIIl,OI110Il1III1:WORD;OOlIIO1O1OO0:VGACHRTABLEPTR;BEGIN OOlIIO1O1OO0:=MEMALLOC(HEIGHT*TOTALCHRS);IF
  121. OOlIIO1O1OO0<>NIL THEN BEGIN FOR O1lI0111OIIl:=0 TO TOTALCHRS-1 DO FOR OI110Il1III1:=0 TO HEIGHT-1
  122. DO OOlIIO1O1OO0 ^[O1lI0111OIIl*HEIGHT+OI110Il1III1]:=CHRADDR ^[(O1lI0111OIIl+STARTCHR)* VGAMAXCHRHEIGHT +
  123. OI110Il1III1];END;GETRAMTABLE:=OOlIIO1O1OO0 END;PROCEDURE SETTABLEPIX(X,Y,XLEN,HEIGHT:WORD;
  124. CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);VAR O1lI0111OIIl,OI110Il1III1:WORD;CONST O1lI01ll11OI:ARRAY[0..7]
  125. OF BYTE=(128,64,32,16,8,4,2,1);BEGIN O1lI0111OIIl:=(X SHR 3)+(Y DIV HEIGHT*XLEN);OI110Il1III1:=Y
  126. MOD HEIGHT;IF PIXON THEN CHRADDR ^[O1lI0111OIIl*VGAMAXCHRHEIGHT+OI110Il1III1]:=CHRADDR ^[O1lI0111OIIl *
  127. VGAMAXCHRHEIGHT+OI110Il1III1]OR O1lI01ll11OI[(X AND 7)]ELSE CHRADDR ^[O1lI0111OIIl*VGAMAXCHRHEIGHT +
  128. OI110Il1III1]:=CHRADDR ^[O1lI0111OIIl*VGAMAXCHRHEIGHT+OI110Il1III1]AND NOT O1lI01ll11OI[(X AND 7)]END;
  129. PROCEDURE DRAWTABLELINE(X1,Y1,X2,Y2,XLEN,HEIGHT:INTEGER;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);
  130. VAR O1I10Ol1,O1I1Il0I,OOIO,OOIl,O10OI1l0O0I0l,O10OI1l0O0I10,OIOI,OO1I:INTEGER;BEGIN O10OI1l0O0I0l:=1;O1I10Ol1:=X2 -
  131. X1;IF O1I10Ol1 < 0 THEN BEGIN O10OI1l0O0I0l:=-1;O1I10Ol1:=-O1I10Ol1 END;O1I1Il0I:=Y2-Y1;IF O1I1Il0I < 0
  132. THEN BEGIN O10OI1l0O0I10:=-1;O1I1Il0I:=-O1I1Il0I END ELSE IF O1I1Il0I > 0 THEN O10OI1l0O0I10:=1 ELSE
  133. O10OI1l0O0I10:=0;OOIO:=X1;OOIl:=Y1;SETTABLEPIX(OOIO,OOIl,XLEN,HEIGHT,CHRADDR,PIXON);IF O1I10Ol1 >
  134. O1I1Il0I THEN BEGIN OO1I:=O1I10Ol1 SHR 1;FOR OIOI:=1 TO O1I10Ol1 DO BEGIN OOIO:=OOIO+O10OI1l0O0I0l;OO1I:=
  135. OO1I+O1I1Il0I;IF OO1I >= O1I10Ol1 THEN BEGIN OOIl:=OOIl+O10OI1l0O0I10;OO1I:=OO1I-O1I10Ol1 END;SETTABLEPIX
  136. (OOIO,OOIl,XLEN,HEIGHT,CHRADDR,PIXON)END END ELSE BEGIN OO1I:=O1I1Il0I SHR 1;FOR OIOI:=1 TO O1I1Il0I
  137. DO BEGIN OOIl:=OOIl+O10OI1l0O0I10;OO1I:=OO1I+O1I10Ol1;IF OO1I >= O1I1Il0I THEN BEGIN OOIO:=OOIO +
  138. O10OI1l0O0I0l;OO1I:=OO1I-O1I1Il0I END;SETTABLEPIX(OOIO,OOIl,XLEN,HEIGHT,CHRADDR,PIXON)END END END;
  139. PROCEDURE DRAWTABLEELLIPSE(XC,YC,A,B,XLEN,HEIGHT:INTEGER;CHRADDR:VGACHRTABLEPTR;PIXON:BOOLEAN);VAR OOIO,OOIl:INTEGER;
  140. O101OO10,O1OI0OlO010,O10I0OII,O1OI0l000II,OIOO,O1I10Ol1,O1I1Il0I:LONGINT;BEGIN OOIO:=0;OOIl:=B;O101OO10:=LONGINT
  141. (A)* A;O1OI0OlO010:=O101OO10 SHL 1;O10I0OII:=LONGINT(B)* B;O1OI0l000II:=O10I0OII SHL 1;OIOO:=O10I0OII -
  142. O101OO10*B+O101OO10 SHR 2;O1I10Ol1:=0;O1I1Il0I:=O1OI0OlO010*B;SETTABLEPIX(XC,YC-OOIl,XLEN,HEIGHT,
  143. CHRADDR,PIXON);SETTABLEPIX(XC,YC+OOIl,XLEN,HEIGHT,CHRADDR,PIXON);WHILE(O1I10Ol1 < O1I1Il0I
  144. ) DO BEGIN IF(OIOO > 0)THEN BEGIN DEC(OOIl);DEC(O1I1Il0I,O1OI0OlO010);DEC(OIOO,O1I1Il0I);END;INC(OOIO);
  145. INC(O1I10Ol1,O1OI0l000II);INC(OIOO,O10I0OII+O1I10Ol1);SETTABLEPIX(XC+OOIO,YC+OOIl,XLEN,HEIGHT,
  146. CHRADDR,PIXON);SETTABLEPIX(XC-OOIO,YC+OOIl,XLEN,HEIGHT,CHRADDR,PIXON);SETTABLEPIX(XC+OOIO,YC -
  147. OOIl,XLEN,HEIGHT,CHRADDR,PIXON);SETTABLEPIX(XC-OOIO,YC-OOIl,XLEN,HEIGHT,CHRADDR,PIXON)END;INC
  148. (OIOO,(3 *(O101OO10-O10I0OII)DIV 2-(O1I10Ol1+O1I1Il0I))DIV 2);WHILE(OOIl > 0) DO BEGIN IF(OIOO < 0)THEN
  149. BEGIN INC(OOIO);INC(O1I10Ol1,O1OI0l000II);INC(OIOO,O10I0OII+O1I10Ol1);END;DEC(OOIl);DEC(O1I1Il0I,
  150. O1OI0OlO010);INC(OIOO,O101OO10-O1I1Il0I);SETTABLEPIX(XC+OOIO,YC+OOIl,XLEN,HEIGHT,CHRADDR,PIXON);
  151. SETTABLEPIX(XC-OOIO,YC+OOIl,XLEN,HEIGHT,CHRADDR,PIXON);SETTABLEPIX(XC+OOIO,YC-OOIl,XLEN,HEIGHT
  152. ,CHRADDR,PIXON);SETTABLEPIX(XC-OOIO,YC-OOIl,XLEN,HEIGHT,CHRADDR,PIXON)END;END;
  153. FUNCTION VGACARDACTIVE:BOOLEAN;ASSEMBLER;ASM{}MOV AX,1a00h{}INT 10h{}XCHG AL,AH{}MOV AL,00h{}
  154. CMP AH,1ah{}JNZ @endif1{}CMP BL,VGAVGACOLOR{}JNZ @endif1{}INC AL{}@endif1:{}END;PROCEDURE BIOSSETPALREG
  155. (REGNUM,REGDATA:BYTE);ASSEMBLER;ASM{}MOV AX,1000h{}MOV BH,REGDATA{}MOV BL,REGNUM{}INT 10h{}END;
  156. FUNCTION BIOSGETPALREG(REGNUM:BYTE):BYTE;ASSEMBLER;ASM{}MOV BL,REGNUM{}MOV AX,1007h{}INT 10h{}MOV AL,BH{}
  157. END;PROCEDURE BIOSSETDAC(REGNUM,R,G,B:BYTE);ASSEMBLER;ASM{}XOR BH,BH{}MOV BL,REGNUM{}MOV AX,1010h{}
  158. MOV DH,R{}MOV CH,G{}MOV CL,B{}INT 10h{}END;PROCEDURE BIOSGETDAC(REGNUM:BYTE;VAR R,G,B:BYTE);ASSEMBLER;ASM{}
  159. XOR BH,BH{}MOV BL,REGNUM{}MOV AX,1015h{}INT 10h{}LES DI,R{}MOV ES:[DI],DH{}LES DI,G{}
  160. MOV ES:[DI],CH{}LES DI,B{}MOV ES:[DI],CL{}END;PROCEDURE BIOSSETDACBLOCK(PALPTR:POINTER;
  161. STARTREG,REGCNT:WORD);ASSEMBLER;ASM{}MOV AX,1012h{}MOV BX,STARTREG{}MOV CX,REGCNT{}LES DX,PALPTR{}
  162. INT 10h{}END;PROCEDURE BIOSGETDACBLOCK(PALPTR:POINTER;STARTREG,REGCNT:WORD);ASSEMBLER;ASM{}MOV AX,1017h{}
  163. MOV BX,STARTREG{}MOV CX,REGCNT{}LES DX,PALPTR{}INT 10h{}END;PROCEDURE BIOSFONTMAPSELECT(FONT1,FONT2:BYTE);
  164. ASSEMBLER;ASM{}MOV AX,1103h{}MOV BL,FONT1{}OR BL,FONT2{}INT 10h{}END;FUNCTION BIOSGETCHRHEIGHT:BYTE;
  165. ASSEMBLER;ASM{}MOV AX,1130h{}MOV BH,6{}PUSH BP{}INT 10h{}POP BP{}MOV AX,CX{}END;
  166. FUNCTION BIOSGETROMTABLEPTR(INFO:BYTE):POINTER;ASSEMBLER;ASM{}MOV AX,1130h{}MOV BH,INFO{}PUSH BP{}INT 10h{}
  167. MOV AX,BP{}POP BP{}MOV DX,ES{}END;FUNCTION BIOSCOPYROMTABLE(INFO:BYTE):VGACHRTABLEPTR;VAR OIl0OII10lI:WORD;
  168. OI11I1l0lII,OIlI1OlO00I:VGACHRTABLEPTR;BEGIN OI11I1l0lII:=BIOSGETROMTABLEPTR(INFO);OIlI1OlO00I:=NIL;CASE INFO
  169. OF VGAROM8X8:OIl0OII10lI:=8;VGAROMALT8X8:OIl0OII10lI:=8;VGAROM8X14:OIl0OII10lI:=14;VGAROMALT9X14
  170. :OIl0OII10lI:=14;VGAROM8X16:OIl0OII10lI:=16;VGAROMALT9X16:OIl0OII10lI:=16 END;OIlI1OlO00I:=MEMALLOC
  171. (OIl0OII10lI*VGAMAXCHRS);IF OIlI1OlO00I<>NIL THEN MOVE(OI11I1l0lII ^,OIlI1OlO00I ^,OIl0OII10lI*VGAMAXCHRS);
  172. BIOSCOPYROMTABLE:=OIlI1OlO00I END;PROCEDURE BIOSSETCHRTABLE(CHRTABLE:BYTE);ASSEMBLER;ASM{}MOV AX,1103h{}
  173. MOV BL,CHRTABLE{}INT 10h{}END;PROCEDURE BIOSLOADFONT(CHRDATA:POINTER;CHRTABLE,CHRHEIGHT:BYTE;
  174. STARTCHR,NUMCHRS:WORD);ASSEMBLER;ASM{}MOV AX,1100h{}MOV BH,CHRHEIGHT{}MOV BL,CHRTABLE{}MOV CX,NUMCHRS{}
  175. MOV DX,STARTCHR{}LES SI,CHRDATA{}PUSH BP{}MOV BP,SI{}INT 10h{}POP BP{}END;PROCEDURE BIOSSETFONT
  176. (CHRDATA:POINTER;CHRTABLE,CHRHEIGHT:BYTE;STARTCHR,NUMCHRS:WORD);ASSEMBLER;ASM{}MOV AX,1110h{}MOV BH,CHRHEIGHT{}
  177. MOV BL,CHRTABLE{}MOV CX,NUMCHRS{}MOV DX,STARTCHR{}LES SI,CHRDATA{}PUSH BP{}MOV BP,SI{}INT 10h{}
  178. POP BP{}END;PROCEDURE BIOSLOAD8X8FONT(CHRTABLE:BYTE);ASSEMBLER;ASM{}MOV AX,1102h{}MOV BL,CHRTABLE{}INT 10h{}
  179. END;PROCEDURE BIOSLOAD8X14FONT(CHRTABLE:BYTE);ASSEMBLER;ASM{}MOV AX,1101h{}MOV BL,CHRTABLE{}INT 10h{}END;
  180. PROCEDURE BIOSLOAD8X16FONT(CHRTABLE:BYTE);ASSEMBLER;ASM{}MOV AX,1104h{}MOV BL,CHRTABLE{}INT 10h{}END;
  181. PROCEDURE BIOSSET8X8FONT(CHRTABLE:BYTE);ASSEMBLER;ASM{}MOV AX,1112h{}MOV BL,CHRTABLE{}INT 10h{}END;
  182. PROCEDURE BIOSSET8X14FONT(CHRTABLE:BYTE);ASSEMBLER;ASM{}MOV AX,1111h{}MOV BL,CHRTABLE{}INT 10h{}END;
  183. PROCEDURE BIOSSET8X16FONT(CHRTABLE:BYTE);ASSEMBLER;ASM{}MOV AX,1114h{}MOV BL,CHRTABLE{}INT 10h{}END;
  184. PROCEDURE O1l0OI1llOO0;VAR OIlO:BYTE;BEGIN FOR OIlO:=0 TO 7 DO BEGIN VGAPAGELOC[OIlO]:=PTR(SEGB800,
  185. VGAPAGELOCOFS[OIlO]);VGACHRTABLELOC[OIlO]:=PTR(SEGA000,VGACHRTABLELOCOFS[OIlO])END END;
  186. BEGIN O1l0OI1llOO0 END.
  187.