home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 1
/
ARM_CLUB_CD.iso
/
contents
/
sillies
/
silly1
/
!Rippler
/
c
/
ripmod
< prev
next >
Wrap
Text File
|
1990-04-14
|
3KB
|
188 lines
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "kernel.h"
#include "swis.h"
#define TRUE (1==1)
#define FALSE (1==0)
int rippling = FALSE;
int *driver_start, *display_start;
int driver_bank;
int *waves = NULL;
int SIZE;
int r12;
int oldstate;
int ticks = 0;
int ripples = 0;
int waiting = FALSE;
int rip = -255;
extern void EventEntry(void);
extern void cb_entry(void);
extern void asm_ripple(int *, int *, int *, int);
int do_ripple(void)
{
ripples++;
asm_ripple(driver_start, display_start, waves, SIZE | (rip << 16));
/*
for (i = 0; i < 256; i++)
{
int *src;
int j, off;
off = i + rip;
if (off < 0 || off > SIZE - 1)
src = driver_start + 80 * i;
else
{
off = waves[off] + i;
if (off < 0 || off > 255)
{
for (j = 0; j < 80; j++)
*dst++ = 0x44444444;
continue;
}
src = driver_start + 80 * off;
}
for (j = 0; j < 80; j++)
*dst++ = *src++;
}
*/
if (++rip >= SIZE)
rip = -255;
waiting = FALSE;
return(1);
}
static void stop_rippling(void)
{
_kernel_swi_regs r;
rippling = FALSE;
r.r[0] = 113;
r.r[1] = driver_bank;
_kernel_swi(OS_Byte, &r, &r);
}
static void start_rippling(void)
{
static int vars[] = { 148, 149, -1 };
int *result[2];
_kernel_swi_regs r;
r.r[0] = 250;
r.r[1] = 0;
r.r[2] = 255;
_kernel_swi(OS_Byte, &r, &r);
driver_bank = r.r[1];
r.r[0] = 113;
r.r[1] = driver_bank == 2 ? 1 : 2;
_kernel_swi(OS_Byte, &r, &r);
r.r[0] = (int)vars;
r.r[1] = (int)result;
_kernel_swi(OS_ReadVduVariables, &r, &r);
driver_start = result[0];
display_start = result[1];
rippling = (driver_start != display_start);
}
int Event_Handler(_kernel_swi_regs *r, void *pw)
{
ticks++;
if (r->r[0] == 4 && waves != NULL && rippling && !waiting)
{
_kernel_swi_regs x;
waiting = TRUE;
x.r[0] = (int)cb_entry;
x.r[1] = (int)pw;
_kernel_swi(OS_AddCallBack, &x, &x);
}
return(1);
}
void closedown(void)
{
_kernel_swi_regs r;
r.r[0] = 13;
r.r[1] = 4;
_kernel_swi(OS_Byte, &r, &r);
rippling = FALSE;
r.r[0] = 0x10;
r.r[1] = (int)EventEntry;
r.r[2] = r12;
_kernel_swi(OS_Release, &r, &r);
if (waves != NULL)
{
r.r[0] = 7;
r.r[2] = (int)waves;
_kernel_swi(OS_Module, &r, &r);
}
}
_kernel_oserror *initialise(char *tail, int pbase, void *pw)
{
_kernel_swi_regs r;
rippling = FALSE;
waiting = FALSE;
r12 = (int)pw;
r.r[0] = 0x10;
r.r[1] = (int)EventEntry;
r.r[2] = (int)pw;
_kernel_swi(OS_Claim, &r, &r);
r.r[0] = 14;
r.r[1] = 4;
_kernel_swi(OS_Byte, &r, &r);
atexit(closedown);
return(NULL);
}
void service(int n, _kernel_swi_regs *r, void *pw)
{
switch(n)
{
case 0x4d:
oldstate = rippling;
if (rippling)
stop_rippling();
break;
case 0x46:
if (oldstate)
start_rippling();
break;
case 0xbb:
waves = (int*)r->r[0];
SIZE = r->r[2];
break;
}
}
_kernel_oserror *command(char *argv, int argc, int n, void *pw)
{
switch(argv[0])
{
case '0':
stop_rippling();
break;
case '1':
start_rippling();
break;
case '2':
if (waves != NULL)
do_ripple();
break;
case '3':
{
int i;
printf("Wave table at %p\n", waves);
printf("Rippling = %d\n", rippling);
printf("Ticks = %d\n", ticks);
printf("Ripples = %d\n", ripples);
printf("Waiting = %d\n", waiting);
break;
}
}
return(NULL);
}