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
|