]> 4ch.mooo.com Git - 16.git/blobdiff - 16/dos_gfx.cpp
modified: 16/Project 16.bfproject
[16.git] / 16 / dos_gfx.cpp
index 3853cd3d7cb5bb89427fb95ab64cbf0213be4988..ad4fae22f5455ec13e893e678bf77b175945960f 100644 (file)
@@ -45,7 +45,7 @@
 #if !defined(__COMPACT__)\r
 # if !defined(__LARGE__)\r
 #  if !defined(__HUGE__)\r
-#   error Large data model required!  Try compiling with 'bcc -ml lib.c'.\r
+#   error Large data model required!  Try compiling with 'wcc -0 -ml lib.c'.\r
 #  endif\r
 # endif\r
 #endif\r
@@ -57,7 +57,6 @@
 //code from old library!\r
 /*src\lib\*/\r
 #include "dos_gfx.h"\r
-#include "lib\x\modex.h"\r
 \r
 int old_mode;\r
 //color \82Ä\82·\82Æ\r
@@ -65,7 +64,7 @@ int gq = LGQ;
 //\82Ä\82·\82Æ\r
 int q = 0;\r
 int bakax = 0, bakay = 0;\r
-int xx = rand()&0%320, yy = rand()&0%240, sx = 0, sy = 0;\r
+cord xx = rand()&0%320, yy = rand()&0%240, sx = 0, sy = 0;\r
 byte coor;\r
 \r
 /*\r
@@ -81,6 +80,14 @@ byte coor;
 \r
 #define SEQU_ADDR         0x3c4   /* Base port of the Sequencer */\r
 #define GRAC_ADDR         0x3ce   /* Base port of the Graphics Controller */\r
+#define STATUS_ADDR     0x3DA\r
+\r
+unsigned char *RowsX[600];\r
+unsigned char write_plane, read_plane;\r
+unsigned short text_mask[16] = { 0x0002, 0x0102, 0x0202, 0x0302,\r
+                                 0x0402, 0x0502, 0x0602, 0x0702,\r
+                                 0x0802, 0x0902, 0x0A02, 0x0B02,\r
+                                 0x0C02, 0x0D02, 0x0E02, 0x0F02 };\r
 \r
 \r
 /*\r
@@ -89,7 +96,6 @@ byte coor;
  */\r
 byte *vga = (byte *) MK_FP(0xA000, 0);\r
 \r
-//fontAddr = getFont();\r
 \r
 /*\r
  * width and height should specify the mode dimensions.  widthBytes\r
@@ -146,6 +152,46 @@ void set320x200x256_X(void)
                /* By default we want screen refreshing and drawing operations\r
                   to be based at offset 0 in the video segment. */\r
                actStart = visStart = 0;\r
+\r
+               /*\r
+--------------------\r
+HORIZONTAL SCROLLING\r
+--------------------\r
+Horizontal scrolling is essentially the same as vertical scrolling, all\r
+you do is increment or decrement the VGA offset register by 1 instead of\r
+80 as with vertical scrolling.\r
+\r
+However, horizontal scrolling is complicated by two things\r
+\r
+  1. Incrementing the offset register by one actually scrolls by FOUR\r
+     pixels (and there are FOUR planes on the VGA, what a coincidence)\r
+\r
+  2. You can't draw the image off the screen and then scroll it on\r
+     because of the way the VGA wraps to the next row every 80 bytes\r
+     (80 bytes * 4 planes = 320 pixels), if you tried it, you would\r
+     actually be drawing to the other side of the screen (which is\r
+     entirely visible)\r
+\r
+I'll solve these problems one at a time.\r
+\r
+Firstly, to get the VGA to scroll by only one pixel you use the horizontal\r
+pixel panning (HPP) register. This register resides at\r
+\r
+  PORT:     3C0H\r
+  INDEX:    13h\r
+\r
+and in real life, you use it like this\r
+\r
+----------------- Pixel Panning ---------------\r
+IN PORT 3DAH (this clears an internal\r
+  flip-flop of the VGA)\r
+OUT 13H TO PORT 3C0H\r
+OUT value TO PORT 3C0H (where "value" is the\r
+  number of pixels to offset)\r
+-----------------------------------------------\r
+*/\r
+\r
+mxSetVirtualScreen(480,360);\r
                }\r
 \r
 /*\r
@@ -246,7 +292,148 @@ void set320x240x256_X(void)
 \r
 \r
 /*-----------XXXX-------------*/\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//                                                                         //\r
