From: cuz Date: Thu, 3 Oct 2002 19:19:25 +0000 (+0000) Subject: Port plasma to the C128 X-Git-Tag: V2.12.0~2195 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=13f81d0377928bb774e7f4fb2bbf5a3ca01a676c;p=cc65 Port plasma to the C128 git-svn-id: svn://svn.cc65.org/cc65/trunk@1437 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/samples/README b/samples/README index 1611d4aa9..40fe72858 100644 --- a/samples/README +++ b/samples/README @@ -30,7 +30,7 @@ Name: mousedemo Description: Shows how to use the mouse. Platforms: All systems with mouse and conio support: Atari (untested), C64, C128 and CBM510 - + ----------------------------------------------------------------------------- Name: nachtm Description: Plays "Eine kleine Nachtmusik" by Wolfgang Amadeus Mozart @@ -41,8 +41,8 @@ Platforms: All systems that have the Commodore SID (Sound Interface ----------------------------------------------------------------------------- Name: plasma Description: A fancy graphics demo written by groepaz/hitmen. -Platforms: The program needs a VIC but has not been ported to / tested - on the C128, so it does currently run on the CBM510 and C64. +Platforms: The program needs a VIC, so it runs on the following systems: + C64, C128, CBM510 ----------------------------------------------------------------------------- Name: sieve diff --git a/samples/plasma.c b/samples/plasma.c index 0267b8efb..683a616c1 100644 --- a/samples/plasma.c +++ b/samples/plasma.c @@ -15,7 +15,7 @@ -#if defined(__C64__) +#if defined(__C64__) || defined(__C128__) # define SCREEN1 0xE000 # define SCREEN2 0xE400 # define CHARSET 0xE800 @@ -113,7 +113,7 @@ static void doplasma (void) c2B -= 3; for (ii = 0; ii < 25; ++ii) { /* Unrolling the following loop will give a speed increase of - * nearly 100% (~24fps), but it will also increase the code + * nearly 100% (~24fps), but it will also increase the code * size a lot. */ for (i = 0; i < 40; ++i, ++scrn) { @@ -165,6 +165,14 @@ int main (void) unsigned long fps; unsigned fps10; +#if defined(__C64__) + unsigned char block; +#endif +#if defined(__C128__) + unsigned char block; + unsigned char initflag; + unsigned char graphflag; +#endif clrscr (); cprintf ("Making charset, mompls"); @@ -176,9 +184,19 @@ int main (void) text = textcolor (COLOR_BLACK); clrscr (); -#if defined(__C64__) +#if defined(__C64__) || defined(__C128__) /* Move the VIC 16K block */ - outb (&CIA2.pra, 0x00); + block = inb (&CIA2.pra); + outb (&CIA2.pra, (block & 0xFC) | ((SCREEN1 >> 14) ^ 0x03)); +#endif +#if defined(__C128__) + /* Save and change some flags, so that kernal/basic interupt handler will + * not interfere with our routine. + */ + initflag = *(unsigned char*) 0xA04; + *(unsigned char*) 0xA04 &= 0xFE; + graphflag = *(unsigned char*) 0xD8; + *(unsigned char*) 0xD8 = 0xFF; #endif /* Remember the VIC address register */ @@ -187,17 +205,17 @@ int main (void) /* Run the demo until a key was hit */ t = clock (); while (!kbhit()) { - /* Build page 1, then make it visible */ + /* Build page 1, then make it visible */ scrn = (unsigned char*)SCREEN1; doplasma(); - outb (&VIC.addr, PAGE1); + outb (&VIC.addr, PAGE1); - /* Build page 2, then make it visible */ + /* Build page 2, then make it visible */ scrn = (unsigned char*)SCREEN2; doplasma(); - outb (&VIC.addr, PAGE2); + outb (&VIC.addr, PAGE2); - /* Count frames */ + /* Count frames */ f += 2; }; t = clock() - t; @@ -205,9 +223,14 @@ int main (void) /* Switch back the VIC screen */ outb (&VIC.addr, v); -#if defined(__C64__) +#if defined(__C64__) || defined(__C128__) /* Move back the VIC 16K block */ - outb (&CIA2.pra, 0x03); + outb (&CIA2.pra, block); +#endif +#if defined(__C128__) + /* Restore the flags */ + *(unsigned char*) 0xA04 = initflag; + *(unsigned char*) 0xD8 = graphflag; #endif /* Fetch the character from the keyboard buffer and discard it */