X-Git-Url: http://4ch.mooo.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=16%2Fdos_gfx.cpp;h=cd45ae844c027764f7d62e89d2339b2b91b62139;hb=ec9980912cecfec9f20e6b41fb86c6af6af51b0f;hp=e11055f036e2118de56626db33b40355074a43c4;hpb=d9b4c65a44fa017633ddbd622fd7d980bb7da609;p=16.git diff --git a/16/dos_gfx.cpp b/16/dos_gfx.cpp index e11055f0..cd45ae84 100644 --- a/16/dos_gfx.cpp +++ b/16/dos_gfx.cpp @@ -32,7 +32,7 @@ * 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 ^^ + * Modified by sparky4 so it can be compiled in open watcom ^^ */ @@ -45,7 +45,7 @@ #if !defined(__COMPACT__) # if !defined(__LARGE__) # if !defined(__HUGE__) -# error Large data model required! Try compiling with 'bcc -ml lib.c'. +# error Large data model required! Try compiling with 'wcc -0 -ml lib.c'. # endif # endif #endif @@ -57,6 +57,7 @@ //code from old library! /*src\lib\*/ #include "dos_gfx.h" +#include "lib\x\modex.h" int old_mode; //color ‚Ä‚·‚Æ @@ -145,6 +146,48 @@ void set320x200x256_X(void) /* By default we want screen refreshing and drawing operations to be based at offset 0 in the video segment. */ actStart = visStart = 0; + + /* +-------------------- +HORIZONTAL SCROLLING +-------------------- +Horizontal scrolling is essentially the same as vertical scrolling, all +you do is increment or decrement the VGA offset register by 1 instead of +80 as with vertical scrolling. + +However, horizontal scrolling is complicated by two things + + 1. Incrementing the offset register by one actually scrolls by FOUR + pixels (and there are FOUR planes on the VGA, what a coincidence) + + 2. You can't draw the image off the screen and then scroll it on + because of the way the VGA wraps to the next row every 80 bytes + (80 bytes * 4 planes = 320 pixels), if you tried it, you would + actually be drawing to the other side of the screen (which is + entirely visible) + +I'll solve these problems one at a time. + +Firstly, to get the VGA to scroll by only one pixel you use the horizontal +pixel panning (HPP) register. This register resides at + + PORT: 3C0H + INDEX: 13h + +and in real life, you use it like this + +----------------- Pixel Panning --------------- +IN PORT 3DAH (this clears an internal + flip-flop of the VGA) +OUT 13H TO PORT 3C0H +OUT value TO PORT 3C0H (where "value" is the + number of pixels to offset) +----------------------------------------------- +*/ +// +// inp(0x3DA); +// outp(0x3C0, 0x13); + } /* @@ -245,39 +288,303 @@ void set320x240x256_X(void) /*-----------XXXX-------------*/ -/*tile*/ -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; cury= (200 * 80) THEN OFFSET = 0 - DRAW TO ROW 200 - SET VGA OFFSET = OFFSET - DRAW TO ROW -1 (was row 0 before scroll) -END WHILE*//* -void scrolly(){ - int OFFSET = 0 - WHILE NOT FINISHED DO - OFFSET = OFFSET + 80 - IF OFFSET >= (240 * 80) THEN OFFSET = 0 - RAW TO ROW 240 - SET VGA OFFSET = OFFSET - DRAW TO ROW -1 (was row 0 before scroll) - } + +//Procedure Play; +void Play() +{ + int loop1,loop2; + int xpos,ypos,xdir,ydir; + //int ch; +// for(loop1=1;loop1<=62;loop1++) + //Pal ((char)loop1,(char)loop1,(char)0,(char)(62-loop1)); // { This sets up the pallette for the pic } + + moveto(0,0,Size); // { This moves the view to the top left hand corner } + +/* for(loop1=0;loop1<=3;loop1++) + for(loop2=0;loop2<=5;loop2++) + Putpic (loop1*160,loop2*66); // { This places the picture all over the + // chain-4 screen } + getch(); + ch=0x0;*/ +// xpos=rand (78)+1; +// ypos=rand (198)+1; // { Random start positions for the view } + xpos=0; + ypos=0; + xdir=1; + ydir=1; +// while(1) +// { + WaitRetrace(); // { Take this out and watch the screen go crazy! } + moveto (xpos,ypos,Size); + xpos=xpos+xdir; + ypos=ypos+ydir; + if( (xpos>79) || (xpos<1))xdir=-xdir; + if( (ypos>199) || (ypos<1))ydir=-ydir; // { Hit a boundry, change + // direction! } +// if(_bios_keybrd(_KEYBRD_READY))ch=getch(); +// if(ch==0x71)break; // 'q' +// if(ch==0x1b)break; // 'ESC' +// } } + +/*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*/); + //setVisibleStart(visStart + (Cols * height)); + setVisibleStart(visStart + (Cols * width)); +} + +/*To implement smooth horizontal scrolling, you would do the following: +-------------- Horizontal Scrolling ------------ +FOR X = 0 TO 319 DO + SET HPP TO ( X MOD 4 ) + SET VGA OFFSET TO ( X/4 ) +END FOR +------------------------------------------------ + +Okay, no problem at all (although I think you might have to fiddle +around with the HPP a bit to get it right...try different values and +see what works :). + +So, the next problem is with drawing the images off the screen where +they aren't visible and then scrolling them on!!! As it turns out, +there's yet ANOTHER register to accomplish this. This one's called the +offset register (no, not the one I was talking about before, that one +was actually the "start address" register) and it's at + + PORT: 3D4H/3D5H + OFFSET: 13H + +and here's how to use it + +-------------- Offset Register --------------- +OUT 13H TO PORT 3D4H +OUT value TO PORT 3D5H +---------------------------------------------- + +Now, what my VGA reference says is that this register holds the number +of bytes (not pixels) difference between the start address of each row. +So, in X-mode it normally contains the value 80 (as we remember, +80 bytes * 4 planes = 320 pixels). This register does not affect the +VISIBLE width of the display, only the difference between addresses on +each row. + +When we scroll horizontally, we need a little bit of extra working space +so we can draw off the edge of the screen. + +Perhaps a little diagram will clarify it. The following picture is of a +standard X-mode addressing scheme with the OFFSET register set to 80. + + ROW OFFSET + 0 0 ======================== + 1 80 [ ] + 2 160 [ ] + .. .. [ VISIBLE ] + [ SCREEN ] + [ ] + [ ] + .. .. [ ] + 199 15920 ======================== + +and the next diagram is of a modified addressing scheme with the OFFSET +register set to 82 (to give us 4 extra pixels on each side of the screen) + +ROW OFFSET +0 0 ------========================------ +1 82 | V [ ] V | +2 164 | I [ ] I | +.. .. | N S [ VISIBLE ] N S | + | O I [ SCREEN ] O I | + | T B [ ] T B | + | L [ ] L | +.. .. | E [ ] E | +199 16318 ------========================------ + +Beautiful!!! + +As with vertical scrolling, however, you still have the problem of when +you reach the bottom of page 4...and it's fixed in the same manner. + +I haven't actually managed to get infinite horizontal scrolling working, +but the method I have just stated will give you a horizontal scrolling +range of over 200 screens!!!! So if you need more (which is extremely +unlikely), figure it out yourself. + + +------------------ +COMBINED SCROLLING +------------------ +To do both horizontal and vertical scrolling, all you have to do is combine +the two methods with a few little extras (it's always the way isn't it). + +You have to start off with the original screen on the current page and the +next page as well. When you scroll horizontally, you have to draw the edge +that's coming in to the screen to BOTH pages (that means you'll be drawing +the incoming edge twice, once for each page). You do this so that when you +have scrolled vertically down through a complete page, you can jump back +to the first page and it will (hopefully) have an identical copy, and you +can then continue scrolling again. + +I'm sorry about this being so confusing but it's a bit difficult to explain. + + */ //--------------------------------------------------- // @@ -285,7 +592,7 @@ void scrolly(){ // // You need a font if you are going to draw text. // - +/* int far * getFont() { @@ -335,7 +642,7 @@ void drawText(int x, int y, int color, byte string) string++; } } - +*/ ///////////////////////////////////////////////////////////////////////////// // // // setvideo() - This function Manages the video modes // @@ -368,7 +675,7 @@ void setvideo(/*byte mode, */int vq){ // // ///////////////////////////////////////////////////////////////////////////// void cls(byte color, byte *Where){ - _fmemset(Where, color, width*(height*17)); + _fmemset(Where, color, width*(height*17)); } //color ‚Ä‚·‚Æ @@ -410,8 +717,19 @@ void ssd(int svq){ /*-----------ding-------------*/ int ding(int q){ + +// if(yy1){ - xx+=TILEWH; +// xx+=TILEWH; + xx++; } if(!bakay){ - yy-=TILEWH; +// yy-=TILEWH; + yy--; }else if(bakay>1){ - yy+=TILEWH; +// yy+=TILEWH; + yy++; } } } // fixer - //if(q!=16){ - if(xx<0) xx=width; - if(yy<0) yy=height; - if(xx>width) xx=0; - if(yy>height) yy=0; - //} +// if(q!=16){ +//if(q!=16) + if(xx<(0/*-TILEWH*/)) xx=(width/*+TILEWH*/); + if(yy<0) yy=(height*3); + if(xx>(width/*+TILEWH*/)) xx=(0/*-TILEWH*/); + if(yy>(height*3)) yy=0; +// } //interesting effects if(q==16) @@ -522,17 +845,20 @@ int ding(int q){ // plot the pixel //---- ppf(xx, yy, coor, vga); - }else if(xx>=0 && xx=0 && PixelY=0 && xx=0 && yy<(height*3))*/{ +// putColorBox_X(xx, yy, TILEWH, TILEWH, coor); +//++++0000 + putPixel_X(xx, yy, coor); + } + //---- if(q==2) ppf(rand()%, rand()%height, 0, vga); - if(q==2) putColorBox_X(rand()%width, rand()%height, TILEWH, TILEWH, 0); - if(q==16) putPixel_X(rand()%width, rand()%height, 0); +// if(q==2) putColorBox_X(rand()%width, rand()%(height*3), TILEWH, TILEWH, 0); +//++++0000 + if(q==2) putPixel_X(rand()%width, rand()%(height*3), 0); + if(q==16) putPixel_X(rand()%width, rand()%(height*3), 0); if(q==2||q==4||q==16){ bakax = rand()%3; bakay = rand()%3; } gq++; -//if(xx<0||xx>320||yy<0||yy>240) +//if(xx<0||xx>320||yy<0||yy>(height*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)); //0000 @@ -588,7 +914,7 @@ void doTest(void) putPixel_X(x+(p+2)*16, y+(p+2)*16, x + y*16); //} - drawText(0, 0, 15, p); +// drawText(0, 0, 15, p); } @@ -625,7 +951,9 @@ int main(void) // puts("Press a key when ready..."); // getch(); +//++++0000 setvideo(1); +//mxInit(); // screen savers /*while(d!=0){ // on! @@ -642,13 +970,24 @@ int main(void) } }*/ // else off while(!kbhit()){ // conditions of screen saver - ding(4); + ding(4); } //end of screen savers - doTest(); +// doTest(); + getch(); + + while(!kbhit()){ // conditions of screen saver +// hScroll(1); +// scrolly(1); +// delay(100); + Play(); + } +//++++0000 setvideo(0); +//mxTerm(); +//mxGetVersion(); puts("Where to next? It's your move! wwww"); - printf("bakapi ver. 1.04.09a\nis made by sparky4i†ƒÖ…j feel free to use it ^^\nLicence: GPL v2\n"); + printf("bakapi ver. 1.04.09.03\nis made by sparky4i†ƒÖ…j feel free to use it ^^\nLicence: GPL v2\n"); return 0; }