#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <msdos.cf>
#include <mos.h>
#include <egb.h>
#include <sidework.h>

#define	ui	unsigned int

#define	FILLUP		for( i = 0; i < _lupy; i++ ){							\
						_movedata( ds, ( ui )fill, seg, i * vxbyte, xbyte );\
					}

#define	FILLDOWN	for( i = _lupy + c; i <= 479; i++ ){					\
						_movedata( ds, ( ui )fill, seg, i * vxbyte, xbyte);	\
					}

#define	NOMDSP( jg )	FILLUP;												\
					for( i = 0, c = 0; i < 480; i++ ){						\
						if( jg ){											\
							_movedata( ds, ( ui )p + i * xbyte,				\
							seg, ( _lupy + c++ ) * vxbyte, xbyte);			\
						}													\
					}														\
					FILLDOWN;

#define	REVDSP( jg )	FILLUP;												\
					for( i = 0, c = 0; i < 480; i++ ){						\
						if( jg ){											\
							_movedata										\
							( ds, ( ui )p + ((( 480 - 1 ) - i) * xbyte),	\
							seg, ( _lupy + c++ ) * vxbyte, xbyte);			\
						}													\
					}														\
					FILLDOWN;

int
main()
{
	char	*p, fill[ 640 ], mwork[ 4096 ];
	int		xbyte,vxbyte,seg;

	int		ds,i,c,_lupy,b,x,y,exitf = 0;
	int		page0,page1,sdk = 0;

	EGB_getResolution( &page0, &page1 );

	switch( page0 ){
	case	12:
		if( NULL == ( p = malloc( 640 * 480 ))){
			sdk_start( 75 );
			sdk = 1;
			if( NULL == ( p = malloc( 640 * 480 )))return 1;
		}
		xbyte = 640;
		seg = 0x10C;
		vxbyte = 1024;
		break;
	case	3:
		if( NULL == ( p = malloc( 640 * 480 / 2 ))){
			sdk_start( 38 );
			sdk = 1;
			if( NULL == ( p = malloc( 640 * 480 / 2 )))return 1;
		}
		xbyte = 320;
		seg = 0x104;
		vxbyte = 512;
		break;
	default:
		return 1;
	}

	if( p == NULL )return 1;

	MOS_start( mwork, 4096 );

	ds = getds();

	for( i = 0; i < 480; i++ ){
		_movedata( seg, i * vxbyte, ds, ( ui )p + i * xbyte, xbyte );
	}

	memset( fill, 0, sizeof( fill ));

	do{
		for( i = 0; i < 480; i++ ){				/* 正常な絵を書く		*/
			_movedata( ds, ( int )p + i * xbyte, seg, i * vxbyte, xbyte);
		}
		if( exitf )break;

		_lupy = 240 - (( 480 * 11 / 12 ) >> 1);
		NOMDSP( i % 12 );
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 10 / 12) >> 1);
		NOMDSP(i % 6);
		_lupy = 240 - ((480 * 9 / 12) >> 1);
		NOMDSP(i % 4);
		_lupy = 240 - ((480 * 8 / 12) >> 1);
		NOMDSP(i % 3);
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 6 / 12) >> 1);
		NOMDSP(i % 2);
		_lupy = 240 - ((480 * 4 / 12) >> 1);
		NOMDSP(!(i % 3));
		_lupy = 240 - ((480 * 2 / 12) >> 1);
		NOMDSP(!(i % 6));
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 1 / 12) >> 1);
		REVDSP(!(i % 12));
		_lupy = 240 - ((480 * 2 / 12) >> 1);
		REVDSP(!(i % 6));
		_lupy = 240 - ((480 * 4 / 12) >> 1);
		REVDSP(!(i % 3));
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 6 / 12) >> 1);
		REVDSP(i % 2);
		_lupy = 240 - ((480 * 8 / 12) >> 1);
		REVDSP(i % 3);
		_lupy = 240 - ((480 * 9 / 12) >> 1);
		REVDSP(i % 4);
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 10 / 12) >> 1);
		REVDSP(i % 6);
		_lupy = 240 - ((480 * 11 / 12) >> 1);
		REVDSP(i % 12);
		MOS_rdpos( &b,&x,&y );exitf |= b;
		for(i = 0; i < 480; i++){
			_movedata( ds, ( ui )p + ((( 480 - 1 ) - i) * xbyte ),
				seg, i * vxbyte, xbyte );
		}
		_lupy = 240 - ((480 * 11 / 12) >> 1);
		REVDSP(i % 12);
		_lupy = 240 - ((480 * 10 / 12) >> 1);
		REVDSP(i % 6);
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 9 / 12) >> 1);
		REVDSP(i % 4);
		_lupy = 240 - ((480 * 8 / 12) >> 1);
		REVDSP(i % 3);
		_lupy = 240 - ((480 * 6 / 12) >> 1);
		REVDSP(i % 2);
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 4 / 12) >> 1);
		REVDSP(!(i % 3));
		_lupy = 240 - ((480 * 2 / 12) >> 1);
		REVDSP(!(i % 6));
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 1 / 12) >> 1);
		NOMDSP(!(i % 12));
		_lupy = 240 - ((480 * 2 / 12) >> 1);
		NOMDSP(!(i % 6));
		_lupy = 240 - ((480 * 4 / 12) >> 1);
		NOMDSP(!(i % 3));
		MOS_rdpos( &b,&x,&y );exitf |= b;
		_lupy = 240 - ((480 * 6 / 12) >> 1);
		NOMDSP(i % 2);
		_lupy = 240 - ((480 * 8 / 12) >> 1);
		NOMDSP(i % 3);
		_lupy = 240 - ((480 * 9 / 12) >> 1);
		NOMDSP(i % 4);
		_lupy = 240 - ((480 * 10 / 12) >> 1);
		MOS_rdpos( &b,&x,&y );exitf |= b;
		NOMDSP(i % 6);
		_lupy = 240 - ((480 * 11 / 12) >> 1);
		NOMDSP(i % 12);

	}while(1);

	free( p );
	MOS_end();

	if( sdk )sdk_terminate( NULL, NULL, NULL );

	return 0;
}
