123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- *****************************************************************
- * MODULE TITLE :darkline *
- * *
- * DESCRIPTION :consists of line drawing routines *
- * *
- * *
- * *
- * NAME DATE *
- * *
- * LIST OF ROUTINES :draw_line *
- * EOR_draw_line *
- * *
- *****************************************************************
- draw_line
- ifnd hard_only
- bsr own_the_blitter
- endc
- movem.l a6,-(sp)
- move.l screen_mem(a0),a0
- do_line_bits
- MOVEQ #0,D6
- MOVEQ #0,D7
- MOVE.W D0,-(SP)
- MOVE.W D0,D6 ;STORE FOR USE IN CALCING START POS
- MOVE.W D1,D7
- CALC_OCTANT
- MOVEQ #0,D5 ;USE TO LOCATE OC
- sub.w d1,d3 ;sub y1 from y2
- bpl y2bigger
- neg.w d3
- bset #2,d5
- y2bigger
- sub.w d0,d2 ;x1 from x2
- bpl x2bigger
- neg.w d2
- bset #1,d5
- x2bigger
- cmp.w d2,d3 ;is deltax smaller than deltay
- BGe.s DELTAXSMALLER
- BSET #0,D5 ;D5 CONTAINS OCTANT POS
- move.w d3,sdelta
- move.w d2,ldelta
- bra.s calc_start
- DELTAXSMALLER
- move.w d3,ldelta
- move.w d2,sdelta
- CALC_START
- moveq #0,d2
- move.l #main_screen_struct,a6
- move.w screen_x_size(a6),d2
- asr.w #3,d2
- mulu d2,d7
-
- ADD.L D7,A0
- andi.w #$fff0,d6
- asr #3,d6
- ADD.L D6,A0 ;START POINT HELD IN A0
- MOVEQ #0,D6
- move.w sdelta,d6
- asl #1,d6
- move.w d6,sdelta
- MOVE.W LDELTA,D2
- MOVE.W d2,length
- SUB.W D2,D6
- asl #1,D2 ;CON LDELTA
- MOVE.W SDELTA,D1
- SUB.W D2,D1 ;contains xpres2
- MOVE.W (SP)+,D0 ;INIT BLTCON0
- andi.w #$000f,d0
- ROR.W #4,D0
- OR.W #$0Bca,D0
- MOVE.W SDELTA,D7
- CMP.W LENGTH,D7
- BGT NO_SET
- MOVE.W #$40,D7
- BRA OR_IN_VAL
- NO_SET
- MOVE.W #0,D7
- OR_IN_VAL
- LEA TABLE,A6 ;OCTANT
- OR.B (A6,D5),D7
- BLITTER_IT
-
- BLITQ BTST #14,$dff002
- BNE BLITQ
- MOVE.W #$ffff,$dff072
- MOVE.W #$8000,$dff074 ;MUST BE THIS
- MOVE.L A0,$dff048 ;START ADDRESS
- MOVE.L A0,$dff054
- MOVE.l d6,$dff050 ;CONTAINS 2*SDELTA-LDELTA
- MOVE.W SDELTA,$dff062 ;2*SDELTA IN HERE
- MOVE.W d1,$dff064 ;CONTAINS 2*SDELTA-2*LDELTA (xpres2)
-
- MOVE.W D0,$dff040
- move.l #main_screen_struct,a0
- move.w screen_x_size(a0),d0
- asr.w #3,d0
- MOVE.W d0,$dff066 ;SCREEN WIDTH IN BYTES
- MOVE.W d0,$dff060
- MOVE.W D7,$dff042
- MOVE.W #$ffff,$dff044 ;MASK
- MOVE.W length,D0
- CMPi.W #0,D0
- BHI KLM
- MOVE.W #1,D0
- KLM
- asl #6,D0
- ADDi.W #2,D0
- MOVE.W D0,$dff058
- movem.l (sp)+,a6
- ifnd hard_only
- bsr disown_the_blitter
- endc
- RTS
- dark_line
- movem.l a6,-(sp)
- bra do_line_bits
- eor_dark_line
- movem.l a6,-(sp)
- bra eor_line_bits
- table
- DC.B 0*4+1
- DC.B 4*4+1
- DC.B 2*4+1
- DC.B 5*4+1
- DC.B 1*4+1
- DC.B 6*4+1
- DC.B 3*4+1
- DC.B 7*4+1
- EVEN
- sdelta dc.w 0
- length dc.w 0
- ldelta dc.w 0
- EOR_draw_line
- ifnd hard_only
- bsr own_the_blitter
- endc
- movem.l a6,-(sp)
- move.l screen_mem(a0),a0
- eor_line_bits
- MOVEQ #0,D6
- MOVEQ #0,D7
- MOVE.W D0,-(SP)
- MOVE.W D0,D6 ;STORE FOR USE IN CALCING START POS
- MOVE.W D1,D7
- E_CALC_OCTANT
- MOVEQ #0,D5 ;USE TO LOCATE OC
- sub.w d1,d3 ;sub y1 from y2
- bpl e_y2bigger
- neg.w d3
- bset #2,d5
- e_y2bigger
- sub.w d0,d2 ;x1 from x2
- bpl e_x2bigger
- neg.w d2
- bset #1,d5
- e_x2bigger
- cmp.w d2,d3 ;is deltax smaller than deltay
- BGe.s e_DELTAXSMALLER
- BSET #0,D5 ;D5 CONTAINS OCTANT POS
- move.w d3,sdelta
- move.w d2,ldelta
- bra.s e_calc_start
- e_DELTAXSMALLER
- move.w d3,ldelta
- move.w d2,sdelta
- e_CALC_START
- moveq #0,d2
- move.l #main_screen_struct,a6
- move.w screen_x_size(a6),d2
- asr.w #3,d2
- mulu d2,d7
-
- ADD.L D7,A0
- andi.w #$fff0,d6
- asr #3,d6
- ADD.L D6,A0 ;START POINT HELD IN A0
- MOVEQ #0,D6
- move.w sdelta,d6
- asl #1,d6
- move.w d6,sdelta
- MOVE.W LDELTA,D2
- MOVE.W d2,length
- SUB.W D2,D6
- asl #1,D2 ;CON LDELTA
- MOVE.W SDELTA,D1
- SUB.W D2,D1 ;contains xpres2
- MOVE.W (SP)+,D0 ;INIT BLTCON0
- andi.w #$000f,d0
- ROR.W #4,D0
- OR.W #$0B5a,D0
- MOVE.W SDELTA,D7
- CMP.W LENGTH,D7
- BGT e_NO_SET
- MOVE.W #$40,D7
- BRA e_OR_IN_VAL
- e_NO_SET
- MOVE.W #0,D7
- e_OR_IN_VAL
- LEA TABLE,A6 ;OCTANT
- OR.B (A6,D5),D7
- e_BLITTER_IT
-
- e_BLITQ BTST #14,$dff002
- BNE e_BLITQ
- MOVE.W #$ffff,$dff072
- MOVE.W #$8000,$dff074 ;MUST BE THIS
- MOVE.L A0,$dff048 ;START ADDRESS
- MOVE.L A0,$dff054
- MOVE.l d6,$dff050 ;CONTAINS 2*SDELTA-LDELTA
- MOVE.W SDELTA,$dff062 ;2*SDELTA IN HERE
- MOVE.W d1,$dff064 ;CONTAINS 2*SDELTA-2*LDELTA (xpres2)
-
- MOVE.W D0,$dff040
- move.l #main_screen_struct,a0
- move.w screen_x_size(a0),d0
- asr.w #3,d0
- MOVE.W d0,$dff066 ;SCREEN WIDTH IN BYTES
- MOVE.W d0,$dff060
- MOVE.W D7,$dff042
- MOVE.W #$ffff,$dff044 ;MASK
- MOVE.W length,D0
- CMPi.W #0,D0
- BHI e_KLM
- MOVE.W #1,D0
- e_KLM
- asl #6,D0
- ADDi.W #2,D0
- MOVE.W D0,$dff058
- movem.l (sp)+,a6
- ifnd hard_only
- bsr disown_the_blitter
- endc
- RTS
|