screen_savers/Nebula: Convert draw_stars.S to C.

Hand-translated. I left the assembly in as comments for easy analysis,
I'll remove it in the next commit.
This commit is contained in:
Augustin Cavalier 2015-07-07 15:37:06 -04:00
parent c93cc19069
commit 413d14fb36
4 changed files with 141 additions and 97 deletions

View File

@ -0,0 +1,110 @@
// Hand-translated from x86 assembly.
/* this function needs a definition from outside (the width of the bitmap) */
// #define STAR_WIDTH 320
// #define STAR_FUNCTION draw_stars320
/* draw a star (5 pixels) */
void STAR_FUNCTION(char* dstParam, char incParam)
{
// movl 8(%ebp),%edi /* dst */
// movl 12(%ebp),%edx /* inc */
//
unsigned char* dst;
unsigned char inc;
dst = (unsigned char*)dstParam;
inc = (unsigned char)incParam;
dst[STAR_WIDTH] += inc;
if (dst[STAR_WIDTH] < inc) {
// addb %dl,(STAR_WIDTH)(%edi)
// Overflowed.
dst[STAR_WIDTH] = 255;
// movb $255,(STAR_WIDTH)(%edi)
}
// jnc 3f
//
//3:
inc >>= 1;
// shrb $1,%dl
unsigned char al;
al = *dst;
// movb (%edi),%al
unsigned char cl;
cl = dst[STAR_WIDTH - 1];
// movb (STAR_WIDTH-1)(%edi),%cl
al += inc;
// addb %dl,%al
if (al >= inc) {
cl += inc;
// addb %dl,%cl
if (cl < inc) {
// jc 2f
// 2:
*dst = 255;
// movb $255,(%edi)
dst[STAR_WIDTH - 1] = 255;
// movb $255,(STAR_WIDTH-1)(%edi)
} else {
*dst = al;
// movb %al,(%edi)
dst[STAR_WIDTH - 1] = cl;
// movb %cl,(STAR_WIDTH-1)(%edi)
}
} else {
// 1:
cl += inc;
// addb %dl,%cl
if (cl < inc) {
// jc 2f
*dst = 255;
// movb $255,(%edi)
dst[STAR_WIDTH - 1] = 255;
// movb $255,(STAR_WIDTH-1)(%edi)
} else {
*dst = 255;
// movb $255,(%edi)
dst[STAR_WIDTH - 1] = cl;
// movb %cl,(STAR_WIDTH-1)(%edi)
}
}
al = dst[STAR_WIDTH * 2];
// movb 2*STAR_WIDTH(%edi),%al
cl = dst[STAR_WIDTH + 1];
// movb (STAR_WIDTH+1)(%edi),%cl
al += inc;
// addb %dl,%al
if (al < inc) {
// jc 11f
cl += inc;
// addb %dl,%cl
if (cl >= inc) {
dst[STAR_WIDTH * 2] = 255;
// movb $255,(2*STAR_WIDTH)(%edi)
dst[STAR_WIDTH + 1] = cl;
// movb %cl,(STAR_WIDTH+1)(%edi)
return;
}
} else {
cl += inc;
// addb %dl,%cl
if (cl >= inc) {
// jc 21f
dst[STAR_WIDTH * 2] = al;
// movb %al,2*STAR_WIDTH(%edi)
dst[STAR_WIDTH + 1] = cl;
// movb %cl,(STAR_WIDTH+1)(%edi)
return;
}
}
//
//21:
dst[STAR_WIDTH * 2] = 255;
// movb $255,2*STAR_WIDTH(%edi)
dst[STAR_WIDTH + 1] = 255;
// movb $255,(STAR_WIDTH+1)(%edi)
// popl %edi
// leave
// ret
}

View File

