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

