[cc65] Newbie question: memcpy

Date view Thread view Subject view

From: Tim Schürmann (tischuer_at_web.de)
Date: 2003-01-13 12:41:51


Hallo!

I try to backup a hires graphic in memory by using malloc/memcpy. Why
does the following code won't work?
As you can see, i'm using loadkoala to exclude any other errors.

------------------------ snip -------------------------------------


... header-files ...

unsigned char loadtoram(unsigned char lfn, unsigned char *dest, unsigned
int length) {...}

#define POKE(A,X) (*(unsigned char *)A) = (X)
#define PEEK(A) (*(unsigned char *)A)

unsigned char *filename = "cyberwing.koa";

int main (void)
{

    unsigned char dev;
    unsigned char addr[2];
    unsigned char* bitmap_buffer; /* graphic buffer */
    unsigned char* screen_buffer;
    unsigned char* color_buffer;

    /* Allocating mem for backup */
    bitmap_buffer=(unsigned char*)malloc(8000);
    if(bitmap_buffer==NULL) exit(1);
    screen_buffer=(unsigned char*)malloc(1000);
    if(screen_buffer==NULL) exit(1);
    color_buffer=(unsigned char*)malloc(1000);
    if(color_buffer==NULL) exit(1);

    /* Clear the screen, set white on black */
    bordercolor (COLOR_BLACK);
    bgcolor (COLOR_BLACK);
    textcolor (COLOR_GRAY3);
    cursor (0);
    clrscr ();

/* load routines */

    dev = PEEK(0x00ba); /* get current device number */

    /* open the file */
    if (cbm_open(1, dev, 2, filename)) {...}

    /* read file load address */
    if (cbm_read(1, &addr, 2) != 2) {...}

    /* make sure load address is $4400 or $6000 */
    if (addr[0] != 0 || (addr[1] != 0x44 && addr[1] != 0x60)) {...}

    /* load bitmap data */
    if (loadtoram(1, (unsigned char *)bitmap_buffer, 8000)) {...}
    memcpy ((void*)0x2000, bitmap_buffer, 8000);

    /* load screen data */
    if (loadtoram(1, (unsigned char *)screen_buffer, 1000)) {...}
    memcpy ((void*)0x0400, screen_buffer, 1000);

    /* load colour ram */
    if (loadtoram(1, (unsigned char*)color_buffer, 1000)) {...}
    memcpy ((void*)0xd800, color_buffer, 1000);

    /* load background colour into $d021 */
    if (loadtoram(1, (unsigned char *)0xd021, 1)) {...}

    /* done */
    cbm_close(1);

    POKE(0xd011, 0x3b); /* enable bitmap mode */
    POKE(0xd016, 0x18); /* enable multicolour */
    POKE(0xd018, 0x1f); /* screen at $0400 bitmap at $2000 */
    POKE(0xd020, 0x00); /* black border */


/* Here follows: wait for a key, and "cleanup" code */

...

}

------------------------ snap -------------------------------------

After starting this little routine, the screen messed up.

Could anyone help?

Thanks,

Tim Schürmann
tischuer_at_web.de

P.S.: Please excuse my really bad english :)

----------------------------------------------------------------------
To unsubscribe from the list send mail to majordomo_at_musoftware.de with
the string "unsubscribe cc65" in the body(!) of the mail.


Date view Thread view Subject view

This archive was generated by hypermail 2.1.3 : 2003-01-13 12:41:08 CET