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:
@@ -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
|
||||||
|
}
|
||||||
@@ -33,18 +33,38 @@ float presin[512];
|
|||||||
typedef unsigned short word;
|
typedef unsigned short word;
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "Draw.c"
|
#include "Draw.c"
|
||||||
|
|
||||||
void draw_stars320(char *, char);
|
#define STAR_WIDTH 320
|
||||||
void draw_stars512(char *, char);
|
#define STAR_FUNCTION draw_stars320
|
||||||
void draw_stars576(char *, char);
|
#include "DrawStars.c"
|
||||||
void draw_stars640(char *, char);
|
#define STAR_WIDTH 512
|
||||||
void draw_stars800(char *, char);
|
#define STAR_FUNCTION draw_stars512
|
||||||
void draw_stars1024(char *, char);
|
#include "DrawStars.c"
|
||||||
void draw_stars1152(char *, char);
|
#define STAR_WIDTH 576
|
||||||
void draw_stars1280(char *, char);
|
#define STAR_FUNCTION draw_stars576
|
||||||
void draw_stars1400(char *, char);
|
#include "DrawStars.c"
|
||||||
void draw_stars1600(char *, char);
|
#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';
|
const uint32 kMsgWidth = 'widt';
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -7,8 +7,6 @@ LIBS = -lbe -lscreensaver
|
|||||||
NAME = Nebula
|
NAME = Nebula
|
||||||
FILES = Nebula
|
FILES = Nebula
|
||||||
ASMFILES =
|
ASMFILES =
|
||||||
STARFILE = draw_stars
|
|
||||||
STARWIDTHS = 320 512 576 640 800 1024 1152 1280 1400 1600
|
|
||||||
OBJDIR = obj.x86
|
OBJDIR = obj.x86
|
||||||
|
|
||||||
STARFILES := $(foreach f, $(STARWIDTHS), $(STARFILE)$(f))
|
STARFILES := $(foreach f, $(STARWIDTHS), $(STARFILE)$(f))
|
||||||
@@ -38,11 +36,5 @@ Nebula: $(OBJS)
|
|||||||
$(OBJDIR)/%.o : %.cpp
|
$(OBJDIR)/%.o : %.cpp
|
||||||
$(CC) -c $*.cpp -o $(OBJDIR)/$*.o $(CFLAGS)
|
$(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:
|
tar zip backup:
|
||||||
@zip `basename $(NAME)`-`date +%Y-%m-%d`.zip *.[chS]* *.rsrc makefile
|
@zip `basename $(NAME)`-`date +%Y-%m-%d`.zip *.[chS]* *.rsrc makefile
|
||||||
|
|||||||
Reference in New Issue
Block a user