mirror of
https://github.com/deater/dos33fsprogs.git
synced 2025-01-14 13:33:48 +00:00
mem: more demoscene nonsense
This commit is contained in:
parent
c8f1fddb76
commit
e690731f43
@ -1,11 +1,34 @@
|
||||
/* A Linux/SDL/C version of Hellmood's amazing 256B DOS Memories Demo */
|
||||
|
||||
/* See http://www.sizecoding.org/wiki/Memories for a rundown on how it works */
|
||||
|
||||
/* This is a conversion to C I did in an attempt to see how it works */
|
||||
/* and also to see if I could port any of this to the Apple II */
|
||||
|
||||
/* x86 has amazing code density with powerful instructions */
|
||||
/* stos, mul, div, FPU, lots of 1-byte instructions */
|
||||
/* and old x86 hardware made it really easy to program with limited code */
|
||||
/* VGA/MCGA Mode13h (320x200 256 colors linear framebuffer) */
|
||||
/* soundblaster MIDI with only a few out instructions */
|
||||
|
||||
/* Anyway this is a rough attempt to getting things going in C */
|
||||
/* The last effect (ocean) is doing lots of sketchy stuff and */
|
||||
/* depending a bit on undefined behavior so it's hit or miss */
|
||||
/* whether it will work for you */
|
||||
|
||||
/* deater -- Vince Weaver -- vince@deater.net -- 23 April 2020 */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "gr-sim.h"
|
||||
#include "tfv_zp.h"
|
||||
|
||||
static unsigned short frame;
|
||||
|
||||
#if 0
|
||||
static unsigned short stack[128];
|
||||
static unsigned short ax,bx,cx,dx,di,bp,es;
|
||||
static unsigned short ax,bx,cx,dx,es;
|
||||
static int cf=0,of=0,zf=0,sf=0;
|
||||
static int sp=0;
|
||||
static unsigned char framebuffer[320*200];
|
||||
@ -73,6 +96,88 @@ static int mode13h_graphics_update(unsigned char *buffer, struct palette *pal) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void set_vga_pal(void) {
|
||||
|
||||
/* output of vgapal https://github.com/canidlogic/vgapal */
|
||||
unsigned char raw_pal[3*256]=
|
||||
{ 0, 0, 0, 0, 0, 170, 0, 170, 0, 0, 170, 170,
|
||||
170, 0, 0, 170, 0, 170, 170, 85, 0, 170, 170, 170,
|
||||
85, 85, 85, 85, 85, 255, 85, 255, 85, 85, 255, 255,
|
||||
255, 85, 85, 255, 85, 255, 255, 255, 85, 255, 255, 255,
|
||||
0, 0, 0, 20, 20, 20, 32, 32, 32, 44, 44, 44,
|
||||
56, 56, 56, 69, 69, 69, 81, 81, 81, 97, 97, 97,
|
||||
113, 113, 113, 130, 130, 130, 146, 146, 146, 162, 162, 162,
|
||||
182, 182, 182, 203, 203, 203, 227, 227, 227, 255, 255, 255,
|
||||
0, 0, 255, 65, 0, 255, 125, 0, 255, 190, 0, 255,
|
||||
255, 0, 255, 255, 0, 190, 255, 0, 125, 255, 0, 65,
|
||||
255, 0, 0, 255, 65, 0, 255, 125, 0, 255, 190, 0,
|
||||
255, 255, 0, 190, 255, 0, 125, 255, 0, 65, 255, 0,
|
||||
0, 255, 0, 0, 255, 65, 0, 255, 125, 0, 255, 190,
|
||||
0, 255, 255, 0, 190, 255, 0, 125, 255, 0, 65, 255,
|
||||
125, 125, 255, 158, 125, 255, 190, 125, 255, 223, 125, 255,
|
||||
255, 125, 255, 255, 125, 223, 255, 125, 190, 255, 125, 158,
|
||||
255, 125, 125, 255, 158, 125, 255, 190, 125, 255, 223, 125,
|
||||
255, 255, 125, 223, 255, 125, 190, 255, 125, 158, 255, 125,
|
||||
125, 255, 125, 125, 255, 158, 125, 255, 190, 125, 255, 223,
|
||||
125, 255, 255, 125, 223, 255, 125, 190, 255, 125, 158, 255,
|
||||
182, 182, 255, 199, 182, 255, 219, 182, 255, 235, 182, 255,
|
||||
255, 182, 255, 255, 182, 235, 255, 182, 219, 255, 182, 199,
|
||||
255, 182, 182, 255, 199, 182, 255, 219, 182, 255, 235, 182,
|
||||
255, 255, 182, 235, 255, 182, 219, 255, 182, 199, 255, 182,
|
||||
182, 255, 182, 182, 255, 199, 182, 255, 219, 182, 255, 235,
|
||||
182, 255, 255, 182, 235, 255, 182, 219, 255, 182, 199, 255,
|
||||
0, 0, 113, 28, 0, 113, 56, 0, 113, 85, 0, 113,
|
||||
113, 0, 113, 113, 0, 85, 113, 0, 56, 113, 0, 28,
|
||||
113, 0, 0, 113, 28, 0, 113, 56, 0, 113, 85, 0,
|
||||
113, 113, 0, 85, 113, 0, 56, 113, 0, 28, 113, 0,
|
||||
0, 113, 0, 0, 113, 28, 0, 113, 56, 0, 113, 85,
|
||||
0, 113, 113, 0, 85, 113, 0, 56, 113, 0, 28, 113,
|
||||
56, 56, 113, 69, 56, 113, 85, 56, 113, 97, 56, 113,
|
||||
113, 56, 113, 113, 56, 97, 113, 56, 85, 113, 56, 69,
|
||||
113, 56, 56, 113, 69, 56, 113, 85, 56, 113, 97, 56,
|
||||
113, 113, 56, 97, 113, 56, 85, 113, 56, 69, 113, 56,
|
||||
56, 113, 56, 56, 113, 69, 56, 113, 85, 56, 113, 97,
|
||||
56, 113, 113, 56, 97, 113, 56, 85, 113, 56, 69, 113,
|
||||
81, 81, 113, 89, 81, 113, 97, 81, 113, 105, 81, 113,
|
||||
113, 81, 113, 113, 81, 105, 113, 81, 97, 113, 81, 89,
|
||||
113, 81, 81, 113, 89, 81, 113, 97, 81, 113, 105, 81,
|
||||
113, 113, 81, 105, 113, 81, 97, 113, 81, 89, 113, 81,
|
||||
81, 113, 81, 81, 113, 89, 81, 113, 97, 81, 113, 105,
|
||||
81, 113, 113, 81, 105, 113, 81, 97, 113, 81, 89, 113,
|
||||
0, 0, 65, 16, 0, 65, 32, 0, 65, 48, 0, 65,
|
||||
65, 0, 65, 65, 0, 48, 65, 0, 32, 65, 0, 16,
|
||||
65, 0, 0, 65, 16, 0, 65, 32, 0, 65, 48, 0,
|
||||
65, 65, 0, 48, 65, 0, 32, 65, 0, 16, 65, 0,
|
||||
0, 65, 0, 0, 65, 16, 0, 65, 32, 0, 65, 48,
|
||||
0, 65, 65, 0, 48, 65, 0, 32, 65, 0, 16, 65,
|
||||
32, 32, 65, 40, 32, 65, 48, 32, 65, 56, 32, 65,
|
||||
65, 32, 65, 65, 32, 56, 65, 32, 48, 65, 32, 40,
|
||||
65, 32, 32, 65, 40, 32, 65, 48, 32, 65, 56, 32,
|
||||
65, 65, 32, 56, 65, 32, 48, 65, 32, 40, 65, 32,
|
||||
32, 65, 32, 32, 65, 40, 32, 65, 48, 32, 65, 56,
|
||||
32, 65, 65, 32, 56, 65, 32, 48, 65, 32, 40, 65,
|
||||
44, 44, 65, 48, 44, 65, 52, 44, 65, 60, 44, 65,
|
||||
65, 44, 65, 65, 44, 60, 65, 44, 52, 65, 44, 48,
|
||||
65, 44, 44, 65, 48, 44, 65, 52, 44, 65, 60, 44,
|
||||
65, 65, 44, 60, 65, 44, 52, 65, 44, 48, 65, 44,
|
||||
44, 65, 44, 44, 65, 48, 44, 65, 52, 44, 65, 60,
|
||||
44, 65, 65, 44, 60, 65, 44, 52, 65, 44, 48, 65,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
int i;
|
||||
|
||||
for(i=0;i<256;i++) {
|
||||
pal.red[i]=raw_pal[i*3];
|
||||
pal.green[i]=raw_pal[(i*3)+1];
|
||||
pal.blue[i]=raw_pal[(i*3)+2];
|
||||
|
||||
}
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
static int graphics_input(void) {
|
||||
|
||||
SDL_Event event;
|
||||
@ -301,9 +406,11 @@ static short pop(void) {
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
/* tilted plane */
|
||||
/* DH=Y, DL=X */
|
||||
static void fx0(void) {
|
||||
static int fx0(int xx, int yy, int xprime) {
|
||||
return 0;
|
||||
}
|
||||
#if 0
|
||||
char ah,al,dh,dl;
|
||||
@ -312,7 +419,7 @@ static void fx0(void) {
|
||||
ax=0x1329; // mov ax,0x1329 init
|
||||
|
||||
al=ax&0xff; ah=(ax>>8)&0xff;
|
||||
dl=dx&0xff; dh=(dx>>8)&0xff;
|
||||
dl=xprime; dh=yy;
|
||||
|
||||
|
||||
dh=dh+al; // add dh,al ; prevent divide overflow
|
||||
@ -326,7 +433,7 @@ static void fx0(void) {
|
||||
dl=dx&0xff; dh=(dx>>8)&0xff;
|
||||
|
||||
imul_8(dl); // imul dl
|
||||
dx=dx-bp; // sub dx,bp
|
||||
dx=dx-frame; // sub dx,bp
|
||||
dl=dx&0xff;
|
||||
|
||||
ah=(ax>>8)&0xff;
|
||||
@ -335,81 +442,66 @@ static void fx0(void) {
|
||||
ax=((ah&0xff)<<8)|(al&0xff);
|
||||
|
||||
ax&=0xff1c; // and al,4+8+16
|
||||
|
||||
return ax;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* circles? */
|
||||
/* DH=Y, DL=X */
|
||||
static void fx1(void) {
|
||||
static int fx1(int xx, int yy, int xprime) {
|
||||
|
||||
signed short yyy,xxx;
|
||||
signed short color;
|
||||
|
||||
yyy=yy-24; /* align Y vertically */
|
||||
|
||||
yyy=yyy*yyy;
|
||||
color=((yyy/32)&0xff);
|
||||
|
||||
/* signed 8-bit multiply */
|
||||
xxx=xprime-20;
|
||||
xxx=(char)xxx*(char)xxx;
|
||||
color+=((xxx/32)&0xff);
|
||||
|
||||
color+=frame; /* offset color by time */
|
||||
// color&=0x18; /* select special rings */
|
||||
// color&=0x18; /* select special rings */
|
||||
|
||||
return color;
|
||||
}
|
||||
#if 0
|
||||
int temp;
|
||||
char al,dh,ah;
|
||||
|
||||
// mov al,dh ; get Y in AL
|
||||
al=(dx>>8)&0xff;
|
||||
// sub al,100 ; align Y vertically
|
||||
al=al-100;
|
||||
ax=ax&0xff00;
|
||||
ax=ax|al;
|
||||
// imul al ; AL=Y*Y
|
||||
imul_8(al);
|
||||
// xchg dx,ax ; Y*Y/256 in DH, X in AL
|
||||
temp=ax;
|
||||
ax=dx;
|
||||
dx=temp;
|
||||
// imul al ; AL=X*X
|
||||
imul_8(ax&0xff);
|
||||
// add dh,ah ; DH=X*X+Y*Y/256
|
||||
dh=(dx>>8)&0xff;
|
||||
ah=(ax>>8)&0xff;
|
||||
dh=dh+ah;
|
||||
// mov al,dh ; AL = X*X+Y*Y/256
|
||||
al=dh;
|
||||
|
||||
dx=dx&0xff;
|
||||
dx|=(dh<<8);
|
||||
ax=(ah<<8)|(al&0xff);
|
||||
|
||||
// add ax,bp ; offset color by time
|
||||
ax=ax+bp;
|
||||
// and al,8+16 ; select special rings
|
||||
ax=ax&0xff18;
|
||||
}
|
||||
#endif
|
||||
/* checkers */
|
||||
static void fx2(void) {
|
||||
static int fx2(int xx, int yy, int xprime) {
|
||||
return 0;
|
||||
}
|
||||
#if 0
|
||||
int temp;
|
||||
unsigned char al;
|
||||
int color;
|
||||
|
||||
temp=ax;
|
||||
ax=dx; dx=temp; // xchg dx,ax
|
||||
ax=ax-bp; // sub ax,bp
|
||||
temp=((ax>>8)&0xff)^(ax&0xff);
|
||||
ax=ax&0xff00;
|
||||
ax|=temp; // xor al,ah
|
||||
ax|=0xdb; // or al,0xdb
|
||||
al=ax&0xff;
|
||||
al=al+0x13;
|
||||
ax=ax&0xff00;
|
||||
ax=ax|al; // add al,13h
|
||||
// ret
|
||||
color=((yy&0xff)<<8) | (xprime&0xff);
|
||||
color=color-frame; /* adjust with frame */
|
||||
color=((color>>8)&0xff)^(color&0xff); /* xor x and y */
|
||||
color|=0xdb; /* or result with 0xdb */
|
||||
color+=0x13; /* Map to yellow/grey */
|
||||
|
||||
return color;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
/* parallax checkrboard */
|
||||
static void fx3(void) {
|
||||
|
||||
/* parallax checkerboard */
|
||||
static int fx3(int xx,int yy,int xprime) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
cx=bp; // mov cx,bp ; set init point to time
|
||||
dx=((yy&0xff)<<8) | (xprime&0xff);
|
||||
|
||||
cx=frame; // mov cx,bp ; set init point to time
|
||||
bx=-16; // mov bx,-16 ; limit to 16 iterations
|
||||
fx3L:
|
||||
cx=cx+di; // add cx, di ; offset by screenpointer
|
||||
cx=cx+(yy*320)+xx; // add cx, di ; offset by screenpointer
|
||||
ax=819; // mov ax,819 ; magic, related to Rrrola
|
||||
imul_16(cx); // imul cx ; get X',Y' in DX
|
||||
cf=dx&1; // ror dx,1 ; set carry flag on "hit"
|
||||
@ -430,17 +522,23 @@ fx3L:
|
||||
|
||||
ax=bx+31; // lea ax,[bx+32] ; map value to standard gray scale
|
||||
//printf("%d %d\n",ax,bx);
|
||||
}
|
||||
|
||||
return ax;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* sierpinski rotozoomer */
|
||||
static void fx4(void) {
|
||||
static int fx4(int xx, int yy, int xprime) {
|
||||
return 0;
|
||||
}
|
||||
#if 0
|
||||
unsigned char dl,dh,bh,al;
|
||||
|
||||
dx=((yy&0xff)<<8) | (xprime&0xff);
|
||||
|
||||
dl=dx&0xff; dh=(dx>>8)&0xff;
|
||||
|
||||
cx=bp-2048; // lea cx,[bp-2048] ; center time to pass zero
|
||||
cx=frame-2048; // lea cx,[bp-2048] ; center time to pass zero
|
||||
cx=cx<<3; // sal cx,3 ; speed up by factor of 8!
|
||||
ax=(dh&0xff); // movzx ax,dh ; get X into AL
|
||||
// movsx dx,dl ; get Y into DL
|
||||
@ -486,16 +584,20 @@ static void fx4(void) {
|
||||
ax|=0x2a;
|
||||
fx4q:
|
||||
;
|
||||
return ax;
|
||||
}
|
||||
|
||||
#endif
|
||||
/* raycast bent tunnel */
|
||||
static void fx5(void) {
|
||||
|
||||
static int fx5(int xx, int yy, int xprime) {
|
||||
return 0;
|
||||
}
|
||||
#if 0
|
||||
unsigned char al,cl;
|
||||
unsigned short temp;
|
||||
|
||||
dx=((yy&0xff)<<8) | (xprime&0xff);
|
||||
|
||||
cx=cx&0xff00;
|
||||
cx|=(-9&0xff); // mov cl,-9 ; start with depth 9 (moves backwards)
|
||||
fx5L:
|
||||
@ -537,18 +639,20 @@ fx5L:
|
||||
if ((cx!=0) && (zf==1)) goto fx5L;
|
||||
// loopz fx5L (repeat until "hit" or "iter=max"
|
||||
|
||||
cx=cx-bp; // sub cx,bp ; offset depth by time
|
||||
cx=cx-frame; // sub cx,bp ; offset depth by time
|
||||
al^=(cx&0xff); // xor al,cl ; XOR pattern for texture
|
||||
// ah=al/6;
|
||||
al=al%6; // aam 6 ; irregular pattern with MOD 6
|
||||
al+=20; // add al,20 ; offset into grayscale pattern
|
||||
ax=al&0xff;
|
||||
#endif
|
||||
}
|
||||
|
||||
return ax;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ocean night */
|
||||
static void fx6(void) {
|
||||
static int fx6(int xx, int yy, int xprime) {
|
||||
return 0;
|
||||
}
|
||||
#if 0
|
||||
char dh;
|
||||
@ -556,6 +660,8 @@ static void fx6(void) {
|
||||
int edx;
|
||||
char scratch[64];
|
||||
|
||||
dx=((yy&0xff)<<8) | (xprime&0xff);
|
||||
|
||||
// bx coming in is the address of the effect
|
||||
// this is a guess, too lazy to hexdump
|
||||
bx=0x1d5;
|
||||
@ -590,16 +696,18 @@ static void fx6(void) {
|
||||
|
||||
|
||||
|
||||
ax+=bp; // add ax,bp ; modify color by time
|
||||
ax+=frame; // add ax,bp ; modify color by time
|
||||
ax&=0xff80; // and al,128 ; threshold into two bands
|
||||
ax--; // dec ax ; beautify colors to blue/black
|
||||
fx6q: ;
|
||||
return ax;
|
||||
}
|
||||
#endif
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
int which=5,ch;
|
||||
int color=0,which,xx,yy,xprime;
|
||||
int ch;
|
||||
|
||||
grsim_init();
|
||||
|
||||
@ -607,31 +715,50 @@ int main(int argc, char **argv) {
|
||||
|
||||
clear_screens();
|
||||
|
||||
while(1) {
|
||||
ram[DRAW_PAGE]=0;
|
||||
|
||||
switch (which) {
|
||||
case 0: fx2(); break;
|
||||
case 1: fx1(); break;
|
||||
case 2: fx0(); break;
|
||||
case 3: fx3(); break;
|
||||
case 4: fx4(); break;
|
||||
case 5: fx5(); break;
|
||||
case 6: fx6(); break;
|
||||
case 7: goto end;
|
||||
frame=0x13;
|
||||
|
||||
while(1) {
|
||||
for(yy=0;yy<48;yy++) {
|
||||
for(xx=0;xx<40;xx++) {
|
||||
|
||||
// xprime=xx*256/320;
|
||||
xprime=xx;
|
||||
/* rrolla multiply by 0xcccd trick */
|
||||
|
||||
which=frame/512;
|
||||
switch (which&0xff) {
|
||||
case 1: color=fx2(xx,yy,xprime); break;
|
||||
case 0: color=fx1(xx,yy,xprime); break;
|
||||
case 2: color=fx0(xx,yy,xprime); break;
|
||||
case 3: color=fx3(xx,yy,xprime); break;
|
||||
case 4: color=fx4(xx,yy,xprime); break;
|
||||
case 5: color=fx5(xx,yy,xprime); break;
|
||||
case 6: color=fx6(xx,yy,xprime); break;
|
||||
case 7: return 0;
|
||||
default: printf("Trying effect %d\n",which);
|
||||
}
|
||||
color_equals(color&0xf);
|
||||
plot(xx,yy);
|
||||
// printf("plot %d,%d = %d\n",xx,yy,color&0xf);
|
||||
// write_framebuffer((es<<4)+((yy*320)+xx), color);
|
||||
|
||||
/* 320*200=64000; / 3 = 21,333R1 */
|
||||
/* 65536 / 3 = 21845 R 1 */
|
||||
/* so wraps 3 times before updating screen? */
|
||||
}
|
||||
}
|
||||
|
||||
grsim_update();
|
||||
|
||||
usleep(30000);
|
||||
frame++;
|
||||
|
||||
ch=grsim_input();
|
||||
if (ch=='q') goto end;
|
||||
|
||||
usleep(10000);
|
||||
|
||||
|
||||
if (ch=='q') return 0;
|
||||
if (ch==27) return 0;
|
||||
}
|
||||
|
||||
end:
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -451,16 +451,20 @@ static void fx1(void) {
|
||||
ax=ax|al;
|
||||
// imul al ; AL=Y*Y
|
||||
imul_8(al);
|
||||
|
||||
// xchg dx,ax ; Y*Y/256 in DH, X in AL
|
||||
temp=ax;
|
||||
ax=dx;
|
||||
dx=temp;
|
||||
|
||||
// imul al ; AL=X*X
|
||||
imul_8(ax&0xff);
|
||||
|
||||
// add dh,ah ; DH=X*X+Y*Y/256
|
||||
dh=(dx>>8)&0xff;
|
||||
ah=(ax>>8)&0xff;
|
||||
dh=dh+ah;
|
||||
|
||||
// mov al,dh ; AL = X*X+Y*Y/256
|
||||
al=dh;
|
||||
|
||||
@ -471,7 +475,8 @@ static void fx1(void) {
|
||||
// add ax,bp ; offset color by time
|
||||
ax=ax+bp;
|
||||
// and al,8+16 ; select special rings
|
||||
ax=ax&0xff18;
|
||||
ax=ax&0x18;
|
||||
|
||||
}
|
||||
|
||||
/* checkers */
|
||||
|
@ -23,8 +23,10 @@
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
static unsigned short frame;
|
||||
|
||||
static unsigned short stack[128];
|
||||
static unsigned short ax,bx,cx,dx,di,bp,es;
|
||||
static unsigned short ax,bx,cx,dx,es;
|
||||
static int cf=0,of=0,zf=0,sf=0;
|
||||
static int sp=0;
|
||||
static unsigned char framebuffer[320*200];
|
||||
@ -403,7 +405,7 @@ static short pop(void) {
|
||||
}
|
||||
/* tilted plane */
|
||||
/* DH=Y, DL=X */
|
||||
static void fx0(void) {
|
||||
static int fx0(int xx, int yy, int xprime) {
|
||||
|
||||
char ah,al,dh,dl;
|
||||
unsigned short temp;
|
||||
@ -411,7 +413,7 @@ static void fx0(void) {
|
||||
ax=0x1329; // mov ax,0x1329 init
|
||||
|
||||
al=ax&0xff; ah=(ax>>8)&0xff;
|
||||
dl=dx&0xff; dh=(dx>>8)&0xff;
|
||||
dl=xprime; dh=yy;
|
||||
|
||||
|
||||
dh=dh+al; // add dh,al ; prevent divide overflow
|
||||
@ -425,7 +427,7 @@ static void fx0(void) {
|
||||
dl=dx&0xff; dh=(dx>>8)&0xff;
|
||||
|
||||
imul_8(dl); // imul dl
|
||||
dx=dx-bp; // sub dx,bp
|
||||
dx=dx-frame; // sub dx,bp
|
||||
dl=dx&0xff;
|
||||
|
||||
ah=(ax>>8)&0xff;
|
||||
@ -434,74 +436,56 @@ static void fx0(void) {
|
||||
ax=((ah&0xff)<<8)|(al&0xff);
|
||||
|
||||
ax&=0xff1c; // and al,4+8+16
|
||||
|
||||
return ax;
|
||||
}
|
||||
|
||||
/* circles? */
|
||||
/* DH=Y, DL=X */
|
||||
static void fx1(void) {
|
||||
static int fx1(int xx, int yy, int xprime) {
|
||||
|
||||
int temp;
|
||||
char al,dh,ah;
|
||||
signed short yyy,xxx;
|
||||
signed short color;
|
||||
|
||||
// mov al,dh ; get Y in AL
|
||||
al=(dx>>8)&0xff;
|
||||
// sub al,100 ; align Y vertically
|
||||
al=al-100;
|
||||
ax=ax&0xff00;
|
||||
ax=ax|al;
|
||||
// imul al ; AL=Y*Y
|
||||
imul_8(al);
|
||||
// xchg dx,ax ; Y*Y/256 in DH, X in AL
|
||||
temp=ax;
|
||||
ax=dx;
|
||||
dx=temp;
|
||||
// imul al ; AL=X*X
|
||||
imul_8(ax&0xff);
|
||||
// add dh,ah ; DH=X*X+Y*Y/256
|
||||
dh=(dx>>8)&0xff;
|
||||
ah=(ax>>8)&0xff;
|
||||
dh=dh+ah;
|
||||
// mov al,dh ; AL = X*X+Y*Y/256
|
||||
al=dh;
|
||||
yyy=yy-100; /* align Y vertically */
|
||||
|
||||
dx=dx&0xff;
|
||||
dx|=(dh<<8);
|
||||
ax=(ah<<8)|(al&0xff);
|
||||
yyy=yyy*yyy;
|
||||
color=((yyy/256)&0xff);
|
||||
|
||||
// add ax,bp ; offset color by time
|
||||
ax=ax+bp;
|
||||
// and al,8+16 ; select special rings
|
||||
ax=ax&0xff18;
|
||||
/* signed 8-bit multiply */
|
||||
xxx=(char)xprime*(char)xprime;
|
||||
color+=((xxx/256)&0xff);
|
||||
|
||||
color+=frame; /* offset color by time */
|
||||
color&=0x18; /* select special rings */
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
/* checkers */
|
||||
static void fx2(void) {
|
||||
int temp;
|
||||
unsigned char al;
|
||||
static int fx2(int xx, int yy, int xprime) {
|
||||
int color;
|
||||
|
||||
temp=ax;
|
||||
ax=dx; dx=temp; // xchg dx,ax
|
||||
ax=ax-bp; // sub ax,bp
|
||||
temp=((ax>>8)&0xff)^(ax&0xff);
|
||||
ax=ax&0xff00;
|
||||
ax|=temp; // xor al,ah
|
||||
ax|=0xdb; // or al,0xdb
|
||||
al=ax&0xff;
|
||||
al=al+0x13;
|
||||
ax=ax&0xff00;
|
||||
ax=ax|al; // add al,13h
|
||||
// ret
|
||||
color=((yy&0xff)<<8) | (xprime&0xff);
|
||||
color=color-frame; /* adjust with frame */
|
||||
color=((color>>8)&0xff)^(color&0xff); /* xor x and y */
|
||||
color|=0xdb; /* or result with 0xdb */
|
||||
color+=0x13; /* Map to yellow/grey */
|
||||
|
||||
return color;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* parallax checkrboard */
|
||||
static void fx3(void) {
|
||||
/* parallax checkerboard */
|
||||
static int fx3(int xx,int yy,int xprime) {
|
||||
|
||||
cx=bp; // mov cx,bp ; set init point to time
|
||||
dx=((yy&0xff)<<8) | (xprime&0xff);
|
||||
|
||||
cx=frame; // mov cx,bp ; set init point to time
|
||||
bx=-16; // mov bx,-16 ; limit to 16 iterations
|
||||
fx3L:
|
||||
cx=cx+di; // add cx, di ; offset by screenpointer
|
||||
cx=cx+(yy*320)+xx; // add cx, di ; offset by screenpointer
|
||||
ax=819; // mov ax,819 ; magic, related to Rrrola
|
||||
imul_16(cx); // imul cx ; get X',Y' in DX
|
||||
cf=dx&1; // ror dx,1 ; set carry flag on "hit"
|
||||
@ -522,15 +506,20 @@ fx3L:
|
||||
|
||||
ax=bx+31; // lea ax,[bx+32] ; map value to standard gray scale
|
||||
//printf("%d %d\n",ax,bx);
|
||||
|
||||
return ax;
|
||||
}
|
||||
|
||||
/* sierpinski rotozoomer */
|
||||
static void fx4(void) {
|
||||
static int fx4(int xx, int yy, int xprime) {
|
||||
|
||||
unsigned char dl,dh,bh,al;
|
||||
|
||||
dx=((yy&0xff)<<8) | (xprime&0xff);
|
||||
|
||||
dl=dx&0xff; dh=(dx>>8)&0xff;
|
||||
|
||||
cx=bp-2048; // lea cx,[bp-2048] ; center time to pass zero
|
||||
cx=frame-2048; // lea cx,[bp-2048] ; center time to pass zero
|
||||
cx=cx<<3; // sal cx,3 ; speed up by factor of 8!
|
||||
ax=(dh&0xff); // movzx ax,dh ; get X into AL
|
||||
// movsx dx,dl ; get Y into DL
|
||||
@ -576,15 +565,18 @@ static void fx4(void) {
|
||||
ax|=0x2a;
|
||||
fx4q:
|
||||
;
|
||||
return ax;
|
||||
}
|
||||
|
||||
|
||||
/* raycast bent tunnel */
|
||||
static void fx5(void) {
|
||||
static int fx5(int xx, int yy, int xprime) {
|
||||
|
||||
unsigned char al,cl;
|
||||
unsigned short temp;
|
||||
|
||||
dx=((yy&0xff)<<8) | (xprime&0xff);
|
||||
|
||||
cx=cx&0xff00;
|
||||
cx|=(-9&0xff); // mov cl,-9 ; start with depth 9 (moves backwards)
|
||||
fx5L:
|
||||
@ -626,21 +618,25 @@ fx5L:
|
||||
if ((cx!=0) && (zf==1)) goto fx5L;
|
||||
// loopz fx5L (repeat until "hit" or "iter=max"
|
||||
|
||||
cx=cx-bp; // sub cx,bp ; offset depth by time
|
||||
cx=cx-frame; // sub cx,bp ; offset depth by time
|
||||
al^=(cx&0xff); // xor al,cl ; XOR pattern for texture
|
||||
// ah=al/6;
|
||||
al=al%6; // aam 6 ; irregular pattern with MOD 6
|
||||
al+=20; // add al,20 ; offset into grayscale pattern
|
||||
ax=al&0xff;
|
||||
|
||||
return ax;
|
||||
}
|
||||
|
||||
/* ocean night */
|
||||
static void fx6(void) {
|
||||
static int fx6(int xx, int yy, int xprime) {
|
||||
char dh;
|
||||
double f;
|
||||
int edx;
|
||||
char scratch[64];
|
||||
|
||||
dx=((yy&0xff)<<8) | (xprime&0xff);
|
||||
|
||||
// bx coming in is the address of the effect
|
||||
// this is a guess, too lazy to hexdump
|
||||
bx=0x1d5;
|
||||
@ -675,72 +671,61 @@ static void fx6(void) {
|
||||
|
||||
|
||||
|
||||
ax+=bp; // add ax,bp ; modify color by time
|
||||
ax+=frame; // add ax,bp ; modify color by time
|
||||
ax&=0xff80; // and al,128 ; threshold into two bands
|
||||
ax--; // dec ax ; beautify colors to blue/black
|
||||
fx6q: ;
|
||||
return ax;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
|
||||
int temp;
|
||||
int color=0,which,xx,yy,xprime;
|
||||
|
||||
set_vga_pal();
|
||||
|
||||
mode13h_graphics_init();
|
||||
|
||||
di=0;
|
||||
bp=0x13; // xchg bp,ax ; set bp to 0x13
|
||||
frame=0x13;
|
||||
es=0xa000-10;
|
||||
|
||||
while(1) {
|
||||
for(yy=0;yy<200;yy++) {
|
||||
for(xx=0;xx<320;xx++) {
|
||||
|
||||
ax=0xcccd; // load rrrola constant
|
||||
mul_16(di); // multiply
|
||||
temp=(ax&0xff)+((ax>>8)&0xff); // add al,ah
|
||||
ax=ax&0xff00;
|
||||
ax|=(temp&0xff);
|
||||
ax=ax&0xff; // xor ah,ah
|
||||
ax=ax+bp; // add ax,bp
|
||||
ax=ax>>9; // shr ax,9
|
||||
ax=ax&0xff0f; // and al,15
|
||||
temp=ax; // xchg bx,ax
|
||||
ax=bx;
|
||||
bx=temp;
|
||||
bx=bx&0xff; // mov bh,1
|
||||
bx|=1<<8;
|
||||
xprime=xx*256/320;
|
||||
/* rrolla multiply by 0xcccd trick */
|
||||
|
||||
switch (bx&0xff) {
|
||||
case 0: fx2(); break;
|
||||
case 1: fx1(); break;
|
||||
case 2: fx0(); break;
|
||||
case 3: fx3(); break;
|
||||
case 4: fx4(); break;
|
||||
case 5: fx5(); break;
|
||||
case 6: fx6(); break;
|
||||
case 7: goto end;
|
||||
default: printf("Trying effect %d\n",bx&0xff);
|
||||
which=frame/512;
|
||||
switch (which&0xff) {
|
||||
case 0: color=fx2(xx,yy,xprime); break;
|
||||
case 1: color=fx1(xx,yy,xprime); break;
|
||||
case 2: color=fx0(xx,yy,xprime); break;
|
||||
case 3: color=fx3(xx,yy,xprime); break;
|
||||
case 4: color=fx4(xx,yy,xprime); break;
|
||||
case 5: color=fx5(xx,yy,xprime); break;
|
||||
case 6: color=fx6(xx,yy,xprime); break;
|
||||
case 7: return 0;
|
||||
default: printf("Trying effect %d\n",which);
|
||||
}
|
||||
// stosb
|
||||
write_framebuffer((es<<4)+di, ax&0xff);
|
||||
di++;
|
||||
write_framebuffer((es<<4)+((yy*320)+xx), color);
|
||||
|
||||
di++; // inc di
|
||||
di++; // inc di
|
||||
if (di!=0) continue;
|
||||
/* 320*200=64000; / 3 = 21,333R1 */
|
||||
/* 65536 / 3 = 21845 R 1 */
|
||||
/* so wraps 3 times before updating screen? */
|
||||
}
|
||||
}
|
||||
|
||||
mode13h_graphics_update(framebuffer,&pal);
|
||||
|
||||
usleep(10000);
|
||||
bp=bp+1;
|
||||
frame++;
|
||||
|
||||
if (graphics_input()) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
3
gr-sim/hellmood_memories/zooming_circles.bas
Normal file
3
gr-sim/hellmood_memories/zooming_circles.bas
Normal file
@ -0,0 +1,3 @@
|
||||
1 GR:X=PEEK(49234):A(0)=0:A(1)=5:A(2)=0:A(3)=7
|
||||
2 FOR Y=-24 TO 23: FOR X=-20 TO 19: Z=X*4/3:C=F+(Z*Z+Y*Y)/16: C=C-INT(C/32)*32:COLOR=A(C/8):PLOT X+20,Y+24:NEXT:NEXT:F=F+1: GOTO 2
|
||||
|
Loading…
x
Reference in New Issue
Block a user