@ -33,18 +33,38 @@ float presin[512];
typedef unsigned short word;
extern "C" {
#include "Draw.c"
#include "Draw.c"
void draw_stars320(char *, char);
void draw_stars512(char *, char);
void draw_stars576(char *, char);
void draw_stars640(char *, char);
void draw_stars800(char *, char);
void draw_stars1024(char *, char);
void draw_stars1152(char *, char);
void draw_stars1280(char *, char);
void draw_stars1400(char *, char);
void draw_stars1600(char *, char);
#define STAR_WIDTH 320
#define STAR_FUNCTION draw_stars320
#include "DrawStars.c"
#define STAR_WIDTH 512
#define STAR_FUNCTION draw_stars512
#include "DrawStars.c"
#define STAR_WIDTH 576
#define STAR_FUNCTION draw_stars576
#include "DrawStars.c"
#define STAR_WIDTH 640
#define STAR_FUNCTION draw_stars640
#include "DrawStars.c"
#define STAR_WIDTH 800
#define STAR_FUNCTION draw_stars800
#include "DrawStars.c"
#define STAR_WIDTH 1024
#define STAR_FUNCTION draw_stars1024
#include "DrawStars.c"
#define STAR_WIDTH 1152
#define STAR_FUNCTION draw_stars1152
#include "DrawStars.c"
#define STAR_WIDTH 1280
#define STAR_FUNCTION draw_stars1280
#include "DrawStars.c"
#define STAR_WIDTH 1400
#define STAR_FUNCTION draw_stars1400
#include "DrawStars.c"
#define STAR_WIDTH 1600
#define STAR_FUNCTION draw_stars1600
#include "DrawStars.c"
}
const uint32 kMsgWidth = 'widt';

View File

@ -1,78 +0,0 @@
.text
/* this function needs a definition from outside (the width of the bitmap) */
// #define STAR_WIDTH 320
// #define STAR_FUNCTION draw_stars320
/* draw a star (5 pixels) */
.globl STAR_FUNCTION
.type STAR_FUNCTION,@function
STAR_FUNCTION:
pushl %ebp
movl %esp,%ebp
pushl %edi
movl 8(%ebp),%edi /* dst */
movl 12(%ebp),%edx /* inc */
addb %dl,(STAR_WIDTH)(%edi)
jnc 3f
movb $255,(STAR_WIDTH)(%edi)
3:
shrb $1,%dl
movb (%edi),%al
movb (STAR_WIDTH-1)(%edi),%cl
addb %dl,%al
jc 1f
addb %dl,%cl
jc 2f
movb %al,(%edi)
movb %cl,(STAR_WIDTH-1)(%edi)
jmp 31f
1:
addb %dl,%cl
jc 2f
movb $255,(%edi)
movb %cl,(STAR_WIDTH-1)(%edi)
jmp 31f
2:
movb $255,(%edi)
movb $255,(STAR_WIDTH-1)(%edi)
31:
movb 2*STAR_WIDTH(%edi),%al
movb (STAR_WIDTH+1)(%edi),%cl
addb %dl,%al
jc 11f
addb %dl,%cl
jc 21f
movb %al,2*STAR_WIDTH(%edi)
movb %cl,(STAR_WIDTH+1)(%edi)
popl %edi
leave
ret
11:
addb %dl,%cl
jc 21f
movb $255,(2*STAR_WIDTH)(%edi)
movb %cl,(STAR_WIDTH+1)(%edi)
popl %edi
leave
ret
21:
movb $255,2*STAR_WIDTH(%edi)
movb $255,(STAR_WIDTH+1)(%edi)
popl %edi
leave
ret

View File

@ -7,8 +7,6 @@ LIBS = -lbe -lscreensaver
NAME = Nebula
FILES = Nebula
ASMFILES =
STARFILE = draw_stars
STARWIDTHS = 320 512 576 640 800 1024 1152 1280 1400 1600
OBJDIR = obj.x86
STARFILES := $(foreach f, $(STARWIDTHS), $(STARFILE)$(f))
@ -38,11 +36,5 @@ Nebula: $(OBJS)
$(OBJDIR)/%.o : %.cpp
$(CC) -c $*.cpp -o $(OBJDIR)/$*.o $(CFLAGS)
$(OBJDIR)/$(STARFILE)%.o : $(STARFILE).S
$(CC) -c $(STARFILE).S -DSTAR_WIDTH=$* -DSTAR_FUNCTION=draw_stars$* -o $@
$(OBJDIR)/%.o : %.S
$(CC) -c $*.S -o $(OBJDIR)/$*.o $(CFLAGS)
tar zip backup:
@zip `basename $(NAME)`-`date +%Y-%m-%d`.zip *.[chS]* *.rsrc makefile