www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1997/10/12/17:16:38

From: quintero AT swbell DOT net
Newsgroups: comp.os.msdos.djgpp
Subject: HELP!! DJGPP WON'T WORK!
Date: Sun, 12 Oct 1997 10:00:57 -0700
Organization: Southwestern Bell Internet Services, Richardson, TX
Lines: 726
Message-ID: <34410249.2D03@swbell.net>
Reply-To: quintero AT swbell DOT net
NNTP-Posting-Host: ppp-207-193-27-136.snantx.swbell.net
Mime-Version: 1.0
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

This is a multi-part message in MIME format.

--------------28B24C3C2DA3
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

Hello DJGPP users,
I have a serious problem.  I downloaded all the necessary files for
DJGPP and downloaded RHIDE 1.3c as well.  Everytime I use DJGPP under
DOS, it won't compile my programs (not even the simple hello.cc).  It
always gives me errors about the <iostream.h> and a couple others like
e:/dj/bin/ld.exe can't find crt0.o.  I don't understand it! I have
everything in my paths
(path=c:\dos;c:\pcci5(antivirus);d:\;e:\dj\bin;e:\)
and the autoexec.bat and config.sys is configured to the way the FAQ
told me.  Here's a sample problem program that I have tried in vain to
compile:
/* Cheap program... */

#include<iostream.h>
int main()
{
clrscr(); 	// it also gives me : Warning: Implicit use of clrscr(..)
cout<<"If this does not work, I am throwing my computer";
cout<<" Out the window!!"<<'\n'; // I am but a novice C++ programmer. :(
return 0;
}

also, I can't compile Allegro 2.2 using the makefile.  It gives me an
error about "can't make use (something like that) of 'Badtarget'"
I really need help on this! Many thanks to all who help me!

Sergio Peña

P.S. attached is a 3d line program that one of my freinds gave me to
test out my paths:k2.cpp.

--------------28B24C3C2DA3
Content-Type: text/plain; charset=us-ascii; name="K2.CPP"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="K2.CPP"

// line3d.cpp
// program for first six weeks







// include files
// some are specific to DJGPP
#include <sys/nearptr.h>
#include <go32.h> /* for _dos_ds */
#include <dos.h>
#include <pc.h>
#include <dpmi.h>
#include <math.h>






//
//
// defines
//
//


/* palette */
#define PALETTE_MASK        0x3c6
#define PALETTE_REGISTER_RD 0x3c7
#define PALETTE_REGISTER_WR 0x3c8
#define PALETTE_DATA        0x3c9
#define CHAR_WIDTH  8
#define CHAR_HEIGHT 8

#define GRAPHICS        0x013
#define TEXT            0x03

/* key_table indexes */
#define UP           0
#define DOWN         1
#define LEFT         2
#define RIGHT        3
#define LSTRAFE      4
#define RSTRAFE      5
#define INIT         6
#define ESCAPE       7

#define NUMLINES     20

//
enum ptflags {INSIGHT,BEHIND,PERIPHERAL};





//
// global vars
//
unsigned char raw_key, key_table[8];
_go32_dpmi_seginfo old_key_handler,new_key_handler;
char *video_buffer = (char *)0xa0000;
char *rom_char_set = (char *)0xffa6e;
char *double_buffer;








//
//
// classes and structures
//
//
typedef struct rgb_color_type {
        unsigned char red;
        unsigned char green;
        unsigned char blue;
} rgb_color;

// structure for 3d coordinates
struct PV3D  {
        float x, y, z;
};

// structure that holds information on the location and perspective
// of the eye: the perspective from which the 3d objects are rendered
struct Perspective  {
        PV3D place, lsght, lx, ly;
        float ls_angle, lx_angle;
} eye;

// the class for 3d lines
class Line3d  {
public:
       PV3D p1, p2;
       char color;
       void render();
}lines[NUMLINES]; 








//
//
// prototype section
//
//
void do_keys(void);  // I wrote
void get_lines(void);  // I wrote
inline void init_eye(void);  // I wrote
void key_handler(void); // I altered


