home *** CD-ROM | disk | FTP | other *** search
- @program prog_code,prog_name
-
- ;************** Start of Fargo program ***************
-
- ; Fargo sprite demo
- ; Sprite routines by Rob Taylor
-
- prog_code:
- move.w #$0700,d0
- trap #1
- move.l $64,old_int_1
- bclr.b #2,$600001
- move.l #int_1,$64
- bset.b #2,$600001
- trap #1
-
- move.l #121,d6
- move.l #62,d7
- move.l #4,d4
- lea Spritedata(pc),a5
-
- main_loop:
- move.l d6,d0
- move.l #10,d1
- move.l #10,d2
- move.l #3,d4
-
- jsr hexlib[put_hex]
- move.l d7,d0
- move.l #10,d1
- move.l #20,d2
- move.l #3,d4
- jsr hexlib[put_hex]
-
- move.w d6,d0
- move.w d7,d1
- move.l a5,a0
-
- bsr PutSprite
-
- test_key:
- tst.w ($75B0)
- beq test_arrow
-
- clr.w ($75B0)
- move.w ($75B2),d0
- cmp.w #$108,d0
- beq exit
-
- test_arrow:
- move.w ($75A0),d0
- move.w d0,d1
- and.w #$FFF0,d1
- cmp.w #$0050,d1
- bne wait_vbl
-
- testdown:
- btst #1,d0
- bne testup
- add.w #1,d7
- cmp.w #112,d7
- bcs testup
- move.w #112,d7
-
- testup:
- btst #3,d0
- bne testleft
- sub.w #1,d7
- bcc testleft
- clr.w d7
-
- testleft:
- btst #2,d0
- bne testright
- sub.w #1,d6
- bcc testright
- clr.w d6
-
- testright:
- btst #0,d0
- bne wait_vbl
- add.w #1,d6
- cmp.w #224,d6
- bcs wait_vbl
- move.w #224,d6
-
- wait_vbl:
- tst.w vbl_phase
- bne wait_vbl
- add.w #4,vbl_phase
-
- bsr RemoveSprite
- bra main_loop
-
- exit:
- move.w #$0700,d0
- trap #1
- bclr.b #2,$600001
- move.l old_int_1,$64
- bset.b #2,$600001
- trap #1
-
- rts
-
- ;*****************************************************
-
- int_1:
- add.w #1,vbl_phase
- and.w #3,vbl_phase
-
- move.l old_int_1,-(a7)
- rts
-
- ;*****************************************************
-
- ;16*16 sprite put
- ;data is of the format
- ;32 bytes sprite
- ;32 bytes mask
- ;a0=pointer to sprite
- ;d0=x coord, d1=y coord
-
- PutSprite:
- move.w d1,d2 multiply d1 by 30
- lsl.w #4,d1
- sub.w d2,d1
- lsl.w #1,d1
- ext.l d1
- move.l d1,a1
-
- move.w d0,d2
- and.w #$F,d2
- and.w #$fff0,d0
- asr.w #3,d0
- ext.l d0
- adda.l d0,a1 a1=address to start putting sprite at
- adda.l #$004440,a1
-
- lea backstore(pc),a2
-
- move.l a1,(a2)+
- tst.w d2
- beq QuickPut if x is on a word boundary we're OK
- cmp.w #8,d2
- blt RightShift
-
- LeftShift:
- move.w #1,(a2)+
-
- sub.w #16,d2
- neg.w d2
- move.w #15,d3
- LeftLoop:
-
- move.l (a1),d0
- move.l d0,(a2)+ store background
-
- clr.l d1
- move.w 32(a0),d1 get mask
- lsl.l d2,d1 shift it
- not.l d1
- and.l d1,d0 and with back
- clr.l d1
- move.w (a0)+,d1 get data
- lsl.l d2,d1 shift it
- or.l d1,d0 or with back+mask
- move.l d0,(a1) put it on the screen
- lea 30(a1),a1 next line
- dbra d3,LeftLoop loop
- rts
-
- RightShift:
- move.w #1,(a2)+
- move.w #15,d3
- RightLoop:
- move.l (a1),d0
- move.l d0,(a2)+ store background
-
- clr.l d1
- move.w 32(a0),d1 get mask
- swap d1
- lsr.l d2,d1 shift it
- not.l d1
- and.l d1,d0 and with back
-
- clr.l d1
- move.w (a0)+,d1 get data
- swap d1
- lsr.l d2,d1 shift it
- or.l d1,d0 or with back+mask
- move.l d0,(a1) put it on the screen
- lea 30(a1),a1 next line
- dbra d3,RightLoop loop
- rts
-
- QuickPut:
- move.w #0,(a2)+
- move.w #15,d3
- QuickLoop:
- move.w (a1),d0
- move.w d0,(a2)+ store background
-
- move.w 32(a0),d1 get mask
- not.w d1
- and.w d1,d0 and with back
-
- move.w (a0)+,d1 get data
- or.w d1,d0 or with back+mask
- move.w d0,(a1) put it on the screen
- lea 30(a1),a1 next line
- dbra d3,QuickLoop loop
- rts
-
- RemoveSprite:
- lea backstore(pc),a1
- move.l (a1)+,a0
- tst.w (a1)+
- beq QuickRemove
-
- move.w #15,d1
- RemoveLoop:
- move.l (a1)+,(a0)
- lea 30(a0),a0
- dbra d1,RemoveLoop
- rts
-
- QuickRemove:
- move.w #15,d1
- QRemoveLoop:
- move.w (a1)+,(a0)
- lea 30(a0),a0
- dbra d1,QRemoveLoop
- rts
-
- ;*****************************************************
-
- backstore:
- dc.l 0
- dc.w 0
- dcb.l 16,0
-
- ;*****************************************************
-
- Spritedata:
- dc.w %1111000000001111
- dc.w %0111100000011110
- dc.w %0011110000111100
- dc.w %0001111001111000
- dc.w %0000111111110000
- dc.w %0000011111100000
- dc.w %0000001001000000
- dc.w %0000001001000000
- dc.w %0000001001000000
- dc.w %0000011111100000
- dc.w %0000111111110000
- dc.w %0001111001111000
- dc.w %0011110000111100
- dc.w %0111100000011110
- dc.w %1111000000001111
- dc.w %0000000000000000
-
- dc.w %1111100000011111
- dc.w %1111110000111111
- dc.w %0111111001111110
- dc.w %0011111111111100
- dc.w %0001111111111000
- dc.w %0000111111110000
- dc.w %0000011111100000
- dc.w %0000011111100000
- dc.w %0000011111100000
- dc.w %0000111111110000
- dc.w %0001111111111000
- dc.w %0011111111111100
- dc.w %0111111001111110
- dc.w %1111110000111111
- dc.w %1111100000011111
- dc.w %1111000000001111
-
- ;*****************************************************
-
- old_int_1 dc.l 0
-
- vbl_phase dc.w 0
-
- prog_name:
- dc.b "Sprite test",0
- ds.w 0
-
- ;*************** End of Fargo program ****************
-
- reloc_open
- add_library hexlib
- reloc_close
- end
-