Prev: EBFF Up: Map Next: ECDA
EC2C: Renders a single character
Compare draw_char
Used by the routine at menu_draw_string.
Input
A The character to plot (ASCII)
F' Carry flag set to draw single height characters
DE' Screen address (UDG aligned)
HL' Attribute address
menu_draw_char EC2C SUB $20 Handle space
EC2E JR NZ,mdc_not_space
EC30 EXX
EC31 INC E
EC32 INC L Advance attribute address
EC33 EXX
EC34 RET
Map character ranges.
mdc_not_space EC35 LD C,$12 >= 'A' then glyph offset C=(65-32-18)=15
EC37 CP $21
EC39 JR NC,mdc_have_ascii
EC3B LD C,$0B >= '0' then glyph offset C=(48-32-11)=5
EC3D CP $10
EC3F JR NC,mdc_have_ascii
EC41 LD C,$00 == '!' then glyph offset C=0
EC43 DEC A
EC44 JR Z,mdc_have_glyph
EC46 INC C == '(' then glyph offset C=1
EC47 SUB $07
EC49 JR Z,mdc_have_glyph
EC4B INC C == ')' then glyph offset C=2
EC4C DEC A
EC4D JR Z,mdc_have_glyph
EC4F INC C == ',' then glyph offset C=3
EC50 SUB $03
EC52 JR Z,mdc_have_glyph
EC54 INC C Anything else becomes a full stop
EC55 JR mdc_have_glyph
mdc_have_ascii EC57 SUB C ASCII - 32 - offset in C
EC58 LD C,A
mdc_have_glyph EC59 LD A,C Multiply C by seven - the height of a glyph
EC5A RLCA
EC5B LD B,A
EC5C RLCA
EC5D ADD A,B
EC5E ADD A,C
EC5F LD B,$00 BC = A -- Why the RL?
EC61 RL B
EC63 LD C,A
EC64 LD HL,$A27A Point HL at 8x7 font
EC67 ADD HL,BC Point at glyph
EC68 EXX bank
EC69 PUSH DE push banked scr addr
EC6A INC E advance banked scr addr
EC6B EXX unbank
EC6C POP DE pop scr addr as-was
EC6D EX AF,AF' If the banked carry flag is set then draw single height characters
EC6E JR C,mdc_single_height
EC70 EX AF,AF'
mdc_double_height EC71 LD A,(HL) Copy a row of glyph to screen (not advancing)
EC72 LD (DE),A
EC73 INC D Advance to next scanline
EC74 LDI Copy another row (advancing)
EC76 DEC E Undo LDI's DE++
EC77 INC D Move to next scanline
EC78 LD A,(HL) Row 2/7
EC79 LD (DE),A
EC7A INC D
EC7B LDI
EC7D DEC E
EC7E INC D
EC7F LD A,(HL)
EC80 LD (DE),A Row 3/7
EC81 INC D
EC82 LDI
EC84 DEC E
EC85 INC D
EC86 LD A,(HL) Row 4/7
EC87 LD (DE),A
EC88 INC D
EC89 LDI
EC8B LD A,E Move to next scanline after boundary (DE += $F81F)
EC8C ADD A,$1F
EC8E LD E,A
EC8F LD A,D
EC90 SUB $07
EC92 LD D,A Row 5/7
EC93 LD A,(HL)
EC94 LD (DE),A
EC95 INC D
EC96 LDI
EC98 DEC E
EC99 INC D
EC9A LD A,(HL) Row 6/7
EC9B LD (DE),A
EC9C INC D
EC9D LDI
EC9F DEC E
ECA0 INC D
ECA1 LD A,(HL) Row 7/7
ECA2 LD (DE),A
ECA3 INC D
ECA4 LDI
ECA6 DEC E
ECA7 INC D
ECA8 XOR A why writing a blank?
ECA9 LD (DE),A
ECAA EXX Bank
ECAB LD B,L Save L
ECAC SET 6,C Set the BRIGHT bit
ECAE LD (HL),C Set the screen attribute
ECAF LD A,L Move to the next attribute row
ECB0 ADD A,$20
ECB2 LD L,A
ECB3 RES 6,C Clear the BRIGHT bit
ECB5 LD (HL),C Set the screen attribute
ECB6 LD L,B Restore L
ECB7 INC L Advance cursor
ECB8 EXX Unbank
ECB9 RET Return
Plot 8x7 character HL->character, DE->screen
mdc_single_height ECBA EX AF,AF'
ECBB LDI Row 1/7
ECBD DEC E
ECBE INC D
ECBF LDI Row 2/7
ECC1 DEC E
ECC2 INC D
ECC3 LDI Row 3/7
ECC5 DEC E
ECC6 INC D
ECC7 LDI Row 4/7
ECC9 DEC E
ECCA INC D
ECCB LDI Row 5/7
ECCD DEC E
ECCE INC D
ECCF LDI Row 6/7
ECD1 DEC E
ECD2 INC D
ECD3 LDI Row 7/7
ECD5 EXX Bank
ECD6 LD (HL),C Set the screen attribute
ECD7 INC L Advance cursor
ECD8 EXX Unbank
ECD9 RET Return
Prev: EBFF Up: Map Next: ECDA