void key_init(void); 
void key_delete(void);
void clear(char*, char);
void wait_for_vsync(void);
void show_double_buffer(void);
void char_blt(int,int,int,unsigned char);
void string_blt(int,int,int,char*);
void set_video_mode(int);
void put_pixel(short int, short int, char);
unsigned char get_pixel(short int, short int);
void get_palette_register(unsigned char, rgb_color);
void set_palette_register(unsigned char, rgb_color);
void line(short int, short int, short int, short int, char);

// end of prototypes









//
//
// this is the data for the lines
// in this format: x1, y1, z1, x2, y2, z2, color for a line from p1 to p2
// 
// 
float line_array [NUMLINES][7] =
                                 // a cube, blue
                                 {{10, 5, 5,10, 5,-5,1},
                                  {10,-5, 5,10,-5,-5,1},
                                  {10, 5, 5,10,-5, 5,1},
                                  {10, 5,-5,10,-5,-5,1},

                                  {20, 5, 5,20, 5,-5,1},
                                  {20,-5, 5,20,-5,-5,1},
                                  {20, 5, 5,20,-5, 5,1},
                                  {20, 5,-5,20,-5,-5,1},

                                  {10, 5, 5,20, 5, 5,1},
                                  {10,-5, 5,20,-5, 5,1},
                                  {10,-5,-5,20,-5,-5,1},
                                  {10, 5,-5,20, 5,-5,1},

                                 // a pyraymid, green
                                  {60, 5, 0,60,-3, 5,2},
                                  {60,-3, 5,60,-3,-5,2},
                                  {60,-3,-5,60, 5, 0,2},

                                  {60, 5, 0,70, 0, 0,2},
                                  {60,-3, 5,70, 0, 0,2},
                                  {60,-3,-5,70, 0, 0,2},



                                 // some lines, light blue
                                  {80, 5, 0,80, 10, 0,3},
                                  {80,-5, 0,80,-10, 0,3}};
                                 

// rendering function for the line class
// doesn't clip partially visible lines, but
// that is the next thing I will do
// this uses some 3d math to render a line to the sreen
void Line3d::render()  {

     PV3D pvect; // temporary vector to do all calculations with
     int x1, y1, x2, y2; // eventually will be screen coordinates
                         // size of screen is 320*200

     // makes pvect a vector from the eye to the point to be rendered
     pvect.x = p1.x - eye.place.x;
     pvect.y = p1.y - eye.place.y;
     pvect.z = p1.z - eye.place.z;

     // quits if point is behind the eye (angle >= 180)
     if ((pvect.x * eye.lsght.x + pvect.y * eye.lsght.y + 
     pvect.z * eye.lsght.z) > 0)
     {
       // makes pvect a unit vector
       float mag = sqrt( pow(pvect.x,2) + pow(pvect.y,2) + pow(pvect.z,2) );
       pvect.x /= mag;
       pvect.y /= mag;
       pvect.z /= mag;

       // projects pvect onto lx (the x orientation) then multiplies and
       // shifts for suitible sreen coordinates
       // note : projection values greater than .5 and less
       // than -.5 will be off the screen
       
       x1 = (int)
        (480 * (pvect.x * eye.lx.x + pvect.y * eye.lx.y +
        pvect.z * eye.lx.z) + 160);
       
       // projects pvect onto ly (the y orientation) then multiplies and
       // shifts for suitible sreen coordinates
       // note : projection values greater than .5 or less
       // than -.5  will be off the screen
       
       y1 = (int)
        (300 * (pvect.x * eye.ly.x + pvect.y * eye.ly.y +
        pvect.z * eye.ly.z) + 100);

     // second point
     pvect.x = p2.x - eye.place.x;
     pvect.y = p2.y - eye.place.y;
     pvect.z = p2.z - eye.place.z;

     if ((pvect.x * eye.lsght.x + pvect.y * eye.lsght.y + 
     pvect.z * eye.lsght.z) > 0)
     {
       mag = sqrt( pow(pvect.x,2) +  pow(pvect.y,2) +  pow(pvect.z,2) );

       pvect.x /= mag;
       pvect.y /= mag;
       pvect.z /= mag;
       
       x2 = (int)
        (480 * (pvect.x * eye.lx.x + pvect.y * eye.lx.y +
        pvect.z * eye.lx.z) + 160);

       y2 = (int)
        (300 * (pvect.x * eye.ly.x + pvect.y * eye.ly.y +
        pvect.z * eye.ly.z) + 100);

       // ensures that points are within bounds of the screen
       if ((x1 >= 0) && (x1 <= 320) &&
           (x2 >= 0) && (x2 <= 320) &&
           (y1 >= 0) && (y1 <= 200) &&
           (y2 >= 0) && (y2 <= 200)) 
               line(x1, y1, x2, y2, color);
     }
    }
}



