home *** CD-ROM | disk | FTP | other *** search
- ;*---------------------------------------------------------------------------
- ; :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
- ; :History. V 2.8 26-Dez-90 [fbs] CopyLine removed
- ; :Copyright. Public Domain
- ; :Language. 68000 Assembler
- ; :Translator. a68k
- ;---------------------------------------------------------------------------*
-
- XDEF QText ; QText Procedure
- XDEF GetFontData ; GetFontData 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 A4;
- p2 EQUR A1;
- chr EQUR A3;
- nch EQUR A6;
- col EQUR A5;
-
- char EQUR d0
- vert EQUR d1
- bpr EQUR d2
- scratch 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(PC),col;
- clr style;
- sf ulin;
- st nuln;
- move bm_BytesPerRow(a1),bpr;
- ext.l bpr;
- mulu bpr,vert;
- move.l bm_Planes(a1),p1; position in plane #1
- move.l bm_Planes+4(a1),p2; position in plane #2
- add.l vert,p2;
- add.l vert,p1; add offset within plane
- 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 #21,char;
- blt \newstyle;
- seq ulin;
- sne nuln;
- bra.s loop;
- \newstyle;
- 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:
-
- ext.w char;
- add.w char,char;
- move.w char,scratch;
- add.w char,char;
- add.w scratch,char;
- jmp \whichCol-6(PC,char.w);
- \whichCol:
- lea Col00(PC),col;
- bra.s \nxt;
- lea Col01(PC),col;
- bra.s \nxt;
- lea Col02(PC),col;
- bra.s \nxt;
- lea Col03(PC),col;
- bra.s \nxt;
- lea Col04(PC),col;
- bra.s \nxt;
- lea Col05(PC),col;
- bra.s \nxt;
- lea Col06(PC),col;
- bra.s \nxt;
- lea Col07(PC),col;
- bra.s \nxt;
- lea Col08(PC),col;
- bra.s \nxt;
- lea Col09(PC),col;
- bra.s \nxt;
- lea Col10(PC),col;
- bra.s \nxt;
- lea Col11(PC),col;
- bra.s \nxt;
- lea Col12(PC),col;
- bra.s \nxt;
- lea Col13(PC),col;
- bra.s \nxt;
- lea Col14(PC),col;
- bra.s \nxt;
- lea Col15(PC),col;
- \nxt:
- 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.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch),0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch),0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch),0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch),0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch),0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch),0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- and.b nuln,0(p1,dadr.w);
- and.b nuln,0(p2,dadr.w);
- 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.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- bra next;
-
- Col06:
- move.b (chr)+,(p1);
- move.b (nch)+,(p2);
- move bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- or.b ulin,0(p1,dadr.w);
- and.b nuln,0(p2,dadr.w);
- bra next;
-
- Col07:
- st (p1);
- move.b (nch)+,(p2);
- move bpr,dadr;
- st 0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (nch)+,0(p2,dadr.w);
- and.b nuln,0(p2,dadr.w);
- 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.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- and.b nuln,0(p1,dadr.w);
- or.b ulin,0(p2,dadr.w);
- 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.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (nch)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- and.b nuln,0(p1,dadr.w);
- bra next;
-
- Col12:
- move.b (chr),(p1);
- move.b (chr)+,(p2);
- move bpr,dadr;
- move.b (chr),0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr),0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr),0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr),0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr),0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr),0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr),0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- or.b ulin,0(p1,dadr.w);
- or.b ulin,0(p2,dadr.w);
- bra next;
-
- Col13:
- st (p1);
- move.b (chr)+,(p2);
- move bpr,dadr;
- st 0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- move.b (chr)+,0(p2,dadr.w);
- or.b ulin,0(p2,dadr.w);
- bra next;
-
- Col14:
- move.b (chr)+,(p1);
- st (p2);
- move bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- move.b (chr)+,0(p1,dadr.w);
- st 0(p2,dadr.w);
- or.b ulin,0(p1,dadr.w);
- bra next;
-
- Col15:
- st (p1);
- st (p2);
- move bpr,dadr;
- st 0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- st 0(p2,dadr.w);
- add bpr,dadr;
- st 0(p1,dadr.w);
- st 0(p2,dadr.w);
-
- next:
- addq.l #1,p2;
- addq.l #1,p1;
- 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;
-
- END
-