This is scramble.c in view mode; [Download] [Up]
#import <stdio.h>
#import <nextdev/video.h>
#import <sys/file.h>
#import <sys/ioctl.h>
#import <objc/objc.h>
#import <stdlib.h>
#import <string.h>
#import <sys/signal.h>
/* scramble.c -- scramble the screen by mixing up the scanlines in a nasty way
*
* 5/92, CWS -- Added support for signal trapping. Cleaned up the code.
* This now runs forever until the user kills it.
*/
#define PC_WIDTH 56
#define PC_HEIGHT 52
#define X_TILES 20
#define Y_TILES 16
extern open();
extern ioctl();
extern close();
extern sleep();
unsigned char *old_screen = NULL, *vid_base = NULL;
long num_bytes = (VIDEO_MW * VIDEO_H / NPPB), bytes_per_row = (VIDEO_MW/NPPB);
long coordtoindex(x,y)
long x, y;
{
return (y*bytes_per_row + x);
}
void get_piece(x, y, piece, source)
long x,y;
unsigned char *piece, *source;
{
long i,j;
for(j=0;j<PC_HEIGHT;j++){
for(i=0;i<(PC_WIDTH/4);i++){
piece[coordtoindex(i,j)]=
source[coordtoindex(((x*(PC_WIDTH/4))+i),((y*PC_HEIGHT)+j))];
}
}
}
void place_piece(x,y,piece,dest)
long x,y;
unsigned char *piece, *dest;
{
long i,j;
for(j=0;j<PC_HEIGHT;j++){
for(i=0;i<(PC_WIDTH/4);i++){
dest[coordtoindex(((x*(PC_WIDTH/4))+i),((y*PC_HEIGHT)+j))]=
piece[coordtoindex(i,j)];
}
}
}
void erase_piece(x,y,dest)
long x,y;
unsigned char *dest;
{
long i,j;
for(j=0;j<PC_HEIGHT;j++){
for(i=0;i<(PC_WIDTH/4);i++){
dest[coordtoindex(((x*(PC_WIDTH/4))+i),((y*PC_HEIGHT)+j))]=255;
}
}
}
// general signal handler; simply restores screen memory and exits.
void handle(sig)
int sig;
{
fprintf(stdout, "\nCatching signal %d...\n", sig);
bcopy(old_screen, vid_base, num_bytes * sizeof(unsigned char));
free(old_screen);
exit(0);
}
// handle SIGTSTP; restores screen memory, then calls SIGSTOP
void pause(sig)
int sig;
{
bcopy(old_screen, vid_base, num_bytes * sizeof(unsigned char));
raise(SIGSTOP);
}
#define DELAY 5000
main() {
int fd, i, j, k, e;
unsigned char *piece_to_move, *d;
short direction, oldDirection, steps;
long curx, cury;
long newx, newy;
BOOL valid;
if (signal(SIGINT, &handle)) {
fprintf(stdout, "Error, couldn't establish new handler.\n");
exit(2);
}
if (signal(SIGTERM, &handle)) {
fprintf(stdout, "Couldn't establish new error handler for SIGTERM.\n");
exit(2);
}
if (signal(SIGTSTP, &pause)) {
fprintf(stdout, "Couldn't establish new errorhandler for SIGTSTP.\n");
exit(3);
}
// open the /dev/vid0, and get the address of screen memory
fd = open("/dev/vid0", O_RDWR, NULL);
if (fd <= 0) {
fprintf(stdout,"open result:%d\n", errno);
exit(1);
}
if (ioctl(fd, DKIOCGADDR, &vid_base) < 0) {
fprintf(stdout, "ioctl errno: %d\n", errno);
exit(1);
}
old_screen=(unsigned char *) malloc(num_bytes * sizeof(unsigned char));
bcopy(vid_base, old_screen, num_bytes);
for (;;) {
for(k=1; k<500; k += 3) {
for(i=0; i<VIDEO_H; i++){
bcopy(&old_screen[coordtoindex(0,i)],
&vid_base[coordtoindex(0,((VIDEO_H-i-1)*k) % VIDEO_H)],
bytes_per_row);
// bcopy(&old_screen[coordtoindex(0,((VIDEO_H-i-1)*k) % VIDEO_H)],
// &vid_base[coordtoindex(0,(i+1))],
// bytes_per_row);
for(j=0; j<DELAY; j++);
}
}
for (i=0; i < 500000; i++);
for (k=500; k>0; k -= 3) {
for (i=0; i<VIDEO_H; i++){
bcopy(&old_screen[coordtoindex(i % num_bytes,(VIDEO_H-i-1))],
&vid_base[coordtoindex(0,((VIDEO_H-i-1)*k) % VIDEO_H)],
bytes_per_row);
// bcopy(&old_screen[coordtoindex(0,((VIDEO_H-i-1)*k) % VIDEO_H)],
// &vid_base[coordtoindex(0,(i+1))],
// bytes_per_row);
for(j=0; j<DELAY; j++);
}
}
for (i=0; i < 500000; i++);
}
sleep(1);
bcopy(old_screen, vid_base, num_bytes);
free(old_screen);
close(fd);
exit(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.