void main(void)
{
  // all the initialization
  unsigned count;
  __djgpp_nearptr_enable();
  video_buffer += __djgpp_conventional_base;
  rom_char_set += __djgpp_conventional_base;
  set_video_mode(GRAPHICS);

  /* setup double buffer */
  double_buffer = (char *)malloc(64000);

  // now for a 3d line demonstration
  init_eye();
  get_lines();

  // clear key table
  key_table[UP] = key_table[DOWN] = key_table[LEFT] = key_table[RIGHT] =
  key_table[LSTRAFE] = key_table[RSTRAFE] = key_table[ESCAPE] =
  key_table[INIT] = 0;

  // install keyboard handler
  key_init();
  
  // instructions

        for (float i = 0; i <= 50; i += .3) {
           clear(double_buffer,0);
           string_blt(140,(int)(10+i),((int)i+1)%10+1,"WELCOME");
           string_blt((int)(90+i),70,((int)i+2)%10+1,"TO");
           string_blt((int)(210-i),70,((int)i+6)%10+1,"THE GREAT");
           string_blt(150,(int)(130-i),((int)i+9)%10+1,"LINE3D.CPP");
           show_double_buffer();
        };

           string_blt(30,100,1,"PUSH: I to go forward");
           string_blt(30,110,2,"PUSH: K to go back");
           string_blt(30,120,1,"PUSH: J to turn left");
           string_blt(30,130,2,"PUSH: L to turn right");
           string_blt(30,140,1,"PUSH: U to sidestep left");
           string_blt(30,150,2,"PUSH: O to sidestep right");
           string_blt(30,160,1,"PUSH: P to return to begining");
           string_blt(30,170,1,"PUSH: Esc to exit");

           string_blt(30,190,1,"PUSH: Esc now to begin");

           show_double_buffer();



  while (!key_table[ESCAPE]){};
  key_table[ESCAPE] = 0;



  // here the real stuff begins
  while (!key_table[ESCAPE])  {
     clear(double_buffer,0);
     do_keys();
     for(int l = 0; l < NUMLINES; l++) {
      lines[l].render();
     }

     // shows lsght and lx orientation
     line(280,20,(int)(280+5*eye.lsght.z),(int)(20-5*eye.lsght.x),1);
     line(280,20,(int)(280+5*eye.lx.z),(int)(20-5*eye.lx.x),2);
     
     show_double_buffer();
  };

  key_delete();
  set_video_mode(TEXT);
  __djgpp_nearptr_disable();
}


//
//
// functions
//
//




