;*--------------------------------------------------------------------------- ; :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] ; :Copyright. Publik Domain ; :Language. 68000 Assembler ; :Translator. a68k ;---------------------------------------------------------------------------* XDEF QText ; QText Procedure XDEF GetFontData ; GetFontData Procedure XDEF CopyLine1 ; CopyLine1 Procedure XDEF CopyLine2 ; CopyLine2 Procedure XDEF BitMap ; Variable Contains Pointer to the BitMap ; BitMap: bm_BytesPerRow = 0 bm_Rows = 2 bm_Flags = 4 bm_Depth = 5 bm_Pad = 6 bm_Planes = 8 bm_SIZEOF = 40 BitMap: dc.l 0; ;* 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.l BitMap,a1; 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; \loop; move.l (s1)+,(z1)+; move.l (s2)+,(z2)+; dbra NumCol,\loop; rts; ;---------------------------------------------------------------------------*) ; CopyLine2: CopyLine2: jsr InitCopyLine; \loop; move.l (z1)+,(s1)+; move.l (z2)+,(s2)+; dbra NumCol,\loop; rts; InitCopyLine: move.l BitMap,BM move.l bm_Planes(BM),z1; move.l bm_Planes+4(BM),z2; asl #3,NumCol; muls NumCol,ScrPos; lea 0(z1,ScrPos),z1; lea 0(z2,ScrPos),z2; muls NumCol,NumLin; lea 0(z1,NumLin),s1; lea 0(z2,NumLin),s2; asr #2,NumCol; subq #1,NumCol; rts; ;---------------------------------------------------------------------------*) END