;*--------------------------------------------------------------------------- ; :Program. QText.ASM ; :Contents. Procedure for fast text-output ; :Author. Fridtjof Siebert ; :Address. Nobileweg 67, D-7-Stgt-40 ; :Phone. (0)711/822509 ; :Shortcut. [fbs] ; :Version. 2.0 ; :Date. 02-Jul-89 ; :Copyright. Publik Domain ; :Language. 68000 Assembler ;---------------------------------------------------------------------------* ; 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: points to bitmap / 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; bhs \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),(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (nch),(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (nch),(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (nch),(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (nch),(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (nch),(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (nch),(p1,dadr); move.b (nch)+,(p2,dadr); and.b nuln,(p1,dadr); and.b nuln,(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 (p1,dadr); add bpr,dadr; st (p1,dadr); add bpr,dadr; st (p1,dadr); add bpr,dadr; st (p1,dadr); add bpr,dadr; st (p1,dadr); add bpr,dadr; st (p1,dadr); add bpr,dadr; st (p1,dadr); bra next; Col06: move.b (chr)+,(p1); move.b (nch)+,(p2); move bpr,dadr; move.b (chr)+,(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); move.b (nch)+,(p2,dadr); or.b ulin,(p1,dadr); and.b nuln,(p2,dadr); bra next; Col07: st (p1); move.b (nch)+,(p2); move bpr,dadr; st (p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (nch)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (nch)+,(p2,dadr); and.b nuln,(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)+,(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); move.b (chr)+,(p2,dadr); and.b nuln,(p1,dadr); or.b ulin,(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)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (nch)+,(p1,dadr); st (p2,dadr); and.b nuln,(p1,dadr); bra next; Col12: move.b (chr),(p1); move.b (chr)+,(p2); move bpr,dadr; move.b (chr),(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (chr),(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (chr),(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (chr),(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (chr),(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (chr),(p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; move.b (chr),(p1,dadr); move.b (chr)+,(p2,dadr); or.b ulin,(p1,dadr); or.b ulin,(p2,dadr); bra next; Col13: st (p1); move.b (chr)+,(p2); move bpr,dadr; st (p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (chr)+,(p2,dadr); add bpr,dadr; st (p1,dadr); move.b (chr)+,(p2,dadr); or.b ulin,(p2,dadr); bra next; Col14: move.b (chr)+,(p1); st (p2); move bpr,dadr; move.b (chr)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); st (p2,dadr); add bpr,dadr; move.b (chr)+,(p1,dadr); st (p2,dadr); or.b ulin,(p1,dadr); bra next; Col15: st (p1); st (p2); move bpr,dadr; st (p1,dadr); st (p2,dadr); add bpr,dadr; st (p1,dadr); st (p2,dadr); add bpr,dadr; st (p1,dadr); st (p2,dadr); add bpr,dadr; st (p1,dadr); st (p2,dadr); add bpr,dadr; st (p1,dadr); st (p2,dadr); add bpr,dadr; st (p1,dadr); st (p2,dadr); add bpr,dadr; st (p1,dadr); st (p2,dadr); next: addq #1,p1; addq #1,p2; bra loop; return: move.l (A7)+,A5; END;