home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / 2d / scalea.asm < prev    next >
Assembly Source File  |  1998-06-08  |  6KB  |  249 lines

  1. ;THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  2. ;SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  3. ;END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  4. ;ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  5. ;IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  6. ;SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  7. ;FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  8. ;CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  9. ;AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  10. ;COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  11. ;
  12. ; $Source: f:/miner/source/2d/rcs/scalea.asm $
  13. ; $Revision: 1.2 $
  14. ; $Author: john $
  15. ; $Date: 1994/01/12 18:02:52 $
  16. ; Asm inner loop for scaler.
  17. ; $Log: scalea.asm $
  18. ; Revision 1.2  1994/01/12  18:02:52  john
  19. ; Asm code for the scaler... first iteration here
  20. ; has compiled code that works!!
  21. ; Revision 1.1  1994/01/12  12:20:11  john
  22. ; Initial revision
  23.  
  24.  
  25.  
  26. .386
  27.     option    oldstructs
  28.  
  29.     .nolist
  30.     include    types.inc
  31.     include    psmacros.inc
  32.     .list
  33.  
  34.     assume    cs:_TEXT, ds:_DATA
  35.  
  36. _DATA    segment    dword public USE32 'DATA'
  37.  
  38. rcsid    db    "$Id: scalea.asm 1.2 1994/01/12 18:02:52 john Exp $"
  39.     align    4
  40.     
  41.  
  42.     public _scale_trans_color        
  43.     public _scale_error_term        
  44.     public _scale_initial_pixel_count    
  45.     public _scale_adj_up            
  46.     public _scale_adj_down            
  47.     public _scale_final_pixel_count    
  48.     public _scale_ydelta_minus_1        
  49.     public _scale_whole_step        
  50.     public _scale_source_ptr        
  51.     public _scale_dest_ptr            
  52.  
  53.         
  54.     _scale_trans_color        db    ?
  55.     _scale_error_term        dd    ?
  56.     _scale_initial_pixel_count    dd    ?
  57.     _scale_adj_up            dd    ?
  58.     _scale_adj_down            dd    ?
  59.     _scale_final_pixel_count    dd    ?
  60.     _scale_ydelta_minus_1        dd    ?
  61.     _scale_whole_step        dd    ?
  62.     _scale_source_ptr        dd    ?
  63.     _scale_dest_ptr            dd    ?
  64.     _scale_cc_jump_spot        dd    ?
  65.     _scale_slice_length_1        dd    ?
  66.     _scale_slice_length_2        dd    ?
  67.  
  68. _DATA    ends
  69.  
  70.  
  71. _TEXT    segment    dword public USE32 'CODE'
  72.  
  73.  
  74. PUBLIC rls_stretch_scanline_asm_
  75.  
  76. rls_stretch_scanline_asm_:
  77.         cld
  78.         pusha
  79.         mov    esi, _scale_source_ptr
  80.         mov    edi, _scale_dest_ptr
  81.         mov    edx, _scale_ydelta_minus_1
  82.         mov    ebx, _scale_whole_step
  83.         mov    ah,  _scale_trans_color
  84.         mov    ebp, _scale_error_term
  85.  
  86.         mov    ecx, _scale_initial_pixel_count
  87.         lodsb
  88.         cmp    al, ah
  89.         je    first_pixel_transparent
  90.         rep    stosb
  91.         jmp    next_pixel
  92.  
  93. first_pixel_transparent:
  94.         add    edi, ecx
  95.         jmp    next_pixel
  96.  
  97. skip_this_pixel:    add    edi, ecx
  98.             dec    edx
  99.             jz    done
  100.  
  101. next_pixel:        lodsb                ; get next source pixel
  102.             mov    ecx, ebx                    
  103.             add    ebp, _scale_adj_up
  104.             jle    no_inc_error_term
  105.             inc    ecx
  106.             sub    ebp, _scale_adj_down
  107. no_inc_error_term:                        
  108.             cmp    al, ah
  109.             je    skip_this_pixel
  110.             rep    stosb            ; write source pixel to n locations
  111.             dec    edx
  112.             jnz    next_pixel
  113.  
  114. done:            lodsb
  115.             cmp    al, ah
  116.             je    exit_sub
  117.             mov    ecx, _scale_final_pixel_count
  118.             rep    stosb
  119.  
  120. exit_sub:
  121.             popa
  122.             ret
  123.  
  124. PUBLIC scale_do_cc_scanline_
  125. PUBLIC rls_do_cc_setup_asm_
  126.  
  127. scale_do_cc_scanline_:
  128.     cld
  129.     pusha
  130.     mov    esi, _scale_source_ptr
  131.     mov    edi, _scale_dest_ptr
  132.     mov    ah,  _scale_trans_color
  133.     mov    ebx, _scale_slice_length_1
  134.     mov    edx, _scale_slice_length_2
  135.  
  136.     mov    ecx, _scale_initial_pixel_count
  137.  
  138.     ; Do the first texture pixel
  139.     mov    ecx, _scale_initial_pixel_count
  140.     lodsb
  141.     cmp    al, ah
  142.     je    @f
  143.     rep    stosb
  144. @@:    add    edi, ecx
  145.  
  146.     mov    ecx, _scale_cc_jump_spot
  147.     jmp    ecx
  148.  
  149.     ; This is the compiled code to do the middle pixels...
  150. scale_cc_start:        mov    al, [esi]
  151. scale_cc_changer:    mov    ecx, ebx    ;<==== CODE CHANGES TO EBX OR EDX !!!!!!
  152.             inc    esi
  153.             cmp    al, ah
  154.             je    @f
  155.             rep    stosb
  156.         @@:    add    edi, ecx
  157. scale_cc_end:
  158.  
  159.     REPT 319
  160.             mov    al, [esi]
  161.             mov    ecx, ebx    ;<==== CODE CHANGES TO EBX OR EDX !!!!!!
  162.             inc    esi
  163.             cmp    al, ah
  164.             je    @f
  165.             rep    stosb
  166.         @@:    add    edi, ecx
  167.     ENDM
  168. last_cc_instruction:
  169.  
  170.     mov    ecx, _scale_final_pixel_count
  171.     lodsb
  172.     cmp    al, ah
  173.     je    last_one_transparent
  174.     rep    stosb
  175. last_one_transparent:
  176.  
  177.     popa
  178.     ret
  179.  
  180. rls_do_cc_setup_asm_:
  181.  
  182.         pusha
  183.  
  184.         mov    ebx, _scale_whole_step
  185.         mov      _scale_slice_length_1, ebx
  186.         inc    ebx
  187.         mov      _scale_slice_length_2, ebx
  188.  
  189.         mov    ebp, _scale_error_term
  190.         mov    edx, _scale_ydelta_minus_1
  191.  
  192.         mov    ebx, offset scale_cc_end
  193.         sub    ebx, offset scale_cc_start    ; ebx = distance to next changer inst.
  194.  
  195.         mov    eax, _scale_ydelta_minus_1
  196.  
  197.         
  198.         imul    eax, ebx        ; eax = sizeof 1 iteration * numiterations.
  199.                         
  200.         mov    edi, offset last_cc_instruction
  201.         sub    edi, eax        ; edi = address of first iteration that we need
  202.                         ;       to jump to
  203.         mov    _scale_cc_jump_spot, edi
  204.  
  205.         mov    ecx, offset scale_cc_changer
  206.         sub    ecx, offset scale_cc_start    ; ecx = distance from start to to next changer inst.
  207.         
  208.         add    edi, ecx
  209.  
  210. next_pixel1:        add    ebp, _scale_adj_up
  211.             jle    no_inc_error_term1
  212.             ; Modify code in scale_do_cc_scanline_ to write 'edx' pixels
  213.         mov    al, byte ptr [edi]
  214.         cmp    al, 08bh
  215.         jne    BigError
  216.             mov    word ptr [edi], 0CA8Bh    ; 0x8BCA = mov ecx, edx
  217.             add    edi, ebx        
  218.             sub    ebp, _scale_adj_down
  219.             dec    edx
  220.             jnz    next_pixel1
  221.             jmp    done1
  222.  
  223. no_inc_error_term1:    ; Modify code in scale_do_cc_scanline_ to write 'ebx' pixels
  224.         mov    al, byte ptr [edi]
  225.         cmp    al, 08bh
  226.         jne    BigError
  227.             mov    word ptr [edi], 0CB8Bh    ; 0x8BCB = mov ecx, ebx
  228.             add    edi, ebx        
  229.             dec    edx
  230.             jnz    next_pixel1
  231.  
  232. done1:        popa
  233.         ret
  234.  
  235. BigError:    int 3    ; Stop, buddy!!
  236.         popa
  237.         ret
  238.  
  239. _TEXT    ends
  240.  
  241.     end
  242.  
  243. 
  244.