home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
451.lha
/
MuchMore_v2.7
/
txt
/
MMQText.asm
< prev
next >
Wrap
Assembly Source File
|
1990-12-08
|
19KB
|
827 lines
;*---------------------------------------------------------------------------
; :Program. MMQText.ASM
; :Contents. Procedure for fast text-output used within MuchMore
; :Author. Fridtjof Siebert
; :Address. Nobileweg 67, D-7-Stgt-40
; :Shortcut. [fbs]
; :History. V 2.0 03-Sep-89 [fbs]
; :History. V 2.6 26-Jun-90 [fbs] removed globals
; :Copyright. Public Domain
; :Language. 68000 Assembler
; :Translator. a68k
;---------------------------------------------------------------------------*
XDEF QText ; QText Procedure
XDEF GetFontData ; GetFontData Procedure
XDEF CopyLine1 ; CopyLine1 Procedure
XDEF CopyLine2 ; CopyLine2 Procedure
; BitMap:
bm_BytesPerRow = 0
bm_Rows = 2
bm_Flags = 4
bm_Depth = 5
bm_Pad = 6
bm_Planes = 8
bm_SIZEOF = 40
;* d1 - vertical position (pixel position)
;* a0 - Pointer to String (0C-Termination)
;* a1 - Pointer to BitMap to store String
;* a2 - Pointer to TextFont
;
;Special codes:
; 1..16: background color (x-1) & 3, foreground ((x-1) / 4) & 3
; 17: switch to plain text
; 18: switch to italics
; 19: switch to bold
; 20: switch to italics and bold
; 21: underline on
; 22: underline off
; Register use:
; D0: character
; D1: vertical position
; D2: bytesperrow
; D3: to examine character
; D4: Offset of fontstyle
; D5: offset (row * bytesperrow)
; A0: points to string
; A1: plane # 1
; A2: fontdata
; A3: character address in font.chardata
; A4: plane # 2;
; A5: procedure to type in correct color
; A6: negative character
p1 EQUR A1;
p2 EQUR A4;
chr EQUR A3;
nch EQUR A6;
col EQUR A5;
char EQUR d0
vert EQUR d1
bpr EQUR d2
ch2 EQUR d3
style EQUR d4
dadr EQUR d5
ulin EQUR d6 ; underline on ?
nuln EQUR d7 ; underline off?
QText:
move.l A5,-(A7);
lea Col04,col;
clr style;
sf ulin;
st nuln;
move bm_BytesPerRow(a1),bpr;
ext.l bpr;
mulu bpr,vert;
move.l bm_Planes+4(a1),p2; position in plane #2
move.l bm_Planes(a1),p1; position in plane #1
add.l vert,p1; add offset within plane
add.l vert,p2;
move.l p1,chr;
move.l p2,nch;
move bpr,vert;
subq #1,vert;
clrline:
clr.l (chr)+ ; clear line
clr.l (chr)+
clr.l (nch)+
clr.l (nch)+
dbra vert,clrline;
move bpr,vert;
asl #3,vert;
sub bpr,vert; vert = 7*bpr;
loop:
move.b (a0)+,char; ; get character
beq return;
cmp.b #$20,char;
bcc \typechr;
cmp.b #17,char;
blt \newcol;
cmp.b #22,char;
cmp.b #21,char;
blt \newstyle;
seq ulin;
sne nuln;
bra.s loop;
\newstyle;
bhi.s loop;
sub.b #17,char;
ext.w char;
move char,style;
asl #1,style;
add char,style;
asl #8,style;
add style,style;
bra loop;
\newcol:
subq.b #1,char;
bne \l0;
lea Col00,col;
bra loop;
\l0:
subq.b #1,char;
bne \l1;
lea Col01,col;
bra loop;
\l1:
subq.b #1,char;
bne \l2;
lea Col02,col;
bra loop;
\l2:
subq.b #1,char;
bne \l3;
lea Col03,col;
bra loop;
\l3:
subq.b #1,char;
bne \l4;
lea Col04,col;
bra loop;
\l4:
subq.b #1,char;
bne \l5;
lea Col05,col;
bra loop;
\l5:
subq.b #1,char;
bne \l6;
lea Col06,col;
bra loop;
\l6:
subq.b #1,char;
bne \l7;
lea Col07,col;
bra loop;
\l7:
subq.b #1,char;
bne \l8;
lea Col08,col;
bra loop;
\l8:
subq.b #1,char;
bne \l9;
lea Col09,col;
bra loop;
\l9:
subq.b #1,char;
bne \la;
lea Col10,col;
bra loop;
\la:
subq.b #1,char;
bne \lb;
lea Col11,col;
bra loop;
\lb:
subq.b #1,char;
bne \lc;
lea Col12,col;
bra loop;
\lc:
subq.b #1,char;
bne \ld;
lea Col13,col;
bra loop;
\ld:
subq.b #1,char;
bne \le;
lea Col14,col;
bra loop;
\le:
lea Col15,col;
bra loop;
\typechr:
sub.b #$20,char;
and #$ff,char;
asl #3,char;
add style,char;
lea 0(a2,char.w),chr;
lea $1800(chr),nch
jmp (col);
Col00:
bra next;
Col01:
move.b (nch)+,(p1);
adda.w bpr,p1;
move.b (nch)+,(p1);
adda.w bpr,p1;
move.b (nch)+,(p1);
adda.w bpr,p1;
move.b (nch)+,(p1);
adda.w bpr,p1;
move.b (nch)+,(p1);
adda.w bpr,p1;
move.b (nch)+,(p1);
adda.w bpr,p1;
move.b (nch)+,(p1);
adda.w bpr,p1;
move.b (nch)+,(p1);
and.b nuln,(p1);
suba.w vert,p1;
bra next;
Col02:
move.b (nch)+,(p2);
adda.w bpr,p2;
move.b (nch)+,(p2);
adda.w bpr,p2;
move.b (nch)+,(p2);
adda.w bpr,p2;
move.b (nch)+,(p2);
adda.w bpr,p2;
move.b (nch)+,(p2);
adda.w bpr,p2;
move.b (nch)+,(p2);
adda.w bpr,p2;
move.b (nch)+,(p2);
adda.w bpr,p2;
move.b (nch)+,(p2);
and.b nuln,(p2);
suba.w vert,p2;
bra next;
Col03:
move.b (nch),(p1);
move.b (nch)+,(p2);
move bpr,dadr;
move.b (nch),0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (nch),0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (nch),0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (nch),0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (nch),0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (nch),0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (nch),0(p1,dadr);
move.b (nch)+,0(p2,dadr);
and.b nuln,0(p1,dadr);
and.b nuln,0(p2,dadr);
bra next;
Col04:
move.b (chr)+,(p1);
adda.w bpr,p1;
move.b (chr)+,(p1);
adda.w bpr,p1;
move.b (chr)+,(p1);
adda.w bpr,p1;
move.b (chr)+,(p1);
adda.w bpr,p1;
move.b (chr)+,(p1);
adda.w bpr,p1;
move.b (chr)+,(p1);
adda.w bpr,p1;
move.b (chr)+,(p1);
adda.w bpr,p1;
move.b (chr)+,(p1);
or.b ulin,(p1);
suba.w vert,p1;
bra next;
Col05:
st (p1);
move bpr,dadr;
st 0(p1,dadr);
add bpr,dadr;
st 0(p1,dadr);
add bpr,dadr;
st 0(p1,dadr);
add bpr,dadr;
st 0(p1,dadr);
add bpr,dadr;
st 0(p1,dadr);
add bpr,dadr;
st 0(p1,dadr);
add bpr,dadr;
st 0(p1,dadr);
bra next;
Col06:
move.b (chr)+,(p1);
move.b (nch)+,(p2);
move bpr,dadr;
move.b (chr)+,0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
move.b (nch)+,0(p2,dadr);
or.b ulin,0(p1,dadr);
and.b nuln,0(p2,dadr);
bra next;
Col07:
st (p1);
move.b (nch)+,(p2);
move bpr,dadr;
st 0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (nch)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (nch)+,0(p2,dadr);
and.b nuln,0(p2,dadr);
bra next;
Col08:
move.b (chr)+,(p2);
adda.w bpr,p2;
move.b (chr)+,(p2);
adda.w bpr,p2;
move.b (chr)+,(p2);
adda.w bpr,p2;
move.b (chr)+,(p2);
adda.w bpr,p2;
move.b (chr)+,(p2);
adda.w bpr,p2;
move.b (chr)+,(p2);
adda.w bpr,p2;
move.b (chr)+,(p2);
adda.w bpr,p2;
move.b (chr)+,(p2);
or.b ulin,(p2);
suba.w vert,p2;
bra next;
Col09:
move.b (nch)+,(p1);
move.b (chr)+,(p2);
move bpr,dadr;
move.b (nch)+,0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
move.b (chr)+,0(p2,dadr);
and.b nuln,0(p1,dadr);
or.b ulin,0(p2,dadr);
bra next;
Col10:
st (p2);
adda.w bpr,p2;
st (p2);
adda.w bpr,p2;
st (p2);
adda.w bpr,p2;
st (p2);
adda.w bpr,p2;
st (p2);
adda.w bpr,p2;
st (p2);
adda.w bpr,p2;
st (p2);
adda.w bpr,p2;
st (p2);
suba.w vert,p2;
bra next;
Col11:
move.b (nch)+,(p1);
st (p2);
move bpr,dadr;
move.b (nch)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (nch)+,0(p1,dadr);
st 0(p2,dadr);
and.b nuln,0(p1,dadr);
bra next;
Col12:
move.b (chr),(p1);
move.b (chr)+,(p2);
move bpr,dadr;
move.b (chr),0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (chr),0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (chr),0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (chr),0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (chr),0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (chr),0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
move.b (chr),0(p1,dadr);
move.b (chr)+,0(p2,dadr);
or.b ulin,0(p1,dadr);
or.b ulin,0(p2,dadr);
bra next;
Col13:
st (p1);
move.b (chr)+,(p2);
move bpr,dadr;
st 0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (chr)+,0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
move.b (chr)+,0(p2,dadr);
or.b ulin,0(p2,dadr);
bra next;
Col14:
move.b (chr)+,(p1);
st (p2);
move bpr,dadr;
move.b (chr)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
move.b (chr)+,0(p1,dadr);
st 0(p2,dadr);
or.b ulin,0(p1,dadr);
bra next;
Col15:
st (p1);
st (p2);
move bpr,dadr;
st 0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
st 0(p2,dadr);
add bpr,dadr;
st 0(p1,dadr);
st 0(p2,dadr);
next:
addq #1,p1;
addq #1,p2;
bra loop;
return:
move.l (A7)+,A5;
rts;
;---------------------------------------------------------------------------*)
; GetFontData
; A0: Pointer to font's chardata
; A1: Pointer to fontdata-Array
; D7: Line Modulo
ch EQUR A0;
fd EQUR A1;
ad EQUR A2;
j EQUR D0;
x EQUR D1;
c EQUR D2;
d EQUR D3;
e EQUR D4;
x1 EQUR D5;
x2 EQUR D6;
x3 EQUR D7;
GetFontData:
move.w D7,-(A7);
move #0,j;
jloop: move j,x;
asl #3,x;
move x,x1;
move x,x2;
move x,x3;
add #$600,x1;
add #$c00,x2;
add #$1200,x3;
lea 0(ch,j),ad;
; Byte 0:
move.b (ad),c;
move.b c,0(fd,x);
move.b c,d;
lsr.b #2,d;
bcc \1;
bset #0,d;
\1: move.b d,0(fd,x1);
move.b c,e;
lsr.b #1,e;
or.b c,e;
move.b e,0(fd,x2);
move.b d,e;
lsr.b #1,e;
or.b d,e;
move.b e,0(fd,x3);
; Byte 1:
adda.w (A7),ad
move.b (ad),c;
move.b c,1(fd,x);
move.b c,d;
lsr.b #2,d;
bcc \2;
bset #0,d;
\2: move.b d,1(fd,x1);
move.b c,e;
lsr.b #1,e;
or.b c,e;
move.b e,1(fd,x2);
move.b d,e;
lsr.b #1,e;
or.b d,e;
move.b e,1(fd,x3);
; Byte 2:
adda.w (A7),ad
move.b (ad),c;
move.b c,2(fd,x);
move.b c,d;
lsr.b #1,d;
bcc \3;
bset #0,d;
\3: move.b d,2(fd,x1);
move.b c,e;
lsr.b #1,e;
or.b c,e;
move.b e,2(fd,x2);
move.b d,e;
lsr.b #1,e;
or.b d,e;
move.b e,2(fd,x3);
; Byte 3:
adda.w (A7),ad
move.b (ad),c;
move.b c,3(fd,x);
move.b c,d;
lsr.b #1,d;
bcc \4;
bset #0,d;
\4: move.b d,3(fd,x1);
move.b c,e;
lsr.b #1,e;
or.b c,e;
move.b e,3(fd,x2);
move.b d,e;
lsr.b #1,e;
or.b d,e;
move.b e,3(fd,x3);
; Byte 4:
adda.w (A7),ad
move.b (ad),c;
move.b c,4(fd,x);
move.b c,4(fd,x1);
move.b c,e;
lsr.b #1,e;
or.b c,e;
move.b e,4(fd,x2);
move.b e,4(fd,x3);
; Byte 5:
adda.w (A7),ad
move.b (ad),c;
move.b c,5(fd,x);
move.b c,5(fd,x1);
move.b c,e;
lsr.b #1,e;
or.b c,e;
move.b e,5(fd,x2);
move.b e,5(fd,x3);
; Byte 6:
adda.w (A7),ad
move.b (ad),c;
move.b c,6(fd,x);
move.b c,d;
lsl.b #1,d;
bcc \7;
bset #7,d;
\7: move.b d,6(fd,x1);
move.b c,e;
lsr.b #1,e;
or.b c,e;
move.b e,6(fd,x2);
move.b d,e;
lsr.b #1,e;
or.b d,e;
move.b e,6(fd,x3);
; Byte 7:
adda.w (A7),ad
move.b (ad),c;
move.b c,7(fd,x);
move.b c,d;
lsl.b #1,d;
bcc \8;
bset #7,d;
\8: move.b d,7(fd,x1);
move.b c,e;
lsr.b #1,e;
or.b c,e;
move.b e,7(fd,x2);
move.b d,e;
lsr.b #1,e;
or.b d,e;
move.b e,7(fd,x3);
addq #1,j;
move j,x;
cmp #$30,x;
beq.s newlin;
cmp #$60,x;
beq.s newlin;
cmp #$90,x;
bne.s nextl;
newlin: move (A7),x;
asl #3,x;
sub #$30,x;
adda.w x,ch;
nextl: cmp #$c0,j;
blt jloop;
move.l fd,ad;
adda.w #$1800,ad;
move #$5ff,j;
invers: move.l (fd)+,c;
not.l c;
move.l c,(ad)+;
dbra j,invers;
lea 2(A7),A7;
rts;
;---------------------------------------------------------------------------*)
; CopyLine1
; a0: Bitmap
; d0: NumColumns
; d1: NumLines;
; d2: ScreenPos;
BM EQUR a0;
s1 EQUR a1;
s2 EQUR a2;
z1 EQUR a3;
z2 EQUR a4;
NumCol EQUR d0;
NumLin EQUR d1;
ScrPos EQUR d2;
CopyLine1:
jsr InitCopyLine(PC);
\loop;
move.l (s1)+,(z1)+;
move.l (s2)+,(z2)+;
dbra NumCol,\loop;
rts;
;---------------------------------------------------------------------------*)
; CopyLine2:
CopyLine2:
jsr InitCopyLine(PC);
\loop;
move.l (z1)+,(s1)+;
move.l (z2)+,(s2)+;
dbra NumCol,\loop;
rts;
InitCopyLine:
move.l bm_Planes(BM),z1;
move.l bm_Planes+4(BM),z2;
asl #3,NumCol;
muls NumCol,ScrPos;
lea 0(z1,ScrPos.l),z1;
lea 0(z2,ScrPos.l),z2;
muls NumCol,NumLin;
lea 0(z1,NumLin.l),s1;
lea 0(z2,NumLin.l),s2;
asr #2,NumCol;
subq #1,NumCol;
rts;
;---------------------------------------------------------------------------*)
END