123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400 |
- IFND NOLINK
- FUNC_SPRITES = 1
- ; include custom.i
- ; include myheader.i
- ; INCLUDE funcs.f
- ENDC
- *****************************************************************************
- * Both the blitter and the processor sprite *
- * routines use d0-d7 a0 & a1 *
- * the blitter version also uses a2 *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
- *****************************************************************************
- SPRITE_SCREEN_WIDTH = SCREEN_WIDTH
- *****************************************************************************
- xdef _s8_draw
- _s8_draw
- rts
- *****************************************************************************
- * d0 = x d1 = y d2 = height a0 = the screen a1 = source *
- *****************************************************************************
- xdef _s16_draw
- _s16_draw ;
- move.w d2,d7 *1 calculate the plane size
- add.w d7,d7 *2
- tst.w d1 is y less than 0
- bge.s .y_not_minus no, ok.
- ******************************************************************************
- * QY is negative
- neg.w d1
- sub.w d1,d2 do we see any of it ?
- ble .not_drawn no, dont draw the thing at all
- ; a 16 pixel wide sprite has 2 bytes a line, so we have to multiply by 2
- add.w d1,d1 *2
- adda.w d1,a1 move into the source the required no. of lines
- bra.s .y_clipped
- *********
- .y_not_minus
- move.w lines_high(pc),d6
- cmp.w d6,d1
- bge .not_drawn
- IFNE SCREEN_WIDTH-40
- fail 'sorry, SCREEN_WIDTH changed you gotta re-write this bit'
- ENDC
- move.w d1,d3
- add.w d3,d3 *2
- add.w d3,d3 *4
- add.w d1,d3 *5
- lsl.w #3,d3 *8*5 = *40
- adda.w d3,a0 move down the screen
- add.w d2,d1
- sub.w d6,d1
- blt.s .y_clipped
- sub.w d1,d2 adjust height of sprite to fit the fucker on
- .y_clipped
- *****************************************************************************
- * I suppose I better do the QX stuff now
- tst.w d0
- bge.s .x_not_minus x ok, well at least it isn't negative!
- cmpi.w #-16,d0
- ble.s .not_drawn it is off screen
- bra blit_left_16
- .x_not_minus
- move.w d0,d3
- andi.w #$f,d0 just the shift
- * we want . . . 0-15 ->0, 16-31->2 etc.........
- eor.w d0,d3 all but the shift
- lsr.w #3,d3 AMIGA
- move.w sprite_screen_width(pc),d6 """""
- cmp.w d6,d3 is it off the right side of the screen ?
- bge.s .not_drawn yes
- adda.w d3,a0 adjust destination
- subq.w #2,d6 AMIGA
- cmp.w d6,d3
- bne blit_mid_16
- * right hand only case
- moveq #0,d1
- bra blit_right_16
- .not_drawn
- rts
- ;left_gone BLTCON0 BLTCON1 BLTAFWM BLTALWM
- left16lu
- dc.w $0fca, $0000, $0000, $0000
- dc.w $1fca, $1000, $0001, $0000
- dc.w $2fca, $2000, $0003, $0000
- dc.w $3fca, $3000, $0007, $0000
- dc.w $4fca, $4000, $000f, $0000
- dc.w $5fca, $5000, $001f, $0000
- dc.w $6fca, $6000, $003f, $0000
- dc.w $7fca, $7000, $007f, $0000
- dc.w $8fca, $8000, $00ff, $0000
- dc.w $9fca, $9000, $01ff, $0000
- dc.w $afca, $a000, $03ff, $0000
- dc.w $bfca, $b000, $07ff, $0000
- dc.w $cfca, $c000, $0fff, $0000
- dc.w $dfca, $d000, $1fff, $0000
- dc.w $efca, $e000, $3fff, $0000
- dc.w $ffca, $f000, $7fff, $0000
- blit_left_16
- subq.l #2,a0
- andi.w #$f,d0
- lsl.w #3,d0 shifted for lookup
- lea left16lu,a2
- movem.l (a2,d0.w),d0/d1
- movem.l d0/d1,(BLTCON0).l
- move.w #-2,(BLTAMOD).l
- move.w #-2,(BLTBMOD).l
- move.w #SCREEN_WIDTH-4,(BLTCMOD).l
- move.w #SCREEN_WIDTH-4,(BLTDMOD).l
- lsl.w #6,d2
- addq.w #4/2,d2
- bra blit_sprite
- right_16_lu
- ;right_gone BLTCON0 BLTCON1 BLTAFWM BLTALWM 2 less on the width
- dc.w $0fca, $0000, $ffff, $ffff
- dc.w $1fca, $1000, $ffff, $fffe
- dc.w $2fca, $2000, $ffff, $fffc
- dc.w $3fca, $3000, $ffff, $fff8
- dc.w $4fca, $4000, $ffff, $fff0
- dc.w $5fca, $5000, $ffff, $ffe0
- dc.w $6fca, $6000, $ffff, $ffc0
- dc.w $7fca, $7000, $ffff, $ff80
- dc.w $8fca, $8000, $ffff, $ff00
- dc.w $9fca, $9000, $ffff, $fe00
- dc.w $afca, $a000, $ffff, $fc00
- dc.w $bfca, $b000, $ffff, $f800
- dc.w $cfca, $c000, $ffff, $f000
- dc.w $dfca, $d000, $ffff, $e000
- dc.w $efca, $e000, $ffff, $c000
- dc.w $ffca, $f000, $ffff, $8000
- blit_right_16
- andi.w #$f,d0
- lsl.w #3,d0 shifted for lookup
- lea right_16_lu,a2
- movem.l (a2,d0.w),d0/d1
- movem.l d0/d1,(BLTCON0).l
- move.w #0,(BLTAMOD).l
- move.w #0,(BLTBMOD).l
- move.w #SCREEN_WIDTH-2,(BLTCMOD).l
- move.w #SCREEN_WIDTH-2,(BLTDMOD).l
- lsl.w #6,d2
- addq.w #2/2,d2
- bra blit_sprite
- rts
- ;mid screen BLTCON0 BLTCON1 BLTAFWM BLTALWM
- mid16lu
- dc.w $0fca, $0000, $ffff, $0000
- dc.w $1fca, $1000, $ffff, $0000
- dc.w $2fca, $2000, $ffff, $0000
- dc.w $3fca, $3000, $ffff, $0000
- dc.w $4fca, $4000, $ffff, $0000
- dc.w $5fca, $5000, $ffff, $0000
- dc.w $6fca, $6000, $ffff, $0000
- dc.w $7fca, $7000, $ffff, $0000
- dc.w $8fca, $8000, $ffff, $0000
- dc.w $9fca, $9000, $ffff, $0000
- dc.w $afca, $a000, $ffff, $0000
- dc.w $bfca, $b000, $ffff, $0000
- dc.w $cfca, $c000, $ffff, $0000
- dc.w $dfca, $d000, $ffff, $0000
- dc.w $efca, $e000, $ffff, $0000
- dc.w $ffca, $f000, $ffff, $0000
- blit_mid_16
- lsl.w #3,d0 shifted for lookup
- lea mid16lu,a2
- movem.l (a2,d0.w),d0/d1
- movem.l d0/d1,(BLTCON0).l
- move.w #-2,(BLTAMOD).l
- move.w #-2,(BLTBMOD).l
- move.w #SCREEN_WIDTH-4,(BLTCMOD).l
- move.w #SCREEN_WIDTH-4,(BLTDMOD).l
- lsl.w #6,d2
- addq.w #4/2,d2
- bra blit_sprite
- *****************************************************************************
- xdef _s32_draw
- _s32_draw ;
- ; move.w #$707,(COLOR).l
- move.w d2,d7 *1 calculate the plane size
- add.w d7,d7 *2
- add.w d7,d7 *4
- tst.w d1 is y less than 0
- bge.s .y_not_minus no, ok.
- ******************************************************************************
- * QY is negative
- neg.w d1
- sub.w d1,d2 do we see any of it ?
- ble .not_drawn no, dont draw the thing at all
- ; a 32 pixel wide sprite has 4 bytes a line, so we have to multiply by 4
- add.w d1,d1 *2
- add.w d1,d1 *4
- adda.w d1,a1 move into the source the required no. of lines
- bra.s .y_clipped
- *********
- .y_not_minus
- move.w lines_high(pc),d6
- cmp.w d6,d1
- bge .not_drawn
- IFNE SCREEN_WIDTH-40
- fail 'sorry, SCREEN_WIDTH changed you gotta re-write this bit'
- ENDC
- move.w d1,d3
- add.w d3,d3 *2
- add.w d3,d3 *4
- add.w d1,d3 *5
- lsl.w #3,d3 *8*5 = *40
- adda.w d3,a0 move down the screen
- add.w d2,d1
- sub.w d6,d1
- blt.s .y_clipped
- sub.w d1,d2 adjust height of sprite to fit the fucker on
- .y_clipped
- *****************************************************************************
- * I suppose I better do the X stuff now
- tst.w d0
- bge.s .x_not_minus x ok, well at least it isn't negative!
- cmpi.w #-32,d0
- ble.s .not_drawn it is off screen
- cmpi.w #-16,d0
- blt blit_left_32_lt16
- bra blit_left_32_gt16
- .x_not_minus
- move.w d0,d3
- andi.w #$f,d0 just the shift
- * we want . . . 0-15 ->0, 16-31->2 etc.........
- eor.w d0,d3 all but the shift
- lsr.w #3,d3
- adda.w d3,a0 adjust destination
- move.w sprite_screen_width(pc),d6 """""
- subq.w #6,d6
- cmp.w d6,d3 is it definately on screen ?
- ble blit_mid_32 yes
- addq.w #2,d6
- cmp.w d6,d3 is it mostly on screen ?
- ble blit_right_32_gt16 yes
- addq.w #2,d6
- cmp.w d6,d3 is it partly on screen ?
- ble blit_right_32_lt16 yes
- .not_drawn
- rts
- blit_right_32_gt16
- andi.w #$f,d0
- lsl.w #3,d0 shifted for lookup
- lea right_16_lu,a2
- movem.l (a2,d0.w),d0/d1
- movem.l d0/d1,(BLTCON0).l
- move.w #0,(BLTAMOD).l
- move.w #0,(BLTBMOD).l
- move.w #SCREEN_WIDTH-4,(BLTCMOD).l
- move.w #SCREEN_WIDTH-4,(BLTDMOD).l
- lsl.w #6,d2
- addq.w #4/2,d2
- bra blit_sprite
- rts
- blit_right_32_lt16
- andi.w #$f,d0
- lsl.w #3,d0 shifted for lookup
- lea right_16_lu,a2
- movem.l (a2,d0.w),d0/d1
- movem.l d0/d1,(BLTCON0).l
- move.w #2,(BLTAMOD).l
- move.w #2,(BLTBMOD).l
- move.w #SCREEN_WIDTH-2,(BLTCMOD).l
- move.w #SCREEN_WIDTH-2,(BLTDMOD).l
- lsl.w #6,d2
- addq.w #2/2,d2
- bra blit_sprite
- rts
- blit_left_32_lt16
- subq.l #2,a0
- addq.l #2,a1
- andi.w #$f,d0
- lsl.w #3,d0 shifted for lookup
- lea left16lu,a2
- movem.l (a2,d0.w),d0/d1
- movem.l d0/d1,(BLTCON0).l
- move.w #0,(BLTAMOD).l
- move.w #0,(BLTBMOD).l
- move.w #SCREEN_WIDTH-4,(BLTCMOD).l
- move.w #SCREEN_WIDTH-4,(BLTDMOD).l
- lsl.w #6,d2
- addq.w #4/2,d2
- bra blit_sprite
- blit_left_32_gt16
- subq.l #2,a0
- andi.w #$f,d0
- lsl.w #3,d0 shifted for lookup
- lea left16lu,a2
- movem.l (a2,d0.w),d0/d1
- movem.l d0/d1,(BLTCON0).l
- move.w #-2,(BLTAMOD).l
- move.w #-2,(BLTBMOD).l
- move.w #SCREEN_WIDTH-6,(BLTCMOD).l
- move.w #SCREEN_WIDTH-6,(BLTDMOD).l
- lsl.w #6,d2
- addq.w #6/2,d2
- bra blit_sprite
- rts
- blit_mid_32
- lsl.w #3,d0 shifted for lookup
- lea mid16lu,a2
- movem.l (a2,d0.w),d0/d1
- movem.l d0/d1,(BLTCON0).l
- move.w #-2,(BLTAMOD).l
- move.w #-2,(BLTBMOD).l
- move.w #SCREEN_WIDTH-6,(BLTCMOD).l
- move.w #SCREEN_WIDTH-6,(BLTDMOD).l
- lsl.w #6,d2
- addq.w #6/2,d2
- blit_sprite *****************************************************************
- * a0-> screen address; a1-> sprite data; d2 = blitsize; d7 = planesize *
- * mods, cons & endmasks are set up *
- *****************************************************************************
- BLIT_NASTY
- ; move.w #$ff0,(COLOR).l
- lea (a1,d7.w),a2
- move.l a0,(BLTCPT).l dest as source
- move.l a0,(BLTDPT).l dest
- move.l a2,(BLTBPT).l source
- move.l a1,(BLTAPT).l template
- move.w d2,(BLTSIZE).l plane 0
- ; wait_blit
- add.w d7,a2 next plane of source
- lea PLANE_SIZE(a0),a0 next plane of screen
- move.l a0,(BLTCPT).l dest as source
- move.l a0,(BLTDPT).l dest
- move.l a2,(BLTBPT).l source
- move.l a1,(BLTAPT).l template
- move.w d2,(BLTSIZE).l plane 1
- ; wait_blit
- add.w d7,a2 next plane of source
- lea PLANE_SIZE(a0),a0 next plane of screen
- move.l a0,(BLTCPT).l dest as source
- move.l a0,(BLTDPT).l dest
- move.l a2,(BLTBPT).l source
- move.l a1,(BLTAPT).l template
- move.w d2,(BLTSIZE).l plane 2
- ; wait_blit
- add.w d7,a2 next plane of source
- lea PLANE_SIZE(a0),a0 next plane of screen
- move.l a0,(BLTCPT).l dest as source
- move.l a0,(BLTDPT).l dest
- move.l a2,(BLTBPT).l source
- move.l a1,(BLTAPT).l template
- move.w d2,(BLTSIZE).l plane 3
- ; wait_blit
- BLIT_NICE
- ; move.w #0,(COLOR).l
- rts
- *
- xdef lines_high
- lines_high dc.w 200
- xdef sprite_screen_width
- sprite_screen_width dc.w 40
|