+// WaitRetrace() - This waits until you are in a Verticle Retrace.         //\r
+//                                                                         //\r
+/////////////////////////////////////////////////////////////////////////////\r
+void wait_for_retrace(void)\r
+{\r
+    while (!(inp(STATUS_ADDR) & 0x08));\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//                                                                         //\r
+// MoveTo() - This moves to position X*4 on a chain 4 screen.              //\r
+//                Note: As soon as I find documentation, this function     //\r
+//                will be better documented.  - Snowman                    //\r
+//                                                                         //\r
+/////////////////////////////////////////////////////////////////////////////\r
+/*\r
+void MoveTo (word X, word Y) {\r
+\r
+//     word O = Y*SIZE*2+X;\r
+       word O = Y*widthBytes*2+X;\r
+\r
+  asm {\r
+    mov    bx, [O]\r
+    mov    ah, bh\r
+    mov    al, 0x0C\r
+\r
+    mov    dx, 0x3D4\r
+    out    dx, ax\r
+\r
+    mov    ah, bl\r
+    mov    al, 0x0D\r
+    mov    dx, 0x3D4\r
+    out    dx, ax\r
+  }\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; MXPN.ASM - Panning function\r
+; Copyright (c) 1993,1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+;WARN    PRO\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC  mxPan\r
+\r
+EXTRN   mxWaitDisplay   : FAR\r
+EXTRN   mxStartAddress  : FAR\r
+\r
+MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
+                ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+EXTRN   mx_BytesPerLine : WORD\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Moves the screen.\r
+;\r
+; Input:\r
+;       X, Y    = new X, Y coordinates of view screen\r
+; Output:\r
+;       none\r
+;\r
+mxPan           PROC    FAR\r
+        ARG     Y:WORD,                 \\r
+                X:WORD                  = ARG_SIZE\r
+        ASSUME  ds:NOTHING\r
+        .enter  0\r
+\r
+        mov     ax, [Y]\r
+        mul     [mx_BytesPerLine]\r
+        mov     dx, [X]\r
+        shr     dx, 1\r
+        shr     dx, 1\r
+        add     ax, dx\r
+        push    ax                      ; Push the start address\r
+        call    mxWaitDisplay\r
+        call    mxStartAddress\r
+\r
+        mov     dx, 03DAh               ; Set the pixel pan register\r
+        in      al, dx\r
+        mov     dx, 03C0h\r
+        mov     al, 33h\r
+        out     dx, al\r
+        mov     al, BYTE PTR [X]\r
+        and     al, 3\r
+        shl     al, 1\r
+        out     dx, al\r
+\r
+        xor     ax, ax\r
+        .leave  ARG_SIZE\r
+mxPan           ENDP\r
+\r
+MX_TEXT         ENDS\r
+END\r
+\r
+\r
+}\r
+\r
+//Procedure Play;\r
+void Play()\r
+{\r
+  int loop1,loop2;\r
+  int xpos,ypos,xdir,ydir;\r
+  //int ch;\r
+//   for(loop1=1;loop1<=62;loop1++)\r
+     //Pal ((char)loop1,(char)loop1,(char)0,(char)(62-loop1)); // { This sets up the pallette for the pic }\r
+\r
+   moveto(0,0,Size); // { This moves the view to the top left hand corner }\r
+\r
+//   for(loop1=0;loop1<=3;loop1++)\r
+//     for(loop2=0;loop2<=5;loop2++)\r
+//       Putpic (loop1*160,loop2*66); // { This places the picture all over the\r
+                                    //  chain-4 screen }\r
+//   getch();\r
+//   ch=0x0;\r
+//   xpos=rand (78)+1;\r
+//   ypos=rand (198)+1; // { Random start positions for the view }\r
+       xpos=0;\r
+       ypos=0;\r
+   xdir=1;\r
+   ydir=1;\r
+//   while(1)\r
+//   {\r
+     WaitRetrace();     //     { Take this out and watch the screen go crazy! }\r
+     moveto (xpos,ypos,Size);\r
+     xpos=xpos+xdir;\r
+     ypos=ypos+ydir;\r
+     if( (xpos>79)  || (xpos<1))xdir=-xdir;\r
+     if( (ypos>199) || (ypos<1))ydir=-ydir; // { Hit a boundry, change\r
+                                            //    direction! }\r
+//     if(_bios_keybrd(_KEYBRD_READY))ch=getch();\r
+//      if(ch==0x71)break; // 'q'\r
+//      if(ch==0x1b)break; // 'ESC'\r
+//   }\r
+}\r
+*/\r
 /*tile*/\r
+//king_crimson's code\r
 void putColorBox_X(int x, int y, int w, int h, byte color) {\r
        outp(0x3c4, 0x02);\r
 \r
@@ -268,80 +455,197 @@ void vScroll(int rows)
        setVisibleStart(visStart + (rows * width));\r
 }\r
 \r
-/*OFFSET = 0\r
-WHILE NOT FINISHED DO\r
-  OFFSET = OFFSET + 80\r
-  IF OFFSET >= (200 * 80) THEN OFFSET = 0\r
-  DRAW TO ROW 200\r
-  SET VGA OFFSET = OFFSET\r
-  DRAW TO ROW -1 (was row 0 before scroll)\r
-END WHILE*//*\r
-void scrolly(){\r
-       int OFFSET = 0\r
-       WHILE NOT FINISHED DO\r
-               OFFSET = OFFSET + 80\r
-               IF OFFSET >= (240 * 80) THEN OFFSET = 0\r
-               RAW TO ROW 240\r
-               SET VGA OFFSET = OFFSET\r
-               DRAW TO ROW -1 (was row 0 before scroll)\r
+void scrolly(int bongy)\r
+{\r
+       int boingy=0;\r
+       if(bongy<0)\r
+               boingy=-1;\r
+       else if(bongy>0)\r
+               boingy=1;\r
+\r
+       for(int ti=0;ti<TILEWH;ti++)\r
+       {\r
+               delay(1);\r
+               vScroll(boingy);\r
        }\r
 }\r
+\r
+//king_crimson's code\r
+void hScroll(int Cols) {\r
+       wait_for_retrace();\r
+       outp(0x3C0, 0x13);\r
+       outp(0x3C0, Cols & 3);\r
+       outp(0x3D4, 0x13);\r
+       outp(0x3D5, Cols >> 2);\r
+       outp(0x3D4, Cols);\r
+       //setVisibleStart(visStart + (Cols * height));\r
+       setVisibleStart(visStart + (Cols * width));\r
+}\r
+\r
+/*To implement smooth horizontal scrolling, you would do the following:\r
+-------------- Horizontal Scrolling ------------\r
+FOR X = 0 TO 319 DO\r
+  SET HPP TO ( X MOD 4 )\r
+  SET VGA OFFSET TO ( X/4 )\r
+END FOR\r
+------------------------------------------------\r
+\r
+Okay, no problem at all (although I think you might have to fiddle\r
+around with the HPP a bit to get it right...try different values and\r
+see what works :).\r
+\r
+So, the next problem is with drawing the images off the screen where\r
+they aren't visible and then scrolling them on!!! As it turns out,\r
+there's yet ANOTHER register to accomplish this. This one's called the\r
+offset register (no, not the one I was talking about before, that one\r
+was actually the "start address" register) and it's at\r
+\r
+  PORT:     3D4H/3D5H\r
+  OFFSET:   13H\r
+\r
+and here's how to use it\r
+\r
+-------------- Offset Register ---------------\r
+OUT 13H TO PORT 3D4H\r
+OUT value TO PORT 3D5H\r
+----------------------------------------------\r
+\r
+Now, what my VGA reference says is that this register holds the number\r
+of bytes (not pixels) difference between the start address of each row.\r
+So, in X-mode it normally contains the value 80 (as we remember,\r
+80 bytes * 4 planes = 320 pixels). This register does not affect the\r
+VISIBLE width of the display, only the difference between addresses on\r
+each row.\r
+\r
+When we scroll horizontally, we need a little bit of extra working space\r
+so we can draw off the edge of the screen.\r
+\r
+Perhaps a little diagram will clarify it. The following picture is of a\r
+standard X-mode addressing scheme with the OFFSET register set to 80.\r
+\r
+      ROW    OFFSET\r
+      0         0 ========================\r
+      1        80 [                      ]\r
+      2       160 [                      ]\r
+      ..       .. [       VISIBLE        ]\r
+                  [        SCREEN        ]\r
+                  [                      ]\r
+                  [                      ]\r
+      ..       .. [                      ]\r
+      199   15920 ========================\r
+\r
+and the next diagram is of a modified addressing scheme with the OFFSET\r
+register set to 82 (to give us 4 extra pixels on each side of the screen)\r
+\r
+ROW    OFFSET\r
+0         0 ------========================------\r
+1        82 |   V [                      ]   V |\r
+2       164 |   I [                      ]   I |\r
+..       .. | N S [      VISIBLE         ] N S |\r
+            | O I [       SCREEN         ] O I |\r
+            | T B [                      ] T B |\r
+            |   L [                      ]   L |\r
+..       .. |   E [                      ]   E |\r
+199   16318 ------========================------\r
+\r
+Beautiful!!!\r
+\r
+As with vertical scrolling, however, you still have the problem of when\r
+you reach the bottom of page 4...and it's fixed in the same manner.\r
+\r
+I haven't actually managed to get infinite horizontal scrolling working,\r
+but the method I have just stated will give you a horizontal scrolling\r
+range of over 200 screens!!!! So if you need more (which is extremely\r
+unlikely), figure it out yourself.\r
+\r
+\r
+------------------\r
+COMBINED SCROLLING\r
+------------------\r
+To do both horizontal and vertical scrolling, all you have to do is combine\r
+the two methods with a few little extras (it's always the way isn't it).\r
+\r
+You have to start off with the original screen on the current page and the\r
+next page as well. When you scroll horizontally, you have to draw the edge\r
+that's coming in to the screen to BOTH pages (that means you'll be drawing\r
+the incoming edge twice, once for each page). You do this so that when you\r
+have scrolled vertically down through a complete page, you can jump back\r
+to the first page and it will (hopefully) have an identical copy, and you\r
+can then continue scrolling again.\r
+\r
+I'm sorry about this being so confusing but it's a bit difficult to explain.\r
+\r
+\r
 */\r
-//---------------------------------------------------\r
-//\r
-// Use the bios to get the address of the 8x8 font\r
-//\r
-// You need a font if you are going to draw text.\r
-//\r
-\r
-int far *\r
-getFont()\r
+int loadfontX(char *fname)\r
 {\r
-       union REGPACK rg;\r
-       int seg;\r
-       int off;\r
-       memset(&rg, 0, sizeof(rg));\r
-\r
-       rg.w.ax = 0x1130;\r
-       rg.h.bh = 0x03;\r
-       intr(0x10, &rg);\r
-       seg = rg.w.es;\r
-       off = rg.w.bp;\r
-       \r
-\r
-       return (int far *)MK_FP(seg, off);\r
+       FILE *fp;\r
+\r
+       fp = fopen(fname, "rb");\r
+\r
+       if (fp == NULL) {\r
+               return 0;\r
+       } else {\r
+               fread(Xfont, 8, 256, fp);\r
+               fclose(fp);\r
+               return 1;\r
+       }\r
 }\r
 \r
-void drawChar(int x, int y, int color, byte c)\r
+void putchX(cord x, cord y, char c, byte color)\r
 {\r
-               int i, j;\r
-               int mask;\r
-               int far *font = getFont() + (c * 8);\r
-\r
-               for (i = 0; i < 8; i++)\r
-               {\r
-                               mask = *font;\r
-                               for (j = 0; j < 8; j++)\r
-                               {\r
-                                               if (mask & 0x80)\r
-                                               {\r
-                                                               //pixel(x + j, y + i, color);\r
-                                                               putPixel_X(x + j, y + i, color);\r
-                                               }\r
-                                               mask <<= 1;\r
-                               }\r
-                               font++;\r
-               }\r
+       int i;\r
+       byte *vga_ptr;\r
+       byte *font_ptr;\r
+       byte temp;\r
+\r
+       // 8x8 font\r
+       vga_ptr = RowsX[y << 3] + (x << 1) + actStart;\r
+       write_plane = -1;\r
+\r
+       font_ptr = Xfont + (c << 3);\r
+\r
+       i=8;\r
+       while (i--) {\r
+               temp = *font_ptr++;\r
+               outpw(SEQU_ADDR, text_mask[temp & 0x0F]);\r
+               *vga_ptr++ = color;\r
+\r
+               outpw(SEQU_ADDR, text_mask[temp >> 4]);\r
+               *vga_ptr-- = color;\r
+               vga_ptr += widthBytes;\r
+       }\r
 }\r
 \r
-void drawText(int x, int y, int color, byte string)\r
+void putstringX(cord x, cord y, char *str, byte color)\r
 {\r
-               while (string)\r
-               {\r
-                               drawChar(x, y, color, string);\r
-                               x += 8;\r
-                               string++;\r
+       int i, skip;\r
+       byte *vga_ptr;\r
+       byte *font_ptr;\r
+       byte c, temp;\r
+\r
+       // 8x8 font\r
+       vga_ptr = RowsX[y << 3] + (x << 1) + actStart;\r
+       write_plane = -1;\r
+\r
+       skip = 2 - (widthBytes << 3);\r
+\r
+       while (c = *str++) {\r
+               font_ptr = Xfont + (c << 3);\r
+\r
+               i=8;\r
+               while (i--) {\r
+                       temp = *font_ptr++;\r
+                       outpw(SEQU_ADDR, text_mask[temp & 0x0F]);\r
+                       *vga_ptr++ = color;\r
+\r
+                       outpw(SEQU_ADDR, text_mask[temp >> 4]);\r
+                       *vga_ptr-- = color;\r
+                       vga_ptr += widthBytes;\r
                }\r
+\r
+               vga_ptr += skip;\r
+       }\r
 }\r
 \r
 /////////////////////////////////////////////////////////////////////////////\r
@@ -419,18 +723,18 @@ void ssd(int svq){
 /*-----------ding-------------*/\r
 int ding(int q){\r
 \r
-       if(yy<height){\r
+//     if(yy<height){\r
                setActivePage(0);\r
                setVisiblePage(0);\r
-       }
+/*     }\r
        if((height)<yy<(height*2)){\r
                setActivePage(1);\r
                setVisiblePage(1);\r
-       }
+       }\r
        if((height*2)<yy<(height*3)){\r
                setActivePage(2);\r
                setVisiblePage(2);\r
-       }\r
+       }*/\r
                int d3y;\r
 \r
 //++++  if(q <= 4 && q!=2 && gq == BONK-1) coor = rand()%HGQ;\r
@@ -446,18 +750,18 @@ int ding(int q){
                                }\r
                }\r
 \r
-               if(q == 8){ colorz(); return gq; }else\r
-               if(q == 10){ ssd(q); /*printf("%d\n", coor);*/ }else\r
-               if(q == 5){ colortest(); return gq; }else\r
-               if(q == 11){ colorz(); delay(100); return gq; }\r
-               if(q == 6){\r
+               if(q==8){ colorz(); return gq; }else\r
+               if(q==10){ ssd(q); /*printf("%d\n", coor);*/ }else\r
+               if(q==5){ colortest(); return gq; }else\r
+               if(q==11){ colorz(); delay(100); return gq; }\r
+               if(q==6){\r
                                coor = rand()%NUM_COLORS;\r
 //----           cls(coor, vaddr);\r
                                cls(coor, vga);\r
                                //updatevbuff();\r
                }\r
 \r
-               if(q == 7 || q== 9){\r
+               if(q==7||q==9){\r
                                if(gq < HGQ){\r
                                                if(q == 7) ssd(q);\r
                                                if(q == 9){ ssd(q); coor++; }\r
@@ -510,23 +814,27 @@ int ding(int q){
                                                                }\r
                                                }else{\r
                                                                if(!bakax){\r
-                                                                               xx-=TILEWH;\r
+//                                                                             xx-=TILEWH;\r
+                                                                               xx--;\r
                                                                }else if(bakax>1){\r
-                                                                               xx+=TILEWH;\r
+//                                                                             xx+=TILEWH;\r
+                                                                               xx++;\r
                                                                }\r
                                                                if(!bakay){\r
-                                                                               yy-=TILEWH;\r
+//                                                                             yy-=TILEWH;\r
+                                                                               yy--;\r
                                                                }else if(bakay>1){\r
-                                                                               yy+=TILEWH;\r
+//                                                                             yy+=TILEWH;\r
+                                                                               yy++;\r
                                                                }\r
                                                }\r
                                }\r
                                // fixer\r
 //                             if(q!=16){\r
 //if(q!=16)\r
-                                               if(xx<0) xx=width;\r
+                                               if(xx<(0/*-TILEWH*/)) xx=(width/*+TILEWH*/);\r
                                                if(yy<0) yy=(height*3);\r
-                                               if(xx>width) xx=0;\r
+                                               if(xx>(width/*+TILEWH*/)) xx=(0/*-TILEWH*/);\r
                                                if(yy>(height*3)) yy=0;\r
 //                             }\r
 \r
@@ -543,16 +851,19 @@ int ding(int q){
                                // plot the pixel\r
 //----           ppf(xx, yy, coor, vga);\r
                                }else /*if(xx>=0 && xx<width && yy>=0 && yy<(height*3))*/{\r
-                                       putColorBox_X(xx, yy, TILEWH, TILEWH, coor);\r
-//++++0000                                     putPixel_X(xx, yy, coor);\r
+//                                     putColorBox_X(xx, yy, TILEWH, TILEWH, coor);\r
+//++++0000\r
+                                       putPixel_X(xx, yy, coor);\r
                                } \r
 \r
 //----           if(q==2) ppf(rand()%, rand()%height, 0, vga);\r
-                               if(q==2) putColorBox_X(rand()%width, rand()%(height*3), TILEWH, TILEWH, 0);\r
+//                             if(q==2) putColorBox_X(rand()%width, rand()%(height*3), TILEWH, TILEWH, 0);\r
+//++++0000\r
+                               if(q==2) putPixel_X(rand()%width, rand()%(height*3), 0);\r
                                if(q==16) putPixel_X(rand()%width, rand()%(height*3), 0);\r
                                if(q==2||q==4||q==16){ bakax = rand()%3; bakay = rand()%3; }\r
                                gq++;\r
-//if(xx<0||xx>320||yy<0||yy>240)\r
+//if(xx<0||xx>320||yy<0||yy>(height*3))\r
 //       printf("%d %d %d %d %d %d\n", xx, yy, coor, bakax, bakay, getPixel_X(xx,yy));\r
 //       printf("%d\n", getPixel_X(xx,yy));\r
 //0000\r
@@ -630,6 +941,7 @@ void doTest(void)
 int main(void)\r
                {\r
                int key,d;\r
+               //short int temp;\r
                // main variables\r
                d=1; // switch variable\r
                key=4; // default screensaver number\r
@@ -647,7 +959,12 @@ int main(void)
 \r
 //++++0000\r
                setvideo(1);\r
-//mxInit();\r
+               /*temp = loadfontX("vga8x8.fnt");\r
+\r
+               if (temp) {\r
+                       putstringX(0, 0, "bakapi!", 2);\r
+               }\r
+               getch();*/\r
 // screen savers\r
 \r
 /*while(d!=0){ // on!\r
@@ -668,16 +985,21 @@ int main(void)
                }\r
                //end of screen savers\r
                doTest();\r
+//             getch();\r
 \r
                while(!kbhit()){ // conditions of screen saver\r
-                       vScroll(-1);\r
+//                     hScroll(1);\r
+//                     scrolly(1);\r
+                       vScroll(1);\r
+//                     delay(100);\r
+//                     Play();\r
                }\r
 //++++0000\r
                setvideo(0);\r
 //mxTerm();\r
 //mxGetVersion();\r
                puts("Where to next?  It's your move! wwww");\r
-               printf("bakapi ver. 1.04.09.02\nis made by sparky4\81i\81\86\83Ö\81\85\81j feel free to use it ^^\nLicence: GPL v2\n");\r
+               printf("bakapi ver. 1.04.09.03\nis made by sparky4\81i\81\86\83Ö\81\85\81j feel free to use it ^^\nLicence: GPL v2\n");\r
                return 0;\r
                }\r
 \r