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:
parent
c93cc19069
commit
413d14fb36
110
src/add-ons/screen_savers/nebula/DrawStars.c
Normal file
110
src/add-ons/screen_savers/nebula/DrawStars.c
Normal 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
|
||||
}
|
@ -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';
|
||||
|
@ -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
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user