; ; Jaguar Example Source Code ; Jaguar Workshop Series #4 ; Copyright (c)1994 Atari Corp. ; ALL RIGHTS RESERVED ; ; Program: scale.cof - Object Scaling Example ; Module: scl_scal.s - Routine and variables to scale bitmap ; ; Revision History: ; 6/16/94 - SDS: Created ; 8/03/94 - SDS: Removed dynamic updating of object list. Moved it to UpdateList .include "scale.inc" ; .include "joytrick.inc" ; Globals .globl ScaleBitmap .globl InitScaleVars .globl h_scale .globl v_scale .globl x_pos .globl y_pos ; Externals .extern draw_invers .extern height .extern width .extern a_vdb .extern a_vde .extern a_hdb .extern a_hde ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Procedure: InitScaleVars ; Initialize variables for our bitmap to be scaled ; ; Registers: None ; InitScaleVars: clr.w frame_count ; 0 frames so far move.w #$20,h_scale ; %001 00000 = 1.0 move.w #$20,v_scale move.w #1,h_off move.w #1,v_off rts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Procedure: ScaleBitmap ; Updating scaling variables ; ScaleBitmap: movem.l d0-d2,-(sp) move #0,add_wert move.w frame_count,d0 add.w #1,d0 cmp.w #UPDATE_FREQ,d0 ; Enough frames? beq do_scale ; Do scale update move.w d0,frame_count ; Update counter bra scale_done ; outta here do_scale: move.w v_scale,d0 ; Old scaling value ; add.w v_off,d0 ; Add offset move.w d0,v_scale ; Re-store bne .test_high ; >0 ; ; move #0,draw_invers ;-------------------- move.w #1,v_off ; Else reverse scaling bra do_vscale .test_high: cmp.w #SCALE_LIMIT,d0 ; Too high blt do_vscale ;move #1,draw_invers ; ----------------- move.w #-1,v_off ; ...then reverse do_vscale: ; Now we have to determine the adjusted height of the bitmap so we ; can adjust YPOS to center the bitmap. move.l #BMP_HEIGHT,d1 ; Original height mulu.w d0,d1 ; Multiply lsr.l #5,d1 ; Normalize d1 move.w height,d2 ; YPOS = (height - sub.w d1,d2 ; bmp_height + add.w a_vdb,d2 ; a_vde) andi.w #$7FE,d2 ; Range check. move.w d2,y_pos ; Now do H_SCALE and WIDTH move.w h_scale,d0 ; Current scale factor add.w h_off,d0 ; Add offset move.w d0,h_scale ; Re-store bne .test_high move #0,add_wert tst.w draw_invers beq .weiter ; sub.w #BMP_WIDTH,add_wert ; move #0,draw_invers .weiter: move.w #1,h_off ; Reverse increment bra do_hscale .test_high: cmp.w #SCALE_LIMIT,d0 blt do_hscale move #0,add_wert tst.w draw_invers bne .ww ; add.w #BMP_WIDTH,add_wert ; move #1,draw_invers .ww: move.w #-1,h_off ; Now downward do_hscale: ; Now adjust the bitmap XPOS for its new width move.l #BMP_WIDTH,d1 ; Fixed width mulu.w d0,d1 ; Multiply to scale lsr.l #5,d1 ; Normalize d1 clr.l d2 ; Calculate screen width move.w width,d2 lsr.w #2,d2 ; /4 Pixel Divisor sub.w d1,d2 lsr.w #1,d2 andi.w #$0FFF,d2 ; Range check ;add.w add_wert,d2 move.w d2,x_pos clr.w frame_count ; Wait til next frame interval scale_done: movem.l (sp)+,d0-d2 rts .bss frame_count: .ds.w 1 h_scale: .ds.w 1 v_scale: .ds.w 1 x_pos: .ds.w 1 y_pos: .ds.w 1 h_off: .ds.w 1 v_off: .ds.w 1 add_wert: .ds.w 1 .end