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
- ; :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
-
-