home *** CD-ROM | disk | FTP | other *** search
- XDEF _interpret ; Bitmap-to-Ascii function
- XDEF _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 _Underscore
- XREF _TrueUnderscore
- XREF _LoChar
- XREF _HiChar
- XREF _IFlags
-
- XDEF _myActivateWindow
- XDEF _myWindowToFront
- XDEF _myWindowToBack
-
- SECTION CODE
-
- USC equ 1 ; Interpreted char was underscored
- PUSC equ 2 ; Prevoius char was underscored
- PUS equ 4 ; Pending underscored space
-
- _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
- move.w 0(a0,d0.w),d3 ; d3 := mask
- move.l _CharData,a0 ; Char image data
- bclr.b #PUS,_IFlags ; No pending-underscored-space
- .lp1
- cmpi.b #31,d4 ; Into printable characters yet?
- bhi .Search ; If yes, go and start searching
- addq #1,d4 ; Move to next char
- adda.l #32,a0 ; Increment bitmap ptr also
- bra .lp1 ; Back to check again
- .Search
- cmp.w (a0),d2 ; Compare first word
- bne .tryinverted ; Not this one
- bclr.b #USC,_IFlags ; Assume not underscored
- moveq #1,d5 ; current word
- moveq #0,d6 ; Modulo
- .morerows
- addq #2,d6 ; Add modulo - next bit row in image data
- move.w 0(a0,d6.w),d1 ; Character row
- cmp.w 0(a1,d6.w),d1
- beq .stdmatch ; Rows matched
- cmp.w _Underscore,d5 ; Could it be the underscore line?
- bne .tryinverted ; Nope
- tst.b _TrueUnderscore ; Use true underscore?
- beq .uscmatch ; No. Let's hope it's okay
- moveq #0,d1 ; 00000000
- move.w 0(a0,d6.w),d0 ; 00110000
- or.w d0,d1 ; 00110000
- rol.l #2,d1 ; 0011000000
- or.w d0,d1 ; 0011110000
- ror.l #1,d1 ; X01111000
- eor.w d3,d1 ; 10000111
- or.w d0,d1 ; 10110111
- move.w 0(a1,d6.w),d0
- eor.w d0,d1 ; Zero if equal
- ; But, let's skip the last bit since it
- ; may be affected by the next character
- lsr.w #1,d1 ; Shift one step right
- and.w d3,d1 ; Mask out last bit
- bne .tryinverted
- .uscmatch
- bset.b #USC,_IFlags ; Set underscored flag
- .stdmatch
- addq #1,d5 ; Next row in bitmap
- cmp.w _FontHeight,d5 ; Are we done?
- bne .morerows ; Not yet
- cmp.b #32,d4 ; Space
- bne .notuspace
- ; Space. Check for underscore
- btst.b #USC,_IFlags ; Underscored char?
- beq .notuspace ; Nope, everything ok
- ; Underscored space. Check if previous char was underscored
- btst.b #PUSC,_IFlags ; Previous char underscored?
- bne .okuspace ; Yep, ok underscored space
- ; Previous char not underscored. Set pending-underscored-space flag
- ; and go on to check if the normal underscore char matches
- bset.b #PUS,_IFlags
- bra .tryinverted
-
- .notuspace
- .okuspace
- bclr.b #PUSC,_IFlags ; Clear previous-underscored
- btst.b #USC,_IFlags ; Underscored char?
- beq .interpreted ; Nope
- bset.b #PUSC,_IFlags ; Set previous-underscored
- bra .interpreted ; Got it
-
- .tryinverted
- move.w (a0),d1 ; Copy first row
- eor.w d3,d1 ; and invert the bits
- cmp.w d2,d1 ; Compare inverted rows
- bne .trybold ; No match
- moveq #1,d5 ; current row
- moveq #0,d6 ; Modulo
- .moreinverted
- addq #2,d6
- move.w 0(a0,d6.w),d1 ; Character row
- eor.w d3,d1 ; and invert the bits
- cmp.w 0(a1,d6.w),d1
- bne .trybold ; Rows didn't match
- addq #1,d5 ; Next row in bitmap
- cmp.w _FontHeight,d5 ; Are we done?
- bne .moreinverted ; Not yet
- bra .interpreted ; Got it
-
- .trybold
- move.w (a0),d1 ; Copy first row
- lsr.w #1,d1 ; Shift one step left
- or.w (a0),d1 ; Make bold
- and.w d3,d1 ; and mask out unwanted bits
- cmp.w d2,d1 ; Compare bold rows
- bne .trynext ; No match
- moveq #1,d5 ; current row
- moveq #0,d6 ; Modulo
- .morebold
- addq #2,d6
- move.w 0(a0,d6.w),d1 ; Character row
- lsr.w #1,d1 ; Shift one step left
- or.w 0(a0,d6.w),d1 ; Make bold
- and.w d3,d1 ; and mask out unwanted bits
- cmp.w 0(a1,d6.w),d1
- bne .trynext ; Rows didn't match
- addq #1,d5 ; Next row in bitmap
- cmp.w _FontHeight,d5 ; 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
- btst.b #PUS,_IFlags ; Hey, perhaps it was an underscored space?
- beq .interpreted ; Nope, return not-found
- move.l #32,d4
-
- .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
- move.w 0(a1,d0.w),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
-
-
- _myActivateWindow:
- rts
-
- _myWindowToFront:
- rts
-
- _myWindowToBack:
- rts
-
- END
-