Flanker's Home page

Voilà les routines d'affichage de caractère que j'utilise
Elles sont pas parfaites (il faudrait notamment remplacer les mulu #30,d2 par du code un peu plus optimisé), mais sont quand même très rapides et relativement petites.
Attention, les arguments sont sensés être valides !
Si vous les utilisez, mettez quand même mon nom quelque part, merci :)
draw_chr:
; input :
;<- d0.w char
;<- d1.w x
;<- d2.w y
;<- a1.l pointeur vers la fonte #1
;détruit a0-a1,d0-d3
 lsl.w #3,d0
 lea 0(a1,d0.w),a1; a1 pointe maintenant vers le caractère à afficher
 move.l #$4C00,a0;pointeur vers l'écran
;on multiplie d2 par #30 (une ligne fait 30o de long) en détruisant d0
 move.w d2,d0
 lsl.w     #1,d0
 lsl.w     #5,d2
 sub.w    d0,d2

 move.w d1,d0
 lsr.w #3,d1
 add.w d1,d2
 lea 0(a0,d2.w),a0
 andi.b #%111,d0
 moveq #7,d3
 moveq #-1,d2
 andi.b #%11,d2
 cmp.b #2,d0
 bgt _loop_0
 ror.b d0,d2
_loop_2:
 move.b (a1)+,d1
 lsr.b d0,d1
 and.b d2,(a0)
 or.b d1,(a0)
 lea 30(a0),a0
 dbra d3,_loop_2
 rts
_loop_0:
 move.l d4,-(a7)
 moveq #8,d1
 sub.b d0,d1
 move.l d2,d4
 rol.w d1,d4
 ror.w d0,d2
_loop_1:
 move.b (a1)+,d0
 lsl.w d1,d0
 and.b d4,1(a0)
 or.b d0,1(a0)
 lsr.w #8,d0
 and.b d2,(a0)
 or.b d0,(a0)
 lea 30(a0),a0
 dbra d3,_loop_1
 move.l (a7)+,d4
 rts
 


little_char:
; input :
;<- d0.w char
;<- d1.w x
;<- d2.w y
;<- a1.l pointeur vers la fonte #1
;détruit a0-a1,d0-d3
 move.l #$4C00,a0;pointeur vers l'écran
 move.w d0,d4
 add.w d4,d4
 add.w d4,d0
 add.w d0,d0
 lea 0(a1,d0.w),a1
 moveq #0,d4
 move.b (a1)+,d4
 moveq #-1,d0
 lsr.b d4,d0

;on multiplie d2 par #30 (une ligne fait 30o de long) en détruisant d0
 move.w d2,d0
 lsl.w     #1,d0
 lsl.w     #5,d2
 sub.w    d0,d2

 move.b d1,d3
 andi.b #%111,d3
 lsr.w #3,d1
 add.w d1,d2
 lea 0(a0,d2.w),a0
 move.b d3,d1
 add.b d4,d1
 cmp.b #7,d1
 bgt little_0
 ror.b d3,d0
 moveq #4,d2
 little_loop_1:
 move.b (a1)+,d1
 and.b d0,(a0)
 ror.b d3,d1
 or.b d1,(a0)
 lea 30(a0),a0
 dbra d2,little_loop_1
 rts
little_0:
 movem.l d6-d7,-(a7)
 move.w d0,d1
 moveq #8,d2
 sub.b d3,d2
 rol.w d2,d1
 ror.w d3,d0
 moveq #4,d7
little_loop_2:
 moveq #0,d5
 move.b (a1)+,d5
 move.b d5,d6
 lsl.b d2,d5
 lsr.b d3,d6
 and.b d1,1(a0)
 and.b d0,(a0)
 or.b d5,1(a0)
 or.b d6,(a0)
 lea 30(a0),a0
 dbra d7,little_loop_2
 movem.l (a7)+,d6-d7
 rts