-#if defined(__C64__)
+#if defined(__C64__) || defined(__C128__)
# define SCREEN1 0xE000
# define SCREEN2 0xE400
# define CHARSET 0xE800
# define CHARSET 0xE000
# define outb(addr,val) pokebsys ((unsigned)(addr), val)
# define inb(addr) peekbsys ((unsigned)(addr))
+#elif defined(__PLUS4__)
+# define SCREEN1 0x6400
+# define SCREEN2 0x6C00
+# define CHARSET 0x7000
+# define outb(addr,val) (*(addr)) = (val)
+# define inb(addr) (*(addr))
#endif
/* Values for the VIC address register to switch between the two pages */
+#if defined(__PLUS4__)
+#define PAGE1 ((SCREEN1 >> 8) & 0xF8)
+#define PAGE2 ((SCREEN2 >> 8) & 0xF8)
+#define CHARADR ((CHARSET >> 8) & 0xFC)
+#else
#define PAGE1 ((SCREEN1 >> 6) & 0xF0) | ((CHARSET >> 10) & 0x0E)
#define PAGE2 ((SCREEN2 >> 6) & 0xF0) | ((CHARSET >> 10) & 0x0E)
+#endif
/* Use static local variables for speed */
-#pragma staticlocals (1);
+#pragma staticlocals (1);
-static unsigned char *scrn;
-
-
-
-static void doplasma (void)
+static void doplasma (register unsigned char* scrn)
{
unsigned char xbuf[40];
unsigned char ybuf[25];
- unsigned char i,ii;
unsigned char c1a,c1b;
unsigned char c2a,c2b;
unsigned char c1A,c1B;
unsigned char c2A,c2B;
+ register unsigned char i, ii;
c1a = c1A;
c1b = c1B;
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) {
unsigned fps10;
+#if defined(__C64__)
+ unsigned char block;
+#endif
+#if defined(__C128__)
+ unsigned char block;
+ unsigned char initflag;
+ unsigned char graphflag;
+#endif
+#if defined(__PLUS4__)
+ unsigned int i;
+ unsigned char v2;
+#endif
+
clrscr ();
cprintf ("Making charset, mompls");
makechar();
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 */
+#if defined(__PLUS4__)
+ v = inb (&TED.char_addr);
+ v2 = inb (&TED.video_addr);
+#else
v = inb (&VIC.addr);
+#endif
+
+#if defined(__PLUS4__)
+ for (i=0;i<1000;i++) {
+ ((unsigned char *) (SCREEN1-0x0400))[i] = 0;
+ ((unsigned char *) (SCREEN2-0x0400))[i] = 0;
+ }
+ outb (&TED.char_addr, CHARADR);
+#endif
/* Run the demo until a key was hit */
t = clock ();
while (!kbhit()) {
- /* Build page 1, then make it visible */
- scrn = (unsigned char*)SCREEN1;
- doplasma();
- outb (&VIC.addr, PAGE1);
+ /* Build page 1, then make it visible */
+ doplasma ((unsigned char*)SCREEN1);
+#if defined(__PLUS4__)
+ outb (&TED.video_addr, PAGE1);
+#else
+ outb (&VIC.addr, PAGE1);
+#endif
- /* Build page 2, then make it visible */
- scrn = (unsigned char*)SCREEN2;
- doplasma();
- outb (&VIC.addr, PAGE2);
+ /* Build page 2, then make it visible */
+ doplasma ((unsigned char*)SCREEN2);
+#if defined(__PLUS4__)
+ outb (&TED.video_addr, PAGE2);
+#else
+ outb (&VIC.addr, PAGE2);
+#endif
- /* Count frames */
+ /* Count frames */
f += 2;
- };
+ }
t = clock() - t;
/* Switch back the VIC screen */
+#if defined(__PLUS4__)
+ outb (&TED.video_addr, v2);
+ outb (&TED.char_addr, v);
+#else
outb (&VIC.addr, v);
+#endif
-#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 */
bordercolor (border);
bgcolor (background);
textcolor (text);
- clrscr();
+ clrscr ();
/* Calculate stats */
sec = (t * 10) / CLK_TCK;