From 413d14fb36add8747a83f2ab8520e20acd922bfc Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 7 Jul 2015 15:37:06 -0400 Subject: [PATCH] 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. --- src/add-ons/screen_savers/nebula/DrawStars.c | 110 ++++++++++++++++++ src/add-ons/screen_savers/nebula/Nebula.cpp | 42 +++++-- src/add-ons/screen_savers/nebula/draw_stars.S | 78 ------------- src/add-ons/screen_savers/nebula/makefile | 8 -- 4 files changed, 141 insertions(+), 97 deletions(-) create mode 100644 src/add-ons/screen_savers/nebula/DrawStars.c delete mode 100644 src/add-ons/screen_savers/nebula/draw_stars.S diff --git a/src/add-ons/screen_savers/nebula/DrawStars.c b/src/add-ons/screen_savers/nebula/DrawStars.c new file mode 100644 index 0000000000..f3542e28cb --- /dev/null +++ b/src/add-ons/screen_savers/nebula/DrawStars.c @@ -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 +} diff --git a/src/add-ons/screen_savers/nebula/Nebula.cpp b/src/add-ons/screen_savers/nebula/Nebula.cpp index 6f6402bc5a..4f1e180d57 100644 --- a/src/add-ons/screen_savers/nebula/Nebula.cpp +++ b/src/add-ons/screen_savers/nebula/Nebula.cpp @@ -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'; diff --git a/src/add-ons/screen_savers/nebula/draw_stars.S b/src/add-ons/screen_savers/nebula/draw_stars.S deleted file mode 100644 index df27e83889..0000000000 --- a/src/add-ons/screen_savers/nebula/draw_stars.S +++ /dev/null @@ -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 diff --git a/src/add-ons/screen_savers/nebula/makefile b/src/add-ons/screen_savers/nebula/makefile index c074f5808e..9e6d0ab932 100644 --- a/src/add-ons/screen_savers/nebula/makefile +++ b/src/add-ons/screen_savers/nebula/makefile @@ -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