-/*****************************************************************************
- * plasma test program for cc65. *
- * *
- * (w)2001 by groepaz/hitmen *
- * *
- * Cleanup and porting by Ullrich von Bassewitz. *
- * *
- *****************************************************************************/
+/*****************************************************************************\
+** plasma test program for cc65. **
+** **
+** (w)2001 by groepaz/hitmen **
+** **
+** Cleanup and porting by Ullrich von Bassewitz. **
+** **
+\*****************************************************************************/
# define SCREEN1 0xE000
# define SCREEN2 0xE400
# define CHARSET 0xE800
-# define outb(addr,val) (*(addr)) = (val)
+# define outb(addr,val) (*(addr)) = (val)
# define inb(addr) (*(addr))
#elif defined(__CBM510__)
# define SCREEN1 0xF000
# define SCREEN2 0xF400
# define CHARSET 0xE000
-# define outb(addr,val) pokebsys ((unsigned)(addr), val)
+# 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 static-locals (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;
for (ii = 0; ii < 25; ++ii) {
ybuf[ii] = (sinustable[c1a] + sinustable[c1b]);
c1a += 4;
- c1b += 9;
+ c1b += 9;
}
c1A += 3;
c1B -= 5;
for (i = 0; i < 40; ++i) {
xbuf[i] = (sinustable[c2a] + sinustable[c2b]);
c2a += 3;
- c2b += 7;
+ c2b += 7;
}
c2A += 2;
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
- * size a lot.
- */
+ /* Unrolling the following loop will give a speed increase of
+ ** nearly 100% (~24fps), but it will also increase the code
+ ** size a lot.
+ */
for (i = 0; i < 40; ++i, ++scrn) {
*scrn = (xbuf[i] + ybuf[ii]);
}
static void makechar (void)
{
static const unsigned char bittab[8] = {
- 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
+ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
};
unsigned char i, ii, b, s;
unsigned c;
gotoxy (0, 1);
for (c = 0; c < 0x100; ++c) {
- s = sinustable[c];
+ s = sinustable[c];
for (i = 0; i < 8; ++i){
b = 0;
for (ii = 0; ii < 8; ++ii) {
if ((rand() & 0xFF) > s) {
- b |= bittab[ii];
- }
+ b |= bittab[ii];
+ }
}
((unsigned char*)CHARSET) [(c*8) + i] = b;
}
- if ((c & 0x07) == 0) {
- cputc ('.');
- }
+ if ((c & 0x07) == 0) {
+ cputc ('.');
+ }
}
}
unsigned long fps;
unsigned fps10;
+
#if defined(__C64__)
unsigned char block;
#endif
unsigned char initflag;
unsigned char graphflag;
#endif
+#if defined(__PLUS4__)
+ unsigned int i;
+ unsigned char v2;
+#endif
clrscr ();
cprintf ("Making charset, mompls");
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.
- */
+ /* Save and change some flags, so that kernal/basic interrupt handler will
+ ** not interfere with our routine.
+ */
initflag = *(unsigned char*) 0xA04;
*(unsigned char*) 0xA04 &= 0xFE;
graphflag = *(unsigned char*) 0xD8;
#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__) || defined(__C128__)
/* Move back the VIC 16K block */