Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Vanhemmat koodit ja XP

Xtreme [26.04.2005 22:00:30]

#

Asiana on siis tuollainen, vanhempien grafiikanpiirto koodien toiminta XP:ssä, olen vasta alkanut tutkimaan ja opettelemaan grafiikan ohjelmointia, muuten olen ohjelmoinut melko paljon, mutta kysymys siis olisi tuollaisesta esimerkistä eräästä tutorialista, jonka tahtoisin saada toimimaan XP:ssä...

#include <iostream.h>  // stream output
#include <stdlib.h>    // for function rand()
#include <conio.h>     //              kbhit()
#include <stdio.h>     // file input, i don't like streams for file input :)
#include "vga.h"
#include "timer.h"

// this handles all the graphics
VGA *vga;

// our timing module
TIMER *timer;

/*
 * the blending procedure... calculates an itermediary image given 2 other
 * pictures and a blending coefficient (from 0 to 256), and dumps the result
 * to the temporary buffer
 */
void blendImage( unsigned char *image1, unsigned char *image2, int coef )
{
// loop for all pixels
   for (int i=0; i<64000; i++)
   {
    // calculate the interpolated value in fixed point
       vga->page_draw[i] = image1[i] + ( ( image2[i] - image1[i] ) * coef >> 8 );
   }
}

// the main program
int main()
{
// set mode 320x200x8
    vga = new VGA;
// setup a greyscale palette
    for (int i=0; i<256; i++)
    {
        vga->SetColour( i, i>>2, i>>2, i>>2 );  //  i>>2 is equivalent to i/4
    }
// load the 2 greyscale images that we will blend
    unsigned char *pic1 = new (unsigned char)[64000],
                  *pic2 = new (unsigned char)[64000];
// load the simple logo
    FILE *raw_file = fopen( "picture1.raw", "rb" );
    fread( pic1, 1, 64000, raw_file );
    fclose( raw_file );
// load an old postcard of my hometown. Montbrison, Loire, France
    raw_file = fopen( "mtbrison.raw", "rb" );
    fread( pic2, 1, 64000, raw_file );
    fclose( raw_file );
// start the timer
    timer = new TIMER;
    long long startTime = timer->getCount(), frameCount = 0;
// run the main loop
    while (!kbhit())
    {
    // get a time value within the range 0..1023 with a bit mask
       int testVal = (timer->getCount()>>14)&0x3ff;
      // just draw image 1
         if (testVal<256) memcpy( vga->page_draw, pic1, 64000 );
      // or fade image 1 to image 2
         else if (testVal<512) blendImage( pic1, pic2, testVal-256 );
      // or just draw image 2
         else if (testVal<768) memcpy( vga->page_draw, pic2, 64000 );
      // or fade image 2 to image 1
         else blendImage( pic2, pic1, testVal-768 );
    // dump our temporary buffer to the screen
       vga->Update();
    // we've just draw a frame
       frameCount++;
    }
// calculate total running time
    long long totalTime = timer->getCount() - startTime;
// and turn off the timer
    delete (timer);
// now get FPS
    float FPS = (float)(frameCount)*1193180.0f / (float)(totalTime);
// return to text mode
    delete (vga);
// free memory
    delete [] (pic1);
    delete [] (pic2);

    cout << "                             The Art Of" << endl;
    cout << "                         D E M O M A K I N G " << endl << endl;
    cout << "                       by Alex J. Champandard" << endl << endl;
    cout << "        information." << endl;
    cout << endl << FPS << " frames per second." << endl;

    return 0;
}

Antaa siis General Protection errorin kun koitan ajaa, ohjelmaan siis sisältyy myös VGA, sekä Timer tiedostot.

peran [26.04.2005 23:26:33]

#

Ilmeisesti ohjelmasi yrittää käyttää keskeytyksiä mennäkseen VGA-tilaan ja kirjoittaa suoraan videorammiin.
Näitä XP ei sulata sellaisenaan, koska se ei ole Windows-ohjelmointia.
Kiertää tätä voi ajamalla WIN95-yhteensopivuustilalla.
Luo .exe:lle pikakuvake ja ko. pikakuvakkeesta ominaisuudet ja niistä yhteensopivuus.

Xtreme [27.04.2005 10:42:10]

#

Niinhän siinä tehdään, tai pyskurin kautta piirretään, mutta kuitenkin, ei toiminut edes Win 95 yhteensopivuudella,vaan vieläkin antaa GPF:n...

Meitsi [27.04.2005 16:09:54]

#

Jos tuo on dosille tehty voit käyttää vaikka DosBoxia sen emulointiin...

Xtreme [27.04.2005 16:27:07]

#

on käännetty DJGPP:llä alunperinkin, eikä silti worki yhteensopivuustilassa!...No nyt sain toimimaan DosBoxin kautta sen kun lisäsi CSDPMI:n. Mikseiköhän tuo toimi sitten Win 95 yhteensopivuudella.

pukki [03.05.2005 23:57:08]

#

Itse olen saanut ihan hyvin toimimaan vanhempia koodeja XP:llä, kunhan ne on vaan käännetty jollain 16-bittisellä kääntäjällä. Eli kaikki suorat näyttömuistin räpläykset suun muut on toimineet ilman ongelmia.

PIT:in / kellokeskeytyksien kanssa on ollut nikottelua (esim. toimii liian hitaasti).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta