home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga ACS 1998 #6
/
amigaacscoverdisc1998-061998.iso
/
games
/
descent
/
source
/
2d
/
scalea.asm
< prev
next >
Wrap
Assembly Source File
|
1998-06-08
|
6KB
|
249 lines
;THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
;SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
;END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
;ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
;IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
;SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
;FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
;CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
;AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
;COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
;
; $Source: f:/miner/source/2d/rcs/scalea.asm $
; $Revision: 1.2 $
; $Author: john $
; $Date: 1994/01/12 18:02:52 $
;
; Asm inner loop for scaler.
;
; $Log: scalea.asm $
; Revision 1.2 1994/01/12 18:02:52 john
; Asm code for the scaler... first iteration here
; has compiled code that works!!
;
; Revision 1.1 1994/01/12 12:20:11 john
; Initial revision
;
;
.386
option oldstructs
.nolist
include types.inc
include psmacros.inc
.list
assume cs:_TEXT, ds:_DATA
_DATA segment dword public USE32 'DATA'
rcsid db "$Id: scalea.asm 1.2 1994/01/12 18:02:52 john Exp $"
align 4
public _scale_trans_color
public _scale_error_term
public _scale_initial_pixel_count
public _scale_adj_up
public _scale_adj_down
public _scale_final_pixel_count
public _scale_ydelta_minus_1
public _scale_whole_step
public _scale_source_ptr
public _scale_dest_ptr
_scale_trans_color db ?
_scale_error_term dd ?
_scale_initial_pixel_count dd ?
_scale_adj_up dd ?
_scale_adj_down dd ?
_scale_final_pixel_count dd ?
_scale_ydelta_minus_1 dd ?
_scale_whole_step dd ?
_scale_source_ptr dd ?
_scale_dest_ptr dd ?
_scale_cc_jump_spot dd ?
_scale_slice_length_1 dd ?
_scale_slice_length_2 dd ?
_DATA ends
_TEXT segment dword public USE32 'CODE'
PUBLIC rls_stretch_scanline_asm_
rls_stretch_scanline_asm_:
cld
pusha
mov esi, _scale_source_ptr
mov edi, _scale_dest_ptr
mov edx, _scale_ydelta_minus_1
mov ebx, _scale_whole_step
mov ah, _scale_trans_color
mov ebp, _scale_error_term
mov ecx, _scale_initial_pixel_count
lodsb
cmp al, ah
je first_pixel_transparent
rep stosb
jmp next_pixel
first_pixel_transparent:
add edi, ecx
jmp next_pixel
skip_this_pixel: add edi, ecx
dec edx
jz done
next_pixel: lodsb ; get next source pixel
mov ecx, ebx
add ebp, _scale_adj_up
jle no_inc_error_term
inc ecx
sub ebp, _scale_adj_down
no_inc_error_term:
cmp al, ah
je skip_this_pixel
rep stosb ; write source pixel to n locations
dec edx
jnz next_pixel
done: lodsb
cmp al, ah
je exit_sub
mov ecx, _scale_final_pixel_count
rep stosb
exit_sub:
popa
ret
PUBLIC scale_do_cc_scanline_
PUBLIC rls_do_cc_setup_asm_
scale_do_cc_scanline_:
cld
pusha
mov esi, _scale_source_ptr
mov edi, _scale_dest_ptr
mov ah, _scale_trans_color
mov ebx, _scale_slice_length_1
mov edx, _scale_slice_length_2
mov ecx, _scale_initial_pixel_count
; Do the first texture pixel
mov ecx, _scale_initial_pixel_count
lodsb
cmp al, ah
je @f
rep stosb
@@: add edi, ecx
mov ecx, _scale_cc_jump_spot
jmp ecx
; This is the compiled code to do the middle pixels...
scale_cc_start: mov al, [esi]
scale_cc_changer: mov ecx, ebx ;<==== CODE CHANGES TO EBX OR EDX !!!!!!
inc esi
cmp al, ah
je @f
rep stosb
@@: add edi, ecx
scale_cc_end:
REPT 319
mov al, [esi]
mov ecx, ebx ;<==== CODE CHANGES TO EBX OR EDX !!!!!!
inc esi
cmp al, ah
je @f
rep stosb
@@: add edi, ecx
ENDM
last_cc_instruction:
mov ecx, _scale_final_pixel_count
lodsb
cmp al, ah
je last_one_transparent
rep stosb
last_one_transparent:
popa
ret
rls_do_cc_setup_asm_:
pusha
mov ebx, _scale_whole_step
mov _scale_slice_length_1, ebx
inc ebx
mov _scale_slice_length_2, ebx
mov ebp, _scale_error_term
mov edx, _scale_ydelta_minus_1
mov ebx, offset scale_cc_end
sub ebx, offset scale_cc_start ; ebx = distance to next changer inst.
mov eax, _scale_ydelta_minus_1
imul eax, ebx ; eax = sizeof 1 iteration * numiterations.
mov edi, offset last_cc_instruction
sub edi, eax ; edi = address of first iteration that we need
; to jump to
mov _scale_cc_jump_spot, edi
mov ecx, offset scale_cc_changer
sub ecx, offset scale_cc_start ; ecx = distance from start to to next changer inst.
add edi, ecx
next_pixel1: add ebp, _scale_adj_up
jle no_inc_error_term1
; Modify code in scale_do_cc_scanline_ to write 'edx' pixels
mov al, byte ptr [edi]
cmp al, 08bh
jne BigError
mov word ptr [edi], 0CA8Bh ; 0x8BCA = mov ecx, edx
add edi, ebx
sub ebp, _scale_adj_down
dec edx
jnz next_pixel1
jmp done1
no_inc_error_term1: ; Modify code in scale_do_cc_scanline_ to write 'ebx' pixels
mov al, byte ptr [edi]
cmp al, 08bh
jne BigError
mov word ptr [edi], 0CB8Bh ; 0x8BCB = mov ecx, ebx
add edi, ebx
dec edx
jnz next_pixel1
done1: popa
ret
BigError: int 3 ; Stop, buddy!!
popa
ret
_TEXT ends
end