// makes changes on eye data according to keystrokes
void do_keys()  {
     if (key_table[UP]) {
        eye.place.x += .3 * eye.lsght.x;
        eye.place.y += .3 * eye.lsght.y;
        eye.place.z += .3 * eye.lsght.z;
        string_blt(10,10,1,"FORWARD");
     };

     if (key_table[DOWN])  {
        eye.place.x -= 0.3 * eye.lsght.x;
        eye.place.y -= 0.3 * eye.lsght.y;
        eye.place.z -= 0.3 * eye.lsght.z;
        string_blt(30,10,2,"BACK");
     };

     if (key_table[LSTRAFE])  {
        eye.place.x -= 0.3 * eye.lx.x;
        eye.place.y -= 0.3 * eye.lx.y;
        eye.place.z -= 0.3 * eye.lx.z;
        string_blt(250,10,2,"LSTRAFE");
     };

     if (key_table[RSTRAFE])  {
        eye.place.x += 0.3 * eye.lx.x;
        eye.place.y += 0.3 * eye.lx.y;
        eye.place.z += 0.3 * eye.lx.z;
        string_blt(180,10,2,"RSTRAFE");
     };

     if (key_table[INIT])  {
        init_eye();
        string_blt(20,10,2,"CENTERING");
     };

     if (key_table[LEFT])  {
        eye.ls_angle -= .03;
        eye.lx_angle -= .03;

        eye.lsght.x = cos(eye.ls_angle);
        eye.lsght.z = sin(eye.ls_angle);
        eye.lx.x = cos(eye.lx_angle);
        eye.lx.z = sin(eye.lx_angle);

        string_blt(70,10,3,"LEFT");
     };

     if (key_table[RIGHT]) {
        eye.ls_angle += .03;
        eye.lx_angle += .03;

        eye.lsght.x = cos(eye.ls_angle);
        eye.lsght.z = sin(eye.ls_angle);
        eye.lx.x = cos(eye.lx_angle);
        eye.lx.z = sin(eye.lx_angle);

        string_blt(100,10,4,"RIGHT");
     };
};


// reads data from line_array into the array of lines
void get_lines(void)  {
   for(int i = 0; i < NUMLINES; i++)  {
    lines[i].p1.x = line_array[i][0];
    lines[i].p1.y = line_array[i][1];
    lines[i].p1.z = line_array[i][2];
    lines[i].p2.x = line_array[i][3];
    lines[i].p2.y = line_array[i][4];
    lines[i].p2.z = line_array[i][5];
    lines[i].color = (char)(line_array[i][6]);

   }
}

// initializes the eye to the origin, looking down the x axis, and upright
inline void init_eye() {
     eye.ls_angle = 0;
     eye.lx_angle = asin(1);

     eye.place.x = 0;
     eye.place.y = 0;
     eye.place.z = 0;

     eye.lsght.x = 1;
     eye.lsght.y = 0;
     eye.lsght.z = 0;

     eye.lx.x = 0;
     eye.lx.y = 0;
     eye.lx.z = 1;

     eye.ly.x = 0;
     eye.ly.y = 1;
     eye.ly.z = 0;
}







//
//
// I took most of the following stuff from DJGPP tutorial pages on the 
// internet
// 
//




// I changed this one slightly. It now accepts more keystrokes
// than it originally did
void key_handler(void)
{
        unsigned char al, ah;

        asm("cli; pusha");
        
        raw_key = inportb(0x60);
                
        al = inportb(0x61); 
        al |= 0x82;
        outportb(0x61, al);       
        al &= 0x7f;
        outportb(0x61, al);

        /* you have the option of putting this outside */
        switch(raw_key) {
                /* make codes */
                case 23: /* up */
                        key_table[UP] = 1;
                        break;
                case 37: /* down */
                        key_table[DOWN] = 1;
                        break;
                case 36: /* left */
                        key_table[LEFT] = 1;
                        break;
                case 38: /* right */
                        key_table[RIGHT] = 1;
                        break;
                case 22: /* left strafe */
                        key_table[LSTRAFE] = 1;
                        break;
                case 24: /* right strafe */
                        key_table[RSTRAFE] = 1;
                        break;
                case  1: /* escape */
                        key_table[ESCAPE] = 1;
                        break;
                case 25: /* center eye */
                        key_table[INIT] = 1;
                        break;
                   
                /* break codes = make code + 128 */
                case 151: /* up release */
                        key_table[UP] = 0;
                        break;
                case 165: /* down release */
                        key_table[DOWN] = 0;
                        break;
                case 164: /* left release */
                        key_table[LEFT] = 0;
                        break;
                case 166: /* right release */
                        key_table[RIGHT] = 0;
                        break;
                case 150: /* stop lstrafe */
                        key_table[LSTRAFE] = 0;
                        break;
                case 152: /* stop right strafe */
                        key_table[RSTRAFE] = 0;
                        break;
                case 153: /* stop center*/
                        key_table[INIT] = 0;
                        break;

                default:
                        break;
        }

        outportb(0x20, 0x20);
        asm("popa; sti");
}

