]> git.sur5r.net Git - cc65/commitdiff
Port plasma to the C128
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 3 Oct 2002 19:19:25 +0000 (19:19 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 3 Oct 2002 19:19:25 +0000 (19:19 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1437 b7a2c559-68d2-44c3-8de9-860c34a00d81

samples/README
samples/plasma.c

index 1611d4aa91567ad96768a0ea23c84157b7505d18..40fe728581a211bc12d7212862a1b32108ef0937 100644 (file)
@@ -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
index 0267b8efbd55477df9072b86659341dc448d5b22..683a616c1c3329d73d00efed7795597f4cc63f76 100644 (file)
@@ -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 */