Difference between revisions of "83Plus:Hooks:9B9C"

From WikiTI
Jump to: navigation, search
(clarified width condition, added fracdrawlfont condition, updated example code; note that B is not always equal to the character!)
m (Clarify zero is the zero flag)
 
Line 21: Line 21:
 
* '''A = 2''': The width of a small font character is requested.
 
* '''A = 2''': The width of a small font character is requested.
 
* '''A = 3''': A large font bitmap is requested for variable-width display.  The bitmap provided will be shifted left by 1 bit and copied to [[83Plus:RAM:845A|lFont_record]] ''plus 1'', so that (lFont_record) can be set to 6.
 
* '''A = 3''': A large font bitmap is requested for variable-width display.  The bitmap provided will be shifted left by 1 bit and copied to [[83Plus:RAM:845A|lFont_record]] ''plus 1'', so that (lFont_record) can be set to 6.
HL contains the font table offset, equal to the character multiplied by 8.  In modes 1 and 3, B also contains the character. If you want to use the default characters (or rather, the bitmaps provided by the [[83Plus:Hooks:9BCC|localize hook]]), return with zero reset. If you do this, HL and B '''must''' be left intact.  Otherwise, your outputs depend on the mode.
+
HL contains the font table offset, equal to the character multiplied by 8.  In modes 1 and 3, B also contains the character. If you want to use the default characters (or rather, the bitmaps provided by the [[83Plus:Hooks:9BCC|localize hook]]), return with the zero flag reset. If you do this, HL and B '''must''' be left intact.  Otherwise, your outputs depend on the mode.
 
* In modes 0 and 1, set HL pointing to the font data, which must be in RAM. If you want to, you can copy data to [[83Plus:RAM:8462|sFont_record]] or [[83Plus:RAM:845A|lFont_record]], and then point HL to this location. Of course, you can use any location you want.
 
* In modes 0 and 1, set HL pointing to the font data, which must be in RAM. If you want to, you can copy data to [[83Plus:RAM:8462|sFont_record]] or [[83Plus:RAM:845A|lFont_record]], and then point HL to this location. Of course, you can use any location you want.
 
* In mode 2, set B to the width of the character.
 
* In mode 2, set B to the width of the character.

Latest revision as of 10:12, 5 September 2023

Synopsis

Name: Font Hook

Hook Pointer Block Address: 9B9C

Hook Enable BCALL: 4FE4

Hook Disable BCALL: 4FE7

Hook Call BCALL: 4003

Hook Active Flag: 5, (iy + 35h)

This hook allows you to change the font bitmaps; for example, it is used for Omnicalc's custom fonts.

Using the Hook

This hook is called to request information about a particular character. The accumulator indicates the type of information:

  • A = 0: A small font bitmap is requested.
  • A = 1: A large font bitmap is requested for fixed-width display.
  • A = 2: The width of a small font character is requested.
  • A = 3: A large font bitmap is requested for variable-width display. The bitmap provided will be shifted left by 1 bit and copied to lFont_record plus 1, so that (lFont_record) can be set to 6.

HL contains the font table offset, equal to the character multiplied by 8. In modes 1 and 3, B also contains the character. If you want to use the default characters (or rather, the bitmaps provided by the localize hook), return with the zero flag reset. If you do this, HL and B must be left intact. Otherwise, your outputs depend on the mode.

  • In modes 0 and 1, set HL pointing to the font data, which must be in RAM. If you want to, you can copy data to sFont_record or lFont_record, and then point HL to this location. Of course, you can use any location you want.
  • In mode 2, set B to the width of the character.
  • In mode 3, set HL pointing to the font data as in mode 1, but note that in this case it must not be located at lFont_record, but at lFontRecord+1, or else an entirely different area.

Character bitmap formats

In small font (mode 0):

(HL) = width of character
(HL+1) = first (accent) row, right aligned (the last pixel usually clear)
(HL+2) = second row
...
(HL+6) = sixth row
(HL+7) = seventh row (only displayed with bit textEraseBelow, (iy+textFlags) set)

In large font (modes 1 and 3):

(HL) = first row, right aligned
...
(HL+6) = seventh row

See the example code for actual formatted data.

Comments

This hook is one of the four "official" hooks defined in ti83plus.inc.

Example

The following code displays the letter A in boldface:

FontHook:
       .db 83h             ; Required for all hooks
       ld c,a
       ld a,h              ; what character is to be displayed?
       or l
       rrca
       rrca
       rrca
       cp 'A'
       ret nz
       ld a,c
       or a                ; check hook mode
       jr z,SmallFontMode
       cp 2
       jr z,WidthMode
       ld hl,BigA          ; get our replacement bitmap
       ld de,lFont_record+1
       ld bc,7             ; copy it into RAM
       ldir
       ld hl,lFont_record+1
       cp a
       ret
SmallFontMode:
       ld hl,SmallA        ; get our replacement bitmap
       ld de,sFont_record
       ld bc,8             ; copy it into RAM
       ldir
       ld hl,sFont_record
       cp a
       ret
WidthMode:
       ld b,5
       cp a
       ret
BigA:
       .db 00001110b
       .db 00010011b
       .db 00010011b
       .db 00011111b
       .db 00010011b
       .db 00010011b
       .db 00010011b
SmallA:
       .db 5
       .db 00000000b
       .db 00001100b
       .db 00010110b
       .db 00011110b
       .db 00010110b
       .db 00010110b
       .db 00000000b