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

