From 0fd6f3d210d87e6b1eb1924bb16f945f1d1bf42e Mon Sep 17 00:00:00 2001 From: sparky4 Date: Thu, 29 May 2014 12:56:46 -0500 Subject: [PATCH] modified: 16/DOS_GFX.EXE modified: 16/DOS_GFX.OBJ modified: 16/Project 16.bfproject modified: 16/dos_gfx.cpp modified: 16/dos_gfx.h modified: 16/lib/intro/lib.c --- 16/DOS_GFX.EXE | Bin 34858 -> 30934 bytes 16/DOS_GFX.OBJ | Bin 7743 -> 4716 bytes 16/Project 16.bfproject | 45 ++-- 16/dos_gfx.cpp | 479 +++++----------------------------------- 16/dos_gfx.h | 14 +- 16/lib/intro/lib.c | 299 +++++++++++++++++++++---- 6 files changed, 348 insertions(+), 489 deletions(-) diff --git a/16/DOS_GFX.EXE b/16/DOS_GFX.EXE index 3b6fc2ba12bcfc5ba6e7ba682a4d53c58d7da63c..e835c57b6eab14fddb2072881a329fcc3066e68e 100644 GIT binary patch delta 16564 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 WMH#ACFv?DCLk&sM0pY>8%l|)+K{}uS delta 20567 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 aobW~Z2GY=v1tQ&S;m?Tl4}Jqd!v6=xCh;-= diff --git a/16/DOS_GFX.OBJ b/16/DOS_GFX.OBJ index 1f08446c10199f66ec768c718f1ee711d943d824..56298e2a462e71f14776bf532c535aef44d0274d 100644 GIT binary patch delta 3039 zcmZuz3vg7`8UD_F<^3WL0wfSaK*BQ#umltm0$Cm=5Cfb<1p*|Sun>}veHdesC9_LQ zG(g}23Jtne5wV~YMYl2(Y;OrNw^Nuw(5lnIAeBOeDlZXt`|oaeIQ8!S^FQx7|No!w z+;fgRekG$TC$-L$nmldN!lxHz8~p!T^Rk6a3s==wnVLo~FWEGA*kh?n4o^>bD59#~ zQc+V)UVYs_thscR+)2OSu54%+u<5{fw&;Mo8?WTF90wU5JTgn^c!D zhFR73g$%VmqOW4Ev*sEqR9D1U)}lTk4(VIs8HpXBr+nU%r3*T~c3w$Yd(@Vpo{LBi zxjbVsgRMY~jvVFiWC zKs<%ZdIs4ha7CNSL-hGPRA0?QwHA^cJWOB5!}YB^Lf^?F^}Sr!-#HUu71gUut1KpK z1rkHb@@iIRRGSe|mS?Y7no-?QZL3tfqEd&2mgQNRGOBGBRr5#wx9P2?d*r}vb@Ur`bNsU65++=B@5=4%qlM|LW}z_SRFI?41mE6WL*e0+u&2k z;LkXp+42LL(;H%w4c>e9Yp@M-dP8l4Rd-xstYKXeRnjT;mgH2OG2@F z-CC-2J?T4$eoOQ=(eLT~gIqLk`7^*6VJy;tP^4fG{c?~F0|w(UWFQYiV8o*+MT%j;}i<<1-*FzGjJO-@e^i4X2pnPbCASJ zFpxco99D`6tPBOL9HlJpDLlg#Vij8q2U`LcTZ;8;88)*@bTborm>DNo9nP^v{J<=T z60ArRZ0Il8kuKD9&Q(8)oe`r{nQE6lSAh+FxIHSUv*Xg4sIH1jPW-pv^hVfXqQ3z= zRY9a(I-~B0D^SPw$#7iho&_z8C+d;ZyCk0E8pQj$M)71&im@Kd4Ii(d=1n) z8=!rJ(;I6m?$uhS zJH5Fp9N7x==o*urR}%`s!X)qxCg)BWY=J=>>VjiEs7uR z2!iue_mh77L~AibsYD~Vq>bl^+9cuy#Ak6?o5z#1a^g#fHn_~BK z*&Bd*GxCJz@r2NVa-kJfLK~U{2U>+S*e+e~x8PZED>jPT@TT|@J{Gs*D{%+Ti@(7|u^Zot zui$&}RooEWxFx=UyW%cL(whjAb|X@H3(?XZ#7iUIMw0Y9JRyiP z03MUx!!+rA%#@b+;Z-E5mc%jr2~O65fgWZF_In8Nue4kJFma+IE%43Qekh;a`mwZE zJ}HoV?~w4r@&ALK>0SU$rVd6@_u`2UAU=q?IEuPGf#j(~Mv_a2o+5b(@s-3Ih+FBy z(##Wd7Z>C8E-vb?lCp<5eQiGP%v4`a&WuWP{}D`gI)Rr&r3SiNPopf=@ed(PUCgyQ|yt> zV88Tt9FV@m`_eyfLi#7JO6QOupGUrY5spInUzj6*gHrhh%HU0Kl?3#Gi`%SU!db{^38oEb8??bDUPL$0D>V?D?5Lt+vM4QR> z60PPNw3>VPpv|4h2x(}f`&M-YB8$ss6guYf!qR!O=FY)h_X;q(;*jav+$!E$e6!v6 zE=cpS))TiDU%&j9?4yArnnpU59Mo=5sL(r56r<8w)#M{*fY>*;Eu<2sgZRVJ(5TxF`y zs2*m{v=0KvR#|Hy)mG`heP!Br2W|DW^^I1O#Y&z`^C=+8f3qQ5bHEVE{C75s#ZeU; zsDL4|EU(I3R};|9CmG~bOU-o^AJRqcVb(C?nYdC5J6m#xj#K zp4BP_R%Nmz9K9|N# Tjh0?_xN1*b#4PIR)Rq4OQUb;- literal 7743 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 diff --git a/16/Project 16.bfproject b/16/Project 16.bfproject index abdd2559..f743508d 100644 --- a/16/Project 16.bfproject +++ b/16/Project 16.bfproject @@ -1,18 +1,21 @@ c2e.convert_special: 0 e2c.convert_num: 0 -openfiles: /dos/z/16/16/dos_gfx.cpp:19173:18568:0: -openfiles: /dos/z/16/16/dos_gfx.h:141:0:0: +openfiles: /dos/z/16/16/dos_gfx.cpp:8331:7953:1: +openfiles: /dos/z/16/16/dos_gfx.h:477:0:0: openfiles: /dos/z/16/16/dos_kb.c:892:395:0: openfiles: /dos/z/16/16/dos_kb.h:60:0:0: openfiles: /dos/z/16/16/lib/lib_com.cpp:0:0:0: openfiles: /dos/z/16/16/lib/lib_com.h:2553:1416:0: openfiles: /dos/z/16/16/scroll.txt:5307:5080:0: -openfiles: /dos/z/16/16/project16.txt:1675:950:0: +openfiles: /dos/z/16/16/project16.txt:8161:7174:0: openfiles: /dos/z/16/16/16.txt:0:0:0: -openfiles: /dos/z/16/16/lib/x/MODEX.H:2945:2439:0: +openfiles: /dos/z/16/16/lib/x/MODEX.H:3331:2278:0: openfiles: /dos/z/16/16/lib/x/MODEX.DEF:4471:3131:0: openfiles: /dos/z/16/16/lib/x/MAKEFILE:1186:782:0: -openfiles: /dos/z/4x4_16/modex/DEMO07.PAS:1095:490:0: +openfiles: /dos/z/4x4_16/modex/DEMO07.PAS:985:490:0: +openfiles: /dos/z/16/16/lib/intro/lib.c:2417:1910:0: +openfiles: /dos/z/16/src/lib/dos_gfx.cpp:2384:0:0: +openfiles: /dos/z/16/src/lib/dos_gfx.h:0:0:0: snr_recursion_level: 0 convertcolumn_horizontally: 0 adv_open_matchname: 0 @@ -24,15 +27,16 @@ view_left_panel: 0 default_mime_type: text/plain e2c.convert_xml: 1 c2e.convert_iso: 0 -opendir: file:///dos/z/4x4_16/modex +opendir: file:///dos/z/16/src/lib wrap_text_default: 0 bookmarks_filename_mode: 1 -ssearch_text: mxSetClip( +ssearch_text: put snr_casesens: 0 view_blocks: 1 name: project 16 replacelist: てすと replacelist: \t +replacelist: putPixel_X fb_show_hidden_f: 0 editor_tab_width: 4 show_visible_spacing: 1 @@ -74,19 +78,22 @@ recent_files: file:///dos/z/16/16/x.bat recent_files: file:///dos/z/16/16/xx.bat recent_files: file:///dos/z/16/16/lib/x/MXVS.ASM recent_files: file:///dos/z/16/16/lib/x/MXPN.ASM -recent_files: file:///dos/z/16/16/dos_gfx.cpp -recent_files: file:///dos/z/16/16/lib/lib_com.cpp recent_files: file:///dos/z/16/16/dos_gfx.h -recent_files: file:///dos/z/16/16/project16.txt -recent_files: file:///dos/z/16/16/dos_kb.h recent_files: file:///dos/z/16/16/dos_kb.c +recent_files: file:///dos/z/16/16/dos_kb.h +recent_files: file:///dos/z/16/16/lib/lib_com.cpp +recent_files: file:///dos/z/16/16/lib/lib_com.h recent_files: file:///dos/z/16/16/scroll.txt +recent_files: file:///dos/z/16/16/project16.txt +recent_files: file:///dos/z/16/16/dos_gfx.cpp +recent_files: file:///dos/z/16/16/lib/x/MODEX.H recent_files: file:///dos/z/16/16/lib/x/MODEX.DEF recent_files: file:///dos/z/16/16/16.txt -recent_files: file:///dos/z/16/16/lib/x/MODEX.H -recent_files: file:///dos/z/16/16/lib/lib_com.h -recent_files: file:///dos/z/4x4_16/modex/DEMO07.PAS recent_files: file:///dos/z/16/16/lib/x/MAKEFILE +recent_files: file:///dos/z/4x4_16/modex/DEMO07.PAS +recent_files: file:///dos/z/16/16/lib/intro/lib.c +recent_files: file:///dos/z/16/src/lib/dos_gfx.cpp +recent_files: file:///dos/z/16/src/lib/dos_gfx.h snr_replacetype: 0 savedir: file:///dos/z/16/16 spell_check_default: 1 @@ -98,11 +105,6 @@ snr_escape_chars: 0 htmlbar_view: 0 spell_lang: en ssearch_dotmatchall: 0 -searchlist: mspai -searchlist: mspan -searchlist: mspab -searchlist: mpab -searchlist: mxpab searchlist: mxpan searchlist: gets searchlist: mxset @@ -113,6 +115,11 @@ searchlist: setvir searchlist: virtual searchlist: STEPS searchlist: mxSetClip( TRUE ); +searchlist: world_matrix +searchlist: mxPutPixel +searchlist: setactive +searchlist: vga +searchlist: put autocomplete: 1 outputb_show_all_output: 0 bookmarks_show_mode: 0 diff --git a/16/dos_gfx.cpp b/16/dos_gfx.cpp index 1aec6780..e14c5c49 100644 --- a/16/dos_gfx.cpp +++ b/16/dos_gfx.cpp @@ -1,60 +1,5 @@ -/* - * LIB.C v1.2a - * - * by Robert Schmidt - * (C)1993 Ztiff Zox Softwear - * - * Simple graphics library to accompany the article - * - * INTRODUCTION TO MODE X. - * - * This library provides the basic functions for initializing and using - * unchained (planar) 256-color VGA modes. Currently supported are: - * - * - 320x200 - * - 320x240 - * - * Functions are provided for: - * - * - initializing one of the available modes - * - setting the start address of the VGA refresh data - * - setting active and visible display pages - * - writing and reading a single pixel to/from video memory - * - * The library is provided as a demonstration only, and is not claimed - * to be particularly efficient or suited for any purpose. It has only - * been tested with Borland C++ 3.1 by the author. Comments on success - * or disaster with other compilers are welcome. - * - * This file is public domain. Do with it whatever you'd like, but - * please don't distribute it without the article. - * - * Thanks go out to various helpful netters who spotted the 0xE7 bug - * in the set320x240x256() function! - * - * Modified by sparky4 so it can be compiled in open watcom ^^ - */ - - - - -/* - * We 'require' a large data model simply to get rid of explicit 'far' - * pointers and compiler specific '_fmemset()' functions and the likes. - */ -#if !defined(__COMPACT__) -# if !defined(__LARGE__) -# if !defined(__HUGE__) -# error Large data model required! Try compiling with 'wcc -0 -ml lib.c'. -# endif -# endif -#endif - -#include -#include -#include - -//code from old library! +//DOS Graphics thingy by sparky4 licence GPL v2 +//a special thanks to everyone to release source code for mode X /*src\lib\*/ #include "dos_gfx.h" @@ -65,7 +10,9 @@ int gq = LGQ; int q = 0; int bakax = 0, bakay = 0; cord xx = rand()&0%320, yy = rand()&0%240, sx = 0, sy = 0; -byte coor; +byte coor; + +byte *vga = (byte *) MK_FP(0xA000, 0); /* * Comment out the following #define if you don't want the testing main() @@ -73,240 +20,6 @@ byte coor; */ #define TESTING -/* - * Define the port addresses of some VGA registers. - */ -#define CRTC_ADDR 0x3d4 /* Base port of the CRT Controller (color) */ - -#define SEQU_ADDR 0x3c4 /* Base port of the Sequencer */ -#define GRAC_ADDR 0x3ce /* Base port of the Graphics Controller */ -#define STATUS_ADDR 0x3DA - - -/* - * Make a far pointer to the VGA graphics buffer segment. Your compiler - * might not have the MK_FP macro, but you'll figure something out. - */ -byte *vga = (byte *) MK_FP(0xA000, 0); - - -/* - * width and height should specify the mode dimensions. widthBytes - * specify the width of a line in addressable bytes. - */ -unsigned width, height, widthBytes; - -/* - * actStart specifies the start of the page being accessed by - * drawing operations. visStart specifies the contents of the Screen - * Start register, i.e. the start of the visible page. - */ -unsigned actStart, visStart; - -/* - * set320x200x256_X() - * sets mode 13h, then turns it into an unchained (planar), 4-page - * 320x200x256 mode. - */ -void set320x200x256_X(void) - { - union REGS r; - - /* Set VGA BIOS mode 13h: */ - r.x.ax = 0x0013; - int86(0x10, &r, &r); - - /* Turn off the Chain-4 bit (bit 3 at index 4, port 0x3c4): */ - outpw(SEQU_ADDR, 0x0604); - - /* Turn off word mode, by setting the Mode Control register - of the CRT Controller (index 0x17, port 0x3d4): */ - outpw(CRTC_ADDR, 0xE317); - - /* Turn off doubleword mode, by setting the Underline Location - register (index 0x14, port 0x3d4): */ - outpw(CRTC_ADDR, 0x0014); - - /* Clear entire video memory, by selecting all four planes, then - writing 0 to entire segment. */ - outpw(SEQU_ADDR, 0x0F02); - memset(vga+1, 0, 0xffff); /* stupid size_t exactly 1 too small */ - vga[0] = 0; - - /* Update the global variables to reflect dimensions of this - mode. This is needed by most future drawing operations. */ - width = 320; - height = 200; - - /* Each byte addresses four pixels, so the width of a scan line - in *bytes* is one fourth of the number of pixels on a line. */ - widthBytes = width / 4; - - /* By default we want screen refreshing and drawing operations - to be based at offset 0 in the video segment. */ - actStart = visStart = 0; - - } - -/* - * setActiveStart() tells our graphics operations which address in video - * memory should be considered the top left corner. - */ -void setActiveStart(unsigned offset) - { - actStart = offset; - } - -/* - * setVisibleStart() tells the VGA from which byte to fetch the first - * pixel when starting refresh at the top of the screen. This version - * won't look very well in time critical situations (games for - * instance) as the register outputs are not synchronized with the - * screen refresh. This refresh might start when the high byte is - * set, but before the low byte is set, which produces a bad flicker. - */ -void setVisibleStart(unsigned offset) - { - visStart = offset; - outpw(CRTC_ADDR, 0x0C); /* set high byte */ - outpw(CRTC_ADDR+1, visStart >> 8); - outpw(CRTC_ADDR, 0x0D); /* set low byte */ - outpw(CRTC_ADDR+1, visStart & 0xff); - } - -/* - * setXXXPage() sets the specified page by multiplying the page number - * with the size of one page at the current resolution, then handing the - * resulting offset value over to the corresponding setXXXStart() - * function. The first page is number 0. - */ -void setActivePage(int page) - { - setActiveStart(page * widthBytes * height); - } - -void setVisiblePage(int page) - { - setVisibleStart(page * widthBytes * height); - } - -void putPixel_X(int x, int y, byte color) - { - /* Each address accesses four neighboring pixels, so set - Write Plane Enable according to which pixel we want - to modify. The plane is determined by the two least - significant bits of the x-coordinate: */ - outp(0x3c4, 0x02); - outp(0x3c5, 0x01 << (x & 3)); - - /* The offset of the pixel into the video segment is - offset = (width * y + x) / 4, and write the given - color to the plane we selected above. Heed the active - page start selection. */ - vga[(unsigned)(widthBytes * y) + (x / 4) + actStart] = color; - - } - -byte getPixel_X(int x, int y) - { - /* Select the plane from which we must read the pixel color: */ - outpw(GRAC_ADDR, 0x04); - outpw(GRAC_ADDR+1, x & 3); - - return vga[(unsigned)(widthBytes * y) + (x / 4) + actStart]; - - } - -void set320x240x256_X(void) - { - /* Set the unchained version of mode 13h: */ - set320x200x256_X(); - - /* Modify the vertical sync polarity bits in the Misc. Output - Register to achieve square aspect ratio: */ - outp(0x3C2, 0xE3); - - /* Modify the vertical timing registers to reflect the increased - vertical resolution, and to center the image as good as - possible: */ - outpw(0x3D4, 0x2C11); /* turn off write protect */ - outpw(0x3D4, 0x0D06); /* vertical total */ - outpw(0x3D4, 0x3E07); /* overflow register */ - outpw(0x3D4, 0xEA10); /* vertical retrace start */ - outpw(0x3D4, 0xAC11); /* vertical retrace end AND wr.prot */ - outpw(0x3D4, 0xDF12); /* vertical display enable end */ - outpw(0x3D4, 0xE715); /* start vertical blanking */ - outpw(0x3D4, 0x0616); /* end vertical blanking */ - - /* Update mode info, so future operations are aware of the - resolution */ - height = 240; - - } - - -/*-----------XXXX-------------*/ - -///////////////////////////////////////////////////////////////////////////// -// // -// WaitRetrace() - This waits until you are in a Verticle Retrace. // -// // -///////////////////////////////////////////////////////////////////////////// -void wait_for_retrace(void) -{ - while (!(inp(STATUS_ADDR) & 0x08)); -} - -/*tile*/ -//king_crimson's code -void putColorBox_X(int x, int y, int w, int h, byte color) { - outp(0x3c4, 0x02); - - int curx, cury; - unsigned drawptr; - for (curx=x; curx<(x+w); curx++) { - outp(0x3c5, 0x01 << (curx & 3)); - drawptr = (unsigned)(widthBytes * y) + (curx / 4) + actStart; - for (cury=0; cury0) - boingy=1; - - for(int ti=0;ti> 2); - outp(0x3D4, Cols); - //setVisibleStart(visStart + (Cols * height)); - setVisibleStart(visStart + (Cols * width)); -} - ///////////////////////////////////////////////////////////////////////////// // // // setvideo() - This function Manages the video modes // @@ -332,15 +45,12 @@ void setvideo(/*byte mode, */int vq){ // enter mode mxInit(); mxSetMode( MX_320x240 ); - width=320; - height=240; -// mxSetVirtualScreen(width+(width/4), height+(height/4)); -// mxSetVirtualScreen(width*2, height*2); - //set320x240x256_X(); - mxSetVirtualScreen(560,420); -// mxSetVirtualScreen((640-(TILEWH*2)),(480-(TILEWH*2))); +// mxSetVirtualScreen(SW+(SW/4), SH+(SH/4)); +// mxSetVirtualScreen(SW*2, SH*2); + mxSetVirtualScreen(VW,VH); +// mxSetVirtualScreen((640-(TILEWH*4)),(480-(TILEWH*4))); mxSetClip(0); - //mxSetClipRegion(0, 0, width, height); + //mxSetClipRegion(0, 0, SW, SH); } } @@ -351,7 +61,7 @@ void setvideo(/*byte mode, */int vq){ // // ///////////////////////////////////////////////////////////////////////////// void cls(byte color, byte *Where){ - _fmemset(Where, color, width*(height*17)); + _fmemset(Where, color, VW*(VH)); } //color ‚Ä‚·‚Æ @@ -375,18 +85,18 @@ int colorz(){ //slow spectrum down void ssd(int svq){ - if(sy < height+1){ - if(sx < width+1){ + if(sy < SH+1){ + if(sx < SW+1){ //plotpixel(xx, yy, coor, vga); //ppf(sx, sy, coor, vga); - putPixel_X(sx, sy, coor); + mxPutPixel(sx, sy, coor); //printf("%d %d %d %d\n", sx, sy, svq, coor); sx++; }else sx = 0; - if(sx == width){ + if(sx == SW){ sy++; if(svq == 7) coor++; - if(sy == height && svq == 8) coor = rand()%NUM_COLORS; + if(sy == SH && svq == 8) coor = rand()%NUM_COLORS; } }else sy = 0; } @@ -394,18 +104,6 @@ void ssd(int svq){ /*-----------ding-------------*/ int ding(int q){ -/* if(yy(560/*-TILEWH*/)) xx=0; - if(yy>(420/*-TILEWH*/)) yy=0; -// } + if(q!=16){ + if(xx<0) xx=(VW/*-TILEWH*/); + if(yy<0) yy=(VH/*-TILEWH*/); + if(xx>(VW/*-TILEWH*/)) xx=0; + if(yy>(VH/*-TILEWH*/)) yy=0; + } //interesting effects if(q==16) @@ -515,26 +212,19 @@ int ding(int q){ tx+=xx+16; ty+=yy+16; mxPutPixel(tx, ty, coor); - //drawrect(tx, ty, tx+TILEWH, ty+TILEWH, coor); //printf("%d %d %d %d %d %d\n", xx, yy, tx, ty, TILEWH); // plot the pixel -//---- ppf(xx, yy, coor, vga); - }else /*if(xx>=0 && xx=0 && yy<(height*3))*/{ + }else{ // mxFillBox(xx, yy, TILEWH, TILEWH, coor, 0); -//++++0000 -// putPixel_X(xx, yy, coor); mxPutPixel(xx, yy, coor); } -//---- if(q==2) ppf(rand()%, rand()%height, 0, vga); -// if(q==2) putColorBox_X(rand()%width, rand()%(height*3), TILEWH, TILEWH, 0); -//++++0000 - if(q==2) mxPutPixel(rand()%width, rand()%(height*3), 0); - if(q==16) mxPutPixel(rand()%width, rand()%(height*3), 0); + if(q==2) mxPutPixel(rand()%SW, rand()%(SH*3), 0); + if(q==16) mxPutPixel(rand()%SW, rand()%(SH*3), 0); if(q==2||q==4||q==16){ bakax = rand()%3; bakay = rand()%3; } gq++; -//if(xx<0||xx>320||yy<0||yy>(height*3)) +//if(xx<0||xx>320||yy<0||yy>(SH*3)) // printf("%d %d %d %d %d %d\n", xx, yy, coor, bakax, bakay, getPixel_X(xx,yy)); // printf("%d\n", getPixel_X(xx,yy)); }else gq = LGQ; @@ -546,62 +236,8 @@ int ding(int q){ * The library testing routines follows below. */ - #ifdef TESTING -#include -#include - -void doTest(void) - { - int p, x, y, pages; - - /* This is the way to calculate the number of pages available. */ - pages = 65536L/(widthBytes*height); // apparently this takes the A000 address -// if(height==240) pages++; - -// printf("%d\n", pages); - - for (p = 0; p <= pages; ++p) - { - setActivePage(p); - - /* On each page draw a single colored border, and dump the palette - onto a small square about the middle of the page. */ - - //{ - for (x = 0; x <= width; ++x) - { -// putPixel_X(x, 0, p+1); - mxPutPixel(x, 0, p+1); - if(p!=pages) mxPutPixel(x, height-1, p+1); - else if(height==240) mxPutPixel(x, 99-1, p+1); - } - - for (y = 0; y <= height; ++y) - { - mxPutPixel(0, y, p+1); - if(p!=pages) mxPutPixel(width-1, y, p+1); - else if(height==240) mxPutPixel(width-1, y, p+1); - } - - for (x = 0; x < TILEWH; ++x) - for (y = 0; y < TILEWH; ++y) - mxPutPixel(x+(p+2)*16, y+(p+2)*TILEWH, x + y*TILEWH); - //} - - } - - /* Each pages will now contain a different image. Let the user cycle - through all the pages by pressing a key. */ - for (p = 0; p < pages; ++p) - { - setVisiblePage(p); - getch(); - } - - } - /* * Library test (program) entry point. */ @@ -617,19 +253,6 @@ int main(void) ypos=0; xdir=1; ydir=1; -// puts("First, have a look at the 320x200 mode. I will draw some rubbish"); -// puts("on all of the four pages, then let you cycle through them by"); -// puts("hitting a key on each page."); -// puts("Press a key when ready..."); -// getch(); - -// doTest(); - -// puts("Then, check out Mode X, 320x240 with 3 (and a half) pages."); -// puts("Press a key when ready..."); -// getch(); - -//++++0000 setvideo(1); // screen savers @@ -651,16 +274,28 @@ int main(void) } //end of screen savers //doTest(); - for (int x = 0; x < width; ++x) + for (int x = 0; x < VW; ++x) { mxPutPixel(x, 0, 15); - mxPutPixel(x, height-1, 15); + mxPutPixel(x, SH-1, 15); } - for (int y = 0; y < height; ++y) + for (int y = 0; y < VH; ++y) { mxPutPixel(0, y, 15); - mxPutPixel(width-1, y, 15); + mxPutPixel(SW-1, y, 15); + } + + getch(); + for (int x = 320; x < VW; ++x) + { + mxPutPixel(x, 0, 15); + mxPutPixel(x, VH-1, 15); } + for (int y = 240; y < VH; ++y) + { + mxPutPixel(0, y, 15); + mxPutPixel(VW-1, y, 15); + } getch(); while(!kbhit()){ // hScroll(1); @@ -670,18 +305,18 @@ int main(void) //for(int i=0;i239) || (xpos<1))xdir=-xdir; - if( (ypos>179) || (ypos<1))ydir=-ydir; // { Hit a boundry, change + //mxWaitRetrace(); + xpos+=xdir; + ypos+=ydir; + if( (xpos>(VW-SW-1)) || (xpos<1)){xdir=-xdir;} + if( (ypos>(VH-SH-1)) || (ypos<1)){ydir=-ydir;} // { Hit a boundry, change // direction! } //} } setvideo(0); - printf("wwww\n%dx%d\n", width,height); - printf("[%d]\n", mxGetVersion()); - puts("where to next? It's your move! wwww"); + printf("wwww\nResolution: %dx%d\n", SW,SH); + printf("Mode X Library Version: %d\n", mxGetVersion()); + //puts("where to next? It's your move! wwww"); printf("bakapi ver. 1.04.09.04\nis made by sparky4i†ƒÖ…j feel free to use it ^^\nLicence: GPL v2\n"); return 0; } diff --git a/16/dos_gfx.h b/16/dos_gfx.h index 8fd92704..6c7bbeea 100644 --- a/16/dos_gfx.h +++ b/16/dos_gfx.h @@ -16,7 +16,11 @@ // Size = 80 = 2 across, 2 down // Size = 160 = 4 across, 1 down*/ //#define VMEM 0xA000 // = vga -byte Xfont[2048]; +byte Xfont[2048]; +#define SW 320 +#define SH 240 +#define VW 560 +#define VH 416 //void drawChar(int x, int y, int color, byte c); //void drawText(int x, int y, int color, byte string); @@ -27,10 +31,10 @@ void cls(byte color, byte *Where); //void clearscr(); //void plotpixel(int x, int y, byte color, byte *Where); //void plotpixelfast(int x, int y, byte color, byte *Where); -void putPixel_X(int x, int y, byte color); -void putColorBox_X(int x, int y, int w, int h, byte color); -void vScroll(int rows); -void scrolly(int bong); +//void putPixel_X(int x, int y, byte color); +//void putColorBox_X(int x, int y, int w, int h, byte color); +//void vScroll(int rows); +//void scrolly(int bong); //void wait_for_retrace(void); // Waits for vertical retrace //void BlockMove(); //void eraseplayer(int x, int y); diff --git a/16/lib/intro/lib.c b/16/lib/intro/lib.c index 2ee39660..d0e7a83b 100644 --- a/16/lib/intro/lib.c +++ b/16/lib/intro/lib.c @@ -1,3 +1,249 @@ +/* + * LIB.C v1.2a + * + * by Robert Schmidt + * (C)1993 Ztiff Zox Softwear + * + * Simple graphics library to accompany the article + * + * INTRODUCTION TO MODE X. + * + * This library provides the basic functions for initializing and using + * unchained (planar) 256-color VGA modes. Currently supported are: + * + * - 320x200 + * - 320x240 + * + * Functions are provided for: + * + * - initializing one of the available modes + * - setting the start address of the VGA refresh data + * - setting active and visible display pages + * - writing and reading a single pixel to/from video memory + * + * The library is provided as a demonstration only, and is not claimed + * to be particularly efficient or suited for any purpose. It has only + * been tested with Borland C++ 3.1 by the author. Comments on success + * or disaster with other compilers are welcome. + * + * This file is public domain. Do with it whatever you'd like, but + * please don't distribute it without the article. + * + * Thanks go out to various helpful netters who spotted the 0xE7 bug + * in the set320x240x256() function! + * + * Modified by sparky4 so it can be compiled in open watcom ^^ + */ + + + + +/* + * We 'require' a large data model simply to get rid of explicit 'far' + * pointers and compiler specific '_fmemset()' functions and the likes. + */ +#if !defined(__COMPACT__) +# if !defined(__LARGE__) +# if !defined(__HUGE__) +# error Large data model required! Try compiling with 'wcc -0 -ml lib.c'. +# endif +# endif +#endif + +#include +#include +#include + +//code from old library! +/*srcÂ¥libÂ¥*/ +#include "dos_gfx.h" + +int old_mode; +//color てすと +int gq = LGQ; +//てすと +int q = 0; +int bakax = 0, bakay = 0; +cord xx = rand()&0%320, yy = rand()&0%240, sx = 0, sy = 0; +byte coor; + +/* + * Comment out the following #define if you don't want the testing main() + * to be included. + */ +#define TESTING + +/* + * Define the port addresses of some VGA registers. + */ +#define CRTC_ADDR 0x3d4 /* Base port of the CRT Controller (color) */ + +#define SEQU_ADDR 0x3c4 /* Base port of the Sequencer */ +#define GRAC_ADDR 0x3ce /* Base port of the Graphics Controller */ +#define STATUS_ADDR 0x3DA + + +/* + * Make a far pointer to the VGA graphics buffer segment. Your compiler + * might not have the MK_FP macro, but you'll figure something out. + */ +byte *vga = (byte *) MK_FP(0xA000, 0); + + +/* + * width and height should specify the mode dimensions. widthBytes + * specify the width of a line in addressable bytes. + */ +unsigned width, height, widthBytes; + +/* + * actStart specifies the start of the page being accessed by + * drawing operations. visStart specifies the contents of the Screen + * Start register, i.e. the start of the visible page. + */ +unsigned actStart, visStart; + +/* + * set320x200x256_X() + * sets mode 13h, then turns it into an unchained (planar), 4-page + * 320x200x256 mode. + */ +void set320x200x256_X(void) + { + union REGS r; + + /* Set VGA BIOS mode 13h: */ + r.x.ax = 0x0013; + int86(0x10, &r, &r); + + /* Turn off the Chain-4 bit (bit 3 at index 4, port 0x3c4): */ + outpw(SEQU_ADDR, 0x0604); + + /* Turn off word mode, by setting the Mode Control register + of the CRT Controller (index 0x17, port 0x3d4): */ + outpw(CRTC_ADDR, 0xE317); + + /* Turn off doubleword mode, by setting the Underline Location + register (index 0x14, port 0x3d4): */ + outpw(CRTC_ADDR, 0x0014); + + /* Clear entire video memory, by selecting all four planes, then + writing 0 to entire segment. */ + outpw(SEQU_ADDR, 0x0F02); + memset(vga+1, 0, 0xffff); /* stupid size_t exactly 1 too small */ + vga[0] = 0; + + /* Update the global variables to reflect dimensions of this + mode. This is needed by most future drawing operations. */ + width = 320; + height = 200; + + /* Each byte addresses four pixels, so the width of a scan line + in *bytes* is one fourth of the number of pixels on a line. */ + widthBytes = width / 4; + + /* By default we want screen refreshing and drawing operations + to be based at offset 0 in the video segment. */ + actStart = visStart = 0; + + } + +/* + * setActiveStart() tells our graphics operations which address in video + * memory should be considered the top left corner. + */ +void setActiveStart(unsigned offset) + { + actStart = offset; + } + +/* + * setVisibleStart() tells the VGA from which byte to fetch the first + * pixel when starting refresh at the top of the screen. This version + * won't look very well in time critical situations (games for + * instance) as the register outputs are not synchronized with the + * screen refresh. This refresh might start when the high byte is + * set, but before the low byte is set, which produces a bad flicker. + */ +void setVisibleStart(unsigned offset) + { + visStart = offset; + outpw(CRTC_ADDR, 0x0C); /* set high byte */ + outpw(CRTC_ADDR+1, visStart >> 8); + outpw(CRTC_ADDR, 0x0D); /* set low byte */ + outpw(CRTC_ADDR+1, visStart & 0xff); + } + +/* + * setXXXPage() sets the specified page by multiplying the page number + * with the size of one page at the current resolution, then handing the + * resulting offset value over to the corresponding setXXXStart() + * function. The first page is number 0. + */ +void setActivePage(int page) + { + setActiveStart(page * widthBytes * height); + } + +void setVisiblePage(int page) + { + setVisibleStart(page * widthBytes * height); + } + +void putPixel_X(int x, int y, byte color) + { + /* Each address accesses four neighboring pixels, so set + Write Plane Enable according to which pixel we want + to modify. The plane is determined by the two least + significant bits of the x-coordinate: */ + outp(0x3c4, 0x02); + outp(0x3c5, 0x01 << (x & 3)); + + /* The offset of the pixel into the video segment is + offset = (width * y + x) / 4, and write the given + color to the plane we selected above. Heed the active + page start selection. */ + vga[(unsigned)(widthBytes * y) + (x / 4) + actStart] = color; + + } + +byte getPixel_X(int x, int y) + { + /* Select the plane from which we must read the pixel color: */ + outpw(GRAC_ADDR, 0x04); + outpw(GRAC_ADDR+1, x & 3); + + return vga[(unsigned)(widthBytes * y) + (x / 4) + actStart]; + + } + +void set320x240x256_X(void) + { + /* Set the unchained version of mode 13h: */ + set320x200x256_X(); + + /* Modify the vertical sync polarity bits in the Misc. Output + Register to achieve square aspect ratio: */ + outp(0x3C2, 0xE3); + + /* Modify the vertical timing registers to reflect the increased + vertical resolution, and to center the image as good as + possible: */ + outpw(0x3D4, 0x2C11); /* turn off write protect */ + outpw(0x3D4, 0x0D06); /* vertical total */ + outpw(0x3D4, 0x3E07); /* overflow register */ + outpw(0x3D4, 0xEA10); /* vertical retrace start */ + outpw(0x3D4, 0xAC11); /* vertical retrace end AND wr.prot */ + outpw(0x3D4, 0xDF12); /* vertical display enable end */ + outpw(0x3D4, 0xE715); /* start vertical blanking */ + outpw(0x3D4, 0x0616); /* end vertical blanking */ + + /* Update mode info, so future operations are aware of the + resolution */ + height = 240; + + } + /* * The library testing routines follows below. */ @@ -14,9 +260,6 @@ void doTest(void) /* This is the way to calculate the number of pages available. */ pages = 65536L/(widthBytes*height); // apparently this takes the A000 address -// if(height==240) pages++; - -// printf("%dÂ¥n", pages); for (p = 0; p <= pages; ++p) { @@ -28,22 +271,21 @@ void doTest(void) //{ for (x = 0; x <= width; ++x) { -// putPixel_X(x, 0, p+1); - mxPutPixel(x, 0, p+1); - if(p!=pages) mxPutPixel(x, height-1, p+1); - else if(height==240) mxPutPixel(x, 99-1, p+1); + putPixel_X(x, 0, p+1); + if(p!=pages) putPixel_X(x, height-1, p+1); + else if(height==240) putPixel_X(x, 99-1, p+1); } for (y = 0; y <= height; ++y) { - mxPutPixel(0, y, p+1); - if(p!=pages) mxPutPixel(width-1, y, p+1); - else if(height==240) mxPutPixel(width-1, y, p+1); + putPixel_X(0, y, p+1); + if(p!=pages) putPixel_X(width-1, y, p+1); + else if(height==240) putPixel_X(width-1, y, p+1); } for (x = 0; x < TILEWH; ++x) for (y = 0; y < TILEWH; ++y) - mxPutPixel(x+(p+2)*16, y+(p+2)*TILEWH, x + y*TILEWH); + putPixel_X(x+(p+2)*16, y+(p+2)*TILEWH, x + y*TILEWH); //} } @@ -64,15 +306,11 @@ void doTest(void) int main(void) { - int key,d,xpos,ypos,xdir,ydir; + int key,d; //short int temp; // main variables d=1; // switch variable key=4; // default screensaver number - xpos=0; - ypos=0; - xdir=1; - ydir=1; // puts("First, have a look at the 320x200 mode. I will draw some rubbish"); // puts("on all of the four pages, then let you cycle through them by"); // puts("hitting a key on each page."); @@ -85,7 +323,6 @@ int main(void) // puts("Press a key when ready..."); // getch(); -//++++0000 setvideo(1); // screen savers @@ -106,33 +343,9 @@ int main(void) ding(key); } //end of screen savers - //doTest(); - for (int x = 0; x < width; ++x) - { - mxPutPixel(x, 0, 15); - mxPutPixel(x, height-1, 15); - } - for (int y = 0; y < height; ++y) - { - mxPutPixel(0, y, 15); - mxPutPixel(width-1, y, 15); - } - getch(); + doTest(); while(!kbhit()){ -// hScroll(1); -// scrolly(1); -// vScroll(1); -// delay(100); - //for(int i=0;i239) || (xpos<1))xdir=-xdir; - if( (ypos>179) || (ypos<1))ydir=-ydir; // { Hit a boundry, change - // direction! } - //} + } setvideo(0); printf("wwwwÂ¥n%dx%dÂ¥n", width,height); -- 2.39.2