void key_init(void) /* function to swap state */
{
        new_key_handler.pm_offset   = (int)key_handler;
        new_key_handler.pm_selector = _go32_my_cs();
        _go32_dpmi_get_protected_mode_interrupt_vector(0x9, &old_key_handler);
        _go32_dpmi_allocate_iret_wrapper(&new_key_handler);
        _go32_dpmi_set_protected_mode_interrupt_vector(0x9,&new_key_handler);
}

void key_delete(void)
{
        _go32_dpmi_set_protected_mode_interrupt_vector(0x9,&old_key_handler);
}

void clear(char *buffer, char color)
{
        memset(buffer,color,64000);
}

void wait_for_vsync(void)
{
        while (inportb(0x3da) & 0x08); /* vga is in retrace */
        while (!(inportb(0x3da) & 0x08)); /* wait for start of retrace */
}

void show_double_buffer(void)
{
        wait_for_vsync();
        memcpy((char *)video_buffer,(char *)double_buffer,64000);
}


void char_blt(int x, int y, int color, unsigned char c)
{
        int offset, x2, y2;
        char *work_char;
        unsigned char bit_mask = 0x80;

        work_char = rom_char_set + c * CHAR_HEIGHT;

        offset = (y << 8) + (y << 6) + x;

        for(y2=0; y2<CHAR_HEIGHT; y2++) {
                bit_mask = 0x80;
                for(x2=0; x2<CHAR_WIDTH; x2++) {
                        if((*work_char & bit_mask))
                                double_buffer[offset+x2] = color;
                        bit_mask = (bit_mask >> 1);
                }
                offset += 320;
                work_char++;
        }
}

void string_blt(int x, int y, int color, char *string)
{
        int index;

        for(index=0; string[index] != 0; index++) {
                char_blt(x+(index<<3),y,color,string[index]);
        }
}

void set_video_mode(int mode)
{
        union REGS regs;

        regs.x.ax = mode;
        int86(0x10, &regs, &regs);
}

void put_pixel(short int x, short int y, char color)
{
        double_buffer[(y << 8) + (y << 6) + x] = color;
}

unsigned char get_pixel(short int x, short int y)
{
        return double_buffer[(y << 8) + (y << 6) + x];
}
 void get_palette_register(unsigned char index, rgb_color *color)
{
        outportb(PALETTE_MASK,0xff);
        outportb(PALETTE_REGISTER_RD,index);
        color->red = inportb(PALETTE_DATA);
        color->green = inportb(PALETTE_DATA);
        color->blue = inportb(PALETTE_DATA);
}

void set_palette_register(unsigned char index, rgb_color *color)
{
        outportb(PALETTE_MASK,0xff);
        outportb(PALETTE_REGISTER_WR,index);
        outportb(PALETTE_DATA,color->red);
        outportb(PALETTE_DATA,color->green);
        outportb(PALETTE_DATA,color->blue);
}

void line(short int x1, short int y1, short int x2, short int y2, char color)
{
        short int dx, dy, sdx, sdy, x, y, px, py;

        /* the change in x and y */
        dx = x2 - x1;
        dy = y2 - y1;

        /* signs of dx and dy, for getting absolute value */
        /* and for moving our pen */
        sdx = (dx < 0) ? -1 : 1;
        sdy = (dy < 0) ? -1 : 1;

        /* the values to be used for incrementing/decrementing counters */
        dx = sdx * dx + 1;
        dy = sdy * dy + 1;

        /* the counters */
        x = y = 0;

        /* the pen */
        px = x1;
        py = y1;

        if (dx >= dy) { /* x axis s major */
                for (x = 0; x < dx; x++) {
                        double_buffer[(py << 8) + (py << 6) + px] = color;
                        y += dy;
                        if (y >= dx) {
                                y -= dx;
                                py += sdy;
                        }
                        px += sdx;
                }
        } else { /* y axis is major */
                for (y = 0; y < dy; y++) {
                        double_buffer[(py << 8) + (py << 6) + px] = color;
                        x += dx;
                        if (x >= dy) {
                                x -= dy;
                                px += sdx;
                        }
                        py += sdy;
                }
        }
}
--------------28B24C3C2DA3--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019