/programs/develop/libraries/TinyGL/asm_fork/export.inc |
---|
165,6 → 165,7 |
E_LIB gluDeleteQuadric |
E_LIB gluQuadricDrawStyle |
E_LIB gluQuadricOrientation |
E_LIB gluQuadricTexture |
E_LIB gluSphere |
; |
/programs/develop/libraries/TinyGL/asm_fork/glu.asm |
---|
75,7 → 75,7 |
mov dword[eax+offs_qobj_DrawStyle],ebx |
jmp @f |
.err_q: |
;quadric_error(qobj, GLU_INVALID_ENUM, "qluQuadricDrawStyle") |
stdcall dbg_print,sz_gluQuadricDrawStyle,err_9 |
@@: |
ret |
endp |
98,11 → 98,30 |
mov dword[eax+offs_qobj_Orientation],ebx |
jmp @f |
.err_q: |
;quadric_error(qobj, GLU_INVALID_ENUM, "qluQuadricOrientation") |
stdcall dbg_print,sz_gluQuadricOrientation,err_9 |
@@: |
ret |
endp |
align 4 |
proc gluQuadricTexture uses eax ebx, qobj:dword, texture:dword |
mov eax,[qobj] |
or eax,eax |
jz .err_q |
mov ebx,[texture] |
cmp ebx,GL_TRUE |
je @f |
cmp ebx,GL_FALSE |
je @f |
@@: |
mov dword[eax+offs_qobj_TextureFlag],ebx |
jmp @f |
.err_q: |
stdcall dbg_print,sz_gluQuadricTexture,err_9 |
@@: |
ret |
endp |
;void gluCylinder(GLUquadricObj *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks ) |
;{ |
;} |
179,7 → 198,7 |
@@: |
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) |
je @f |
;glTexCoord2f(0.5,0.0) |
stdcall glTexCoord2f, 0.5,0.0 |
@@: |
sub esp,4 |
fld dword[nsign] |
320,7 → 339,11 |
@@: |
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) |
je @f |
;glTexCoord2f(s,1-t) |
fld1 |
fsub dword[t] |
fstp dword[esp-4] |
sub esp,4 |
stdcall glTexCoord2f, [s] ;,1-t |
@@: |
fld dword[radius] |
fld dword[z] |
368,7 → 391,12 |
@@: |
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) |
je @f |
;glTexCoord2f(s,1-(t-dt)) |
fld1 |
fsub dword[t] |
fadd dword[d_t] |
fstp dword[esp-4] |
sub esp,4 |
stdcall glTexCoord2f, [s] ;,1-(t-dt) |
fld dword[s] |
fadd dword[d_s] |
fstp dword[s] |
404,7 → 432,7 |
@@: |
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) |
je @f |
;glTexCoord2f(0.5,1.0) |
stdcall glTexCoord2f, 0.5,1.0 |
mov dword[s],1.0 |
mov ebx,[d_t] |
mov [t],ebx |
463,7 → 491,11 |
@@: |
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) |
je @f |
;glTexCoord2f(s,1-t) |
fld1 |
fsub dword[t] |
fstp dword[esp-4] |
sub esp,4 |
stdcall glTexCoord2f, [s] ;,1-t |
fld dword[s] |
fsub dword[d_s] |
fstp dword[s] |
/programs/develop/libraries/TinyGL/asm_fork/kosgl.asm |
---|
14,11 → 14,11 |
;KOSGLContext kosglCreateContext(KOSGLContext shareList, int flags) |
;{ |
; TinyGLContext *ctx; |
; |
; if (shareList != NULL) { |
; gl_fatal_error("No sharing available in TinyGL"); |
; } |
; |
; ctx=gl_malloc(sizeof(TinyGLContext)); |
; if (!ctx) |
; return NULL; |
99,9 → 99,9 |
xor eax,eax |
stdcall ZB_open, dword[win_x], dword[win_y], dword ZB_MODE_RGB24, eax,eax,eax,eax ;NULL,NULL,NULL |
cmp eax,0 |
jne @f |
stdcall dbg_print,f_kosgl_1,err_0 |
or eax,eax |
jnz @f |
stdcall dbg_print,sz_kosglMakeCurrent,err_0 |
xor eax,eax |
jmp .err_f |
@@: |
/programs/develop/libraries/TinyGL/asm_fork/list.asm |
---|
263,9 → 263,9 |
mov ebx,[p] |
stdcall find_list,edx,[ebx+4] |
cmp eax,0 |
jne @f |
;if (eax == NULL) gl_fatal_error("list %d not defined",[ebx+4]) |
or eax,eax |
jnz @f |
;gl_fatal_error("list %d not defined",[ebx+4]) |
@@: |
mov edi,[eax] ;edi = &GLList.first_op_buffer.ops |
/programs/develop/libraries/TinyGL/asm_fork/misc.asm |
---|
54,7 → 54,7 |
stdcall dword[edx+offs_cont_gl_resize_viewport], edx ;gl_resize_viewport(context,&xsize_req,&ysize_req) |
cmp eax,0 |
je @f |
stdcall dbg_print,f_vp,err_4 |
stdcall dbg_print,sz_glViewport,err_4 |
@@: |
mov ecx,[xsize_req] |
67,40 → 67,8 |
jg @f |
cmp dword[xsize],0 |
jg @f |
stdcall dbg_print,f_vp,err_5 |
stdcall dbg_print,sz_glViewport,err_5 |
@@: |
if DEBUG ;glopViewport |
push edi |
mov ecx,80 |
mov eax,[xmin] |
lea edi,[buf_param] |
stdcall convert_int_to_str,ecx |
stdcall str_n_cat,edi,txt_zp_sp,2 |
stdcall str_len,edi |
add edi,eax |
sub ecx,eax |
mov eax,[ymin] |
stdcall convert_int_to_str,ecx |
stdcall str_n_cat,edi,txt_zp_sp,2 |
stdcall str_len,edi |
add edi,eax |
sub ecx,eax |
mov eax,[xsize] |
stdcall convert_int_to_str,ecx |
stdcall str_n_cat,edi,txt_zp_sp,2 |
stdcall str_len,edi |
add edi,eax |
sub ecx,eax |
mov eax,[ysize] |
stdcall convert_int_to_str,ecx |
stdcall str_n_cat,edi,txt_nl,2 |
stdcall dbg_print,f_vp,buf_param |
pop edi |
end if |
mov ecx,[xmin] |
mov dword[edx+offs_cont_viewport+offs_vpor_xmin],ecx |
mov ecx,[ymin] |
/programs/develop/libraries/TinyGL/asm_fork/texture.asm |
---|
9,7 → 9,7 |
mov eax,[h] |
and eax,0xff |
shl eax,2 |
add eax,[ebx] ;eax = &context.shared_state.texture_hash_table[h % TEXTURE_HASH_TABLE_SIZE] |
add eax,ebx ;eax = &context.shared_state.texture_hash_table[h % TEXTURE_HASH_TABLE_SIZE] |
; [eax] - указатель на текстуру, получаемую через хеш таблицу |
mov ecx,[h] ; ecx - указатель на искомую текстуру |
27,30 → 27,51 |
ret |
endp |
;static void free_texture(GLContext *c,int h) |
;{ |
; GLTexture *t,**ht; |
; GLImage *im; |
; int i; |
; |
; t=find_texture(c,h); |
; if (t->prev==NULL) { |
; ht=&c->shared_state.texture_hash_table |
; [t->handle % TEXTURE_HASH_TABLE_SIZE]; |
; *ht=t->next; |
; } else { |
; t->prev->next=t->next; |
; } |
; if (t->next!=NULL) t->next->prev=t->prev; |
; |
; for(i=0;i<MAX_TEXTURE_LEVELS;i++) { |
; im=&t->images[i]; |
; if (im->pixmap != NULL) gl_free(im->pixmap); |
; } |
; |
; gl_free(t); |
;} |
align 4 |
proc free_texture uses eax ebx ecx edx, context:dword, h:dword |
mov edx,[context] |
stdcall find_texture,edx,[h] ;t=find_texture(context,h) |
cmp dword[eax+offs_text_prev],0 ;if (t.prev==NULL) |
jne .else |
mov edx,[edx+offs_cont_shared_state+4] ;edx = &context.shared_state.texture_hash_table[0] |
mov ebx,[eax+offs_text_handle] |
and ebx,0xff |
shl ebx,2 |
add edx,ebx ;edx = &context.shared_state.texture_hash_table[t.handle % TEXTURE_HASH_TABLE_SIZE] |
mov ebx,[eax+offs_text_next] |
mov [edx],ebx ;*ht=t.next |
jmp @f |
.else: |
mov ebx,[eax+offs_text_prev] |
mov ecx,[eax+offs_text_next] |
mov [ebx+offs_text_next],ecx ;t.prev.next=t.next |
@@: |
cmp dword[eax+offs_text_next],0 ;if (t.next!=NULL) |
je @f |
mov ebx,[eax+offs_text_next] |
mov ecx,[eax+offs_text_prev] |
mov [ebx+offs_text_prev],ecx ;t.next.prev=t.prev |
@@: |
xor ebx,ebx |
mov ecx,[eax+offs_text_images] ;im=&t.images[0] |
.cycle_0: ;for(i=0;i<MAX_TEXTURE_LEVELS;i++) |
cmp ebx,MAX_TEXTURE_LEVELS |
jge .cycle_0_end |
cmp dword[ecx+offs_imag_pixmap],0 ;if (im.pixmap != NULL) |
je @f |
stdcall gl_free,[ecx+offs_imag_pixmap] |
@@: |
add ecx,sizeof.GLImage |
inc ebx |
jmp .cycle_0 |
.cycle_0_end: |
stdcall gl_free,eax |
ret |
endp |
;output: |
; eax - указатель на память |
align 4 |
63,7 → 84,7 |
mov ecx,[h] |
and ecx,0xff |
shl ecx,2 |
add ecx,[ebx] ;ecx = &context.shared_state.texture_hash_table[h % TEXTURE_HASH_TABLE_SIZE] |
add ecx,ebx ;ecx = &context.shared_state.texture_hash_table[h % TEXTURE_HASH_TABLE_SIZE] |
mov ebx,[ecx] |
mov [eax+offs_text_next],ebx |
90,56 → 111,94 |
ret |
endp |
;void glGenTextures(int n, unsigned int *textures) |
;{ |
; GLContext *c=gl_get_context(); |
; int max,i; |
; GLTexture *t; |
; |
; max=0; |
; for(i=0;i<TEXTURE_HASH_TABLE_SIZE;i++) { |
; t=c->shared_state.texture_hash_table[i]; |
; while (t!=NULL) { |
; if (t->handle>max) max=t->handle; |
; t=t->next; |
; } |
; |
; } |
; for(i=0;i<n;i++) { |
; textures[i]=max+i+1; |
; } |
;} |
; |
; |
;void glDeleteTextures(int n, const unsigned int *textures) |
;{ |
; GLContext *c=gl_get_context(); |
; int i; |
; GLTexture *t; |
; |
; for(i=0;i<n;i++) { |
; t=find_texture(c,textures[i]); |
; if (t!=NULL && t!=0) { |
; if (t==c->current_texture) { |
; glBindTexture(GL_TEXTURE_2D,0); |
; } |
; free_texture(c,textures[i]); |
; } |
; } |
;} |
align 4 |
proc glGenTextures uses eax ebx ecx edx esi, n:dword, textures:dword |
;edx - GLTexture *t |
call gl_get_context |
add eax,offs_cont_shared_state+4 ;offset texture_hash_table = 4 |
xor ebx,ebx ;max=0 |
xor ecx,ecx ;i=0 |
.cycle_0: ;for(i=0;i<TEXTURE_HASH_TABLE_SIZE;i++) |
cmp ecx,TEXTURE_HASH_TABLE_SIZE |
jge .cycle_0_end |
mov esi,ecx |
shl esi,2 |
add esi,[eax] |
mov edx,dword[esi] ;t=context.shared_state.texture_hash_table[i] |
.cycle_1: ;while (t!=NULL) |
or edx,edx |
jz .cycle_1_end |
cmp [edx+offs_text_handle],ebx ;if (t.handle>max) |
jle @f |
mov ebx,[edx+offs_text_handle] ;max=t.handle |
@@: |
mov edx,[edx+offs_text_next] ;t=t.next |
jmp .cycle_1 |
.cycle_1_end: |
inc ecx |
jmp .cycle_0 |
.cycle_0_end: |
xor ecx,ecx ;i=0 |
mov esi,[textures] |
.cycle_2: ;for(i=0;i<n;i++) |
cmp ecx,[n] |
jge .cycle_2_end |
inc ebx |
mov [esi],ebx ;textures[i]=max+i+1 |
add esi,4 |
inc ecx |
jmp .cycle_2 |
.cycle_2_end: |
ret |
endp |
align 4 |
proc glDeleteTextures uses eax ebx ecx edx, n:dword, textures:dword |
call gl_get_context |
mov edx,eax |
mov ecx,[textures] |
xor ebx,ebx |
.cycle_0: ;for(i=0;i<n;i++) |
cmp ebx,[n] |
jge .cycle_0_end |
stdcall find_texture,edx,[ecx] ;t=find_texture(context,textures[i]) |
or eax,eax ;if (t!=0) |
jz @f |
cmp eax,[edx+offs_cont_current_texture] ;if (t==context.current_texture) |
jne .end_1 |
stdcall glBindTexture,GL_TEXTURE_2D,0 |
.end_1: |
stdcall free_texture, edx,[ecx] |
@@: |
add ecx,4 |
inc ebx |
jmp .cycle_0 |
.cycle_0_end: |
ret |
endp |
align 4 |
proc glopBindTexture uses eax ebx edx, context:dword, p:dword |
mov ebx,[p] |
mov edx,[context] |
; assert(p[1].i == GL_TEXTURE_2D && texture >= 0); |
cmp dword[ebx+4],GL_TEXTURE_2D |
je @f |
;jne .error |
;cmp dword[ebx+8],0 |
;jge @f |
.error: |
stdcall dbg_print,sz_glBindTexture,err_7 |
@@: |
;[ebx+8] = p[2] |
stdcall find_texture, edx,dword[ebx+8] |
cmp eax,0 ;NULL |
jne @f |
stdcall alloc_texture, edx,dword[ebx+8] |
mov ebx,[ebx+8] ;ebx = p[2] |
stdcall find_texture, edx,ebx |
or eax,eax ;if(t==NULL) |
jnz @f |
stdcall alloc_texture, edx,ebx |
@@: |
mov [edx+offs_cont_current_texture],eax |
ret |
147,114 → 206,170 |
align 4 |
proc glopTexImage2D, context:dword, p:dword |
;{ |
; int target=p[1].i; |
; int level=p[2].i; |
; int components=p[3].i; |
; int width=p[4].i; |
; int height=p[5].i; |
; int border=p[6].i; |
; int format=p[7].i; |
; int type=p[8].i; |
; void *pixels=p[9].p; |
; GLImage *im; |
; unsigned char *pixels1; |
; int do_free; |
; |
; if (!(target == GL_TEXTURE_2D && level == 0 && components == 3 && |
; border == 0 && format == GL_RGB && |
; type == GL_UNSIGNED_BYTE)) { |
; gl_fatal_error("glTexImage2D: combinaison of parameters not handled"); |
; } |
; |
; do_free=0; |
; if (width != 256 || height != 256) { |
; pixels1 = gl_malloc(256 * 256 * 3); |
; /* no interpolation is done here to respect the original image aliasing ! */ |
; gl_resizeImageNoInterpolate(pixels1,256,256,pixels,width,height); |
; do_free=1; |
; width=256; |
; height=256; |
; } else { |
; pixels1=pixels; |
; } |
; |
; im=&c->current_texture->images[level]; |
; im->xsize=width; |
; im->ysize=height; |
; if (im->pixmap!=NULL) gl_free(im->pixmap); |
;#if TGL_FEATURE_RENDER_BITS == 24 |
; im->pixmap=gl_malloc(width*height*3); |
; if(im->pixmap) { |
; memcpy(im->pixmap,pixels1,width*height*3); |
; } |
;#elif TGL_FEATURE_RENDER_BITS == 32 |
; im->pixmap=gl_malloc(width*height*4); |
; if(im->pixmap) { |
; gl_convertRGB_to_8A8R8G8B(im->pixmap,pixels1,width,height); |
; } |
;#elif TGL_FEATURE_RENDER_BITS == 16 |
; im->pixmap=gl_malloc(width*height*2); |
; if(im->pixmap) { |
; gl_convertRGB_to_5R6G5B(im->pixmap,pixels1,width,height); |
; } |
;#else |
;#error TODO |
;#endif |
; if (do_free) gl_free(pixels1); |
locals |
pixels1 dd ? |
do_free dd ? |
endl |
pushad |
mov edi,[p] |
mov eax,[edi+4] ;target=p[1].i |
mov ebx,[edi+8] ;level=p[2].i |
mov ecx,[edi+12] ;components=p[3].i; |
mov edx,[edi+16] ;width=p[4].i; |
mov esi,[edi+20] ;height=p[5].i; |
cmp eax,GL_TEXTURE_2D ;if (param != GL_TEXTURE_2D) |
jne .error |
or ebx,ebx ;if (level != 0) |
jnz .error |
cmp ecx,3 ;if (components != 3) |
jne .error |
cmp dword[edi+24],0 ;if (border != 0) |
jne .error |
cmp dword[edi+28],GL_RGB ;if (format != GL_RGB) |
jne .error |
cmp dword[edi+32],GL_UNSIGNED_BYTE ;if (type != GL_UNSIGNED_BYTE) |
jne .error |
jmp @f |
.error: |
stdcall dbg_print,sz_glTexImage2D,err_8 ;"glTexImage2D: combinaison of parameters not handled" |
@@: |
mov dword[do_free],0 |
cmp edx,256 |
jne .else |
cmp esi,256 |
jne .else |
mov eax,[edi+36] |
mov [pixels1],eax ;pixels1=pixels |
jmp @f |
.else: ;if (width != 256 || height != 256) |
stdcall gl_malloc, 256*256*3 |
mov [pixels1],eax ;pixels1 = gl_malloc(256 * 256 * 3) |
; no interpolation is done here to respect the original image aliasing ! |
;gl_resizeImageNoInterpolate(eax,256,256,[edi+36],edx,esi) |
mov dword[do_free],1 |
mov edx,256 |
mov esi,256 |
@@: |
mov ecx,[context] |
mov ecx,[ecx+offs_cont_current_texture] |
add ecx,offs_text_images |
imul ebx,sizeof.GLTexture |
add ecx,ebx ;ecx = &context.current_texture.images[level] |
mov dword[ecx+offs_imag_xsize],edx ;im.xsize=width |
mov dword[ecx+offs_imag_ysize],esi ;im.ysize=height |
cmp dword[ecx+offs_imag_pixmap],0 ;if (im.pixmap!=NULL) |
je @f |
stdcall gl_free, [ecx+offs_imag_pixmap] |
@@: |
if TGL_FEATURE_RENDER_BITS eq 24 |
imul edx,esi |
imul edx,3 |
stdcall gl_malloc,edx |
mov [ecx+offs_imag_pixmap],eax ;im.pixmap = gl_malloc(width*height*3) |
or eax,eax ;if(im.pixmap) |
jz @f |
mov edi,eax |
mov esi,[pixels1] |
mov ecx,edx |
rep movsb ;memcpy(im.pixmap,pixels1,width*height*3) |
@@: |
end if |
if TGL_FEATURE_RENDER_BITS eq 32 |
mov ebx,edx |
imul edx,esi |
shl edx,2 |
stdcall gl_malloc,edx |
mov [ecx+offs_imag_pixmap],eax ;im.pixmap = gl_malloc(width*height*4) |
or eax,eax ;if(im.pixmap) |
jz @f |
;gl_convertRGB_to_8A8R8G8B(eax,[pixels1],ebx,esi) |
@@: |
end if |
if TGL_FEATURE_RENDER_BITS eq 16 |
mov ebx,edx |
imul edx,esi |
shl edx,1 |
stdcall gl_malloc,edx |
mov [ecx+offs_imag_pixmap],eax ;im.pixmap = gl_malloc(width*height*2) |
or eax,eax ;if(im.pixmap) |
jz @f |
;gl_convertRGB_to_5R6G5B(eax,[pixels1],ebx,esi) |
@@: |
end if |
cmp dword[do_free],0 ;if (do_free) |
je @f |
stdcall gl_free, [pixels1] |
@@: |
popad |
ret |
endp |
; TODO: not all tests are done |
align 4 |
proc glopTexEnv, context:dword, p:dword |
proc glopTexEnv uses eax ebx ecx, context:dword, p:dword |
mov ecx,[p] |
mov eax,[ecx+4] ;target=p[1].i |
mov ebx,[ecx+8] ;pname=p[2].i |
mov ecx,[ecx+12] ;param=p[3].i |
; int target=p[1].i; |
; int pname=p[2].i; |
; int param=p[3].i; |
; |
; if (target != GL_TEXTURE_ENV) { |
; error: |
; gl_fatal_error("glTexParameter: unsupported option"); |
; } |
; |
; if (pname != GL_TEXTURE_ENV_MODE) goto error; |
; |
; if (param != GL_DECAL) goto error; |
cmp eax,GL_TEXTURE_ENV ;if (target != GL_TEXTURE_ENV) |
jne .error |
cmp ebx,GL_TEXTURE_ENV_MODE ;if (pname != GL_TEXTURE_ENV_MODE) |
jne .error |
cmp ecx,GL_DECAL ;if (param != GL_DECAL) |
jne .error |
jmp @f |
.error: |
stdcall dbg_print,sz_glTexParameteri,err_6 |
@@: |
ret |
endp |
; TODO: not all tests are done |
align 4 |
proc glopTexParameter, context:dword, p:dword |
proc glopTexParameter uses eax ebx ecx, context:dword, p:dword |
mov ecx,[p] |
mov eax,[ecx+4] ;target=p[1].i |
mov ebx,[ecx+8] ;pname=p[2].i |
mov ecx,[ecx+12] ;param=p[3].i |
; int target=p[1].i; |
; int pname=p[2].i; |
; int param=p[3].i; |
; |
; if (target != GL_TEXTURE_2D) { |
; error: |
; gl_fatal_error("glTexParameter: unsupported option"); |
; } |
; |
; switch(pname) { |
; case GL_TEXTURE_WRAP_S: |
; case GL_TEXTURE_WRAP_T: |
; if (param != GL_REPEAT) goto error; |
; break; |
; } |
cmp eax,GL_TEXTURE_2D ;if (target != GL_TEXTURE_2D) |
jne .error |
cmp ebx,GL_TEXTURE_WRAP_S |
je @f |
cmp ebx,GL_TEXTURE_WRAP_T |
je @f |
jmp .error |
@@: |
cmp ecx,GL_REPEAT ;if (param != GL_REPEAT) |
jne .error |
jmp @f |
.error: |
stdcall dbg_print,sz_glTexParameteri,err_6 |
@@: |
ret |
endp |
align 4 |
proc glopPixelStore, context:dword, p:dword |
proc glopPixelStore uses eax ebx, context:dword, p:dword |
mov ebx,[p] |
mov eax,[ebx+4] ;pname=p[1].i |
mov ebx,[ebx+8] ;param=p[2].i |
; int pname=p[1].i; |
; int param=p[2].i; |
; |
; if (pname != GL_UNPACK_ALIGNMENT || |
; param != 1) { |
; gl_fatal_error("glPixelStore: unsupported option"); |
; } |
cmp eax,GL_UNPACK_ALIGNMENT ;if (pname != GL_UNPACK_ALIGNMENT) |
jne .error |
cmp ebx,1 ;if (param != 1) |
jne .error |
jmp @f |
.error: |
stdcall dbg_print,sz_glPixelStorei,err_6 |
@@: |
ret |
endp |
/programs/develop/libraries/TinyGL/asm_fork/tinygl.asm |
---|
86,13 → 86,12 |
align 4 |
.str: |
mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число |
;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной |
;преревод числа в ASCII строку входные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной |
cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax |
jb @f |
xor edx,edx ;очистить edx |
div ecx ;разделить - остаток в edx |
push edx ;положить в стек |
;dec edi ;смещение необходимое для записи с конца строки |
call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx |
pop eax |
@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) |
131,22 → 130,21 |
glTexCoord4d: ;(double ,double ,double, double ) |
glTexCoord4fv: ;(float *) |
glTexCoord4dv: ;(double *) |
glGenTextures: ;(int n, unsigned int *textures) |
glDeleteTextures: ;(int n, const unsigned int *textures) |
glGetIntegerv: ;(int pname,int *params) |
glGetFloatv: ;(int pname, float *v) |
align 4 |
f_kosgl_1 db 'kosglMakeCurrent',0 |
err_0 db 'Error while initializing Z buffer',13,10,0 |
f_zb_opn db ' ZB_open',0 |
err_1 db 'gl_malloc(sizeof.ZBuffer)==0',13,10,0 |
err_2 db 'gl_malloc(xsize*ysize*4)==0',13,10,0 |
err_3 db 'bit mode not correct',13,10,0 |
f_vp db ' glViewport',0 |
err_4 db 'error while resizing display',13,10,0 |
err_5 db 'size too small',13,10,0 |
f_clipcode db ' gl_clipcode',0 |
err_6 db 'unsupported option',13,10,0 |
err_7 db 'assert(target == GL_TEXTURE_2D && texture >= 0)',13,10,0 |
err_8 db 'combinaison of parameters not handled',13,10,0 |
err_9 db 'GL_INVALID_ENUM',13,10,0 |
f_zbz db ' ZB_line_z',0 |
f_zb db ' ZB_line',0 |
f_find_l db 'find_list',0 |
/programs/develop/libraries/TinyGL/asm_fork/zgl.inc |
---|
172,6 → 172,8 |
ends |
offs_imag_pixmap equ 0 |
offs_imag_xsize equ 4 |
offs_imag_ysize equ 8 |
; textures |
477,15 → 479,6 |
fincstp |
mov eax,ebx |
if DEBUG ;gl_clipcode |
push edi |
mov ecx,80 |
lea edi,[buf_param] |
stdcall convert_int_to_str,ecx |
stdcall str_n_cat,edi,txt_nl,2 |
stdcall dbg_print,f_clipcode,buf_param |
pop edi |
end if |
ret |
endp |
/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm |
---|
1,3 → 1,9 |
; |
; Макрос DRAW_LINE имеет параметр code, от которого зависит |
; будет ли включен код или объявлены переменные. |
; В версии на C++ параметра code нет, потому что там переменные |
; можно ставить в любом месте функции, в asm версии такое не проходит. |
; |
INTERP_Z equ 1 |
111,8 → 117,6 |
end if |
} |
;;;DRAW_LINE_M equ 1 |
macro DRAW_LINE code |
{ |
local .cycle_0 |
119,13 → 123,9 |
local .cycle_1 |
if TGL_FEATURE_RENDER_BITS eq 16 |
if code eq 0 |
pz dd ? ;uint* |
tmp dd ? ;uint |
z dd ? ;uint |
zz dd ? ;uint |
rgb dd ? ;uint |
drgbdx dd ? ;uint |
n dd ? ;int |
end if |
if code eq 1 |
mov eax,[x2] |
132,13 → 132,27 |
sar eax,16 |
sub eax,[x1] |
mov [n],eax ;n = (x2 >> 16) - x1 |
; pp=pp1+x1; |
; pz=pz1+x1; |
; z=z1; |
; rgb=(r1 << 16) & 0xFFC00000; |
; rgb|=(g1 >> 5) & 0x000007FF; |
; rgb|=(b1 << 5) & 0x001FF000; |
; drgbdx=_drgbdx; |
mov edi,[pp1] |
add edi,[x1] ;pp = pp1 + x1 |
mov eax,[pz1] |
add eax,[x1] |
mov [pz],eax ;pz = pz1 + x1 |
mov eax,[z1] |
mov [z],eax ;z = z1 |
mov eax,[r1] |
shl eax,16 |
and eax,0xFFC00000 |
mov [rgb],eax ;rgb = (r1 << 16) & 0xFFC00000 |
mov eax,[g1] |
shr eax,5 |
and eax,0x000007FF |
or [rgb],eax ;rgb |= (g1 >> 5) & 0x000007FF |
mov eax,[b1] |
shl eax,5 |
and eax,0x001FF000 |
or [rgb],eax ;rgb |= (b1 << 5) & 0x001FF000 |
mov eax,[_drgbdx] |
mov [drgbdx],eax ;drgbdx = _drgbdx |
align 4 |
.cycle_0: ;while (n>=3) |
cmp dword[n],3 |
148,7 → 162,7 |
PUT_PIXEL 2 |
PUT_PIXEL 3 |
add dword[pz],8 |
add edi,4 |
add edi,4*3 |
sub [n],4 |
jmp .cycle_0 |
.cycle_1: ;while (n>=0) |
156,7 → 170,7 |
jl .cycle_1_end |
PUT_PIXEL 0 |
add dword[pz],2 |
inc edi |
add edi,3 |
dec dword[n] |
jmp .cycle_1 |
.cycle_1_end: |
202,11 → 216,16 |
;edi = pp |
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
if TGL_FEATURE_RENDER_BITS eq 24 |
; unsigned char *ptr; |
; ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3; |
; pp[3 * _a]= ptr[0]; |
; pp[3 * _a + 1]= ptr[1]; |
; pp[3 * _a + 2]= ptr[2]; |
mov ebx,[t] |
and ebx,0x3fc00000 |
or ebx,[s] |
shr ebx,14 |
imul ebx,3 |
add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3 |
mov ax,word[ebx] |
mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1] |
mov al,byte[ebx+2] |
mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2] |
else |
; pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; |
end if |
242,11 → 261,17 |
mov eax,[zb] |
mov eax,[eax+offs_zbuf_current_texture] |
mov [texture],eax |
mov dword[esp-4],NB_INTERP |
fild dword[esp-4] |
fild dword[dzdx] |
fstp dword[fdzdx] |
; fndzdx=NB_INTERP * fdzdx; |
; ndszdx=NB_INTERP * dszdx; |
; ndtzdx=NB_INTERP * dtzdx; |
fst dword[fdzdx] ;fdzdx = (float)dzdx |
fmul st0,st1 |
fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx |
fld dword[fdzdx] |
fmul st0,st1 |
fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx |
fmul dword[dtzdx] |
fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx |
} |
macro PUT_PIXEL _a |
261,11 → 286,18 |
;edi = pp |
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение |
if TGL_FEATURE_RENDER_BITS eq 24 |
; unsigned char *ptr; |
; ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3; |
; pp[3 * _a]= ptr[0]; |
; pp[3 * _a + 1]= ptr[1]; |
; pp[3 * _a + 2]= ptr[2]; |
mov ebx,[t] |
and ebx,0x3fc00000 |
mov eax,[s] |
and eax,0x003fc000 |
or ebx,eax |
shr ebx,14 |
imul ebx,3 |
add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3 |
mov ax,word[ebx] |
mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1] |
mov al,byte[ebx+2] |
mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2] |
else |
; pp[_a]=*(PIXEL *)((char *)texture+ |
; (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH))); |
285,69 → 317,109 |
{ |
if TGL_FEATURE_RENDER_BITS eq 24 |
if code eq 0 |
pz dd ? ;uint * |
s dd ? ;uint |
t dd ? ;uint |
z dd ? ;uint |
zz dd ? ;uint |
n1 dd ? ;int - длинна горизонтальной линии в пикселях |
dsdx dd ? ;int |
dtdx dd ? ;int |
s_z dd ? ;float |
t_z dd ? ;float |
fz dd ? ;float |
zinv dd ? ;float |
end if |
if code eq 1 |
; n1=(x2>>16)-x1; |
; fz=(float)z1; |
; zinv=1.0 / fz; |
; pp=(pp1 + x1 * PSZB); |
; pz=pz1+x1; |
; z=z1; |
; sz=sz1; |
; tz=tz1; |
; while (n1>=(NB_INTERP-1)) { |
; { |
; float ss,tt; |
; ss=(sz * zinv); |
; tt=(tz * zinv); |
; s=(int) ss; |
; t=(int) tt; |
; dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); |
; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); |
; fz+=fndzdx; |
; zinv=1.0 / fz; |
; } |
; PUT_PIXEL(0); |
; PUT_PIXEL(1); |
; PUT_PIXEL(2); |
; PUT_PIXEL(3); |
; PUT_PIXEL(4); |
; PUT_PIXEL(5); |
; PUT_PIXEL(6); |
; PUT_PIXEL(7); |
; pz+=NB_INTERP; |
; pp=(pp + NB_INTERP * PSZB); |
; n1-=NB_INTERP; |
; sz+=ndszdx; |
; tz+=ndtzdx; |
; } |
; { |
; float ss,tt; |
; ss=(sz * zinv); |
; tt=(tz * zinv); |
; s=(int) ss; |
; t=(int) tt; |
; dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); |
; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); |
; } |
; while (n1>=0) { |
;;; PUT_PIXEL 0 |
; pz+=1; |
; pp=(PIXEL *)((char *)pp + PSZB); |
mov eax,[x2] |
sar eax,16 |
sub eax,[x1] |
mov [n1],eax ;n1 = (x2 >> 16) - x1 |
fld1 |
fild dword[z1] |
fst dword[fz] ;fz = (float)z1 |
;fld1 |
fdivp |
fstp dword[zinv] ;zinv = 1.0 / fz |
mov edi,[x1] |
imul edi,PSZB |
add edi,[pp1] ;pp = (pp1 + x1 * PSZB) |
mov eax,[pz1] |
add eax,[x1] |
mov [pz],eax ;pz = pz1 + x1 |
mov eax,[z1] |
mov [z],eax ;z = z1 |
mov eax,[sz1] |
mov [s_z],eax ;sz = sz1 |
mov eax,[tz1] |
mov [t_z],eax ;tz = tz1 |
align 4 |
.cycle_2: ;while (n1>=(NB_INTERP-1)) |
cmp dword[n1],NB_INTERP-1 |
jl .cycle_2_end |
fld dword[zinv] |
fld st0 |
fmul dword[s_z] ;ss = (sz * zinv) |
fist dword[s] ;s = (int) ss |
fmul dword[fdzdx] |
fchs |
fadd dword[dszdx] |
fmul dword[zinv] |
fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv ) |
fmul dword[t_z] ;tt = (tz * zinv) |
fist dword[t] ;t = (int) tt |
fmul dword[fdzdx] |
fchs |
fadd dword[dtzdx] |
fmul dword[zinv] |
fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv ) |
fld1 |
fld dword[fz] |
fadd dword[fndzdx] |
fst dword[fz] ;fz += fndzdx |
;fld1 |
fdivp |
fstp dword[zinv] ;zinv = 1.0 / fz |
PUT_PIXEL 0 |
PUT_PIXEL 1 |
PUT_PIXEL 2 |
PUT_PIXEL 3 |
PUT_PIXEL 4 |
PUT_PIXEL 5 |
PUT_PIXEL 6 |
PUT_PIXEL 7 |
add dword[pz],2*NB_INTERP ;pz += NB_INTERP |
add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB |
sub dword[n1],NB_INTERP ;n1 -= NB_INTERP |
fld dword[ndszdx] |
fadd dword[s_z] |
fstp dword[s_z] ;s_z += ndszdx |
fld dword[ndtzdx] |
fadd dword[t_z] |
fstp dword[t_z] ;tz += ndtzdx |
jmp .cycle_2 |
.cycle_2_end: |
fld dword[zinv] |
fld st0 |
fmul dword[s_z] ;ss = (sz * zinv) |
fist dword[s] ;s = (int) ss |
fmul dword[fdzdx] |
fchs |
fadd dword[dszdx] |
fmul dword[zinv] |
fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv ) |
fmul dword[t_z] ;tt = (tz * zinv) |
fist dword[t] ;t = (int) tt |
fmul dword[fdzdx] |
fchs |
fadd dword[dtzdx] |
fmul dword[zinv] |
fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv ) |
align 4 |
.cycle_3: ;while (n1>=0) |
cmp dword[n1],0 |
jl .cycle_3_end |
PUT_PIXEL 0 |
add dword[pz],2 ;pz += 1 |
add edi,PSZB ;pp += PSZB |
dec dword[n1] |
; } |
jmp .cycle_3 |
.cycle_3_end: |
end if |
end if |
} |
/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc |
---|
20,7 → 20,6 |
; цвет испорченных пикселей. Цвет получаеться наиболее близким к указанному |
; пользователем. |
t dd ? ;ZBufferPoint* |
pr1 dd ? ;ZBufferPoint* |
pr2 dd ? ;ZBufferPoint* |
l1 dd ? ;ZBufferPoint* |
53,6 → 52,10 |
x2 dd ? ;int |
dx2dy2 dd ? ;int |
pz dd ? ;unsigned short * |
z dd ? ;uint |
zz dd ? ;uint |
if INTERP_Z eq 1 |
z1 dd ? ;int |
dzdx dd ? ;int |
100,18 → 103,10 |
dtzdy dd ? ;float |
dtzdl_min dd ? ;float |
dtzdl_max dd ? ;float |
s_z dd ? ;float |
t_z dd ? ;float |
end if |
if DRAW_LINE_M eq 1 |
DRAW_LINE 0 ;переменные делаются в макросе |
else |
n dd ? ;int - длинна горизонтальной линии в пикселях |
if INTERP_Z eq 1 |
pz dd ? ;unsigned short * |
z dd ? ;uint |
zz dd ? ;uint |
end if |
if INTERP_RGB eq 1 |
or1 dd ? ;uint |
og1 dd ? ;uint |
121,19 → 116,14 |
s dd ? ;uint |
t dd ? ;uint |
end if |
if INTERP_STZ eq 1 |
s_z dd ? ;float |
t_z dd ? ;float |
if DRAW_LINE_M eq 1 |
DRAW_LINE 0 ;переменные делаются в макросе |
end if |
end if |
endl |
pushad |
if DEBUG ;(1) |
stdcall dbg_print,f_fill_tr,m_1 |
end if |
; we sort the vertex with increasing y |
mov ebx,[p0] |
mov ecx,[p1] |