        XREF    _interpret       ; Bitmap-to-Ascii function
        XREF    _CopyFont        ; Copies a font and aligns it to 16 bit.
        XREF    _CharData        ; Font data
        XREF    _SrcData
        XREF    _CharLoc
        XREF    _Modulo
        XREF    _FontWidth
        XREF    _FontHeight
        XREF    _LoChar
        XREF    _HiChar

_interpret:
        link    a5,#0
        movem.l d1-d6/a1,-(sp)   ; Free a couple of registers
        move.l  8(a5),a1         ; Bitmap
        move.w  (a1),d2          ; First row
        moveq   #0,d4            ; Code
        move.b  _LoChar,d4       ; First char
        move.w  _FontWidth,d0
        asl.w   #1,d0            ; Times two for words
        lea     MaskTable,a0
        adda.w  d0,a0
        move.w  (a0),d3          ; d3 := mask
        move.l  _CharData,a0     ; Char image data
.Search
        cmp.w   (a0),d2          ; Compare first word
        bne     .tryinverted     ; Not this one
        moveq   #1,d0            ; current word
        moveq   #0,d6            ; Modulo
.morerows
        addq    #2,d6            ; Add modulo - next bit row in image data
        move.w  (a0,d6.w),d1     ; Character row
        cmp.w   (a1,d6.w),d1
        bne     .tryinverted     ; Rows didn't match
        addq    #1,d0            ; Next row in bitmap
        cmp.w   _FontHeight,d0   ; Are we done?
        bne     .morerows        ; Not yet
        bra     .interpreted     ; Got it

.tryinverted
        move.w  d2,d1            ; Copy first row
        eor.w   d3,d1            ; and invert the bits
        cmp.w   (a0),d1          ; Compare inverted rows
        bne     .trybold         ; No match
        moveq   #1,d0            ; current row
        moveq   #0,d6            ; Modulo
.moreinverted
        addq    #2,d6
        move.w  (a0,d6.w),d1     ; Character row
        eor.w   d3,d1            ; and invert the bits
        cmp.w   (a1,d6.w),d1
        bne     .trybold         ; Rows didn't match
        addq    #1,d0            ; Next row in bitmap
        cmp.w   _FontHeight,d0   ; Are we done?
        bne     .moreinverted    ; Not yet
        bra     .interpreted     ; Got it

.trybold
        move.w  d2,d1            ; Copy first row
        lsr.w   #1,d1            ; Shift one step left
        or.w    d2,d1            ; Make bold
        and.w   d3,d1            ; and mask out unwanted bits
        cmp.w   (a0),d1          ; Compare bold rows
        bne     .trynext         ; No match
        moveq   #1,d0            ; current row
        moveq   #0,d6            ; Modulo
.morebold
        addq    #2,d6
        move.w  (a0,d6.w),d1     ; Character row
        lsr.w   #1,d1            ; Shift one step left
        or.w    (a0,d6.w),d1     ; Make bold
        and.w   d3,d1            ; and mask out unwanted bits
        cmp.w   (a1,d6.w),d1
        bne     .trynext         ; Rows didn't match
        addq    #1,d0            ; Next row in bitmap
        cmp.w   _FontHeight,d0   ; Are we done?
        bne     .morebold        ; Not yet
        bra     .interpreted     ; Got it

.trynext
        adda.l  #32,a0           ; Try next character, 32 bytes/char
        addq    #1,d4            ;
        cmp.b   _HiChar,d4       ; Tried all chars?
        bne     .Search          ; More to try
        move.l  #255,d4          ; Not found

.interpreted
        move.l  d4,d0
        movem.l (sp)+,d1-d6/a1
        unlk    a5
        rts


_CopyFont:
        movem.l d2-d5/a2-a3,-(sp)   ; Free a couple of registers
        moveq   #0,d0
        move.l  _CharData,a2        ; a2 := Destination area
        move.l  _CharLoc,a3
        move.b  _LoChar,d5
        move.w  _Modulo,d3

.NextChar
        move.w  (a3),d0             ; Get char location
        adda.w  #4,a3               ; To next, and skip width
        move.w  d0,d1
        and.w   #15,d1              ; Shift amount
        eori.b  #15,d1              ; Negate shift value
        addq.b  #1,d1               ; d1 := Shift Amount

        move.l  _SrcData,a0
        lsr.w   #3,d0               ; Byte offset
        bclr    #0,d0               ; But we deal in words
        adda.w  d0,a0               ; a0 := chardata

        move.w  _FontWidth,d0
        asl.w   #1,d0               ; Times two for words
        lea     MaskTable,a1
        adda.w  d0,a1
        move.w  (a1),d2             ; d2 := mask

        moveq   #0,d4
        move.w  _FontHeight,d4
        move.l  a2,a1               ; a1 := Destination area
        adda.w  #32,a2              ; a2 to next dest area
        bra     .loop
.copyrow
        move.l  (a0),d0             ; Get character row
        adda.w  d3,a0               ; Add modulo -- To next row
        lsr.l   d1,d0               ; Shift data to bit 0 alignment
        and.w   d2,d0               ; Mask out unwanted bits
        move.w  d0,(a1)+            ; Save row
.loop
        dbra    d4,.copyrow         ; Do all rows

        addq    #1,d5               ; Next char
        cmp.b   _HiChar,d5          ; Finished?
        bne     .NextChar           ; Nope -- do next.
        movem.l (sp)+,d2-d5/a2-a3
        rts

MaskTable
        dc.w    $0000
        dc.w    $8000
        dc.w    $c000
        dc.w    $e000
        dc.w    $f000
        dc.w    $f800
        dc.w    $fc00
        dc.w    $fe00
        dc.w    $ff00
        dc.w    $ff80
        dc.w    $ffc0
        dc.w    $ffe0
        dc.w    $fff0
        dc.w    $fff8
        dc.w    $fffc
        dc.w    $fffe
        dc.w    $ffff


        dseg
        XREF   _LVOActivateWindow
        XREF   _LVOWindowToFront
        XREF   _LVOWindowToBack
        XREF   _lvoActivateWindow
        XREF   _lvoWindowToFront
        XREF   _lvoWindowToBack

; Find out offsets for functions. Anybody know of a better way?
_lvoActivateWindow   dc.w _LVOActivateWindow
_lvoWindowToFront    dc.w _LVOWindowToFront
_lvoWindowToBack     dc.w _LVOWindowToBack

        cseg

        XREF   _myActivateWindow
        XREF   _myWindowToFront
        XREF   _myWindowToBack

_myActivateWindow:
        rts

_myWindowToFront:
        rts

_myWindowToBack:
        rts

        END
