avr: work on simple GUI module to be used by node c02.

This commit is contained in:
Martin Preuss
2025-11-03 17:23:40 +01:00
parent b4fee78ad8
commit e58e9b846c
38 changed files with 1951 additions and 2422 deletions

View File

@@ -268,6 +268,14 @@
#endif #endif
#ifdef MODULES_GUI
.include "modules/lcd2/gui/defs.asm"
.include "modules/lcd2/gui/main.asm"
.include "modules/lcd2/gui/window.asm"
#endif
#ifdef MODULES_FONT_8X8 #ifdef MODULES_FONT_8X8
.include "modules/lcd2/font/defs.asm" .include "modules/lcd2/font/defs.asm"
.include "modules/lcd2/font/font8x8.asm" .include "modules/lcd2/font/font8x8.asm"

View File

@@ -179,6 +179,11 @@ onSystemTimerTick:
bigcall Brightness_Every100ms bigcall Brightness_Every100ms
#endif #endif
#ifdef MODULES_GUI
bigcall GUI_Every100ms
#endif
#ifdef APPS_NETWORK #ifdef APPS_NETWORK
ldi yl, LOW(netInterfaceData) ldi yl, LOW(netInterfaceData)
ldi yh, HIGH(netInterfaceData) ldi yh, HIGH(netInterfaceData)

View File

@@ -193,6 +193,10 @@ initModules:
bigcall ILI9341_Init bigcall ILI9341_Init
#endif #endif
#ifdef MODULES_GUI
bigcall GUI_Init
#endif
#ifdef MODULES_BRIGHTNESS #ifdef MODULES_BRIGHTNESS
bigcall Brightness_Init bigcall Brightness_Init
#endif #endif

View File

@@ -137,8 +137,7 @@ main:
.include "modules/flash/defs.asm" .include "modules/flash/defs.asm"
.include "modules/flash/eeprom.asm" .include "modules/flash/eeprom.asm"
.include "modules/flash/io.asm" .include "modules/flash/io.asm"
.include "modules/flash/io_attn.asm" .include "modules/flash/io_com2w.asm"
.include "modules/flash/io_bitbang.asm"
.include "modules/flash/flash1pmega.asm" .include "modules/flash/flash1pmega.asm"
.include "modules/flash/flashxp.asm" .include "modules/flash/flashxp.asm"
.include "modules/flash/flashprocess.asm" .include "modules/flash/flashprocess.asm"

View File

@@ -72,15 +72,15 @@
.equ COM_DATA_OUTPUT = PORTD .equ COM_DATA_OUTPUT = PORTD
.equ COM_DATA_PIN = PORTD0 .equ COM_DATA_PIN = PORTD0
.equ COM_ATTN_DDR = DDRD .equ COM_CLK_DDR = DDRD
.equ COM_ATTN_INPUT = PIND .equ COM_CLK_INPUT = PIND
.equ COM_ATTN_OUTPUT = PORTD .equ COM_CLK_OUTPUT = PORTD
.equ COM_ATTN_PIN = PORTD2 .equ COM_CLK_PIN = PORTD2
.equ COM_IRQ_ADDR_ATTN = EIMSK .equ COM_IRQ_ADDR_CLK = EIMSK
.equ COM_IRQ_BIT_ATTN = INT0 .equ COM_IRQ_BIT_CLK = INT0
.equ COM_IRQ_GIFR_ATTN = INTF0 .equ COM_IRQ_GIFR_CLK = INTF0
;.equ COM_IRQ_GIMSK_ATTN = PCIE0 ;.equ COM_IRQ_GIMSK_CLK = PCIE0
@@ -127,9 +127,12 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; ILI9341 module ; ILI9341 module
.equ DISPLAY_WIDTH = 320
.equ DISPLAY_HEIGHT = 240
.equ ILI9341_DEVICENUM = 0 .equ ILI9341_DEVICENUM = 0
.equ ILI9341_DSP_WIDTH = 320 .equ ILI9341_DSP_WIDTH = DISPLAY_WIDTH
.equ ILI9341_DSP_HEIGHT = 240 .equ ILI9341_DSP_HEIGHT = DISPLAY_HEIGHT
.equ ILI9341_RESET_DDR = DDRB .equ ILI9341_RESET_DDR = DDRB
.equ ILI9341_RESET_OUTPUT = PORTB .equ ILI9341_RESET_OUTPUT = PORTB

View File

@@ -47,16 +47,17 @@
; #define MODULES_TIMER ; #define MODULES_TIMER
#define MODULES_CLOCK #define MODULES_CLOCK
;#define MODULES_XRAM ;#define MODULES_XRAM
#define MODULES_HEAP ;#define MODULES_HEAP
#define MODULES_LED_SIMPLE #define MODULES_LED_SIMPLE
#define MODULES_NETWORK #define MODULES_NETWORK
;#define MODULES_COMONUART0 ;#define MODULES_COMONUART0
;#define MODULES_UART_HW ;#define MODULES_UART_HW
#define MODULES_UART_BITBANG ;#define MODULES_UART_BITBANG
#define MODULES_COM2W
#define MODULES_SPI_HW #define MODULES_SPI_HW
#define MODULES_ILI9341 #define MODULES_ILI9341
#define MODULES_FONT #define MODULES_FONT
#define MODULES_WIN #define MODULES_GUI
;#define MODULES_TWI_MASTER ;#define MODULES_TWI_MASTER
;#define MODULES_LCD ;#define MODULES_LCD
;#define LCD_MINIMAL_FONT ;#define LCD_MINIMAL_FONT
@@ -112,7 +113,7 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; Reset and interrupt vectors ; Reset and interrupt vectors
jmp BOOTLOADER_ADDR ; 1: Reset vector RESET jmp BOOTLOADER_ADDR ; 1: Reset vector RESET
jmp UART_BitBang_PcintIsr ; 2: INT0 External Interrupt Request 0 jmp com2wPcintIsr ; 2: INT0 External Interrupt Request 0
jmp irqNotSet ; 3: INT1 External Interrupt Request 1 jmp irqNotSet ; 3: INT1 External Interrupt Request 1
jmp irqNotSet ; 4: INT2 External Interrupt Request 2 jmp irqNotSet ; 4: INT2 External Interrupt Request 2
jmp irqNotSet ; 5: PCINT0 Pin Change Interrupt Request 0 jmp irqNotSet ; 5: PCINT0 Pin Change Interrupt Request 0
@@ -227,222 +228,110 @@ onEveryLoop:
;.include "modules/lcd2/font/font16x26.asm" ;.include "modules/lcd2/font/font16x26.asm"
;.include "modules/lcd2/font/font4.asm" ;.include "modules/lcd2/font/font4.asm"
;.include "modules/lcd2/font/font12x16.asm" ;.include "modules/lcd2/font/font12x16.asm"
.include "modules/lcd2/font/font5.asm" .include "modules/lcd2/ili9341/font6x8.asm"
.include "modules/lcd2/font/font12x20.asm" .include "modules/lcd2/ili9341/font6x8_1.asm"
;.include "common/list_t.asm" ;.include "common/list_t.asm"
.include "common/tree_t.asm" ;.include "common/tree_t.asm"
.include "common/divide.asm" ;.include "common/divide.asm"
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; defines for network interface ; defines for network interface
;.equ netInterfaceData = netUartIface ;.equ netInterfaceData = netUartIface
.equ netInterfaceData = uart_bitbang_iface ;.equ netInterfaceData = uart_bitbang_iface
.equ netInterfaceData = com2w_iface
; @param %0 X
; @param %1 Y
; @param %2 W
; @param %3 H
.macro M_FILL_RECT
ldi r16, LOW(@0) ; X0
mov r4, r16
ldi r16, HIGH(@0)
mov r5, r16
ldi r16, LOW(@1) ; Y0
mov r6, r16
ldi r16, HIGH(@1)
mov r7, r16
ldi r16, LOW(@2) ; W
mov r8, r16
ldi r16, HIGH(@2)
mov r9, r16
ldi r16, LOW(@3) ; H
mov r10, r16
ldi r16, HIGH(@3)
mov r11, r16
bigcall ILI9341_FillRect
.endmacro
test: test:
; set foreground (r3:r2) #ifdef MODULES_GUI
; 0bRRRRRGGGGGGBBBBB ldi yl, LOW(mainWindow)
ldi r16, 0b11111111 ldi yh, HIGH(mainWindow)
mov r3, r16 ldi zl, LOW(mainWindowInFlash*2);
ldi r16, 0b11111111 ; white ldi zh, HIGH(mainWindowInFlash*2);
mov r2, r16 ldi r17, WIN_SIZE
M_FILL_RECT 0, 0, 319, 239 testCopyWinLoop:
lpm r16, Z+
; set foreground (r3:r2) st Y+, r16
ldi r16, 0b00000000 dec r17
mov r3, r16 brne testCopyWinLoop
ldi r16, 0b00011111 ; blue
mov r2, r16
M_FILL_RECT 0, 0, 319, 32
; set background (r1:r0)
mov r0, r2
mov r1, r3
; set foreground (r3:r2)
ldi r16, 0b11111111
mov r3, r16
ldi r16, 0b11111111 ; white
mov r2, r16
; set Xpos
ldi r16, LOW(10)
mov r4, r16
ldi r16, HIGH(10)
mov r5, r16
; setYpos
ldi r16, LOW(3)
mov r6, r16
ldi r16, HIGH(3)
mov r7, r16
; set font
; ldi zl, LOW(font3_16x26*2)
; ldi zh, HIGH(font3_16x26*2)
ldi zl, LOW(font5_12x20*2)
ldi zh, HIGH(font5_12x20*2)
; set buffer
ldi xl, LOW(glyphBuffer)
ldi xh, HIGH(glyphBuffer)
; write characters
ldi r16, 'A'
bigcall ili9341_WriteCharacterX1At
ldi r16, 'Q'
bigcall ili9341_WriteCharacterX1At
ldi r16, 'H'
bigcall ili9341_WriteCharacterX1At
ldi r16, 'O'
bigcall ili9341_WriteCharacterX1At
ldi r16, 'M'
bigcall ili9341_WriteCharacterX1At
ldi r16, 'E'
bigcall ili9341_WriteCharacterX1At
#if 0
push xl
push xh
rcall listTest1
pop xh
pop xl
brcc test_error
ldi r16, '!'
bigcall ili9341_WriteCharacterX1At
push xl
push xh
rcall listTest2
pop xh
pop xl
brcc test_error
ldi r16, '!'
bigcall ili9341_WriteCharacterX1At
push xl
push xh
rcall listTest3
pop xh
pop xl
brcc test_error
ldi r16, '!'
bigcall ili9341_WriteCharacterX1At
push xl
push xh
rcall listTest4
pop xh
pop xl
brcc test_error
ldi r16, '!'
bigcall ili9341_WriteCharacterX1At
#endif
ldi yl, LOW(mainWindow)
ldi yh, HIGH(mainWindow)
bigcall Window_Clear
#if 1 #if 1
push xl ldi zl, LOW(mainWindowTitle*2)
push xh ldi zh, HIGH(mainWindowTitle*2)
rcall treeTest1 ; print title at 10/2
pop xh ldi r16, 10
pop xl mov r4, r16
brcc test_error clr r5
ldi r16, '!' ldi r16, 2
bigcall ili9341_WriteCharacterX1At mov r6, r16
clr r7
bigcall Window_DrawTextFlash
#else
ldi zl, LOW(ili9341Font6x8_1*2)
ldi zh, HIGH(ili9341Font6x8_1*2)
push xl ldi r16, LOW(0b0000000000000000)
push xh mov r0, r16
rcall treeTest2 ldi r16, HIGH(0b0000000000000000)
pop xh mov r1, r16
pop xl
brcc test_error
ldi r16, '!'
bigcall ili9341_WriteCharacterX1At
push xl ldi r16, LOW(0b1111111111111111)
push xh mov r2, r16
rcall treeTest3 ldi r16, HIGH(0b1111111111111111)
pop xh mov r3, r16
pop xl
brcc test_error
ldi r16, '!'
bigcall ili9341_WriteCharacterX1At
push xl ldi r16, 10
push xh mov r4, r16
rcall treeTest4 clr r5
pop xh ldi r16, 20
pop xl mov r6, r16
brcc test_error clr r7
ldi r16, '!'
bigcall ili9341_WriteCharacterX1At
ldi r16, 'A'
bigcall Display_DrawChar
add r4, r18
adc r5, r19
ldi r16, 'B'
bigcall Display_DrawChar
#endif #endif
ret
test_error:
ldi r17, '0'
add r16, r17
bigcall ili9341_WriteCharacterX1At
ret ret
testHandler:
helloWorld: .db "Hello World", 0 ret
#ifdef MODULES_GUI
mainWindowInFlash:
.dw testHandler ; handler
.dw 0 ; X
.dw 0 ; Y
.dw DISPLAY_WIDTH
.dw DISPLAY_HEIGHT
; 0bRRRRRGGGGGGBBBBB
.dw 0b0000000000011111 ; blue
; .dw 0b1111100000000000 ; red
.dw 0b1111111111111111 ; white
.dw (ili9341Font6x8_1*2)
mainWindowTitle: .db "AQHOME", 0, 0
#endif
.dseg .dseg
glyphBuffer: .byte 1024 mainWindow: .byte WIN_SIZE
heapStart: heapStart:

View File

@@ -46,6 +46,30 @@
.macro M_COM2WSETUPINT0
inr r16, MCUCR
cbr r16, (1<<ISC01) | (1<<ISC00)
sbr r16, (1<<ISC01) | (0<<ISC00) ; falling edge of ATTN
outr MCUCR, r16
; sbr r16, (0<<ISC01) | (0<<ISC00) ; low level triggers
inr r16, COM_IRQ_ADDR_CLK ; enable irq for ATTN line
sbr r16, (1<<COM_IRQ_BIT_CLK)
outr COM_IRQ_ADDR_CLK, r16
.endmacro
.macro M_COM2WSETUPPCI
sbi COM_IRQ_ADDR_CLK, COM_IRQ_BIT_CLK ; enable pin change irq for CLK line
in r16, GIMSK ; enable pin change irq PCIE0 or PCIE1
ori r16, (1<<COM_IRQ_GIMSK_CLK)
out GIMSK, R16
ldi r16, (1<<COM_IRQ_GIFR_CLK) ; clear pending irq by writing 1 to CLK bit
out GIFR, r16
.endmacro
.dseg .dseg
@@ -91,6 +115,19 @@ COM2W_Init:
; setup pin-change interrupt for CLK ; setup pin-change interrupt for CLK
rcall com2wEnableClkIrq rcall com2wEnableClkIrq
; enable IRQ
.ifdef INT0
.if COM_IRQ_BIT_CLK == INT0
M_COM2WSETUPINT0
.else
M_COM2WSETUPPCI
.endif
.else
M_COM2WSETUPPCI
.endif
#if 0
inr r16, COM_IRQ_ADDR_CLK inr r16, COM_IRQ_ADDR_CLK
sbr r16, (1<<COM_IRQ_BIT_CLK) ; enable pin change irq for ATTN line sbr r16, (1<<COM_IRQ_BIT_CLK) ; enable pin change irq for ATTN line
outr COM_IRQ_ADDR_CLK, r16 outr COM_IRQ_ADDR_CLK, r16
@@ -100,6 +137,7 @@ COM2W_Init:
outr GIMSK, r16 outr GIMSK, r16
ldi r16, (1<<COM_IRQ_GIFR_CLK) ; clear pending irq by writing 1 to ATTN bit ldi r16, (1<<COM_IRQ_GIFR_CLK) ; clear pending irq by writing 1 to ATTN bit
outr GIFR, r16 outr GIFR, r16
#endif
ret ret
; @end ; @end

13
avr/modules/lcd2/0BUILD Normal file
View File

@@ -0,0 +1,13 @@
<?xml?>
<gwbuild>
<subdirs>
font
gui
ili9341
xpt2046
</subdirs>
</gwbuild>

View File

@@ -4,16 +4,6 @@
<extradist> <extradist>
defs.asm defs.asm
font8x8.asm
font6x8.asm
font12x16.asm
font12x20.asm
font16x26.asm
font1.asm
font2.asm
font3.asm
font4.asm
font5.asm
main.asm main.asm
</extradist> </extradist>

View File

@@ -7,11 +7,12 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AVR_MODULES_FONT_DEFS #ifndef AQH_AVR_FONT_DEFS_ASM
#define AVR_MODULES_FONT_DEFS #define AQH_AVR_FONT_DEFS_ASM
.equ FONT_OFFS_HANDLERFN_LOW = 0
.equ FONT_OFFS_HANDLERFN_LOW = 0 ; pointer to handler fn (word address!)
.equ FONT_OFFS_HANDLERFN_HI = 1 .equ FONT_OFFS_HANDLERFN_HI = 1
.equ FONT_OFFS_DATASIZE = 2 ; one byte used, one byte reserved .equ FONT_OFFS_DATASIZE = 2 ; one byte used, one byte reserved
.equ FONT_OFFS_WIDTH = 4 .equ FONT_OFFS_WIDTH = 4
@@ -30,6 +31,7 @@
#endif #endif ; AQH_AVR_FONT_DEFS_ASM

View File

@@ -1,100 +0,0 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; This is a font from the project LCD_fonts at
; https://github.com/basti79/LCD-fonts.git
; which in turn is based on a post by Benedikt K. in a forum post on
; https://www.mikrocontroller.net/topic/54860
; ***************************************************************************
; ***************************************************************************
; code
.cseg
font1_8x8:
; header
.dw font6x8MonoHandlerFn ; handlerFn
.db 128, 0 ; needed buffer size
.db 8, 8 ; width, height of chars
.db 32, 64 ; first char, num of chars in font
; data (8x8_horizontal_LSB_2)
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x20
.db 0x0C,0x1E,0x1E,0x0C,0x0C,0x00,0x0C,0x00, ; 0x21
.db 0x36,0x36,0x36,0x00,0x00,0x00,0x00,0x00, ; 0x22
.db 0x36,0x36,0x7F,0x36,0x7F,0x36,0x36,0x00, ; 0x23
.db 0x0C,0x3E,0x03,0x1E,0x30,0x1F,0x0C,0x00, ; 0x24
.db 0x00,0x63,0x33,0x18,0x0C,0x66,0x63,0x00, ; 0x25
.db 0x1C,0x36,0x1C,0x6E,0x3B,0x33,0x6E,0x00, ; 0x26
.db 0x06,0x06,0x03,0x00,0x00,0x00,0x00,0x00, ; 0x27
.db 0x18,0x0C,0x06,0x06,0x06,0x0C,0x18,0x00, ; 0x28
.db 0x06,0x0C,0x18,0x18,0x18,0x0C,0x06,0x00, ; 0x29
.db 0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00, ; 0x2A
.db 0x00,0x0C,0x0C,0x3F,0x0C,0x0C,0x00,0x00, ; 0x2B
.db 0x00,0x00,0x00,0x00,0x00,0x0E,0x0C,0x06, ; 0x2C
.db 0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, ; 0x2D
.db 0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00, ; 0x2E
.db 0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00, ; 0x2F
.db 0x1E,0x33,0x3B,0x3F,0x37,0x33,0x1E,0x00, ; 0x30
.db 0x0C,0x0F,0x0C,0x0C,0x0C,0x0C,0x3F,0x00, ; 0x31
.db 0x1E,0x33,0x30,0x1C,0x06,0x33,0x3F,0x00, ; 0x32
.db 0x1E,0x33,0x30,0x1C,0x30,0x33,0x1E,0x00, ; 0x33
.db 0x38,0x3C,0x36,0x33,0x7F,0x30,0x30,0x00, ; 0x34
.db 0x3F,0x03,0x1F,0x30,0x30,0x33,0x1E,0x00, ; 0x35
.db 0x1C,0x06,0x03,0x1F,0x33,0x33,0x1E,0x00, ; 0x36
.db 0x3F,0x33,0x30,0x18,0x0C,0x06,0x06,0x00, ; 0x37
.db 0x1E,0x33,0x33,0x1E,0x33,0x33,0x1E,0x00, ; 0x38
.db 0x1E,0x33,0x33,0x3E,0x30,0x18,0x0E,0x00, ; 0x39
.db 0x00,0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x00, ; 0x3A
.db 0x00,0x00,0x0C,0x0C,0x00,0x0E,0x0C,0x06, ; 0x3B
.db 0x18,0x0C,0x06,0x03,0x06,0x0C,0x18,0x00, ; 0x3C
.db 0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00, ; 0x3D
.db 0x06,0x0C,0x18,0x30,0x18,0x0C,0x06,0x00, ; 0x3E
.db 0x1E,0x33,0x30,0x18,0x0C,0x00,0x0C,0x00, ; 0x3F
.db 0x3E,0x63,0x7B,0x7B,0x7B,0x03,0x1E,0x00, ; 0x40
.db 0x0C,0x1E,0x33,0x33,0x3F,0x33,0x33,0x00, ; 0x41
.db 0x3F,0x66,0x66,0x3E,0x66,0x66,0x3F,0x00, ; 0x42
.db 0x3C,0x66,0x03,0x03,0x03,0x66,0x3C,0x00, ; 0x43
.db 0x3F,0x36,0x66,0x66,0x66,0x36,0x3F,0x00, ; 0x44
.db 0x7F,0x46,0x16,0x1E,0x16,0x46,0x7F,0x00, ; 0x45
.db 0x7F,0x46,0x16,0x1E,0x16,0x06,0x0F,0x00, ; 0x46
.db 0x3C,0x66,0x03,0x03,0x73,0x66,0x7C,0x00, ; 0x47
.db 0x33,0x33,0x33,0x3F,0x33,0x33,0x33,0x00, ; 0x48
.db 0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00, ; 0x49
.db 0x78,0x30,0x30,0x30,0x33,0x33,0x1E,0x00, ; 0x4A
.db 0x67,0x66,0x36,0x1E,0x36,0x66,0x67,0x00, ; 0x4B
.db 0x0F,0x06,0x06,0x06,0x46,0x66,0x7F,0x00, ; 0x4C
.db 0x63,0x77,0x7F,0x6B,0x63,0x63,0x63,0x00, ; 0x4D
.db 0x63,0x67,0x6F,0x7B,0x73,0x63,0x63,0x00, ; 0x4E
.db 0x1C,0x36,0x63,0x63,0x63,0x36,0x1C,0x00, ; 0x4F
.db 0x3F,0x66,0x66,0x3E,0x06,0x06,0x0F,0x00, ; 0x50
.db 0x1E,0x33,0x33,0x33,0x3B,0x1E,0x38,0x00, ; 0x51
.db 0x3F,0x66,0x66,0x3E,0x1E,0x36,0x67,0x00, ; 0x52
.db 0x1E,0x33,0x07,0x1C,0x38,0x33,0x1E,0x00, ; 0x53
.db 0x3F,0x2D,0x0C,0x0C,0x0C,0x0C,0x1E,0x00, ; 0x54
.db 0x33,0x33,0x33,0x33,0x33,0x33,0x3F,0x00, ; 0x55
.db 0x33,0x33,0x33,0x33,0x33,0x1E,0x0C,0x00, ; 0x56
.db 0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00, ; 0x57
.db 0x63,0x63,0x36,0x1C,0x36,0x63,0x63,0x00, ; 0x58
.db 0x33,0x33,0x33,0x1E,0x0C,0x0C,0x1E,0x00, ; 0x59
.db 0x7F,0x33,0x19,0x0C,0x46,0x63,0x7F,0x00, ; 0x5A
.db 0x1E,0x06,0x06,0x06,0x06,0x06,0x1E,0x00, ; 0x5B
.db 0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00, ; 0x5C
.db 0x1E,0x18,0x18,0x18,0x18,0x18,0x1E,0x00, ; 0x5D
.db 0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00, ; 0x5E
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF ; 0x5F

View File

@@ -1,117 +0,0 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine font12x16MonoHandlerFn
;
; Handler for 12x16 Mono Fonts
;
font12x16MonoHandlerFn:
cpi r23, FONT_FN_RENDER
breq font12x16MonoRenderCharacter
rjmp FONT_GenericHandler
; @end
; ---------------------------------------------------------------------------
; @routine font12x16RenderCharacter
; @param R16 character to write
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @param r18 char width in pixel
; @param r19 char height in pixel
; @clobbers r17, r18, r23, r24, r25, x
font12x16MonoRenderCharacter:
push zl
push zh
rcall font12x16GetCharPosInFont ; (r17, r24, r25, z)
ldi r25, 16 ; 16 bytes height
font12x16MonoRenderCharacter_loop1:
ldi r24, 12 ; 16 bits
ldi r23, 8
lpm r17, Z+
font12x16MonoRenderCharacter_loop2:
dec r23
brne font12x16MonoRenderCharacter_haveByte
lpm r17, Z+
ldi r23, 8
font12x16MonoRenderCharacter_haveByte:
lsr r17
brcs font12x16MonoRenderCharacter_writeForeground
st X+, r0
st X+, r1
rjmp font12x16MonoRenderCharacter_loop2end
font12x16MonoRenderCharacter_writeForeground:
st X+, r2
st X+, r3
font12x16MonoRenderCharacter_loop2end:
dec r24
brne font12x16MonoRenderCharacter_loop2
dec r25
brne font12x16MonoRenderCharacter_loop1
ldi r18, 12
ldi r19, 16
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine font12x16GetCharPosInFont
; @param R16 character to write
; @param Z pointer to font
; @return Z pointer to begin of char data
; @clobbers r17, r24, r25, z
font12x16GetCharPosInFont:
mov r24, r16
adiw zh:zl, FONT_OFFS_FIRSTCHAR
lpm r24, Z+ ; first char num
lpm r25, Z+ ; num of chars
sub r16, r24
brcs font12x16GetCharPosInFont_ret
cp r16, r25
brcc font12x16GetCharPosInFont_ret
mov r25, r16 ; x256
clr r24
lsr r25 ; x128
ror r24
lsr r25 ; x64
ror r24
lsr r25 ; x32
ror r24
add zl, r24
adc zh, r25
font12x16GetCharPosInFont_ret:
ret
; @end

View File

@@ -1,123 +0,0 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine font16x26MonoHandlerFn
;
; Handler for 16x26 Mono Fonts
;
font16x26MonoHandlerFn:
cpi r23, FONT_FN_RENDER
breq font16x26MonoRenderCharacter
rjmp FONT_GenericHandler
; @end
; ---------------------------------------------------------------------------
; @routine font16x26RenderCharacter
; @param R16 character to write
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @param r18 char width in pixel
; @param r19 char height in pixel
; @clobbers r17, r18, r24, r25, x
font16x26MonoRenderCharacter:
push zl
push zh
rcall font16x26GetCharPosInFont ; (r17, r24, r25, z)
ldi r25, 26 ; 26 bytes height
font16x26MonoRenderCharacter_loop1:
ldi r24, 16 ; 16 bits
font16x26MonoRenderCharacter_loop2:
mov r23, r24
andi r23, 7
brne font16x26MonoRenderCharacter_haveByte
lpm r17, Z+
font16x26MonoRenderCharacter_haveByte:
lsr r17
brcs font16x26MonoRenderCharacter_writeForeground
st X+, r0
st X+, r1
rjmp font16x26MonoRenderCharacter_loop2end
font16x26MonoRenderCharacter_writeForeground:
st X+, r2
st X+, r3
font16x26MonoRenderCharacter_loop2end:
dec r24
brne font16x26MonoRenderCharacter_loop2
dec r25
brne font16x26MonoRenderCharacter_loop1
ldi r18, 16
ldi r19, 26
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine font16x26GetCharPosInFont
; @param R16 character to write
; @param Z pointer to font
; @return Z pointer to begin of char data
; @clobbers r17, r24, r25, z
font16x26GetCharPosInFont:
mov r24, r16
adiw zh:zl, FONT_OFFS_FIRSTCHAR
lpm r24, Z+ ; first char num
lpm r25, Z+ ; num of chars
sub r16, r24
brcs font16x26GetCharPosInFont_ret
cp r16, r25
brcc font16x26GetCharPosInFont_ret
mov r24, r16
clr r25
lsl r24 ; x2
rol r25
add r24, r16 ; x3
adc r25, r16
sub r25, r16
lsl r24 ; x6
rol r25
lsl r24 ; x12
rol r25
add r24, r16 ; x13
adc r25, r16
sub r25, r16
lsl r24 ; x26
rol r25
lsl r24 ; x52
rol r25
add zl, r24
adc zh, r25
font16x26GetCharPosInFont_ret:
ret
; @end

View File

@@ -1,257 +0,0 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; This is a font from the project LCD_fonts at
; https://github.com/basti79/LCD-fonts.git
; which in turn is based on a post by Benedikt K. in a forum post on
; https://www.mikrocontroller.net/topic/54860
; ***************************************************************************
; ***************************************************************************
; code
.cseg
font3_16x26:
; header
.dw font16x26MonoHandlerFn ; handlerFn
.dw 832 ; needed buffer size
.db 16, 26 ; width, height of chars
.db 32, 224 ; first char, num of chars in font
; data (16x26_horizontal_LSB_2)
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x20
.db 0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x21
.db 0x00,0x00,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x22
.db 0x00,0x00,0x00,0x00,0x80,0x31,0x80,0x31,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xFC,0x7F,0xFC,0x7F,0x60,0x0C,0x60,0x06,0x30,0x06,0xFE,0x3F,0xFE,0x3F,0x18,0x03,0x18,0x03,0x18,0x03,0x18,0x03,0x8C,0x01,0x8C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x23
.db 0x00,0x03,0x00,0x03,0xC0,0x1F,0xF0,0x3F,0x70,0x23,0x38,0x03,0x38,0x03,0x38,0x03,0x78,0x03,0xF0,0x03,0xE0,0x03,0x80,0x07,0x00,0x1F,0x00,0x1F,0x00,0x3B,0x00,0x3B,0x00,0x3B,0x00,0x3B,0x18,0x1B,0xF8,0x1F,0xE0,0x0F,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x24
.db 0x00,0x00,0x00,0x00,0x3C,0xC0,0x66,0x60,0xC3,0x30,0xC3,0x18,0xC3,0x18,0xC3,0x0C,0xC3,0x06,0x66,0x03,0x3C,0x03,0x80,0x01,0xC0,0x3C,0xC0,0x66,0x60,0xC3,0x30,0xC3,0x18,0xC3,0x18,0xC3,0x0C,0xC3,0x06,0x66,0x03,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x25
.db 0x00,0x00,0x00,0x00,0xE0,0x03,0xF0,0x07,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x06,0x70,0x07,0xF0,0x01,0xF8,0x00,0xFC,0xE0,0xCE,0xE1,0xC7,0xE3,0x87,0x63,0x07,0x67,0x07,0x7E,0x0F,0x3E,0x1E,0x3C,0xFC,0x7F,0xF0,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x26
.db 0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x27
.db 0x00,0x00,0x00,0x18,0x00,0x1E,0x00,0x0F,0x80,0x03,0xC0,0x01,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x01,0x80,0x03,0x00,0x0F,0x00,0x1E,0x00,0x18,0x00,0x00, ; 0x28
.db 0x00,0x00,0x0C,0x00,0x3C,0x00,0x78,0x00,0xE0,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x80,0x03,0x80,0x03,0x80,0x03,0xC0,0x01,0xE0,0x00,0x78,0x00,0x3C,0x00,0x0C,0x00,0x00,0x00, ; 0x29
.db 0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x98,0x1B,0x7C,0x3E,0x30,0x0C,0x40,0x02,0xE0,0x07,0x70,0x0E,0x38,0x1C,0x20,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x2A
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xFE,0x7F,0xFE,0x7F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x2B
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x00,0x03,0x80,0x03,0x80,0x01,0xC0,0x00,0x00,0x00, ; 0x2C
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x2D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x2E
.db 0x00,0x00,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x80,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x00,0x00, ; 0x2F
.db 0x00,0x00,0x00,0x00,0xE0,0x03,0xF0,0x07,0x38,0x0E,0x1C,0x1C,0x1C,0x1C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x1C,0x1C,0x38,0x0E,0xF0,0x07,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x30
.db 0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x03,0xFC,0x03,0x8C,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0xFC,0x7F,0xFC,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x31
.db 0x00,0x00,0x00,0x00,0xF0,0x03,0xFC,0x07,0x0C,0x0E,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x0E,0x00,0x0E,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x30,0x00,0x38,0x00,0x1C,0x00,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x32
.db 0x00,0x00,0x00,0x00,0xF0,0x03,0xF8,0x0F,0x08,0x1E,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x0C,0x00,0x06,0xE0,0x03,0xE0,0x07,0x00,0x0F,0x00,0x1E,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1E,0x08,0x0F,0xF8,0x07,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x33
.db 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x0F,0x80,0x0F,0x80,0x0F,0xC0,0x0E,0xE0,0x0E,0x60,0x0E,0x30,0x0E,0x18,0x0E,0x18,0x0E,0x0C,0x0E,0x06,0x0E,0xFE,0x7F,0xFE,0x7F,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x34
.db 0x00,0x00,0x00,0x00,0xF0,0x3F,0xF0,0x3F,0xF0,0x3F,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0xF0,0x03,0xF0,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x3C,0x10,0x1E,0xF0,0x0F,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x35
.db 0x00,0x00,0x00,0x00,0x80,0x1F,0xE0,0x3F,0xF0,0x20,0x70,0x00,0x38,0x00,0x38,0x00,0x1C,0x00,0x9C,0x0F,0xDC,0x1F,0x7C,0x3C,0x3C,0x78,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x38,0x70,0x38,0x38,0x70,0x38,0xF0,0x1F,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x36
.db 0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0xF8,0x3F,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x02,0x00,0x03,0x80,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x70,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x37
.db 0x00,0x00,0x00,0x00,0xC0,0x07,0xF0,0x0F,0x78,0x1E,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x78,0x0C,0xF0,0x0F,0xE0,0x03,0xF0,0x0F,0x38,0x1F,0x18,0x1E,0x1C,0x3C,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x38
.db 0x00,0x00,0x00,0x00,0xC0,0x07,0xF0,0x1F,0x38,0x1C,0x38,0x38,0x1C,0x38,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3C,0x78,0x78,0x7C,0xF0,0x77,0xE0,0x73,0x00,0x70,0x00,0x38,0x00,0x38,0x00,0x1C,0x08,0x1E,0xF8,0x0F,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x39
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x3A
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x00,0x03,0x80,0x03,0x80,0x01,0xC0,0x00,0x00,0x00, ; 0x3B
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x70,0x00,0x3C,0x00,0x0F,0xC0,0x03,0xF0,0x00,0x3C,0x00,0x3C,0x00,0xF0,0x00,0xC0,0x03,0x00,0x0F,0x00,0x3C,0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x3C
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x3D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0E,0x00,0x3C,0x00,0xF0,0x00,0xC0,0x03,0x00,0x0F,0x00,0x3C,0x00,0x3C,0x00,0x0F,0xC0,0x03,0xF0,0x00,0x3C,0x00,0x0E,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x3E
.db 0x00,0x00,0x00,0x00,0xF8,0x07,0xFC,0x1F,0x0C,0x3C,0x0C,0x38,0x00,0x38,0x00,0x38,0x00,0x1C,0x00,0x1E,0x00,0x0F,0x80,0x07,0x80,0x03,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x3F
.db 0x00,0x00,0x00,0x00,0xC0,0x0F,0xE0,0x1F,0x70,0x38,0x18,0x30,0x1C,0x3E,0x0C,0x31,0x8E,0x31,0xC6,0x30,0xC6,0x30,0xC6,0x38,0xC6,0x38,0xC6,0x3C,0xC6,0x34,0x8E,0xF7,0x8C,0xF3,0x1C,0x00,0x38,0x08,0xF0,0x0F,0xC0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x40
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x03,0xE0,0x03,0x60,0x07,0x60,0x07,0x70,0x06,0x30,0x0E,0x38,0x0E,0x38,0x1C,0x18,0x1C,0xFC,0x3F,0xFC,0x3F,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x41
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0xFC,0x0F,0x1C,0x1E,0x1C,0x1C,0x1C,0x1C,0x1C,0x0E,0xFC,0x07,0xFC,0x07,0x1C,0x1E,0x1C,0x3C,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0xFC,0x1F,0xFC,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x42
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0xF0,0x3F,0x78,0x30,0x3C,0x00,0x1C,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1C,0x00,0x3C,0x00,0x78,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x43
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0xFC,0x0F,0x1C,0x3C,0x1C,0x38,0x1C,0x78,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x38,0x1C,0x38,0x1C,0x1E,0xFC,0x0F,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x44
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x1F,0xF8,0x1F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x7F,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x45
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x7F,0xF8,0x7F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x3F,0xF8,0x3F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x46
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0xF0,0x3F,0x78,0x30,0x3C,0x00,0x1C,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x3F,0x0E,0x3F,0x0E,0x38,0x1C,0x38,0x3C,0x38,0x78,0x38,0xF0,0x3F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x47
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0xFC,0x3F,0xFC,0x3F,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x48
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,0xFC,0x1F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x49
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0xF8,0x0F,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x04,0x07,0xFC,0x03,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x4A
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x78,0x1C,0x3C,0x1C,0x1E,0x1C,0x0F,0x1C,0x07,0x9C,0x03,0xDC,0x01,0xFC,0x00,0xDC,0x01,0xDC,0x03,0x9C,0x07,0x1C,0x0F,0x1C,0x1E,0x1C,0x3C,0x1C,0x78,0x1C,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x4B
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x3F,0xF8,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x4C
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x38,0x1E,0x3C,0x1E,0x3C,0x1E,0x3C,0x36,0x36,0x36,0x36,0x36,0x36,0x66,0x32,0x66,0x33,0x66,0x33,0xC6,0x31,0xC6,0x31,0xC6,0x31,0x06,0x30,0x06,0x30,0x06,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x4D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x30,0x1C,0x30,0x3C,0x30,0x7C,0x30,0x7C,0x30,0xFC,0x30,0xEC,0x31,0xCC,0x31,0xCC,0x33,0x8C,0x37,0x0C,0x3F,0x0C,0x3E,0x0C,0x3E,0x0C,0x3C,0x0C,0x38,0x0C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x4E
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x38,0x1C,0x1C,0x38,0x1C,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x4F
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0xF8,0x3F,0x38,0x78,0x38,0x70,0x38,0x70,0x38,0x70,0x38,0x78,0x38,0x3C,0xF8,0x1F,0xF8,0x07,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x50
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x38,0x1C,0x1C,0x38,0x1C,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x1E,0x00,0x78,0x00,0xF0,0x00,0x40,0x00,0x00, ; 0x51
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0xFC,0x0F,0x1C,0x1E,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x0E,0xFC,0x07,0xFC,0x03,0x9C,0x07,0x1C,0x07,0x1C,0x0F,0x1C,0x1E,0x1C,0x3C,0x1C,0x38,0x1C,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x52
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0xF8,0x1F,0x3C,0x18,0x1C,0x00,0x1C,0x00,0x3C,0x00,0xF8,0x00,0xF0,0x07,0xC0,0x1F,0x00,0x3E,0x00,0x38,0x00,0x38,0x00,0x38,0x0C,0x1C,0xFC,0x1F,0xF0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x53
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,0xFF,0x7F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x54
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3C,0x78,0x38,0x38,0xF0,0x1F,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x55
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0E,0x70,0x0E,0x70,0x1C,0x70,0x1C,0x38,0x3C,0x38,0x38,0x38,0x38,0x1C,0x70,0x1C,0x70,0x0C,0xE0,0x0E,0xE0,0x0E,0xE0,0x07,0xC0,0x07,0xC0,0x07,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x56
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xC0,0x07,0xC0,0x86,0x61,0xC6,0x63,0xC6,0x63,0xC6,0x63,0xC6,0x63,0x4E,0x76,0x6C,0x36,0x6C,0x36,0x6C,0x36,0x2C,0x3E,0x3C,0x3C,0x3C,0x1C,0x3C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x57
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0xE0,0x3C,0x70,0x78,0x38,0x78,0x1C,0xF0,0x0E,0xE0,0x07,0xC0,0x03,0xC0,0x03,0xC0,0x07,0xE0,0x07,0x60,0x0F,0x30,0x1E,0x18,0x3C,0x1C,0x38,0x0E,0x78,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x58
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0E,0x70,0x1C,0x30,0x1C,0x18,0x38,0x1C,0x78,0x0E,0x70,0x07,0xE0,0x03,0xE0,0x03,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x59
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0xFC,0x3F,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x80,0x03,0x80,0x01,0xC0,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0xFE,0x3F,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x5A
.db 0x00,0x00,0xC0,0x3F,0xC0,0x3F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x3F,0xC0,0x3F,0x00,0x00, ; 0x5B
.db 0x00,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x00,0x80,0x01,0x80,0x01,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x00, ; 0x5C
.db 0x00,0x00,0xFC,0x03,0xFC,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0xFC,0x03,0xFC,0x03,0x00,0x00, ; 0x5D
.db 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x80,0x03,0x80,0x03,0xC0,0x03,0xC0,0x06,0xE0,0x06,0x60,0x0C,0x30,0x0C,0x30,0x18,0x18,0x18,0x18,0x18,0x0C,0x30,0x0C,0x30,0x06,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x5E
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x5F
.db 0xC0,0x01,0x80,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x60
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x18,0x1E,0x00,0x1C,0x00,0x1C,0xE0,0x1F,0xF0,0x1F,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x3C,0x1E,0xF8,0x7B,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x61
.db 0x00,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x9C,0x07,0xDC,0x1F,0x7C,0x1C,0x3C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x1C,0x3C,0x1E,0xFC,0x0F,0xCC,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x62
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0xF0,0x3F,0x78,0x20,0x38,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x3C,0x00,0x38,0x00,0xF8,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x63
.db 0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0xC0,0x73,0xF0,0x7F,0x78,0x7C,0x38,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3C,0x78,0x38,0x7C,0xF0,0x77,0xE0,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x64
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x07,0xF0,0x0F,0x78,0x1C,0x38,0x38,0x1C,0x38,0x1C,0x38,0xFC,0x3F,0xFC,0x3F,0x1C,0x00,0x1C,0x00,0x38,0x00,0x78,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x65
.db 0x00,0x00,0x00,0xFF,0x80,0xFF,0xC0,0x03,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xFC,0x7F,0xFC,0x7F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x66
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x73,0xF0,0x7F,0x78,0x7C,0x38,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3C,0x78,0x38,0x7C,0xF0,0x77,0xE0,0x73,0x00,0x70,0x00,0x38,0x18,0x3C,0xF8,0x1F,0xF0,0x07, ; 0x67
.db 0x00,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x0F,0xDC,0x1F,0x7C,0x3C,0x3C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x68
.db 0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0xFC,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x69
.db 0x00,0x00,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0xF8,0x0F,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x04,0x07,0xFC,0x07,0xF8,0x01, ; 0x6A
.db 0x00,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x3C,0x38,0x1E,0x38,0x0E,0x38,0x0F,0xB8,0x07,0xB8,0x03,0xF8,0x03,0xB8,0x03,0xB8,0x07,0x38,0x0F,0x38,0x0E,0x38,0x1E,0x38,0x3C,0x38,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x6B
.db 0x00,0x00,0xF8,0x07,0xF8,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x6C
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCE,0x31,0xEE,0x79,0xFE,0x7F,0x9E,0x77,0x9E,0x73,0x8E,0x73,0x8E,0x73,0x8E,0x73,0x8E,0x73,0x8E,0x73,0x8E,0x73,0x8E,0x73,0x8E,0x73,0x8E,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x6D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x0F,0xDC,0x1F,0x7C,0x3C,0x3C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x6E
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0xF8,0x0F,0x3C,0x1E,0x1C,0x1C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x3C,0x1E,0xF8,0x0F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x6F
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9C,0x07,0xDC,0x1F,0x7C,0x1C,0x3C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x1C,0x3C,0x1E,0xFC,0x0F,0x9C,0x07,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00, ; 0x70
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x39,0xF8,0x3F,0x3C,0x3E,0x1C,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1E,0x3C,0x1C,0x3E,0xF8,0x3B,0xF0,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38, ; 0x71
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x3E,0x70,0x3F,0xF0,0x31,0xF0,0x30,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x72
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x78,0x10,0x38,0x00,0x38,0x00,0xF8,0x01,0xF0,0x07,0x80,0x1F,0x00,0x3C,0x00,0x38,0x00,0x38,0x18,0x3C,0xF8,0x1F,0xF0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x73
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0xE0,0x00,0xFC,0x3F,0xFC,0x3F,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x01,0xC0,0x3F,0x80,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x74
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0x3C,0x3E,0xF8,0x3B,0xF0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x75
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x70,0x1C,0x38,0x1C,0x38,0x3C,0x38,0x38,0x18,0x38,0x1C,0x70,0x1C,0x70,0x0C,0xE0,0x0E,0xE0,0x0E,0xE0,0x06,0xC0,0x07,0xC0,0x07,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x76
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x87,0xC3,0x87,0x43,0xC6,0x63,0xC6,0x63,0x46,0x62,0x6E,0x66,0x6E,0x26,0x6C,0x36,0x2C,0x36,0x3C,0x3C,0x3C,0x3C,0x3C,0x1C,0x18,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x77
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x30,0x3C,0x18,0x78,0x0C,0x70,0x0E,0xF0,0x06,0xE0,0x03,0xC0,0x03,0xC0,0x03,0xE0,0x07,0x70,0x0F,0x30,0x0E,0x38,0x1E,0x1C,0x3C,0x0E,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x78
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x70,0x1C,0x30,0x1C,0x38,0x38,0x18,0x38,0x1C,0x78,0x1C,0x70,0x0E,0xF0,0x0E,0xE0,0x07,0xE0,0x07,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x7C,0x00,0x3C,0x00, ; 0x79
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0xFC,0x3F,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0xFC,0x3F,0xFC,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x7A
.db 0x00,0x00,0x00,0x1F,0x80,0x1F,0xC0,0x03,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0xC0,0x01,0xF8,0x00,0xF8,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x03,0x80,0x1F,0x00,0x1F,0x00,0x00, ; 0x7B
.db 0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00, ; 0x7C
.db 0x00,0x00,0x7C,0x00,0xFC,0x00,0xE0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x01,0x80,0x0F,0x80,0x0F,0xC0,0x01,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xE0,0x01,0xFC,0x00,0x7C,0x00,0x00,0x00, ; 0x7D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x60,0xFC,0x63,0xC6,0x3F,0x06,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x7E
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x7F
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0xF0,0x3F,0x78,0x30,0x3C,0x00,0x1C,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x0E,0x00,0x1C,0x00,0x3C,0x00,0x78,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x02,0x00,0x07,0x00,0x0C,0x00,0x0C,0x80,0x07, ; 0x80
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x30,0x06,0x00,0x00,0x00,0x00,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0x3C,0x3E,0xF8,0x3B,0xF0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x81
.db 0x00,0x00,0x00,0x0C,0x00,0x06,0x00,0x03,0x80,0x01,0x00,0x00,0x00,0x00,0xC0,0x07,0xF0,0x0F,0x78,0x1C,0x38,0x38,0x1C,0x38,0x1C,0x38,0xFC,0x3F,0xFC,0x3F,0x1C,0x00,0x1C,0x00,0x38,0x00,0x78,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x82
.db 0x00,0x00,0xC0,0x01,0x60,0x03,0x30,0x06,0x18,0x0C,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x18,0x1E,0x00,0x1C,0x00,0x1C,0xE0,0x1F,0xF0,0x1F,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x3C,0x1E,0xF8,0x7B,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x83
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x0C,0x60,0x0C,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x18,0x1E,0x00,0x1C,0x00,0x1C,0xE0,0x1F,0xF0,0x1F,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x3C,0x1E,0xF8,0x7B,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x84
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x18,0x1E,0x00,0x1C,0x00,0x1C,0xE0,0x1F,0xF0,0x1F,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x3C,0x1E,0xF8,0x7B,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x85
.db 0xC0,0x01,0x20,0x02,0x20,0x02,0x20,0x02,0xC0,0x01,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x18,0x1E,0x00,0x1C,0x00,0x1C,0xE0,0x1F,0xF0,0x1F,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x3C,0x1E,0xF8,0x7B,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x86
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x1F,0xF0,0x3F,0x78,0x20,0x38,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x3C,0x00,0x38,0x00,0xF8,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0xC0,0x03, ; 0x87
.db 0x00,0x00,0xC0,0x01,0x60,0x03,0x30,0x06,0x18,0x0C,0x00,0x00,0x00,0x00,0xC0,0x07,0xF0,0x0F,0x78,0x1C,0x38,0x38,0x1C,0x38,0x1C,0x38,0xFC,0x3F,0xFC,0x3F,0x1C,0x00,0x1C,0x00,0x38,0x00,0x78,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x88
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x0C,0x60,0x0C,0x00,0x00,0x00,0x00,0xC0,0x07,0xF0,0x0F,0x78,0x1C,0x38,0x38,0x1C,0x38,0x1C,0x38,0xFC,0x3F,0xFC,0x3F,0x1C,0x00,0x1C,0x00,0x38,0x00,0x78,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x89
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0xC0,0x07,0xF0,0x0F,0x78,0x1C,0x38,0x38,0x1C,0x38,0x1C,0x38,0xFC,0x3F,0xFC,0x3F,0x1C,0x00,0x1C,0x00,0x38,0x00,0x78,0x20,0xF0,0x3F,0xC0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x8A
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x30,0x06,0x00,0x00,0x00,0x00,0xFC,0x03,0xFC,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x8B
.db 0x00,0x00,0x80,0x03,0xC0,0x06,0x60,0x0C,0x30,0x18,0x00,0x00,0x00,0x00,0xFC,0x03,0xFC,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x8C
.db 0x00,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0xFC,0x03,0xFC,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x8D
.db 0x30,0x0C,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x03,0xE0,0x03,0x60,0x07,0x60,0x07,0x70,0x06,0x30,0x0E,0x38,0x0E,0x38,0x1C,0x18,0x1C,0xFC,0x3F,0xFC,0x3F,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x8E
.db 0x80,0x03,0x40,0x04,0x40,0x04,0x40,0x04,0x80,0x03,0x80,0x03,0xC0,0x07,0xC0,0x07,0xE0,0x06,0x60,0x0E,0x60,0x0E,0x70,0x0C,0x30,0x1C,0x38,0x1C,0x38,0x38,0xFC,0x3F,0xFC,0x3F,0x1C,0x70,0x0E,0x70,0x0E,0x70,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x8F
.db 0x00,0x0E,0x00,0x07,0x80,0x03,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x1F,0xF8,0x1F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x7F,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x90
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3C,0xFC,0x7F,0x80,0x67,0x80,0xE3,0x80,0xE3,0xF0,0xFF,0xFC,0xFF,0x9C,0x03,0x8E,0x03,0x8E,0x03,0x8E,0x03,0x9E,0x87,0xFC,0xFF,0x78,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x91
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3F,0xC0,0x3F,0xC0,0x07,0xE0,0x07,0x60,0x07,0x60,0x07,0x70,0x07,0x30,0x3F,0x38,0x3F,0x18,0x07,0x1C,0x07,0xFC,0x07,0xFC,0x07,0x06,0x07,0x06,0x7F,0x03,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x92
.db 0x00,0x00,0xC0,0x01,0x60,0x03,0x30,0x06,0x18,0x0C,0x00,0x00,0x00,0x00,0xE0,0x03,0xF8,0x0F,0x3C,0x1E,0x1C,0x1C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x3C,0x1E,0xF8,0x0F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x93
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x30,0x06,0x00,0x00,0x00,0x00,0xE0,0x03,0xF8,0x0F,0x3C,0x1E,0x1C,0x1C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x3C,0x1E,0xF8,0x0F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x94
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0xE0,0x03,0xF8,0x0F,0x3C,0x1E,0x1C,0x1C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x3C,0x1E,0xF8,0x0F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x95
.db 0x00,0x00,0xC0,0x01,0x60,0x03,0x30,0x06,0x18,0x0C,0x00,0x00,0x00,0x00,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0x3C,0x3E,0xF8,0x3B,0xF0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x96
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0x3C,0x3E,0xF8,0x3B,0xF0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x97
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x30,0x06,0x00,0x00,0x00,0x00,0x1E,0x70,0x1C,0x30,0x1C,0x38,0x38,0x18,0x38,0x1C,0x78,0x1C,0x70,0x0E,0xF0,0x0E,0xE0,0x07,0xE0,0x07,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x7C,0x00,0x3C,0x00, ; 0x98
.db 0x30,0x0C,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x38,0x1C,0x1C,0x38,0x1C,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x99
.db 0x60,0x18,0x60,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3C,0x78,0x38,0x38,0xF0,0x1F,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x9A
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x33,0xF8,0x1F,0x3C,0x1E,0x1C,0x1E,0x0E,0x3B,0x0E,0x39,0x8E,0x39,0xCE,0x38,0x6E,0x38,0x6E,0x38,0x3C,0x1C,0x3C,0x1E,0xFC,0x0F,0xE6,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x9B
.db 0x00,0x00,0x00,0x00,0x00,0x3E,0x80,0x3F,0x80,0x03,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xF0,0x0F,0xF0,0x0F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xE0,0x00,0x70,0x00,0xF8,0x3F,0xF8,0x3F,0xF8,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x9C
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x67,0xF0,0x3F,0x38,0x1C,0x1C,0x3C,0x1C,0x3C,0x0E,0x76,0x0E,0x73,0x8E,0x71,0x8E,0x71,0xCE,0x70,0x6E,0x70,0x3C,0x38,0x3C,0x38,0x38,0x1C,0xFC,0x0F,0xE6,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x9D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x0E,0x70,0x1C,0x38,0x38,0x1C,0x70,0x0E,0xE0,0x07,0xC0,0x03,0xC0,0x03,0xE0,0x07,0x70,0x0E,0x38,0x1C,0x1C,0x38,0x0E,0x70,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x9E
.db 0x00,0x00,0x00,0x3F,0x80,0x3F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xF8,0x1F,0xF8,0x1F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xFE,0x00,0x7E,0x00, ; 0x9F
.db 0x00,0x00,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x18,0x1E,0x00,0x1C,0x00,0x1C,0xE0,0x1F,0xF0,0x1F,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x3C,0x1E,0xF8,0x7B,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA0
.db 0x00,0x00,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0xFC,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA1
.db 0x00,0x00,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0xF8,0x0F,0x3C,0x1E,0x1C,0x1C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x3C,0x1E,0xF8,0x0F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA2
.db 0x00,0x00,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x3C,0x3C,0x3E,0xF8,0x3B,0xF0,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA3
.db 0x00,0x00,0x00,0x00,0xE0,0x0C,0xF0,0x0F,0x30,0x07,0x00,0x00,0x00,0x00,0x1C,0x0F,0xDC,0x1F,0x7C,0x3C,0x3C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA4
.db 0xE0,0x0C,0xF0,0x0F,0x30,0x07,0x00,0x00,0x00,0x00,0x1C,0x30,0x1C,0x30,0x3C,0x30,0x7C,0x30,0x7C,0x30,0xFC,0x30,0xEC,0x31,0xCC,0x31,0xCC,0x33,0x8C,0x37,0x0C,0x3F,0x0C,0x3E,0x0C,0x3E,0x0C,0x3C,0x0C,0x38,0x0C,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA5
.db 0x00,0x00,0x00,0x00,0xE0,0x03,0xF0,0x07,0x10,0x06,0xE0,0x07,0xF0,0x07,0x38,0x06,0x18,0x06,0x18,0x07,0xF8,0x1F,0xF0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA6
.db 0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x38,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA7
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x80,0x03,0x80,0x03,0x80,0x03,0xC0,0x01,0xE0,0x01,0xF0,0x00,0x78,0x00,0x38,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x30,0x3C,0x30,0xF8,0x3F,0xE0,0x1F, ; 0xA8
.db 0x00,0x00,0x00,0x00,0xE0,0x03,0x10,0x04,0xE8,0x09,0x24,0x12,0x24,0x12,0xE4,0x11,0x24,0x11,0x24,0x11,0x28,0x0B,0x10,0x04,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA9
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xFE,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAA
.db 0x00,0x00,0x00,0x00,0x1F,0x0C,0x1F,0x06,0x1C,0x06,0x1C,0x03,0x1C,0x03,0x9C,0x01,0x9C,0x01,0xDC,0x00,0xDC,0x00,0x7C,0x3C,0x30,0xFE,0x30,0xE0,0x18,0xE0,0x18,0x70,0x0C,0x38,0x0C,0x0C,0x06,0x06,0x06,0xFE,0x03,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAB
.db 0x00,0x00,0x00,0x00,0x1F,0x18,0x1F,0x0C,0x1C,0x0C,0x1C,0x06,0x1C,0x06,0x1C,0x03,0x1C,0x03,0x9C,0x01,0x9C,0x01,0xDC,0x38,0x60,0x3C,0x60,0x3A,0x30,0x39,0xB0,0x39,0xD8,0x38,0xD8,0xFF,0x0C,0x38,0x0C,0x38,0x06,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAC
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01, ; 0xAD
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x10,0xE0,0x38,0x70,0x1C,0x38,0x0E,0x1C,0x07,0x0C,0x03,0x8E,0x03,0x1C,0x07,0x38,0x0E,0x70,0x1C,0xE0,0x38,0x40,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x9C,0x03,0x38,0x07,0x70,0x0E,0xE0,0x1C,0xC0,0x39,0xC0,0x18,0xE0,0x1C,0x70,0x0E,0x38,0x07,0x9C,0x03,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAF
.db 0xE7,0x1C,0xE7,0x1C,0xE7,0x1C,0x00,0x00,0x00,0x00,0xE7,0x1C,0xE7,0x1C,0xE7,0x1C,0x00,0x00,0x00,0x00,0xE7,0x1C,0xE7,0x1C,0xE7,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x1C,0xE7,0x1C,0xE7,0x1C,0x00,0x00,0x00,0x00,0xE7,0x1C,0xE7,0x1C,0xE7,0x1C,0x00,0x00,0x00,0x00, ; 0xB0
.db 0x38,0xE7,0x38,0xE7,0x38,0xE7,0xE7,0x1C,0xE7,0x1C,0xFF,0xFF,0x38,0xE7,0x38,0xE7,0xE7,0x1C,0xE7,0x1C,0xFF,0xFF,0x38,0xE7,0x38,0xE7,0xE7,0x1C,0xE7,0x1C,0xE7,0x1C,0x38,0xE7,0x38,0xE7,0xFF,0xFF,0xE7,0x1C,0xE7,0x1C,0x38,0xE7,0x38,0xE7,0xFF,0xFF,0xE7,0x1C,0xE7,0x1C, ; 0xB1
.db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0x1C,0xE7,0x1C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0x1C,0xE7,0x1C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0x1C,0xE7,0x1C,0xE7,0x1C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0x1C,0xE7,0x1C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0x1C,0xE7,0x1C, ; 0xB2
.db 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01, ; 0xB3
.db 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xFF,0x01,0xFF,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01, ; 0xB4
.db 0x00,0x07,0x80,0x03,0xC0,0x01,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x03,0xE0,0x03,0x60,0x07,0x60,0x07,0x70,0x06,0x30,0x0E,0x38,0x0E,0x38,0x1C,0x18,0x1C,0xFC,0x3F,0xFC,0x3F,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xB5
.db 0xE0,0x03,0x70,0x07,0x38,0x0E,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x03,0xE0,0x03,0x60,0x07,0x60,0x07,0x70,0x06,0x30,0x0E,0x38,0x0E,0x38,0x1C,0x18,0x1C,0xFC,0x3F,0xFC,0x3F,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xB6
.db 0xE0,0x00,0xC0,0x01,0x80,0x03,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x03,0xE0,0x03,0x60,0x07,0x60,0x07,0x70,0x06,0x30,0x0E,0x38,0x0E,0x38,0x1C,0x18,0x1C,0xFC,0x3F,0xFC,0x3F,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xB7
.db 0x00,0x00,0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x38,0x38,0x1C,0x70,0x8C,0x6F,0xEE,0xEF,0x66,0xC8,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x36,0xC0,0x66,0xC8,0xEE,0xEF,0x8C,0x67,0x1C,0x70,0x38,0x38,0xF0,0x1F,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xB8
.db 0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x7F,0x06,0x7F,0x06,0x00,0x06,0x00,0x06,0x7F,0x06,0x7F,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06, ; 0xB9
.db 0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06, ; 0xBA
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x07,0xFF,0x07,0x00,0x06,0x00,0x06,0x7F,0x06,0x7F,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06, ; 0xBB
.db 0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x7F,0x06,0x7F,0x06,0x00,0x06,0x00,0x06,0xFF,0x07,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xBC
.db 0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0xC0,0x0F,0xF0,0x0F,0xB8,0x09,0xB8,0x01,0x9C,0x01,0x9C,0x01,0x9C,0x01,0x9C,0x01,0x9C,0x01,0x9C,0x01,0x9C,0x01,0xB8,0x01,0xF8,0x09,0xF0,0x0F,0xE0,0x07,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xBD
.db 0x00,0x00,0x00,0x00,0x0E,0xE0,0x1C,0x60,0x38,0x30,0x38,0x30,0x70,0x18,0xE0,0x0C,0xE0,0x0C,0xC0,0x07,0x80,0x03,0xF8,0x3F,0xF8,0x3F,0x80,0x03,0x80,0x03,0x80,0x03,0xF8,0x3F,0xF8,0x3F,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xBE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0xFF,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01, ; 0xBF
.db 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0xFF,0x80,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC0
.db 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC1
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01, ; 0xC2
.db 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0xFF,0x80,0xFF,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01, ; 0xC3
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC4
.db 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01, ; 0xC5
.db 0x00,0x00,0x00,0x00,0xE0,0x0C,0xF0,0x0F,0x30,0x07,0x00,0x00,0x00,0x00,0xE0,0x07,0xF8,0x0F,0x18,0x1E,0x00,0x1C,0x00,0x1C,0xE0,0x1F,0xF0,0x1F,0x38,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x3C,0x1E,0xF8,0x7B,0xF0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC6
.db 0xE0,0x0C,0xF0,0x0F,0x30,0x07,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x03,0xE0,0x03,0x60,0x07,0x60,0x07,0x70,0x06,0x30,0x0E,0x38,0x0E,0x38,0x1C,0x18,0x1C,0xFC,0x3F,0xFC,0x3F,0x0E,0x38,0x0E,0x70,0x0E,0x70,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC7
.db 0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0xFE,0x60,0xFE,0x60,0x00,0x60,0x00,0xE0,0xFF,0xE0,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC8
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xE0,0xFF,0x60,0x00,0x60,0x00,0x60,0xFE,0x60,0xFE,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06, ; 0xC9
.db 0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x7F,0xFE,0x7F,0xFE,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xCA
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x7F,0xFE,0x7F,0xFE,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06, ; 0xCB
.db 0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0xFE,0x60,0xFE,0x60,0x00,0x60,0x00,0x60,0xFE,0x60,0xFE,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06, ; 0xCC
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xCD
.db 0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x7F,0xFE,0x7F,0xFE,0x00,0x00,0x00,0x00,0x7F,0xFE,0x7F,0xFE,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06, ; 0xCE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0xCC,0x33,0xF8,0x1F,0x30,0x0C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x30,0x0C,0xF8,0x1F,0xCC,0x33,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xCF
.db 0x00,0x00,0x1E,0x03,0xFE,0x03,0xF0,0x01,0xF0,0x03,0x18,0x07,0x00,0x0E,0xE0,0x0F,0xF8,0x1F,0x3C,0x1E,0x1C,0x3C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x3C,0x1E,0xF8,0x0F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD0
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0xFC,0x0F,0x1C,0x3C,0x1C,0x38,0x1C,0x78,0x1C,0x70,0x1C,0x70,0xFF,0x70,0xFF,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x38,0x1C,0x38,0x1C,0x1E,0xFC,0x0F,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD1
.db 0xC0,0x07,0xE0,0x0E,0x70,0x1C,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x1F,0xF8,0x1F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x7F,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD2
.db 0x60,0x18,0x60,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x1F,0xF8,0x1F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x7F,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD3
.db 0xC0,0x01,0x80,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0xF8,0x3F,0xF8,0x3F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x1F,0xF8,0x1F,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x7F,0xF8,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD4
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0xFC,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD5
.db 0x00,0x07,0x80,0x03,0xC0,0x01,0x00,0x00,0x00,0x00,0xFC,0x1F,0xFC,0x1F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD6
.db 0xE0,0x03,0x70,0x07,0x38,0x0E,0x00,0x00,0x00,0x00,0xFC,0x1F,0xFC,0x1F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD7
.db 0x30,0x0C,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,0xFC,0x1F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD8
.db 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xFF,0x01,0xFF,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD9
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x80,0xFF,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01, ; 0xDA
.db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, ; 0xDB
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, ; 0xDC
.db 0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00, ; 0xDD
.db 0xE0,0x00,0xC0,0x01,0x80,0x03,0x00,0x00,0x00,0x00,0xFC,0x1F,0xFC,0x1F,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xFC,0x1F,0xFC,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xDE
.db 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xDF
.db 0x00,0x07,0x80,0x03,0xC0,0x01,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x38,0x1C,0x1C,0x38,0x1C,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xE0
.db 0x00,0x00,0xF0,0x03,0xF8,0x07,0x3C,0x0E,0x1C,0x0E,0x1C,0x0E,0x1C,0x06,0x1C,0x07,0x9C,0x03,0x9C,0x03,0x9C,0x03,0x9C,0x07,0x1C,0x0F,0x1C,0x1E,0x1C,0x3C,0x1C,0x78,0x1C,0x70,0x1C,0x70,0x9C,0x70,0x9C,0x3F,0x1C,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xE1
.db 0xE0,0x03,0x70,0x07,0x38,0x0E,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x38,0x1C,0x1C,0x38,0x1C,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xE2
.db 0xE0,0x00,0xC0,0x01,0x80,0x03,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x38,0x1C,0x1C,0x38,0x1C,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xE3
.db 0x00,0x00,0x00,0x00,0xE0,0x0C,0xF0,0x0F,0x30,0x07,0x00,0x00,0x00,0x00,0xE0,0x03,0xF8,0x0F,0x3C,0x1E,0x1C,0x1C,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x0E,0x38,0x1C,0x1C,0x3C,0x1E,0xF8,0x0F,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xE4
.db 0xE0,0x0C,0xF0,0x0F,0x30,0x07,0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x0F,0x38,0x1C,0x1C,0x38,0x1C,0x38,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x0E,0x70,0x1C,0x38,0x1C,0x38,0x38,0x1C,0xF0,0x0F,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xE5
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x3C,0x3C,0x7C,0x3E,0xFC,0x3B,0xDC,0x7B,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00, ; 0xE6
.db 0x00,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x9C,0x07,0xDC,0x1F,0x7C,0x1C,0x3C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x1C,0x3C,0x1E,0xFC,0x0F,0x9C,0x07,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00,0x1C,0x00, ; 0xE7
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0xF8,0x1F,0xF8,0x3F,0x38,0x78,0x38,0x70,0x38,0x70,0x38,0x70,0x38,0x78,0x38,0x3C,0xF8,0x1F,0xF8,0x07,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xE8
.db 0x00,0x07,0x80,0x03,0xC0,0x01,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3C,0x78,0x38,0x38,0xF0,0x1F,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xE9
.db 0xE0,0x03,0x70,0x07,0x38,0x0E,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3C,0x78,0x38,0x38,0xF0,0x1F,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xEA
.db 0xE0,0x00,0xC0,0x01,0x80,0x03,0x00,0x00,0x00,0x00,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x1C,0x70,0x3C,0x78,0x38,0x38,0xF0,0x1F,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xEB
.db 0x00,0x00,0x00,0x06,0x00,0x03,0x80,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x1E,0x70,0x1C,0x30,0x1C,0x38,0x38,0x18,0x38,0x1C,0x78,0x1C,0x70,0x0E,0xF0,0x0E,0xE0,0x07,0xE0,0x07,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x7C,0x00,0x3C,0x00, ; 0xEC
.db 0x00,0x07,0x80,0x03,0xC0,0x01,0x00,0x00,0x00,0x00,0x07,0xE0,0x0E,0x70,0x1C,0x30,0x1C,0x18,0x38,0x1C,0x78,0x0E,0x70,0x07,0xE0,0x03,0xE0,0x03,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xED
.db 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xEE
.db 0x80,0x03,0xC0,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xEF
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x1F,0xF8,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF0
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xFE,0x7F,0xFE,0x7F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0xFE,0x7F,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF1
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF, ; 0xF2
.db 0x00,0x00,0x00,0x00,0x7E,0xE0,0xFE,0x70,0xE0,0x38,0xE0,0x38,0x3C,0x1C,0x7C,0x1C,0xE0,0x0E,0xE0,0x07,0xFE,0x07,0xBE,0x3B,0xC0,0x3D,0xC0,0x3B,0xE0,0x39,0xF0,0x39,0xF0,0x38,0xF8,0xFF,0x38,0x38,0x1C,0x38,0x0E,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF3
.db 0x00,0x00,0x00,0x00,0xF8,0x1F,0xFC,0x1F,0xFE,0x18,0xFE,0x18,0xFE,0x18,0xFE,0x18,0xFE,0x18,0xFC,0x18,0xF8,0x18,0xF0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0xC0,0x18,0x00,0x00, ; 0xF4
.db 0x00,0x00,0x00,0x00,0xC0,0x1F,0xF0,0x1F,0x78,0x10,0x38,0x00,0x38,0x00,0x78,0x00,0xF0,0x01,0xE0,0x07,0xF0,0x0F,0x30,0x1E,0x38,0x3C,0x38,0x38,0x78,0x38,0xF0,0x19,0xE0,0x0F,0x80,0x0F,0x00,0x1E,0x00,0x3C,0x00,0x38,0x00,0x38,0x18,0x3C,0xF8,0x1F,0xE0,0x07,0x00,0x00, ; 0xF5
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0xFE,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF6
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0x00,0x06,0x00,0x06,0xC0,0x03, ; 0xF7
.db 0x00,0x00,0x00,0x00,0xE0,0x00,0x10,0x01,0x10,0x01,0x10,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF8
.db 0x30,0x0C,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF9
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFA
.db 0x00,0x00,0x00,0x00,0xE0,0x03,0xE0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFB
.db 0x00,0x00,0x00,0x00,0xE0,0x0F,0xF0,0x1F,0x10,0x1C,0x00,0x1C,0xC0,0x07,0xC0,0x0F,0x00,0x1C,0x00,0x1C,0xF0,0x1F,0xF0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFC
.db 0x00,0x00,0x00,0x00,0xE0,0x07,0xF0,0x1F,0x10,0x1C,0x00,0x1C,0x00,0x0E,0x80,0x07,0xC0,0x01,0x70,0x00,0xF0,0x1F,0xF0,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFD
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0xFF

View File

@@ -1,258 +0,0 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; This is a font from the project LCD_fonts at
; https://github.com/basti79/LCD-fonts.git
; which in turn is based on a post by Benedikt K. in a forum post on
; https://www.mikrocontroller.net/topic/54860
; ***************************************************************************
; ***************************************************************************
; code
.cseg
font4_12x16:
; header
.dw font12x16MonoHandlerFn ; handlerFn
.dw 384 ; needed buffer size
.db 12, 16 ; width, height of chars
.db 32, 224 ; first char, num of chars in font
; data (12x16_horizontal_LSB_2)
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x20
.db 0x60,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0x21
.db 0x00,0x00,0x00,0x00,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x22
.db 0x00,0x00,0x60,0x06,0x60,0x06,0x60,0x06,0xFC,0x0F,0x30,0x03,0x30,0x03,0x98,0x01,0x98,0x01,0xFE,0x03,0xCC,0x00,0xCC,0x00,0xCC,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x23
.db 0x60,0x00,0x60,0x00,0xF8,0x01,0xFC,0x03,0x6C,0x00,0x6C,0x00,0xFC,0x01,0xF8,0x03,0x60,0x03,0x60,0x03,0xFC,0x03,0xF8,0x01,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0x24
.db 0x00,0x00,0x00,0x00,0x00,0x08,0x1C,0x0C,0x1C,0x0E,0x1C,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x07,0x0E,0x07,0x06,0x07,0x00,0x00,0x00,0x00, ; 0x25
.db 0x00,0x00,0xE0,0x00,0xB0,0x01,0x98,0x01,0x98,0x01,0xD8,0x00,0x70,0x00,0x78,0x00,0x7C,0x00,0xCC,0x06,0xCC,0x03,0x8C,0x01,0xDC,0x03,0x78,0x06,0x00,0x00,0x00,0x00, ; 0x26
.db 0x70,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x27
.db 0xC0,0x01,0x60,0x00,0x70,0x00,0x30,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x30,0x00,0x70,0x00,0x60,0x00,0xC0,0x01,0x00,0x00,0x00,0x00, ; 0x28
.db 0x38,0x00,0x60,0x00,0xE0,0x00,0xC0,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0xE0,0x00,0x60,0x00,0x38,0x00,0x00,0x00,0x00,0x00, ; 0x29
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x03,0x6C,0x03,0xF8,0x01,0xF0,0x00,0xFC,0x03,0xF0,0x00,0xF8,0x01,0x6C,0x03,0x6C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x2A
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFC,0x03,0xFC,0x03,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x2B
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x30,0x00, ; 0x2C
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x2D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x00, ; 0x2E
.db 0x00,0x00,0x00,0x08,0x00,0x0C,0x00,0x0E,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x2F
.db 0xF0,0x01,0xFC,0x07,0x0C,0x06,0x06,0x0E,0x06,0x0F,0x86,0x0D,0xC6,0x0C,0x66,0x0C,0x36,0x0C,0x1E,0x0C,0x0E,0x0C,0x0C,0x06,0xFC,0x07,0xF0,0x01,0x00,0x00,0x00,0x00, ; 0x30
.db 0xC0,0x00,0xE0,0x00,0xF8,0x00,0xF8,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xF8,0x07,0xF8,0x07,0x00,0x00,0x00,0x00, ; 0x31
.db 0xF8,0x03,0xFC,0x07,0x0E,0x0E,0x06,0x0C,0x06,0x0E,0x00,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0xFE,0x0F,0xFE,0x0F,0x00,0x00,0x00,0x00, ; 0x32
.db 0xF8,0x03,0xFC,0x07,0x0E,0x0E,0x06,0x0C,0x00,0x0C,0x00,0x0E,0xF0,0x07,0xF0,0x03,0x00,0x06,0x00,0x0C,0x06,0x0C,0x0E,0x0E,0xFC,0x07,0xF8,0x03,0x00,0x00,0x00,0x00, ; 0x33
.db 0x80,0x03,0xC0,0x03,0xE0,0x03,0x70,0x03,0x38,0x03,0x1C,0x03,0x0E,0x03,0x06,0x03,0xFE,0x0F,0xFE,0x0F,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00, ; 0x34
.db 0xFE,0x0F,0xFE,0x0F,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x03,0xFC,0x07,0x00,0x0E,0x00,0x0C,0x00,0x0C,0x06,0x0C,0x0E,0x0E,0xFC,0x07,0xF8,0x03,0x00,0x00,0x00,0x00, ; 0x35
.db 0xC0,0x03,0xE0,0x03,0x70,0x00,0x38,0x00,0x1C,0x00,0x0C,0x00,0xFE,0x03,0xFE,0x07,0x0E,0x0E,0x06,0x0C,0x06,0x0C,0x0E,0x0E,0xFC,0x07,0xF8,0x03,0x00,0x00,0x00,0x00, ; 0x36
.db 0xFE,0x0F,0xFE,0x0F,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x03,0x80,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00, ; 0x37
.db 0xF0,0x01,0xF8,0x03,0x1C,0x07,0x0C,0x06,0x0C,0x06,0x1C,0x07,0xF8,0x03,0xFC,0x07,0x0E,0x0E,0x06,0x0C,0x06,0x0C,0x0E,0x0E,0xFC,0x07,0xF8,0x03,0x00,0x00,0x00,0x00, ; 0x38
.db 0xF8,0x03,0xFC,0x07,0x0E,0x0E,0x06,0x0C,0x06,0x0C,0x0E,0x0E,0xFC,0x0F,0xF8,0x0F,0x00,0x06,0x00,0x07,0x80,0x03,0xC0,0x01,0xF8,0x00,0x78,0x00,0x00,0x00,0x00,0x00, ; 0x39
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x3A
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x30,0x00, ; 0x3B
.db 0x00,0x03,0x80,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x00,0xC0,0x01,0x80,0x03,0x00,0x03,0x00,0x00,0x00,0x00, ; 0x3C
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x07,0xFC,0x07,0x00,0x00,0x00,0x00,0xFC,0x07,0xFC,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x3D
.db 0x0C,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0xC0,0x01,0xE0,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, ; 0x3E
.db 0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x07,0x80,0x03,0xC0,0x01,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0x3F
.db 0xF8,0x03,0xFC,0x07,0x0C,0x06,0xE6,0x0D,0xF6,0x0D,0xB6,0x0D,0xB6,0x0D,0xB6,0x0D,0xB6,0x0D,0xF6,0x07,0xE6,0x03,0x0E,0x00,0xFC,0x03,0xF0,0x03,0x00,0x00,0x00,0x00, ; 0x40
.db 0x60,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0x98,0x01,0x98,0x01,0x98,0x01,0x0C,0x03,0xFC,0x03,0xFC,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x41
.db 0xFE,0x00,0xFE,0x01,0x86,0x03,0x06,0x03,0x06,0x03,0x86,0x03,0xFE,0x01,0xFE,0x03,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x07,0xFE,0x03,0xFE,0x01,0x00,0x00,0x00,0x00, ; 0x42
.db 0xF0,0x01,0xF8,0x03,0x1C,0x07,0x0C,0x06,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x06,0x1C,0x07,0xF8,0x03,0xF0,0x01,0x00,0x00,0x00,0x00, ; 0x43
.db 0xFE,0x00,0xFE,0x01,0x86,0x03,0x06,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x86,0x03,0xFE,0x01,0xFE,0x00,0x00,0x00,0x00,0x00, ; 0x44
.db 0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x01,0xFE,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00, ; 0x45
.db 0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x01,0xFE,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00, ; 0x46
.db 0xF0,0x03,0xF8,0x07,0x1C,0x06,0x0C,0x00,0x06,0x00,0x06,0x00,0xC6,0x07,0xC6,0x07,0x06,0x06,0x06,0x06,0x0C,0x06,0x1C,0x06,0xF8,0x07,0xF0,0x07,0x00,0x00,0x00,0x00, ; 0x47
.db 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFE,0x07,0xFE,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x48
.db 0xF8,0x01,0xF8,0x01,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x49
.db 0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x06,0x06,0x06,0x06,0x0E,0x03,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x4A
.db 0x06,0x06,0x06,0x07,0x86,0x03,0xC6,0x01,0xE6,0x00,0x76,0x00,0x3E,0x00,0x3E,0x00,0x76,0x00,0xE6,0x00,0xC6,0x01,0x86,0x03,0x06,0x07,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x4B
.db 0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00, ; 0x4C
.db 0x06,0x06,0x0E,0x07,0x0E,0x07,0x9E,0x07,0x9E,0x07,0xF6,0x06,0xF6,0x06,0x66,0x06,0x66,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x4D
.db 0x06,0x06,0x0E,0x06,0x0E,0x06,0x1E,0x06,0x36,0x06,0x36,0x06,0x66,0x06,0x66,0x06,0xC6,0x06,0xC6,0x06,0x86,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x4E
.db 0xF0,0x00,0xF8,0x01,0x9C,0x03,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0x9C,0x03,0xF8,0x01,0xF0,0x00,0x00,0x00,0x00,0x00, ; 0x4F
.db 0xFE,0x01,0xFE,0x03,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0xFE,0x03,0xFE,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00, ; 0x50
.db 0xF0,0x00,0xF8,0x01,0x9C,0x03,0x0C,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xC6,0x06,0xCC,0x03,0x9C,0x03,0xF8,0x07,0xF0,0x06,0x00,0x00,0x00,0x00, ; 0x51
.db 0xFE,0x01,0xFE,0x03,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0xFE,0x03,0xFE,0x01,0xE6,0x00,0xC6,0x01,0x86,0x03,0x06,0x07,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x52
.db 0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x00,0x0E,0x00,0xFC,0x01,0xF8,0x03,0x00,0x07,0x00,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x53
.db 0xFC,0x03,0xFC,0x03,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0x54
.db 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x55
.db 0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0x0C,0x03,0x98,0x01,0x98,0x01,0x98,0x01,0xF0,0x00,0xF0,0x00,0xF0,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0x56
.db 0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x06,0x66,0x06,0xF6,0x06,0x9E,0x07,0x0E,0x07,0x0E,0x07,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x57
.db 0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0x98,0x01,0xF0,0x00,0x60,0x00,0x60,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x03,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x58
.db 0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0x98,0x01,0x98,0x01,0xF0,0x00,0xF0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0x59
.db 0xFE,0x07,0xFE,0x07,0x00,0x03,0x00,0x03,0x80,0x01,0xC0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00, ; 0x5A
.db 0xF8,0x01,0xF8,0x01,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x5B
.db 0x00,0x00,0x02,0x00,0x06,0x00,0x0E,0x00,0x1C,0x00,0x38,0x00,0x70,0x00,0xE0,0x00,0xC0,0x01,0x80,0x03,0x00,0x07,0x00,0x0E,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x5C
.db 0xF8,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x5D
.db 0x40,0x00,0xE0,0x00,0xF0,0x01,0xB8,0x03,0x1C,0x07,0x0E,0x0E,0x06,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x5E
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0xFE,0x0F, ; 0x5F
.db 0x00,0x00,0xE0,0x00,0xE0,0x00,0xE0,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x60
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x03,0xFC,0x07,0x00,0x06,0xF8,0x07,0xFC,0x07,0x06,0x06,0x06,0x06,0xFE,0x07,0xFC,0x07,0x00,0x00,0x00,0x00, ; 0x61
.db 0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xF6,0x01,0xFE,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0xFE,0x03,0xFE,0x01,0x00,0x00,0x00,0x00, ; 0x62
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x06,0x06,0x00,0x06,0x00,0x06,0x00,0x0E,0x06,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x63
.db 0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0xF8,0x06,0xFC,0x07,0x8E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x06,0xFC,0x07,0xF8,0x07,0x00,0x00,0x00,0x00, ; 0x64
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x06,0xFE,0x07,0xFE,0x03,0x06,0x00,0x0E,0x00,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x65
.db 0xE0,0x01,0xF0,0x01,0x38,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xFE,0x00,0xFE,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00, ; 0x66
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0xFC,0x07,0x0E,0x06,0x06,0x06,0x0E,0x07,0xFC,0x07,0xF8,0x06,0x00,0x06,0x00,0x07,0xFC,0x03,0xFC,0x01, ; 0x67
.db 0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0xF6,0x00,0xFE,0x01,0x8E,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x00,0x00,0x00,0x00, ; 0x68
.db 0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x69
.db 0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x01,0x00,0x00,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x98,0x01,0xF8,0x01,0xF0,0x00, ; 0x6A
.db 0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x8C,0x01,0xCC,0x01,0xEC,0x00,0x7C,0x00,0x7C,0x00,0xEC,0x00,0xCC,0x01,0x8C,0x03,0x0C,0x03,0x00,0x00,0x00,0x00, ; 0x6B
.db 0x70,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x6C
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x01,0xFE,0x03,0xFE,0x07,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x00,0x00,0x00,0x00, ; 0x6D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0xFC,0x03,0x0C,0x07,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x00,0x00,0x00,0x00, ; 0x6E
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x6F
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x01,0xFE,0x03,0x06,0x07,0x06,0x06,0x06,0x06,0x0E,0x07,0xFE,0x03,0xF6,0x01,0x06,0x00,0x06,0x00,0x06,0x00, ; 0x70
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x07,0xFC,0x07,0x0E,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x07,0xF8,0x06,0x00,0x06,0x00,0x06,0x00,0x06, ; 0x71
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEC,0x03,0xFC,0x07,0x1C,0x06,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00, ; 0x72
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0xFE,0x01,0x06,0x00,0xFE,0x00,0xFC,0x01,0x80,0x01,0x80,0x01,0xFE,0x01,0xFC,0x00,0x00,0x00,0x00,0x00, ; 0x73
.db 0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xFE,0x00,0xFE,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xF8,0x01,0xF0,0x01,0x00,0x00,0x00,0x00, ; 0x74
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x07,0xF8,0x06,0x00,0x00,0x00,0x00, ; 0x75
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0x98,0x01,0x98,0x01,0xF0,0x00,0xF0,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0x76
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0x66,0x06,0xF6,0x06,0xFC,0x03,0x9C,0x03,0x08,0x01,0x00,0x00,0x00,0x00, ; 0x77
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x8E,0x03,0xDC,0x01,0xF8,0x00,0x70,0x00,0xF8,0x00,0xDC,0x01,0x8E,0x03,0x06,0x03,0x00,0x00,0x00,0x00, ; 0x78
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x03,0x0C,0x03,0x98,0x01,0x98,0x01,0xF0,0x00,0xF0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00, ; 0x79
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0xFE,0x01,0xC0,0x00,0x60,0x00,0x30,0x00,0x18,0x00,0x0C,0x00,0xFE,0x03,0xFE,0x03,0x00,0x00,0x00,0x00, ; 0x7A
.db 0xC0,0x03,0xE0,0x03,0x70,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x38,0x00,0x1C,0x00,0x38,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x70,0x00,0xE0,0x03,0xC0,0x03,0x00,0x00, ; 0x7B
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0x7C
.db 0x3C,0x00,0x7C,0x00,0xE0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0x80,0x03,0xC0,0x01,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xE0,0x00,0x7C,0x00,0x3C,0x00,0x00,0x00, ; 0x7D
.db 0x00,0x00,0x00,0x00,0x38,0x06,0x6C,0x03,0xC6,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x7E
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x06,0x06,0x06,0x06,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x7F
.db 0xF0,0x01,0xF8,0x03,0x1C,0x07,0x0C,0x06,0x06,0x06,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x0C,0x06,0x1C,0x07,0xF8,0x03,0xF0,0x01,0x60,0x00,0x78,0x00,0x78,0x00, ; 0x80
.db 0x00,0x00,0x00,0x00,0x98,0x01,0x98,0x01,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x07,0xF8,0x06,0x00,0x00,0x00,0x00, ; 0x81
.db 0x00,0x00,0x80,0x01,0xC0,0x00,0x60,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x06,0xFE,0x07,0xFE,0x07,0x06,0x00,0x0E,0x00,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x82
.db 0x00,0x00,0x60,0x00,0xF0,0x00,0x98,0x01,0x00,0x00,0xF8,0x03,0xFC,0x07,0x00,0x06,0xF8,0x07,0xFC,0x07,0x06,0x06,0x06,0x06,0xFE,0x07,0xFC,0x07,0x00,0x00,0x00,0x00, ; 0x83
.db 0x00,0x00,0x00,0x00,0x98,0x01,0x98,0x01,0x00,0x00,0xF8,0x03,0xFC,0x07,0x00,0x06,0xF8,0x07,0xFC,0x07,0x06,0x06,0x06,0x06,0xFE,0x07,0xFC,0x07,0x00,0x00,0x00,0x00, ; 0x84
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x00,0x00,0xF8,0x03,0xFC,0x07,0x00,0x06,0xF8,0x07,0xFC,0x07,0x06,0x06,0x06,0x06,0xFE,0x07,0xFC,0x07,0x00,0x00,0x00,0x00, ; 0x85
.db 0x00,0x00,0x60,0x00,0x90,0x00,0x60,0x00,0x00,0x00,0xF8,0x03,0xFC,0x07,0x00,0x06,0xF8,0x07,0xFC,0x07,0x06,0x06,0x06,0x06,0xFE,0x07,0xFC,0x07,0x00,0x00,0x00,0x00, ; 0x86
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x00,0x06,0x00,0x06,0x00,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x60,0x00,0x78,0x00, ; 0x87
.db 0x00,0x00,0x60,0x00,0xF0,0x00,0x98,0x01,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x06,0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x88
.db 0x00,0x00,0x00,0x00,0x98,0x01,0x98,0x01,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x06,0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x89
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x06,0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x8A
.db 0x00,0x00,0x00,0x00,0xD8,0x00,0xD8,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x8B
.db 0x00,0x00,0x60,0x00,0xF0,0x00,0x98,0x01,0x00,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x8C
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x8D
.db 0x98,0x01,0x98,0x01,0x00,0x00,0x60,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0x98,0x01,0x98,0x01,0x0C,0x03,0xFC,0x03,0xFE,0x07,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x8E
.db 0x60,0x00,0x90,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0x98,0x01,0x98,0x01,0x0C,0x03,0xFC,0x03,0xFE,0x07,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0x8F
.db 0x80,0x01,0xC0,0x00,0x60,0x00,0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0xFE,0x01,0xFE,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00, ; 0x90
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBC,0x03,0x66,0x06,0x60,0x06,0xFC,0x03,0x66,0x00,0x66,0x00,0x66,0x06,0xDC,0x03,0x00,0x00,0x00,0x00, ; 0x91
.db 0xE0,0x07,0xE0,0x07,0xF0,0x00,0xF0,0x00,0xF8,0x00,0xD8,0x00,0xD8,0x03,0xCC,0x03,0xCC,0x00,0xFC,0x00,0xFE,0x00,0xC6,0x00,0xC6,0x07,0xC6,0x07,0x00,0x00,0x00,0x00, ; 0x92
.db 0x00,0x00,0x60,0x00,0xF0,0x00,0x98,0x01,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x93
.db 0x00,0x00,0x00,0x00,0x98,0x01,0x98,0x01,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x94
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x95
.db 0x00,0x00,0x60,0x00,0xF0,0x00,0x98,0x01,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x07,0xF8,0x06,0x00,0x00,0x00,0x00, ; 0x96
.db 0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x07,0xF8,0x06,0x00,0x00,0x00,0x00, ; 0x97
.db 0x00,0x00,0x00,0x00,0x98,0x01,0x98,0x01,0x00,0x00,0x0C,0x03,0x0C,0x03,0x98,0x01,0x98,0x01,0xF0,0x00,0xF0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00, ; 0x98
.db 0x98,0x01,0x98,0x01,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0x99
.db 0x00,0x00,0x00,0x00,0x98,0x01,0x98,0x01,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x07,0xF8,0x06,0x00,0x00,0x00,0x00, ; 0x9A
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x06,0xFC,0x03,0x8E,0x07,0xC6,0x06,0x66,0x06,0x36,0x06,0x1E,0x07,0xFC,0x03,0xF6,0x01,0x00,0x00,0x00,0x00, ; 0x9B
.db 0x00,0x00,0x00,0x00,0xE0,0x01,0xF0,0x03,0x30,0x03,0x30,0x00,0x30,0x00,0xF8,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0xFC,0x07,0xDC,0x03,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x9C
.db 0x00,0x00,0x00,0x00,0xF8,0x06,0xFC,0x03,0x8E,0x07,0xC6,0x06,0xC6,0x06,0x66,0x06,0x66,0x06,0x36,0x06,0x36,0x06,0x1E,0x07,0xFC,0x03,0xF6,0x01,0x00,0x00,0x00,0x00, ; 0x9D
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x03,0x98,0x01,0xF0,0x00,0x60,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x9E
.db 0xC0,0x01,0xE0,0x03,0x60,0x03,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x6C,0x00,0x7C,0x00,0x38,0x00,0x00,0x00, ; 0x9F
.db 0x00,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x00,0x00,0xF8,0x03,0xFC,0x07,0x00,0x06,0xF8,0x07,0xFC,0x07,0x06,0x06,0x06,0x06,0xFE,0x07,0xFC,0x07,0x00,0x00,0x00,0x00, ; 0xA0
.db 0x00,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x00,0x00,0x70,0x00,0x70,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xA1
.db 0x00,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xA2
.db 0x00,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x07,0xF8,0x06,0x00,0x00,0x00,0x00, ; 0xA3
.db 0x00,0x00,0x00,0x00,0x70,0x03,0xD8,0x01,0x00,0x00,0xFC,0x01,0xFC,0x03,0x0C,0x07,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x00,0x00,0x00,0x00, ; 0xA4
.db 0x70,0x03,0xD8,0x01,0x00,0x00,0x06,0x06,0x0E,0x06,0x1E,0x06,0x3E,0x06,0x76,0x06,0xE6,0x06,0xC6,0x07,0x86,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0xA5
.db 0xF8,0x03,0xFC,0x07,0x00,0x06,0xFC,0x07,0xFE,0x07,0x06,0x06,0xFE,0x07,0xFC,0x07,0x00,0x00,0xFC,0x03,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA6
.db 0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0xFC,0x03,0xFC,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA7
.db 0x60,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x70,0x00,0x38,0x00,0x1C,0x00,0x0E,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xA8
.db 0x00,0x00,0x00,0x00,0xF8,0x03,0xFC,0x07,0x0E,0x0E,0xF6,0x0C,0xB6,0x0D,0xF6,0x0C,0xB6,0x0D,0xB6,0x0D,0x0E,0x0E,0xFC,0x07,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xA9
.db 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x07,0xFF,0x07,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAA
.db 0x00,0x00,0x00,0x00,0x0C,0x00,0x0E,0x00,0x0C,0x03,0x8C,0x01,0xDE,0x00,0x60,0x00,0xB0,0x03,0x18,0x06,0x0C,0x03,0x80,0x01,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAB
.db 0x00,0x00,0x00,0x00,0x0C,0x00,0x0E,0x00,0x0C,0x03,0x8C,0x01,0xDE,0x00,0x60,0x00,0xB0,0x06,0xD8,0x06,0xCC,0x07,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAC
.db 0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0xAD
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x03,0x8C,0x01,0xC6,0x00,0x8C,0x01,0x18,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x00,0x8C,0x01,0x18,0x03,0x8C,0x01,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xAF
.db 0x11,0x01,0x44,0x04,0x11,0x01,0x44,0x04,0x11,0x01,0x44,0x04,0x11,0x01,0x44,0x04,0x11,0x01,0x44,0x04,0x11,0x01,0x44,0x04,0x11,0x01,0x44,0x04,0x11,0x01,0x44,0x04, ; 0xB0
.db 0xAA,0x0A,0x55,0x05,0xAA,0x0A,0x55,0x05,0xAA,0x0A,0x55,0x05,0xAA,0x0A,0x55,0x05,0xAA,0x0A,0x55,0x05,0xAA,0x0A,0x55,0x05,0xAA,0x0A,0x55,0x05,0xAA,0x0A,0x55,0x05, ; 0xB1
.db 0xEE,0x0E,0xBB,0x0B,0xEE,0x0E,0xBB,0x0B,0xEE,0x0E,0xBB,0x0B,0xEE,0x0E,0xBB,0x0B,0xEE,0x0E,0xBB,0x0B,0xEE,0x0E,0xBB,0x0B,0xEE,0x0E,0xBB,0x0B,0xEE,0x0E,0xBB,0x0B, ; 0xB2
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00, ; 0xB3
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00, ; 0xB4
.db 0xC0,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0x98,0x01,0x98,0x01,0x0C,0x03,0xFC,0x03,0xFE,0x07,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0xB5
.db 0x60,0x00,0xF0,0x00,0x98,0x01,0x60,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0x98,0x01,0x98,0x01,0x0C,0x03,0xFC,0x03,0xFE,0x07,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0xB6
.db 0x30,0x00,0x60,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0x98,0x01,0x98,0x01,0x0C,0x03,0xFC,0x03,0xFE,0x07,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0xB7
.db 0x00,0x00,0x00,0x00,0xF8,0x03,0xFC,0x07,0x0E,0x0E,0xE6,0x0C,0xB6,0x0D,0x36,0x0C,0xB6,0x0D,0xE6,0x0C,0x0E,0x0E,0xFC,0x07,0xF8,0x03,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xB8
.db 0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6F,0x00,0x6F,0x00,0x60,0x00,0x6F,0x00,0x6F,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00, ; 0xB9
.db 0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00, ; 0xBA
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x7F,0x00,0x60,0x00,0x6F,0x00,0x6F,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00, ; 0xBB
.db 0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6F,0x00,0x6F,0x00,0x60,0x00,0x7F,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xBC
.db 0x00,0x00,0x60,0x00,0x60,0x00,0xF0,0x01,0xF8,0x03,0x7C,0x03,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x7C,0x03,0xF8,0x03,0xF0,0x01,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0xBD
.db 0x06,0x06,0x06,0x06,0x0C,0x03,0x0C,0x03,0x98,0x01,0x98,0x01,0xF0,0x00,0xF0,0x00,0x60,0x00,0xFC,0x03,0x60,0x00,0xFC,0x03,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0xBE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00, ; 0xBF
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xE0,0x0F,0xE0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC0
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC1
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00, ; 0xC2
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xE0,0x0F,0xE0,0x0F,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00, ; 0xC3
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC4
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xFF,0x0F,0xFF,0x0F,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00, ; 0xC5
.db 0x00,0x00,0x00,0x00,0x70,0x03,0xD8,0x01,0x00,0x00,0xF8,0x03,0xFC,0x07,0x00,0x06,0xF8,0x07,0xFC,0x07,0x06,0x06,0x06,0x06,0xFE,0x07,0xFC,0x07,0x00,0x00,0x00,0x00, ; 0xC6
.db 0x70,0x03,0xD8,0x01,0x00,0x00,0x60,0x00,0x60,0x00,0xF0,0x00,0xF0,0x00,0x98,0x01,0x98,0x01,0x0C,0x03,0xFC,0x03,0xFE,0x07,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00, ; 0xC7
.db 0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0xEC,0x0F,0xEC,0x0F,0x0C,0x00,0xFC,0x0F,0xFC,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xC8
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x0F,0xFC,0x0F,0x0C,0x00,0xEC,0x0F,0xEC,0x0F,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00, ; 0xC9
.db 0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0xEF,0x0F,0xEF,0x0F,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xCA
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0xEF,0x0F,0xEF,0x0F,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00, ; 0xCB
.db 0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0xEC,0x0F,0xEC,0x0F,0x0C,0x00,0xEC,0x0F,0xEC,0x0F,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00, ; 0xCC
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xCD
.db 0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0xEF,0x0F,0xEF,0x0F,0x00,0x00,0xEF,0x0F,0xEF,0x0F,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00,0x6C,0x00, ; 0xCE
.db 0x00,0x00,0x06,0x06,0xF6,0x06,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF6,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xCF
.db 0x00,0x00,0x00,0x00,0xF0,0x00,0xF8,0x01,0x18,0x01,0x18,0x00,0x38,0x00,0x70,0x00,0xE0,0x00,0xF0,0x01,0x98,0x01,0x98,0x01,0xF8,0x01,0xF0,0x00,0x00,0x00,0x00,0x00, ; 0xD0
.db 0xFC,0x00,0xFC,0x01,0x8C,0x03,0x0C,0x03,0x0C,0x06,0x0C,0x06,0x1E,0x06,0x1E,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x03,0x8C,0x03,0xFC,0x01,0xFC,0x00,0x00,0x00,0x00,0x00, ; 0xD1
.db 0x60,0x00,0xF0,0x00,0x98,0x01,0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0xFE,0x01,0xFE,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00, ; 0xD2
.db 0x98,0x01,0x98,0x01,0x00,0x00,0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0xFE,0x01,0xFE,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00, ; 0xD3
.db 0x18,0x00,0x30,0x00,0x60,0x00,0xFE,0x07,0xFE,0x07,0x06,0x00,0x06,0x00,0xFE,0x01,0xFE,0x01,0x06,0x00,0x06,0x00,0x06,0x00,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00, ; 0xD4
.db 0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD5
.db 0x80,0x01,0xC0,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xD6
.db 0x60,0x00,0xF0,0x00,0x98,0x01,0xF8,0x01,0xF8,0x01,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xD7
.db 0x98,0x01,0x98,0x01,0x00,0x00,0xF8,0x01,0xF8,0x01,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xD8
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x7F,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xD9
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0xE0,0x0F,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00, ; 0xDA
.db 0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F, ; 0xDB
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F, ; 0xDC
.db 0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0xDD
.db 0x18,0x00,0x30,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xDE
.db 0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xDF
.db 0x80,0x01,0xC0,0x00,0x60,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xE0
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x98,0x01,0x0C,0x03,0x0C,0x03,0xFC,0x01,0x8C,0x03,0x0C,0x03,0x0C,0x03,0x8C,0x03,0xFC,0x01,0x0C,0x00,0x0C,0x00, ; 0xE1
.db 0x60,0x00,0xF0,0x00,0x98,0x01,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xE2
.db 0x18,0x00,0x30,0x00,0x60,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xE3
.db 0x00,0x00,0x00,0x00,0xB8,0x01,0xEC,0x00,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xE4
.db 0x70,0x03,0xD8,0x01,0x00,0x00,0xF8,0x01,0xFC,0x03,0x0E,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0E,0x07,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xE5
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x8E,0x03,0xFE,0x03,0x7E,0x03,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00, ; 0xE6
.db 0x00,0x00,0x00,0x00,0x3C,0x00,0x3C,0x00,0x18,0x00,0xF8,0x01,0xF8,0x03,0x18,0x03,0x18,0x03,0xF8,0x03,0xF8,0x01,0x18,0x00,0x3C,0x00,0x3C,0x00,0x00,0x00,0x00,0x00, ; 0xE7
.db 0x3C,0x00,0x3C,0x00,0x18,0x00,0xF8,0x01,0xF8,0x03,0x18,0x03,0x18,0x03,0x18,0x03,0x18,0x03,0xF8,0x03,0xF8,0x01,0x18,0x00,0x3C,0x00,0x3C,0x00,0x00,0x00,0x00,0x00, ; 0xE8
.db 0x80,0x01,0xC0,0x00,0x60,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xE9
.db 0x60,0x00,0xF0,0x00,0x98,0x01,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xEA
.db 0x18,0x00,0x30,0x00,0x60,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0C,0x03,0xFC,0x03,0xF8,0x01,0x00,0x00,0x00,0x00, ; 0xEB
.db 0x00,0x00,0x00,0x00,0x80,0x01,0xC0,0x00,0x60,0x00,0x0C,0x03,0x0C,0x03,0x98,0x01,0x98,0x01,0xF0,0x00,0xF0,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x18,0x00, ; 0xEC
.db 0x80,0x01,0xC0,0x00,0x60,0x00,0x06,0x06,0x0C,0x03,0x98,0x01,0xF0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00, ; 0xED
.db 0x00,0x00,0x00,0x00,0xE0,0x01,0xE0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xEE
.db 0xC0,0x00,0x60,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xEF
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF0
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0xF8,0x01,0xF8,0x01,0x60,0x00,0x60,0x00,0x00,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF1
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0xF8,0x01,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF2
.db 0x00,0x00,0x00,0x00,0x0E,0x00,0x18,0x00,0x0C,0x03,0x98,0x01,0xCE,0x00,0x60,0x00,0xB0,0x06,0xD8,0x06,0xCC,0x07,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF3
.db 0x00,0x00,0xF8,0x07,0x6C,0x03,0x66,0x03,0x66,0x03,0x66,0x03,0x6C,0x03,0x78,0x03,0x60,0x03,0x60,0x03,0x60,0x03,0x60,0x03,0x60,0x03,0x60,0x03,0x00,0x00,0x00,0x00, ; 0xF4
.db 0x00,0x00,0xF8,0x01,0x0C,0x03,0x0C,0x00,0x0C,0x00,0xF8,0x01,0x0C,0x03,0x0C,0x03,0xF8,0x01,0x00,0x03,0x00,0x03,0x0C,0x03,0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF5
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0xFC,0x03,0xFC,0x03,0x00,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF6
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC8,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF7
.db 0xF0,0x00,0xF8,0x01,0x98,0x01,0x98,0x01,0xF8,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF8
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x9C,0x03,0x9C,0x03,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xF9
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xE0,0x00,0xE0,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFA
.db 0x18,0x00,0x1C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFB
.db 0x3C,0x00,0x60,0x00,0x38,0x00,0x60,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFC
.db 0x3C,0x00,0x60,0x00,0x38,0x00,0x0C,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFD
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0xFF

View File

@@ -1,108 +0,0 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine font8x8MonoHandlerFn
;
; Handler for 8x8 Mono Fonts
;
font8x8MonoHandlerFn:
cpi r23, FONT_FN_RENDER
breq font8x8MonoRenderCharacter
rjmp FONT_GenericHandler
; @end
; ---------------------------------------------------------------------------
; @routine font8x8RenderCharacter
; @param R16 character to write
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param Z pointer to font
; @param X pointer to RAM to store data to
; @param r18 char width in pixel
; @param r19 char height in pixel
; @clobbers r17, r24, r25, x
font8x8MonoRenderCharacter:
push zl
push zh
rcall font8x8GetCharPosInFont8x8 ; (r17, r24, r25, z)
ldi r25, 8 ; 8 bytes
font8x8MonoRenderCharacter_loop1:
ldi r24, 8 ; 8 bits
lpm r17, Z+
font8x8MonoRenderCharacter_loop2:
lsr r17
brcs font8x8MonoRenderCharacter_writeForeground
st X+, r0
st X+, r1
rjmp font8x8MonoRenderCharacter_loop2end
font8x8MonoRenderCharacter_writeForeground:
st X+, r2
st X+, r3
font8x8MonoRenderCharacter_loop2end:
dec r24
brne font8x8MonoRenderCharacter_loop2
dec r25
brne font8x8MonoRenderCharacter_loop1
ldi r18, 8
ldi r19, 8
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine font8x8GetCharPosInFont8x8
; @param R16 character to write
; @param Z pointer to font
; @return Z pointer to begin of char data
; @clobbers r17, r24, r25, z
font8x8GetCharPosInFont8x8:
mov r24, r16
adiw zh:zl, FONT_OFFS_FIRSTCHAR
lpm r24, Z+ ; first char num
lpm r25, Z+ ; num of chars
sub r16, r24
brcs font8x8GetCharPosInFont8x8_ret
cp r16, r25
brcc font8x8GetCharPosInFont8x8_ret
mov r24, r16
clr r25
lsl r24 ; x2
rol r25
lsl r24 ; x4
rol r25
lsl r24 ; x8
rol r25
add zl, r24
adc zh, r25
font8x8GetCharPosInFont8x8_ret:
ret
; @end

View File

@@ -7,6 +7,9 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_FONT_MAIN_ASM
#define AQH_AVR_FONT_MAIN_ASM
; *************************************************************************** ; ***************************************************************************
@@ -24,8 +27,8 @@
; @param R3:R2 foreground color ; @param R3:R2 foreground color
; @param Z pointer to font ; @param Z pointer to font
; @param X pointer to RAM to store data to ; @param X pointer to RAM to store data to
; @param r18 char width in pixel ; @return r18 char width in pixel
; @param r19 char height in pixel ; @return r19 char height in pixel
; @clobbers any, !Z ; @clobbers any, !Z
FONT_RenderChar: FONT_RenderChar:
@@ -40,6 +43,7 @@ FONT_RenderChar:
; @routine FONT_GetCharWidth ; @routine FONT_GetCharWidth
; @param Z pointer to font ; @param Z pointer to font
; @param R16 character for which to determine size
; @return R16 character width for given character set ; @return R16 character width for given character set
; @clobbers any, !Z ; @clobbers any, !Z
@@ -65,11 +69,11 @@ FONT_GetCharHeight:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine FONT_GetStringWidth ; @routine FONT_GetStringWidthFlash
; @param Z pointer to font ; @param Z pointer to font
; @param X pointer to null-terminated string in flash ; @param X pointer to null-terminated string in flash
; @return R16 character width for given character set ; @return R17:R16 character width for given character set (in pixel)
; @clobbers any, !Z ; @clobbers any, !Z
FONT_GetStringWidthFlash: FONT_GetStringWidthFlash:
@@ -80,14 +84,14 @@ FONT_GetStringWidthFlash:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine FONT_GetStringHeight ; @routine FONT_GetStringHeightFlash
; @param Z pointer to font ; @param Z pointer to font
; @param X pointer to null-terminated string in flash ; @param X pointer to null-terminated string in flash
; @return R16 character width for given character set ; @return R16 character width for given character set
; @clobbers any, !Z ; @clobbers any, !Z
FONT_GetStringHeight: FONT_GetStringHeightFlash:
ldi r23, FONT_FN_GETSTRINGHEIGHT ldi r23, FONT_FN_GETSTRINGHEIGHT
rjmp fontCallHandler rjmp fontCallHandler
; @end ; @end
@@ -130,38 +134,47 @@ FONT_GenericHandler:
cpi r23, FONT_FN_GETSTRINGHEIGHT cpi r23, FONT_FN_GETSTRINGHEIGHT
breq fontGenericFnGetStringHeight breq fontGenericFnGetStringHeight
ret ret
fontGenericFnGetCharWidth: fontGenericFnGetCharWidth:
adiw zh:zl, FONT_OFFS_WIDTH adiw zh:zl, FONT_OFFS_WIDTH
ld r16, X lpm r16, Z
sbiw zh:zl, FONT_OFFS_WIDTH sbiw zh:zl, FONT_OFFS_WIDTH
ret ret
fontGenericFnGetCharHeight: fontGenericFnGetCharHeight:
adiw zh:zl, FONT_OFFS_HEIGHT adiw zh:zl, FONT_OFFS_HEIGHT
ld r16, X lpm r16, Z
sbiw zh:zl, FONT_OFFS_HEIGHT sbiw zh:zl, FONT_OFFS_HEIGHT
ret ret
fontGenericFnGetStringWidth: fontGenericFnGetStringWidth:
clr r16 ; sum (LOW)
clr r17 ; sum (HIGH)
adiw zh:zl, FONT_OFFS_WIDTH adiw zh:zl, FONT_OFFS_WIDTH
ld r17, X lpm r19, Z
sbiw zh:zl, FONT_OFFS_WIDTH sbiw zh:zl, FONT_OFFS_WIDTH
clr r16
push zl push zl
push zh push zh
mov zl, xl mov zl, xl
mov zh, xh mov zh, xh
fontGenericFnGetStringWidth_loop: fontGenericFnGetStringWidth_loop:
lpm r18, Z+ lpm r18, Z+ ; current byte in string
tst r18 tst r18
breq fontGenericFnGetStringWidth_loopEnd breq fontGenericFnGetStringWidth_loopEnd
add r16, r17 add r16, r19 ; add char width to sum
adc r17, r19
sub r17, r19
rjmp fontGenericFnGetStringWidth_loop rjmp fontGenericFnGetStringWidth_loop
fontGenericFnGetStringWidth_loopEnd: fontGenericFnGetStringWidth_loopEnd:
pop zh pop zh
pop zl pop zl
ret ret
fontGenericFnGetStringHeight: fontGenericFnGetStringHeight:
rjmp fontGenericFnGetCharHeight ; for now monospace fonts only rjmp fontGenericFnGetCharHeight ; for now monospace fonts only
; @end ; @end
#endif ; AQH_AVR_FONT_MAIN_ASM

View File

@@ -0,0 +1,13 @@
<?xml?>
<gwbuild>
<extradist>
defs.asm
main.asm
window.asm
</extradist>
</gwbuild>

View File

@@ -7,28 +7,28 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_GUI_H #ifndef AQH_AVR_GUI_DEFS_ASM
#define AQH_AVR_GUI_H #define AQH_AVR_GUI_DEFS_ASM
.equ SCR_OFFS_HANDLER_LO = 0 .equ WIN_OFFS_HANDLER_LO = 0 ; word address!
.equ SCR_OFFS_HANDLER_HI = 1 .equ WIN_OFFS_HANDLER_HI = 1
.equ SCR_OFFS_X_LO = 2 .equ WIN_OFFS_X_LO = 2
.equ SCR_OFFS_X_HI = 3 .equ WIN_OFFS_X_HI = 3
.equ SCR_OFFS_Y_LO = 4 .equ WIN_OFFS_Y_LO = 4
.equ SCR_OFFS_Y_HI = 5 .equ WIN_OFFS_Y_HI = 5
.equ SCR_OFFS_WIDTH_LO = 6 .equ WIN_OFFS_WIDTH_LO = 6
.equ SCR_OFFS_WIDTH_HI = 7 .equ WIN_OFFS_WIDTH_HI = 7
.equ SCR_OFFS_HEIGHT_LO = 8 .equ WIN_OFFS_HEIGHT_LO = 8
.equ SCR_OFFS_HEIGHT_HI = 9 .equ WIN_OFFS_HEIGHT_HI = 9
.equ SCR_OFFS_BG_COL_LO = 10 .equ WIN_OFFS_BG_COL_LO = 10
.equ SCR_OFFS_BG_COL_HI = 11 .equ WIN_OFFS_BG_COL_HI = 11
.equ SCR_OFFS_FG_COL_LO = 12 .equ WIN_OFFS_FG_COL_LO = 12
.equ SCR_OFFS_FG_COL_HI = 13 .equ WIN_OFFS_FG_COL_HI = 13
.equ SCR_OFFS_FONT_LO = 14 .equ WIN_OFFS_FONT_LO = 14 ;byte address!
.equ SCR_OFFS_FONT_HI = 15 .equ WIN_OFFS_FONT_HI = 15
.equ SCR_SIZE = 16 .equ WIN_SIZE = 16

View File

@@ -0,0 +1,27 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_GUI_MAIN_ASM
#define AQH_AVR_GUI_MAIN_ASM
GUI_Init:
sec
ret
; @end
GUI_Every100ms:
ret
; @end
#endif

View File

@@ -0,0 +1,368 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_GUI_WINDOW_ASM
#define AQH_AVR_GUI_WINDOW_ASM
; ---------------------------------------------------------------------------
; @routine Window_Clear @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
Window_Clear:
ldd r2, Y+WIN_OFFS_BG_COL_LO ; background color low
ldd r3, Y+WIN_OFFS_BG_COL_HI ; background color high
ldd r4, Y+WIN_OFFS_X_LO ; X low
ldd r5, Y+WIN_OFFS_X_HI ; X high
ldd r6, Y+WIN_OFFS_Y_LO ; Y low
ldd r7, Y+WIN_OFFS_Y_HI ; Y high
ldd r8, Y+WIN_OFFS_WIDTH_LO ; width low
ldd r9, Y+WIN_OFFS_WIDTH_HI ; width high
ldd r10, Y+WIN_OFFS_HEIGHT_LO ; height low
ldd r11, Y+WIN_OFFS_HEIGHT_HI ; height high
bigcall Display_FillRect
ret
; @end
; ---------------------------------------------------------------------------
; @routine Window_DrawTextFlash @global
;
; @param Y pointer to screen object in SDRAM
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string
; @return R7:R6 Y pos behind string
; @clobbers any, !Y
Window_DrawTextFlash:
rcall winCalcAbsPosAndBorders ; (R18, R19)
ldd r0, Y+WIN_OFFS_BG_COL_LO
ldd r1, Y+WIN_OFFS_BG_COL_HI
ldd r2, Y+WIN_OFFS_FG_COL_LO
ldd r3, Y+WIN_OFFS_FG_COL_HI
Window_DrawTextFlash_loop:
lpm r16, Z
tst r16
breq Window_DrawTextFlash_loopEnd
rcall winDrawChar
brcc Window_DrawTextFlash_loopEnd
adiw zh:zl, 1 ; next char
rjmp Window_DrawTextFlash_loop
Window_DrawTextFlash_loopEnd:
ret
; @end
; ---------------------------------------------------------------------------
; @routine Window_DrawCharAt @global
;
; @param Y pointer to screen object in SDRAM
; @param R16 char to write
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind char
; @clobbers any, !Y, !R6, !R7
Window_DrawCharAt:
rcall winCalcAbsPosAndBorders
ldd r0, Y+WIN_OFFS_BG_COL_LO
ldd r1, Y+WIN_OFFS_BG_COL_HI
ldd r2, Y+WIN_OFFS_FG_COL_LO
ldd r3, Y+WIN_OFFS_FG_COL_HI
rjmp winDrawChar
; @end
; ---------------------------------------------------------------------------
; @routine winCalcAbsPosAndBorders
;
; @param Y pointer to screen object in SDRAM
; @param R5:R4 X relative to window
; @param R7:R6 Y relative to window
; @return R9:R8 first X pos right of windows
; @return R5:R4 X relative to screen
; @return R7:R6 Y relative to screen
; @return R9:R8 first X pos right of window (abs)
; @return R11:R10 first Y pos below window (abs)
; @clobbers r18, r19
winCalcAbsPosAndBorders:
; calc abs X pos
ldd r18, Y+WIN_OFFS_X_LO
ldd r19, Y+WIN_OFFS_X_HI
add r4, r18 ; add X of window
adc r5, r19
; calc first X pos behind window
ldd r8, Y+WIN_OFFS_WIDTH_LO
ldd r9, Y+WIN_OFFS_WIDTH_HI
add r8, r18
adc r9, r19
; calc abs Y pos
ldd r18, Y+WIN_OFFS_Y_LO
ldd r19, Y+WIN_OFFS_Y_HI
add r6, r18 ; add Y of window
adc r7, r19
; calc first Y pos behind window
ldd r10, Y+WIN_OFFS_HEIGHT_LO
ldd r11, Y+WIN_OFFS_HEIGHT_HI
add r10, r18
adc r11, r19
ret
; @end
; ---------------------------------------------------------------------------
; @routine winDrawChar
;
; @param Y pointer to screen object in SDRAM
; @param R16 char to write
; @param R5:R4 absolute X on screen
; @param R7:R6 absolute Y on screen
; @param R9:R8 first X pos right of windows
; @return R5:R4 X pos behind char
; @clobbers any, !Y, !R6, !R7
winDrawChar:
push zl
push zh
mov r12, r16
ldd zl, Y+WIN_OFFS_FONT_LO
ldd zh, Y+WIN_OFFS_FONT_HI
; check whether the char fits inside window
bigcall FONT_GetCharWidth ; r16=char width
clr r17
add r16, r4 ; char width+X
adc r17, r5
sub r16, r8 ; check against window width
sbc r17, r9
brcc winDrawChar_ret ; not fit, jmp
; actually draw char
mov r16, r12
push r8
push r9
push r10
push r11
bigcall Display_DrawChar
pop r11
pop r10
pop r9
pop r8
clr r16
add r4, r18 ; increment X
adc r5, r16
sec ; write succeeded
winDrawChar_ret:
pop zh
pop zl
ret
; @end
#if 0
; ---------------------------------------------------------------------------
; @routine Window_DrawTextFlash @global
;
; @param Y pointer to screen object in SDRAM
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string
; @return R7:R6 Y pos behind string
; @clobbers any, !Y
Window_DrawTextFlash:
; calc abs X pos
ldd r18, Y+WIN_OFFS_X_LO
ldd r19, Y+WIN_OFFS_X_HI
add r4, r18 ; add X of window
adc r5, r19
; calc first X pos behind window
ldd r8, Y+WIN_OFFS_WIDTH_LO
ldd r9, Y+WIN_OFFS_WIDTH_HI
add r8, r18
adc r9, r19
; calc abs Y pos
ldd r18, Y+WIN_OFFS_Y_LO
ldd r19, Y+WIN_OFFS_Y_HI
add r6, r18 ; add Y of window
adc r7, r19
; calc first Y pos behind window
ldd r10, Y+WIN_OFFS_HEIGHT_LO
ldd r11, Y+WIN_OFFS_HEIGHT_HI
add r10, r18
adc r11, r19
Window_DrawTextFlash_loop:
push zl
push zh
rcall winCalcLengthWordFlash
pop zh
pop zl
mov r18, r4
mov r19, r5
add r18, r12
adc r19, r13
sub r18, r8
sbc r19, r9
brcs Window_DrawTextFlash_xOkay
; we need to go to the beginning of the next line
rcall Window_DrawTextFlash_nextLine
brcc Window_DrawTextFlash_loopEnd ; outside the window, jmp
Window_DrawTextFlash_xOkay:
rcall winDrawWordFlash ; Z points at blank/0 byte after call
lpm r16, Z+
tst r16 ; end of string?
breq Window_DrawTextFlash_loopEnd
cpi r16, 13
breq Window_DrawTextFlash_handle13
; insert other handled chars here
; write blank char
push zl
push zh
ldd zl, Y+WIN_OFFS_FONT_LO
ldd zh, Y+WIN_OFFS_FONT_HI
ldi r16, 32 ; space
bigcall Display_DrawChar
pop zh
pop zl
add r4, r8 ; increment X
adc r5, r9
rjmp Window_DrawTextFlash_loopNext
Window_DrawTextFlash_handle13:
rcall Window_DrawTextFlash_nextLine
Window_DrawTextFlash_loopNext:
rjmp Window_DrawTextFlash_loop
Window_DrawTextFlash_nextLine:
push zl
push zh
ldd zl, Y+WIN_OFFS_FONT_LO
ldd zh, Y+WIN_OFFS_FONT_HI
bigcall FONT_GetCharWidth ; r16=char width
pop zh
pop zl
ldd r4, Y+WIN_OFFS_X_LO ; X=left border
ldd r5, Y+WIN_OFFS_X_HI
clr r17
add r6, r16 ; increment Y by font height
adc r7, r17
mov r16, r6 ; check against lower border of window
mov r17, r7
sub r16, r10
sbc r17, r11 ; CF set if inside window, cleared otherwise
ret
Window_DrawTextFlash_loopEnd:
ret
; @end
; ---------------------------------------------------------------------------
; @routine winDrawWordFlash
;
; @param Y pointer to screen object in SDRAM
; @param Z pointer to string in FLASH
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return r5:r4 next X pos
; @return Z pointer to next char behind current word
; @clobbers any, !Y, !r1-r15
winDrawWordFlash:
winDrawWordFlash_loop:
lpm r16, Z
cpi r16, 33
brcs winDrawWordFlash_ret
push zl
push zh
ldd zl, Y+WIN_OFFS_FONT_LO
ldd zh, Y+WIN_OFFS_FONT_HI
bigcall Display_DrawChar
pop zh
pop zl
clr r16
add r4, r18 ; increment X
adc r5, r16
adiw zh:zl, 1
rjmp winDrawWordFlash_loop
winDrawWordFlash_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine winCalcLengthWordFlash
;
; @param Y pointer to screen object in SDRAM
; @param Z pointer to string in FLASH
; @return r13:r12 width of next word in pixels
; @return Z pointer to next char behind current word
; @clobbers any, !Y, !r1-r11, !r14, !r15
winCalcLengthWordFlash:
clr r12
clr r13
winCalcLengthWordFlash_loop:
lpm r16, Z
cpi r16, 33
brcs winCalcLengthWordFlash_ret
push zl
push zh
ldd zl, Y+WIN_OFFS_FONT_LO
ldd zh, Y+WIN_OFFS_FONT_HI
bigcall FONT_GetCharWidth ; r16=char width
clr r17
add r12, r16
adc r13, r17
pop zh
pop zl
brcs winCalcLengthWordFlash_error
adiw zh:zl, 1 ; next char
rjmp winCalcLengthWordFlash_loop
winCalcLengthWordFlash_error:
ldi r12, 0xff
ldi r13, 0xff
winCalcLengthWordFlash_ret:
ret
; @end
#endif ; if 0
#endif

View File

@@ -3,6 +3,13 @@
<gwbuild> <gwbuild>
<extradist> <extradist>
defs.asm
font12x20.asm
font12x20_1.asm
font6x8.asm
font6x8_1.asm
graphops.asm
io_spi.asm
main.asm main.asm
</extradist> </extradist>

View File

@@ -0,0 +1,16 @@
Display API Implementation for ILI9341 Displays
- Display_FillRect
- Display_BitBlit
- Display_WriteChar
- Display_DrawHLine
- Display_DrawVLine
later
- Display_DrawLine

View File

@@ -0,0 +1,23 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_ILI9341_COLORS_ASM
#define AQH_AVR_ILI9341_COLORS_ASM
; FEDCBA9876543210
; 0bRRRRRGGGGGGBBBBB
#define DISPLAY_COLOR_FROM_RGB(r, g, b) ((r<<11) | (g<<5) | (b & 0x1f))
#endif

View File

@@ -1,3 +1,14 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_ILI9341_DEFS_ASM
#define AQH_AVR_ILI9341_DEFS_ASM
@@ -58,4 +69,5 @@
#endif ; AQH_AVR_ILI9341_DEFS_ASM

View File

@@ -7,6 +7,10 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_ILI9341_FONT12X20_ASM
#define AQH_AVR_ILI9341_FONT12X20_ASM
; *************************************************************************** ; ***************************************************************************
; code ; code
@@ -14,16 +18,15 @@
.cseg .cseg
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine font12x20MonoHandlerFn ; @routine ili9341Font12x20MonoHandlerFn
; ;
; Handler for 12x20 Mono Fonts ; Handler for 12x20 Mono Fonts
; ;
font12x20MonoHandlerFn: ili9341Font12x20MonoHandlerFn:
cpi r23, FONT_FN_RENDER cpi r23, FONT_FN_RENDER
breq font12x20MonoRenderCharacter breq ili9341Font12x20MonoRenderChar
bigjmp FONT_GenericHandler bigjmp FONT_GenericHandler
; @end ; @end
@@ -31,45 +34,49 @@ font12x20MonoHandlerFn:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine font12x20RenderCharacter ; @routine ili9341Font12x20RenderCharacter
; @param R16 character to write ; @param R16 character to write
; @param R1:R0 background color ; @param R1:R0 background color
; @param R3:R2 foreground color ; @param R3:R2 foreground color
; @param Z pointer to font ; @param Z pointer to font
; @param X pointer to RAM to store data to ; @return r18 char width in pixel
; @param r18 char width in pixel ; @return r19 char height in pixel
; @param r19 char height in pixel ; @clobbers r17, r18, r19, r23, r24, r25, x
; @clobbers r17, r18, r23, r24, r25, x
font12x20MonoRenderCharacter: ili9341Font12x20MonoRenderChar:
push zl push zl
push zh push zh
rcall font12x20GetCharPosInFont ; (r17, r24, r25, z) rcall ili9341Font12x20GetCharPosInFont ; (r17, r24, r25, z)
ldi r25, 20 ; 20 bytes height ldi r25, 20 ; 20 bytes height
font12x20MonoRenderCharacter_loop1: ili9341Font12x20MonoRenderChar_loop1:
ldi r24, 12 ; 16 bits ldi r24, 12 ; 16 bits
ldi r23, 8 ldi r23, 8 ; bit counter
lpm r17, Z+ lpm r17, Z+ ; current font byte
font12x20MonoRenderCharacter_loop2: ili9341Font12x20MonoRenderChar_loop2:
dec r23 dec r23
brne font12x20MonoRenderCharacter_haveByte brne ili9341Font12x20MonoRenderChar_haveByte
lpm r17, Z+ lpm r17, Z+
ldi r23, 8 ldi r23, 8
font12x20MonoRenderCharacter_haveByte: ili9341Font12x20MonoRenderChar_haveByte:
lsr r17 lsr r17
brcs font12x20MonoRenderCharacter_writeForeground brcs ili9341Font12x20MonoRenderChar_writeForeground
st X+, r0 mov r18, r0
st X+, r1 mov r19, r1
rjmp font12x20MonoRenderCharacter_loop2end rjmp ili9341Font12x20MonoRenderChar_sendToDisplay
font12x20MonoRenderCharacter_writeForeground: ili9341Font12x20MonoRenderChar_writeForeground:
st X+, r2 mov r18, r2
st X+, r3 mov r19, r3
font12x20MonoRenderCharacter_loop2end: ili9341Font12x20MonoRenderChar_sendToDisplay:
mov r16, r18
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r19
rcall SPIHW_MasterTransfer ; (R16)
ili9341Font12x20MonoRenderChar_loop2end:
dec r24 dec r24
brne font12x20MonoRenderCharacter_loop2 brne ili9341Font12x20MonoRenderChar_loop2
dec r25 dec r25
brne font12x20MonoRenderCharacter_loop1 brne ili9341Font12x20MonoRenderChar_loop1
ldi r18, 12 ldi r18, 12
ldi r19, 20 ldi r19, 20
pop zh pop zh
@@ -80,22 +87,22 @@ font12x20MonoRenderCharacter_loop2end:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine font12x20GetCharPosInFont ; @routine ili9341Font12x20GetCharPosInFont
; @param R16 character to write ; @param R16 character to write
; @param Z pointer to font ; @param Z pointer to font
; @return Z pointer to begin of char data ; @return Z pointer to begin of char data
; @clobbers r17, r24, r25, z ; @clobbers r17, r24, r25, z
font12x20GetCharPosInFont: ili9341Font12x20GetCharPosInFont:
mov r24, r16 mov r24, r16
adiw zh:zl, FONT_OFFS_FIRSTCHAR adiw zh:zl, FONT_OFFS_FIRSTCHAR
lpm r24, Z+ ; first char num lpm r24, Z+ ; first char num
lpm r25, Z+ ; num of chars lpm r25, Z+ ; num of chars
sub r16, r24 sub r16, r24
brcs font12x20GetCharPosInFont_ret brcs ili9341Font12x20GetCharPosInFont_ret
cp r16, r25 cp r16, r25
brcc font12x20GetCharPosInFont_ret brcc ili9341Font12x20GetCharPosInFont_ret
mov r24, r16 mov r24, r16
clr r25 clr r25
@@ -121,9 +128,11 @@ font12x20GetCharPosInFont:
add zl, r24 add zl, r24
adc zh, r25 adc zh, r25
font12x20GetCharPosInFont_ret: ili9341Font12x20GetCharPosInFont_ret:
ret ret
; @end ; @end
#endif ; AQH_AVR_ILI9341_FONT12X20_ASM

View File

@@ -15,6 +15,9 @@
; https://www.mikrocontroller.net/topic/54860 ; https://www.mikrocontroller.net/topic/54860
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_ILI9341_FONT12X20_1_ASM
#define AQH_AVR_ILI9341_FONT12X20_1_ASM
; *************************************************************************** ; ***************************************************************************
@@ -24,9 +27,9 @@
font5_12x20: ili9341Font12x20_1:
; header ; header
.dw font12x20MonoHandlerFn ; handlerFn .dw ili9341Font12x20MonoHandlerFn ; handlerFn
.dw 480 ; needed buffer size .dw 480 ; needed buffer size
.db 12, 20 ; width, height of chars .db 12, 20 ; width, height of chars
.db 32, 224 ; first char, num of chars in font .db 32, 224 ; first char, num of chars in font
@@ -256,3 +259,5 @@ font5_12x20:
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFE .db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0xFE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0xFF .db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0xFF
#endif ; AQH_AVR_ILI9341_FONT12X20_1_ASM

View File

@@ -7,6 +7,11 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_ILI9341_FONT6X8_ASM
#define AQH_AVR_ILI9341_FONT6X8_ASM
; *************************************************************************** ; ***************************************************************************
; code ; code
@@ -16,57 +21,63 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine font6x8MonoHandlerFn ; @routine ili9341Font6x8MonoHandlerFn
; ;
; Handler for 6x8 Mono Fonts ; Handler for 6x8 Mono Fonts
; ;
font6x8MonoHandlerFn: ili9341Font6x8MonoHandlerFn:
cpi r23, FONT_FN_RENDER cpi r23, FONT_FN_RENDER
breq font6x8MonoRenderCharacter breq ili9341Font6x8WriteChar
rjmp FONT_GenericHandler rjmp FONT_GenericHandler
; @end ; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine font6x8RenderCharacter ; @routine ili9341Font6x8WriteChar
; @param R16 character to write ; @param R16 character to write
; @param R1:R0 background color ; @param R1:R0 background color
; @param R3:R2 foreground color ; @param R3:R2 foreground color
; @param Z pointer to font ; @param Z pointer to font
; @param X pointer to RAM to store data to ; @return R18 width of char in pixels
; @param r18 char width in pixel ; @return R19 height of char in pixels
; @param r19 char height in pixel ; @clobbers r16, r17, r18, r19, r22, r23, r24, r25
; @clobbers r16, r17, r24, r25, x
font6x8MonoRenderCharacter: ili9341Font6x8WriteChar:
push zl push zl
push zh push zh
adiw zh:zl, FONT_OFFS_WIDTH adiw zh:zl, FONT_OFFS_WIDTH
lpm r18, Z+ ; char width in pixels lpm r18, Z+ ; char width in pixels
lpm r19, Z ; char height in pixels lpm r19, Z ; char height in pixels
sbiw zh:zl, FONT_OFFS_WIDTH+1 sbiw zh:zl, FONT_OFFS_WIDTH+1
rcall font6x8GetCharPosInFont ; (r16, r17, r24, r25, z) rcall ili9341Font6x8GetCharPosInFont ; (r16, r24, r25, z)
mov r25, r19 ; height in pixels mov r25, r19 ; height in pixels
font6x8MonoRenderCharacter_loop1: ili9341Font6x8WriteChar_loop1:
mov r24, r18 ; width in pixels mov r24, r18 ; width in pixels
lpm r17, Z+ lpm r17, Z+ ; font data
font6x8MonoRenderCharacter_loop2: ili9341Font6x8WriteChar_loop2:
lsr r17 lsr r17
brcs font6x8MonoRenderCharacter_writeForeground brcs ili9341Font6x8WriteChar_writeForeground
st X+, r0 mov r22, r0
st X+, r1 mov r23, r1
rjmp font6x8MonoRenderCharacter_loop2end rjmp ili9341Font6x8WriteChar_sendToDisplay
font6x8MonoRenderCharacter_writeForeground: ili9341Font6x8WriteChar_writeForeground:
st X+, r2 mov r22, r2
st X+, r3 mov r23, r3
font6x8MonoRenderCharacter_loop2end: ili9341Font6x8WriteChar_sendToDisplay:
mov r16, r23
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r22
rcall SPIHW_MasterTransfer ; (R16)
ili9341Font6x8WriteChar_loop2end:
dec r24 dec r24
brne font6x8MonoRenderCharacter_loop2 brne ili9341Font6x8WriteChar_loop2
dec r25 dec r25
brne font6x8MonoRenderCharacter_loop1 brne ili9341Font6x8WriteChar_loop1
ili9341Font6x8WriteChar_end:
pop zh pop zh
pop zl pop zl
ret ret
@@ -75,22 +86,22 @@ font6x8MonoRenderCharacter_loop2end:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine font6x8GetCharPosInFont (same as font8x8GetCharPosInFont!) ; @routine ili9341Font6x8GetCharPosInFont (same as font8x8GetCharPosInFont!)
; @param R16 character to write ; @param R16 character to write
; @param Z pointer to font ; @param Z pointer to font
; @return Z pointer to begin of char data ; @return Z pointer to begin of char data
; @clobbers r16, r17, r24, r25, z ; @clobbers r16, r24, r25, z
font6x8GetCharPosInFont: ili9341Font6x8GetCharPosInFont:
mov r24, r16
adiw zh:zl, FONT_OFFS_FIRSTCHAR adiw zh:zl, FONT_OFFS_FIRSTCHAR
lpm r24, Z+ ; first char num lpm r24, Z+ ; first char num
lpm r25, Z+ ; num of chars lpm r25, Z+ ; num of chars
; Z now points to begin of font data
sub r16, r24 sub r16, r24
brcs font6x8GetCharPosInFont_ret brcs ili9341Font6x8GetCharPosInFont_ret
cp r16, r25 cp r16, r25
brcc font6x8GetCharPosInFont_ret brcc ili9341Font6x8GetCharPosInFont_ret
mov r24, r16 mov r24, r16
clr r25 clr r25
lsl r24 ; x2 lsl r24 ; x2
@@ -101,9 +112,11 @@ font6x8GetCharPosInFont:
rol r25 rol r25
add zl, r24 add zl, r24
adc zh, r25 adc zh, r25
font6x8GetCharPosInFont_ret: ili9341Font6x8GetCharPosInFont_ret:
ret ret
; @end ; @end
#endif ; AQH_AVR_ILI9341_FONT6X8_ASM

View File

@@ -15,6 +15,10 @@
; https://www.mikrocontroller.net/topic/54860 ; https://www.mikrocontroller.net/topic/54860
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_ILI9341_FONT6X8_1_ASM
#define AQH_AVR_ILI9341_FONT6X8_1_ASM
; *************************************************************************** ; ***************************************************************************
@@ -24,9 +28,9 @@
font2_6x8: ili9341Font6x8_1:
; header ; header
.dw font6x8MonoHandlerFn ; handlerFn .dw ili9341Font6x8MonoHandlerFn ; handlerFn
.db 96, 0 ; needed buffer size .db 96, 0 ; needed buffer size
.db 6, 8 ; width, height of chars .db 6, 8 ; width, height of chars
.db 32, 224 ; first char, num of chars in font .db 32, 224 ; first char, num of chars in font
@@ -255,3 +259,7 @@ font2_6x8:
.db 0x06,0x08,0x04,0x0E,0x00,0x00,0x00,0x00, ; 0xFD .db 0x06,0x08,0x04,0x0E,0x00,0x00,0x00,0x00, ; 0xFD
.db 0x00,0x00,0x1E,0x1E,0x1E,0x1E,0x00,0x00, ; 0xFE .db 0x00,0x00,0x1E,0x1E,0x1E,0x1E,0x00,0x00, ; 0xFE
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0xFF .db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 0xFF
#endif ; AQH_AVR_ILI9341_FONT6X8_1_ASM

View File

@@ -7,75 +7,21 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_ILI9341_GRAPHOPS_ASM
#define AQH_AVR_ILI9341_GRAPHOPS_ASM
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ili9341SetAddressWindow ; @routine Display_FillRect @global
; ;
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 W
; @param r11:r10 H
; @clobbers R16, r20, r21
ili9341SetAddressWindow:
; calc XEnd (=X+W-1)
mov r20, r8
mov r21, r9
add r20, r4
adc r21, r5
subi r20, 1
sbci r21, 0
; send column address
ldi r16, ILI9341_CMD_CASET
rcall ili9341SendCommand
; X0
mov r16, r5
rcall ili9341SendData
mov r16, r4
rcall ili9341SendData
; X1
mov r16, r21
rcall ili9341SendData
mov r16, r20
rcall ili9341SendData
; calc YEnd (=Y+H-1)
mov r20, r10
mov r21, r11
add r20, r6
adc r21, r7
subi r20, 1
sbci r21, 0
; send row address
ldi r16, ILI9341_CMD_PASET
rcall ili9341SendCommand
; Y0
mov r16, r7
rcall ili9341SendData
mov r16, r6
rcall ili9341SendData
; Y1
mov r16, r21
rcall ili9341SendData
mov r16, r20
rcall ili9341SendData
ret
; @end
; ---------------------------------------------------------------------------
; @routine ILI9341_FillRect
; @param r3:r2 color ; @param r3:r2 color
; @param r5:r4 X0 ; @param r5:r4 X0
; @param r7:r6 Y0 ; @param r7:r6 Y0
; @param r9:r8 X1/W ; @param r9:r8 X1/W
; @param r11:r10 Y1/H ; @param r11:r10 Y1/H
ILI9341_FillRect: Display_FillRect:
push r15 push r15
in r15, SREG in r15, SREG
cli cli
@@ -87,28 +33,28 @@ ILI9341_FillRect:
mov r19, r3 mov r19, r3
mov r22, r10 ; H low mov r22, r10 ; H low
mov r23, r11 ; H high mov r23, r11 ; H high
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand rcall ili9341SendCommand ; (R16)
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA)
ILI9341_FillRect_loopH: Display_FillRect_loopH:
mov r24, r8 ; W low mov r24, r8 ; W low
mov r25, r9 ; W high mov r25, r9 ; W high
ILI9341_FillRect_loopW: Display_FillRect_loopW:
mov r16, r19 mov r16, r19
rcall SPIHW_MasterTransfer rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18 mov r16, r18
rcall SPIHW_MasterTransfer rcall SPIHW_MasterTransfer ; (R16)
sbiw r25:r24, 1 sbiw r25:r24, 1
brne ILI9341_FillRect_loopW brne Display_FillRect_loopW
mov r24, r22 ; H low mov r24, r22 ; H low
mov r25, r23 ; H high mov r25, r23 ; H high
sbiw r25:r24, 1 ; dec sbiw r25:r24, 1 ; dec
mov r22, r24 ; save in r23:r22 mov r22, r24 ; save in r23:r22
mov r23, r25 mov r23, r25
brne ILI9341_FillRect_loopH brne Display_FillRect_loopH
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high
rcall ili9341EndSpi rcall ili9341EndSpi
out SREG, r15 out SREG, r15
pop r15 pop r15
@@ -118,7 +64,62 @@ ILI9341_FillRect_loopW:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ili9341BitBlit ; @routine Display_DrawChar @global
; @param R16 character to write
; @param R1:R0 background color
; @param R3:R2 foreground color
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @param Z pointer to font
; @return R18 width of char written (in pixel)
; @return R19 height of char written (in pixel)
; @clobbers any, !Z
Display_DrawChar:
push r15
in r15, SREG
cli
push zl
push zh
mov r22, r16 ; save char to R22
adiw zh:zl, FONT_OFFS_WIDTH
lpm r8, Z+ ; char width in pixels
clr r9
lpm r10, Z ; char height in pixels
clr r11
sbiw zh:zl, FONT_OFFS_WIDTH+1
rcall ili9341BeginSpi ; (r16, r17)
rcall ili9341SetAddressWindow ; (R16, R20, R21)
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand ; (R16)
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA)
mov r16, r22 ; char to write
rcall FONT_RenderChar ; (any)
pop zh
pop zl
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high
rcall ili9341EndSpi ; (R16)
out SREG, r15
pop r15
ret
; @end
; ---------------------------------------------------------------------------
; @routine Display_BitBlit @global
; @param r5:r4 X (dest) ; @param r5:r4 X (dest)
; @param r7:r6 Y (dest) ; @param r7:r6 Y (dest)
@@ -127,7 +128,7 @@ ILI9341_FillRect_loopW:
; @param X source data pointer (RAM) ; @param X source data pointer (RAM)
; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21) ; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21)
ili9341BitBlit: Display_BitBlit:
push r15 push r15
in r15, SREG in r15, SREG
cli cli
@@ -138,30 +139,30 @@ ili9341BitBlit:
ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM
rcall ili9341SendCommand rcall ili9341SendCommand
mov r22, r10 mov r22, r10 ; store remaining height
mov r23, r11 mov r23, r11
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA)
ili9341BitBlit_loopH: Display_BitBlit_loopH:
mov r24, r8 mov r24, r8 ; r25:r24=width in pixel
mov r25, r9 mov r25, r9
ili9341BitBlit_loopW: Display_BitBlit_loopW:
ld r18, X+ ld r18, X+ ; read color from X
ld r19, X+ ld r19, X+
mov r16, r19 mov r16, r19
rcall SPIHW_MasterTransfer ; (R16) rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18 mov r16, r18
rcall SPIHW_MasterTransfer ; (R16) rcall SPIHW_MasterTransfer ; (R16)
sbiw r25:r24, 1 sbiw r25:r24, 1
brne ili9341BitBlit_loopW brne Display_BitBlit_loopW
mov r24, r22 mov r24, r22
mov r25, r23 mov r25, r23
sbiw r25:r24, 1 sbiw r25:r24, 1
mov r22, r24 mov r22, r24
mov r23, r25 mov r23, r25
brne ili9341BitBlit_loopH brne Display_BitBlit_loopH
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high
rcall ili9341EndSpi ; (R16) rcall ili9341EndSpi ; (R16)
out SREG, r15 out SREG, r15
pop r15 pop r15
ret ret
@@ -333,4 +334,67 @@ ili9341BitBlitStretchNWriteLine_loop2:
; ---------------------------------------------------------------------------
; @routine ili9341SetAddressWindow
;
; @param r5:r4 X0
; @param r7:r6 Y0
; @param r9:r8 W
; @param r11:r10 H
; @clobbers R16, r20, r21
ili9341SetAddressWindow:
; calc XEnd (=X+W-1)
mov r20, r8
mov r21, r9
add r20, r4
adc r21, r5
subi r20, 1
sbci r21, 0
; send column address
ldi r16, ILI9341_CMD_CASET
rcall ili9341SendCommand ; (R16)
; X0
mov r16, r5
rcall ili9341SendData ; (R16)
mov r16, r4
rcall ili9341SendData ; (R16)
; X1
mov r16, r21
rcall ili9341SendData ; (R16)
mov r16, r20
rcall ili9341SendData ; (R16)
; calc YEnd (=Y+H-1)
mov r20, r10
mov r21, r11
add r20, r6
adc r21, r7
subi r20, 1
sbci r21, 0
; send row address
ldi r16, ILI9341_CMD_PASET
rcall ili9341SendCommand ; (R16)
; Y0
mov r16, r7
rcall ili9341SendData ; (R16)
mov r16, r6
rcall ili9341SendData
; Y1
mov r16, r21
rcall ili9341SendData ; (R16)
mov r16, r20
rcall ili9341SendData ; (R16)
ret
; @end
#endif ; AQH_AVR_ILI9341_GRAPHOPS_ASM

View File

@@ -7,6 +7,11 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_ILI9341_IO_SPI_ASM
#define AQH_AVR_ILI9341_IO_SPI_ASM
; generally we use the following parameters here: ; generally we use the following parameters here:
; @param r1:r0 background color ; @param r1:r0 background color
; @param r3:r2 foreground color ; @param r3:r2 foreground color
@@ -59,7 +64,7 @@ ILI9341IoInit:
ili9341BeginSpi: ili9341BeginSpi:
ldi r16, ILI9341_SPIMODE ldi r16, ILI9341_SPIMODE
ldi r17, ILI9341_DEVICENUM ldi r17, ILI9341_DEVICENUM
rjmp SPIHW_MasterStart ; (R18) rjmp SPIHW_MasterStart ; (R17)
; @end ; @end
@@ -75,17 +80,31 @@ ili9341EndSpi:
; ---------------------------------------------------------------------------
; @routine ili9341SendCommand
;
; @param r16 byte to send
; @return r16 byte received
; @clobbers r16
ili9341SendCommand: ili9341SendCommand:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
cbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D low cbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D low
nop nop
rcall SPIHW_MasterTransfer rcall SPIHW_MasterTransfer ; (none)
sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
ret ret
; @end ; @end
; ---------------------------------------------------------------------------
; @routine ili9341SendData
;
; @param r16 byte to send
; @return r16 byte received
; @clobbers r16
ili9341SendData: ili9341SendData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
@@ -96,7 +115,12 @@ ili9341SendData:
; ---------------------------------------------------------------------------
; @routine ili9341Send16BitData
;
; @param r19:18 data ; @param r19:18 data
; @clobbers r16
ili9341Send16BitData: ili9341Send16BitData:
cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low
sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high
@@ -110,3 +134,5 @@ ili9341Send16BitData:
#endif ; AQH_AVR_ILI9341_IO_SPI_ASM

View File

@@ -7,6 +7,11 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_ILI9341_MAIN_ASM
#define AQH_AVR_ILI9341_MAIN_ASM
; generally we use the following parameters here: ; generally we use the following parameters here:
; @param r1:r0 background color ; @param r1:r0 background color
; @param r3:r2 foreground color ; @param r3:r2 foreground color
@@ -14,6 +19,8 @@
; @param r7:r6 Y0 ; @param r7:r6 Y0
; @param r9:r8 X1/W ; @param r9:r8 X1/W
; @param r11:r10 Y1/H ; @param r11:r10 Y1/H
; @param r13:r12 source data width in bytes (for bit blit, i.e. byte offset from
; one source data line to the next)
; *************************************************************************** ; ***************************************************************************
@@ -65,7 +72,7 @@ ILI9341_Fini:
; Z=byte pointer to command list (as for LPM) ; Z=byte pointer to command list (as for LPM)
ili9341SendCommands: ili9341SendCommands:
rcall ili9341BeginSpi rcall ili9341BeginSpi ; (R16, R17)
ili9341SendCommands_loop1: ili9341SendCommands_loop1:
lpm r16, Z+ ; read command lpm r16, Z+ ; read command
lpm r18, Z+ ; read number of args lpm r18, Z+ ; read number of args
@@ -229,3 +236,6 @@ ili9341InitCommands:
.db 0xff, 0xff .db 0xff, 0xff
#endif ; AQH_AVR_ILI9341_MAIN_ASM

View File

@@ -15,6 +15,7 @@
#if 0
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine ili9341_WriteCharacterX1At ; @routine ili9341_WriteCharacterX1At
@@ -256,4 +257,4 @@ Debug_WriteHexBuffer_loop:
#endif #endif
#endif ; if 0

View File

@@ -7,8 +7,8 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_WIN_H #ifndef AQH_AVR_WIN_DEFS_H
#define AQH_AVR_WIN_H #define AQH_AVR_WIN_DEFS_H
; tree/list data ; tree/list data
@@ -18,12 +18,11 @@
.equ OBJ_OFFS_OBJECT = OBJ_OFFS_TREE+TREE_SIZE .equ OBJ_OFFS_OBJECT = OBJ_OFFS_TREE+TREE_SIZE
.equ OBJ_OFFS_HANDLERFN_LO = OBJ_OFFS_OBJECT .equ OBJ_OFFS_HANDLERFN_LO = OBJ_OFFS_OBJECT
.equ OBJ_OFFS_HANDLERFN_HI = OBJ_OFFS_OBJECT+1 .equ OBJ_OFFS_HANDLERFN_HI = OBJ_OFFS_OBJECT+1
.equ OBJ_OFFS_LINKS_LO = OBJ_OFFS_OBJECT+2 .equ OBJ_OFFS_TARGET_LO = OBJ_OFFS_OBJECT+2
.equ OBJ_OFFS_LINKS_HI = OBJ_OFFS_OBJECT+3 .equ OBJ_OFFS_TARGET_HI = OBJ_OFFS_OBJECT+3
.equ OBJ_OFFS_TIMERS_LO = OBJ_OFFS_OBJECT+4 .equ OBJ_OFFS_IDFORTARGET = OBJ_OFFS_OBJECT+4
.equ OBJ_OFFS_TIMERS_HI = OBJ_OFFS_OBJECT+5 .equ OBJ_OFFS_OPTIONS = OBJ_OFFS_OBJECT+5
.equ OBJ_OFFS_OPTIONS = OBJ_OFFS_OBJECT+6 .equ OBJ_OFFS_SIZE = OBJ_OFFS_OBJECT+6
.equ OBJ_OFFS_SIZE = OBJ_OFFS_OBJECT+7
; widget data ; widget data
.equ WID_OFFS_WIDGET = OBJ_OFFS_SIZE .equ WID_OFFS_WIDGET = OBJ_OFFS_SIZE
@@ -59,6 +58,7 @@
.equ WID_OPTIONS0_BIT_VISIBLE = 0 ; OBJ_OFFS_OPTIONS .equ WID_OPTIONS0_BIT_VISIBLE = 0 ; OBJ_OFFS_OPTIONS
.equ WID_OPTIONS0_BIT_DIRTY = 1 .equ WID_OPTIONS0_BIT_DIRTY = 1
.equ WID_OPTIONS0_BIT_LAYOUT = 2 .equ WID_OPTIONS0_BIT_LAYOUT = 2
.equ WID_OPTIONS0_BIT_DATAINSDRAM = 3 ; text or other data is in SDRAM, not in flash
.equ WID_OPTIONS1_BIT_STRETCH_X = 0 ; WID_OFFS_OPTIONS1 .equ WID_OPTIONS1_BIT_STRETCH_X = 0 ; WID_OFFS_OPTIONS1
.equ WID_OPTIONS1_BIT_STRETCH_Y = 1 .equ WID_OPTIONS1_BIT_STRETCH_Y = 1
@@ -98,21 +98,6 @@
; Links
.equ OBJ_LINK_OFFS_LIST = 0
.equ OBJ_LINK_OFFS_SIGNAL = LIST_SIZE
.equ OBJ_LINK_OFFS_SLOT = LIST_SIZE+1
.equ OBJ_LINK_OFFS_TARGET_LO = LIST_SIZE+2
.equ OBJ_LINK_OFFS_TARGET_HI = LIST_SIZE+3
.equ OBJ_LINK_SIZE = LIST_SIZE+4
; fns:
; - removeLinksTo(Y=win, r19:r18=target)
; - addLink(Y=win, r16=signal, r17=slot, r19:r18=target)
; - removeLinks(Y=win)
.equ TIMER_OFFS_LIST = 0 .equ TIMER_OFFS_LIST = 0
.equ TIMER_OFFS_TIMER = LIST_SIZE .equ TIMER_OFFS_TIMER = LIST_SIZE
.equ TIMER_OFFS_VALUE_LO = TIMER_OFFS_TIMER .equ TIMER_OFFS_VALUE_LO = TIMER_OFFS_TIMER

View File

@@ -7,6 +7,9 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_WIN_OBJECT_H
#define AQH_AVR_WIN_OBJECT_H
.cseg .cseg
@@ -15,20 +18,24 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine OBJ_Init @global ; @routine OBJ_Init @global
; ;
; @param Y pointer to object SRAM ; Generally every object only reports its signals to a single other object
; @param r17 options ; (called the target). However, every object can receive signals from multiple
; @clobbers X ; sender objects. To allow this the target assigns its own id (called idForTarget)
; to the new object in order to determine who sent the signal and to act accordingly.
; There are system signals which don't use idForTarget (like OBJ_SIGNAL_DESTROY).
;
; @param Y pointer to object in SRAM
; @param r18 options
; @clobbers r16, r17, X
OBJ_Init: OBJ_Init:
push r17 mov xl, yl
mov xl, yl mov xh, yh
mov xh, yh clr r16
clr r16 ldi r17, OBJ_OFFS_SIZE
ldi r17, OBJ_OFFS_SIZE bigcall Utils_FillSram ; (R17, X)
bigcall Utils_FillSram ; (R17, X) bigcall Tree_InitObject ; (R16)
bigcall Tree_InitObject ; (R16) std Y+OBJ_OFFS_OPTIONS, r18
pop r17
std Y+OBJ_OFFS_OPTIONS, r17
ldi r16, LOW(OBJ_DefaultHandler) ldi r16, LOW(OBJ_DefaultHandler)
std Y+OBJ_OFFS_HANDLERFN_LO, r16 std Y+OBJ_OFFS_HANDLERFN_LO, r16
ldi r16, HIGH(OBJ_DefaultHandler) ldi r16, HIGH(OBJ_DefaultHandler)
@@ -38,12 +45,28 @@ OBJ_Init:
; ---------------------------------------------------------------------------
; @routine OBJ_SetTarget @global
;
; @param r19 srcIdForTarget
; @param X pointer to target
; @clobbers none
OBJ_SetTarget:
std Y+OBJ_OFFS_TARGET_LO, xl
std Y+OBJ_OFFS_TARGET_HI, xh
std Y+OBJ_OFFS_IDFORTARGET, r19
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine OBJ_SetHandler @global ; @routine OBJ_SetHandler @global
; ;
; @param Y pointer to object SRAM ; @param Y pointer to object SRAM
; @param Z pointer to handler function (word address) ; @param Z pointer to handler function (word address)
; @clobbers X ; @clobbers none
OBJ_SetHandler: OBJ_SetHandler:
std Y+OBJ_OFFS_HANDLERFN_LO, zl std Y+OBJ_OFFS_HANDLERFN_LO, zl
@@ -68,55 +91,20 @@ OBJ_GetHandler:
OBJ_DefaultHandler:
ret
; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine OBJ_free @global ; @routine OBJ_DefaultHandler @global
; ;
; @param Y pointer to object in SRAM ; This is a default signal handler which does nothing.
;
; @param Y pointer to object SRAM
; @param r18 signal
; @param r19 srcIdForTarget
; @param R20 1st param
; @param R21 2nd param
; @param X 3rd param
; @clobbers any ; @clobbers any
OBJ_free: OBJ_DefaultHandler:
; free children
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
OBJ_free_loop:
mov r16, xl
or r16, xh
breq OBJ_free_loopEnd
mov yl, xl
mov yh, xh
rcall Tree_GetNextSibling
push xl ; next
push xh ; next
rcall OBJ_free
pop xh ; next
pop xl ; next
rjmp OBJ_free_loop
OBJ_free_loopEnd:
pop yh
pop yl
rcall Tree_UnlinkObject ; (r16, r17, x)
push yl
push yh
ldi r16, OBJ_SIGNAL_DESTROY
rcall OBJ_Handler
pop yh
pop yl
rcall objFreeLinks
rcall objFreeTimers
mov xl, yl
mov xh, yh
rcall Heap_free
clc clc
ret ret
; @end ; @end
@@ -124,15 +112,62 @@ OBJ_free_loopEnd:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine OBJ_Handler ; @routine OBJ_Fini @global
;
; This routine calls OBJ_Fini on every child object, Then it sends the signal
; OBJ_SIGNAL_DESTROY to this object allowing it to release all its ressources
; (including memory space if using heap or other dynamic ressources).
;
; @param Y pointer to object in SRAM
; @clobbers any, !Y
OBJ_Fini:
; fini children
push yl
push yh
bigcall Tree_GetFirstChildObject ; (none)
OBJ_Fini_loop:
mov r16, xl
or r16, xh
breq OBJ_Fini_loopEnd
mov yl, xl
mov yh, xh
bigcall Tree_GetNextSibling
push xl ; next
push xh ; next
rcall OBJ_Fini
pop xh ; next
pop xl ; next
rjmp OBJ_Fini_loop
OBJ_Fini_loopEnd:
pop yh
pop yl
bigcall Tree_UnlinkObject ; (r16, r17, x)
push yl
push yh
ldi r18, OBJ_SIGNAL_DESTROY
clr r19
rcall OBJ_Handler
pop yh ; probably no longer usable pointer,
pop yl ; especially if using heap!
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_Handler @global
; ;
; Signal handler for an object. A signal can have up to 3 parameters ; Signal handler for an object. A signal can have up to 3 parameters
; conveyed in registers R18, R19 and X. ; conveyed in registers R20, R21 and X.
; ;
; @param Y pointer to object SRAM ; @param Y pointer to object SRAM
; @param r16 signal ; @param r18 signal
; @param R18 1st param ; @param r19 srcIdForTarget
; @param R19 2nd param ; @param R20 1st param
; @param R21 2nd param
; @param X 3rd param ; @param X 3rd param
OBJ_Handler: OBJ_Handler:
@@ -146,22 +181,22 @@ OBJ_Handler:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine OBJ_ForwardSignalToChildren ; @routine OBJ_ForwardSignalToChildren @global
; ;
; Signal handler for an object. A signal can have up to 3 parameters ; Signal handler for an object. A signal can have up to 3 parameters
; conveyed in registers R18, R19 and X. ; conveyed in registers R18, R19 and X.
; ;
; @param Y pointer to object SRAM ; @param Y pointer to object SRAM
; @param r16 signal ; @param r18 signal
; @param R18 1st param ; @param R20 1st param
; @param R19 2nd param ; @param R21 2nd param
; @param X 3rd param ; @param X 3rd param
; @clobbers any, !r16, !r18, !r19, !Y ; @clobbers any, !r18, !r20, !r21, !Y
OBJ_ForwardSignalToChildren: OBJ_ForwardSignalToChildren:
push yl push yl
push yh push yh
rcall Tree_GetFirstChildObject ; (none) bigcall Tree_GetFirstChildObject ; (none)
OBJ_ForwardSignalToChildren_loop: OBJ_ForwardSignalToChildren_loop:
clc clc
mov r17, xl mov r17, xl
@@ -169,21 +204,22 @@ OBJ_ForwardSignalToChildren_loop:
breq OBJ_ForwardSignalToChildren_loopEnd breq OBJ_ForwardSignalToChildren_loopEnd
mov yl, xl mov yl, xl
mov yh, xh mov yh, xh
push r16 push r18
push r18 push r20
push r19 push r21
push xl push xl
push xh push xh
push yl push yl
push yh push yh
clr r19 ; srcId for target set to 0 (this is a direct call to the handler)
rcall OBJ_Handler rcall OBJ_Handler
pop yh pop yh
pop yl pop yl
pop xh pop xh
pop xl pop xl
pop r19 pop r21
pop r18 pop r20
pop r16 pop r18
rcall Tree_GetNextSibling rcall Tree_GetNextSibling
rjmp OBJ_ForwardSignalToChildren_loop rjmp OBJ_ForwardSignalToChildren_loop
OBJ_ForwardSignalToChildren_loopEnd: OBJ_ForwardSignalToChildren_loopEnd:
@@ -195,246 +231,27 @@ OBJ_ForwardSignalToChildren_loopEnd:
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine OBJ_EmitSignal ; @routine OBJ_EmitSignal @global
; ;
; @param Y pointer to object SRAM ; @param Y pointer to object SRAM
; @param r16 signal to emit ; @param r18 signal
; @param R18 1st param ; @param R20 1st param
; @param R19 2nd param ; @param R21 2nd param
; @param X 3rd param ; @param X 3rd param
; @clobbers any, !Y
OBJ_EmitSignal: OBJ_EmitSignal:
push yl push yl
push yh push yh
ldd r17, Y+OBJ_OFFS_LINKS_LO ldd r16, Y+OBJ_OFFS_TARGET_LO
ldd yh, Y+OBJ_OFFS_LINKS_HI ldd r17, Y+OBJ_OFFS_TARGET_HI
mov yl, r17 ldd r19, Y+OBJ_OFFS_IDFORTARGET
OBJ_EmitSignal_loop:
push r16
rcall objCheckEmitSignalForLink ; (any, !X, !Y, !R18, !R19)
pop r16
push xl
push xh
rcall List_GetNextObject ; (none)
mov yl, xl
mov yh, xh
pop xh
pop xl
mov r17, yl
or r17, yh
brne OBJ_EmitSignal_loop
OBJ_EmitSignal_popRet:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_AddLink @global
;
; @param Y pointer to object SRAM
; @param X pointer to link
; @clobbers R16, R17
OBJ_AddLink:
ldd r16, Y+OBJ_OFFS_LINKS_LO
ldd r17, Y+OBJ_OFFS_LINKS_HI
tst r16
brne OBJ_AddLink_addToExisting
tst r17
brne OBJ_AddLink_addToExisting
; empty list, new link is first
std Y+OBJ_OFFS_LINKS_LO, xl
std Y+OBJ_OFFS_LINKS_HI, xh
rjmp OBJ_AddLink_end
OBJ_AddLink_addToExisting:
push xl
push xh
push yl
push yh
mov yl, xl
mov yh, xh
mov xl, r16
mov xh, r17
rcall List_AddObject ; (r16, r17, x)
pop yh
pop yl
pop xh
pop xl
OBJ_AddLink_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_RemoveLink @global
;
; @param Y pointer to object SRAM
; @param X pointer to link
; @clobbers R16, R17
OBJ_RemoveLink:
ldd r16, Y+OBJ_OFFS_LINKS_LO
ldd r17, Y+OBJ_OFFS_LINKS_HI
cp r16, xl
brne OBJ_RemoveLink_notFirst
cp r17, xh
brne OBJ_RemoveLink_notFirst
clr r16
std Y+OBJ_OFFS_LINKS_LO, r16
std Y+OBJ_OFFS_LINKS_HI, r16
rjmp OBJ_RemoveLink_end
OBJ_RemoveLink_notFirst:
push xl
push xh
push yl
push yh
mov yl, xl
mov yh, r17
mov xl, r16
mov xh, r17
rcall List_UnlinkObject ; (r16, r17, x)
pop yh
pop yl
pop xh
pop xl
OBJ_RemoveLink_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_AddTimer @global
;
; @param Y pointer to object SRAM
; @param X pointer to timer
; @clobbers R16, R17
OBJ_AddTimer:
ldd r16, Y+OBJ_OFFS_TIMERS_LO
ldd r17, Y+OBJ_OFFS_TIMERS_HI
tst r16
brne OBJ_AddTimer_addToExisting
tst r17
brne OBJ_AddTimer_addToExisting
; empty list, new timer is first
std Y+OBJ_OFFS_TIMERS_LO, xl
std Y+OBJ_OFFS_TIMERS_HI, xh
rjmp OBJ_AddTimer_end
OBJ_AddTimer_addToExisting:
push xl
push xh
push yl
push yh
mov yl, xl
mov yh, xh
mov xl, r16
mov xh, r17
rcall List_AddObject ; (r16, r17, x)
pop yh
pop yl
pop xh
pop xl
OBJ_AddTimer_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_RemoveTimer @global
;
; @param Y pointer to object SRAM
; @param X pointer to timer
; @clobbers R16, R17
OBJ_RemoveTimer:
ldd r16, Y+OBJ_OFFS_TIMERS_LO
ldd r17, Y+OBJ_OFFS_TIMERS_HI
cp r16, xl
brne OBJ_RemoveTimer_notFirst
cp r17, xh
brne OBJ_RemoveTimer_notFirst
clr r16
std Y+OBJ_OFFS_TIMERS_LO, r16
std Y+OBJ_OFFS_TIMERS_HI, r16
rjmp OBJ_RemoveTimer_end
OBJ_RemoveTimer_notFirst:
push xl
push xh
push yl
push yh
mov yl, xl
mov yh, r17
mov xl, r16
mov xh, r17
rcall List_UnlinkObject ; (r16, r17, x)
pop yh
pop yl
pop xh
pop xl
OBJ_RemoveTimer_end:
ret
; @end
; ---------------------------------------------------------------------------
; @param r16 signal
; @param Y link
; @clobbers any, !X, !Y, !R18, !R19
objCheckEmitSignalForLink:
ldd r17, Y+OBJ_LINK_OFFS_SIGNAL
cp r16, r17
brne objCheckEmitSignalForLink_ret
push yl
push yh
push xl
push xh
push r18
push r19
ldd r16, Y+OBJ_LINK_OFFS_SLOT
ldd r17, Y+OBJ_LINK_OFFS_TARGET_LO
ldd yh, Y+OBJ_LINK_OFFS_TARGET_HI
mov yl, r17
rcall OBJ_Handler
pop r19
pop r18
pop xh
pop xl
pop yh
pop yl
objCheckEmitSignalForLink_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine objFreeLinks
;
; @clobbers r16, r17, r18, r19, r24, r25, X
objFreeLinks:
push yl
push yh
ldd r16, Y+OBJ_OFFS_LINKS_LO
ldd r17, Y+OBJ_OFFS_LINKS_HI
clr r18
std Y+OBJ_OFFS_LINKS_LO, r18
std Y+OBJ_OFFS_LINKS_HI, r18
mov yl, r16 mov yl, r16
mov yh, r17 mov yh, r17
ldi zl, LOW(Obj_Link_free) or r16, r17
ldi zh, HIGH(Obj_Link_free) breq OBJ_EmitSignal_end
rcall List_ForEveryObject ; (r16, r17, r18, r19, r24, r25, X, Y) rcall OBJ_Handler
OBJ_EmitSignal_end:
pop yh pop yh
pop yl pop yl
ret ret
@@ -442,115 +259,5 @@ objFreeLinks:
; --------------------------------------------------------------------------- #endif ; AQH_AVR_WIN_OBJECT_H
; @routine objFreeTimers
;
; @clobbers r16, r17, r18, r19, r24, r25, X
objFreeTimers:
push yl
push yh
ldd r16, Y+OBJ_OFFS_TIMERS_LO
ldd r17, Y+OBJ_OFFS_TIMERS_HI
clr r18
std Y+OBJ_OFFS_TIMERS_LO, r18
std Y+OBJ_OFFS_TIMERS_HI, r18
mov yl, r16
mov yh, r17
ldi zl, LOW(Obj_Timer_free)
ldi zh, HIGH(Obj_Timer_free)
rcall List_ForEveryObject ; (r16, r17, r18, r19, r24, r25, X, Y)
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_Link_new @global
;
; @return CF set if okay, cleared on error
; @return Y pointer to SRAM for link
; @clobbers r16, r17, X
OBJ_Link_new:
ldi r24, LOW(OBJ_LINK_SIZE)
ldi r25, HIGH(OBJ_LINK_SIZE)
bigcall Heap_Alloc
brcc OBJ_Link_new_end
mov yl, xl
mov yh, xh
clr r16
ldi r17, OBJ_LINK_SIZE
bigcall Utils_FillSram ; (R17, X)
rcall List_InitObject ; (R16)
sec
OBJ_Link_new_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_Link_free @global
;
; @param Y pointer to SRAM for link
; @clobbers r16, r17, r24, r25, X
OBJ_Link_free:
rcall List_FiniObject ; (R16)
mov xl, yl
mov xh, yh
rcall Heap_free ; (r16, r17, r24, r25, X)
clc
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_Timer_new @global
;
; @return CF set if okay, cleared on error
; @return Y pointer to SRAM for timer
; @clobbers r16, r17, X
OBJ_Timer_new:
ldi r24, LOW(TIMER_SIZE)
ldi r25, HIGH(TIMER_SIZE)
bigcall Heap_Alloc
brcc OBJ_Timer_new_end
mov yl, xl
mov yh, xh
clr r16
ldi r17, TIMER_SIZE
bigcall Utils_FillSram ; (R17, X)
rcall List_InitObject ; (R16)
sec
OBJ_Timer_new_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine OBJ_Timer_free @global
;
; @param Y pointer to SRAM for timer
; @clobbers r16, r17, r24, r25, X
OBJ_Timer_free:
rcall List_FiniObject ; (R16)
mov xl, yl
mov xh, yh
bigcall Heap_free ; (r16, r17, r24, r25, X)
clc
ret
; @end

View File

@@ -0,0 +1,770 @@
; ***************************************************************************
; copyright : (C) 2025 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
; ***************************************************************************
; defs
.equ WID_WIDGET_INTER_BORDER = 2
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine WID_Widget_new @global
;
; @param Y pointer to window SRAM
; @param X pointer to parent
; @param r18 WID_OFFS_OPTIONS1
; @param r19 WID_OFFS_OPTIONS2
WID_Widget_Init:
push r18
push r19
push xl
push xh
ldi zl, LOW(WID_Widget_Handler)
ldi zh, HIGH(WID_Widget_Handler)
clr r17
rcall OBJ_Init
pop xh
pop xl
pop r19
pop r18
std Y+WID_OFFS_OPTIONS1, r18
std Y+WID_OFFS_OPTIONS2, r19
mov r16, xl
or r16, xh
breq WID_Widget_noParent
; copy defaults from parent
adiw xh:xl, WID_OFFS_BG_COL_LO
ld r16, X+ ; WID_OFFS_BG_COL_LO
std Y+WID_OFFS_BG_COL_LO, r16
ld r16, X+ ; WID_OFFS_BG_COL_HI
std Y+WID_OFFS_BG_COL_HI, r16
ld r16, X+ ; WID_OFFS_FG_COL_LO
std Y+WID_OFFS_FG_COL_LO, r16
ld r16, X+ ; WID_OFFS_FG_COL_HI
std Y+WID_OFFS_FG_COL_HI, r16
ld r16, X+ ; WID_OFFS_FONT_LO
std Y+WID_OFFS_FONT_LO, r16
ld r16, X+ ; WID_OFFS_FONT_HI
std Y+WID_OFFS_FONT_HI, r16
rjmp WID_Widget_end
WID_Widget_noParent: ; preset without parent
clr r16
std Y+WID_OFFS_FONT_LO, r16
std Y+WID_OFFS_FONT_HI, r16
std Y+WID_OFFS_FG_COL_LO, r16 ; foreground black
std Y+WID_OFFS_FG_COL_HI, r16
dec r16
std Y+WID_OFFS_BG_COL_LO, r16 ; background white
std Y+WID_OFFS_BG_COL_HI, r16
ldi r16, 2 ; default borders
std Y+WID_OFFS_BORDER_TOP, r16
std Y+WID_OFFS_BORDER_BOT, r16
std Y+WID_OFFS_BORDER_LEFT, r16
std Y+WID_OFFS_BORDER_RIGHT, r16
WID_Widget_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine WID_Widget_Handler
;
; Signal handler for an object. A signal can have up to 3 parameters
; conveyed in registers R18, R19 and X.
;
; @param Y pointer to object SRAM
; @param r16 signal
; @param R18 1st param
; @param R19 2nd param
; @param X 3rd param
; @clobbers any, !Y
WID_Widget_Handler:
cpi r16, WID_SIGNAL_GETMINWIDTH
breq WID_Widget_Handler_getMinWidth
cpi r16, WID_SIGNAL_GETMINHEIGHT
breq WID_Widget_Handler_getMinHeight
cpi r16, WID_SIGNAL_LAYOUT
breq WID_Widget_Handler_layout
cpi r16, WID_SIGNAL_DRAW
breq WID_Widget_Handler_draw
; for now just forward signal to all children
WID_Widget_Handler_forward:
rcall OBJ_ForwardSignalToChildren
ret
WID_Widget_Handler_getMinWidth:
rjmp widgetGetMinWidth
WID_Widget_Handler_getMinHeight:
rjmp widgetGetMinHeight
WID_Widget_Handler_layout:
rjmp widgetLayout
WID_Widget_Handler_draw:
rjmp wDraw
; @end
wDraw:
ldd r16, Y+OBJ_OFFS_OPTIONS
sbrs r16, WID_OPTIONS0_BIT_VISIBLE ; only draw visible widgets
rjmp wDraw_ret
cbr r16, (1<<WID_OPTIONS0_BIT_DIRTY)
std Y+OBJ_OFFS_OPTIONS, r16
; fill window background
ldd r2, Y+WID_OFFS_BG_COL_LO
ldd r3, Y+WID_OFFS_BG_COL_HI
ldd r4, Y+WID_OFFS_ABS_X_LO
ldd r5, Y+WID_OFFS_ABS_X_HI
ldd r6, Y+WID_OFFS_ABS_Y_LO
ldd r7, Y+WID_OFFS_ABS_Y_HI
ldd r8, Y+WID_OFFS_WIDTH_LO
ldd r9, Y+WID_OFFS_WIDTH_HI
ldd r10, Y+WID_OFFS_HEIGHT_LO
ldd r11, Y+WID_OFFS_HEIGHT_HI
bigcall ILI9341_FillRect
wDraw_ret:
ret
; @end
widgetLayout:
rjmp wVLayout
wVLayout:
rcall wSetChildrenWidthsFromMinWidths
rcall wSetChildrenHeightsFromMinHeights
; count number of expandable children
ldi r16, (1<<WID_OPTIONS1_BIT_STRETCH_Y) ; value
ldi r17, (1<<WID_OPTIONS1_BIT_STRETCH_Y) ; mask
rcall widgetCountVisibleChildrenWithOptions1 ; r18=number of matching visible children (r24, r25, X)
tst r18
breq wVLayout_Ydone ; no expandable children, nothing to distribute
; determine full height needed by all children
push r18 ; number of visible expandable child widgets
clr r17 ; mask=0 -> count all visible children
rcall wGetSumOfMatchingVisibleChildrenHeights ; r19:r18=sum of all children heights
pop r22
clr r23 ; r23:r22=number of visible expandable children
; calculate number of bytes to add to each expandable child widget
ldd r20, Y+WID_OFFS_HEIGHT_LO ; total height
ldd r21, Y+WID_OFFS_HEIGHT_HI
clr r16
ldd r17, Y+WID_OFFS_BORDER_TOP ; subtract top border
sub r20, r17
sbc r21, r16
brcs wVLayout_heightTooSmall ; jmp if too small
ldd r17, Y+WID_OFFS_BORDER_BOT ; subtract bottom border
sub r20, r17
sbc r21, r16
brcs wVLayout_heightTooSmall ; jmp if too small
sub r20, r18 ; r21:r20 = HEIGHT-SUM_OF_VIS_CHILDREN_HEIGHTS
sbc r21, r19
brcc wVLayout_heightTooSmall
breq wVLayout_yDone ; nothing to distribute
bigcall Utils_Divu16_16_16 ; r17:r16 = r21:r20 / r23:r22
; add additional pixel to heights of expandable child widgets
rcall wAddToHeightsOfExpandableVisibleChildren
wVLayout_yDone:
rcall wSetRelYFromHeightInVisibleChildren
rcall wAlignChildrenHorizontally
; rcall wSetAbsoluteCoords call in GUI loop after calling layout on all widgets
wVLayout_heightTooSmall:
; TODO: how to handle this case?
ret
; @end
wSetAbsoluteCoords:
push yl
push yh
wSetAbsoluteCoords_loop:
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wSetAbsoluteCoords_nextSibling
push yl
push yh
bigcall Tree_GetParentObject
clr r18
clr r19
clr r20
clr r21
mov r17, xl
or r17, xh
breq wSetAbsoluteCoords_r1820set
mov yl, xl
mov yh, xh
ldd r18, Y+WID_OFFS_ABS_X_LO
ldd r19, Y+WID_OFFS_ABS_X_HI
ldd r20, Y+WID_OFFS_ABS_Y_LO
ldd r21, Y+WID_OFFS_ABS_Y_HI
wSetAbsoluteCoords_r1820set:
pop yh
pop yl
; handle X
ldd r16, Y+WID_OFFS_REL_X_LO
ldd r17, Y+WID_OFFS_REL_X_HI
add r16, r18
adc r17, r19
std Y+WID_OFFS_ABS_X_LO, r16
std Y+WID_OFFS_ABS_X_HI, r17
; handle Y
ldd r16, Y+WID_OFFS_REL_Y_LO
ldd r17, Y+WID_OFFS_REL_Y_HI
add r16, r20
adc r17, r21
std Y+WID_OFFS_ABS_Y_LO, r16
std Y+WID_OFFS_ABS_Y_HI, r17
bigcall Tree_GetObjectBelow
rjmp wSetAbsoluteCoords_loopEnd
wSetAbsoluteCoords_nextSibling:
bigcall Tree_GetNextSibling
wSetAbsoluteCoords_loopEnd:
mov r17, xl
or r17, xh
breq wSetAbsoluteCoords_end
mov yl, xl
mov yh, xh
rjmp wSetAbsoluteCoords_loop
wSetAbsoluteCoords_end:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wAlignChildrenHorizontally
;
; Horizontally align children within the width of the parent widget.
; Only changes Y+WID_OFFS_REL_X_LO/HI.
;
; @param Y pointer to object SRAM
; @clobbers r16, r17, r18, r19, r24, r25
wAlignChildrenHorizontally:
push yl
push yh
ldd r24, Y+WID_OFFS_WIDTH_LO ; parent width
ldd r25, Y+WID_OFFS_WIDTH_HI
ldd r19, Y+WID_OFFS_BORDER_LEFT ; subtract left border
mov r16, r19
clr r17
sub r24, r16
sbc r25, r17
ldd r16, Y+WID_OFFS_BORDER_RIGHT ; subtract right border
sub r24, r16
sbc r25, r17 ; r25:r24=parent width minus lateral borders, r19=left border
rcall Tree_GetFirstChildObject ; (none)
wAlignChildrenHorizontally_loop:
mov r17, xl
or r17, xh
breq wAlignChildrenHorizontally_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wAlignChildrenHorizontally_loopNext
push r24
push r25
push r19
rcall wAlignHorizontally
pop r19
add r24, r19
adc r25, r19
sub r25, r19
std Y+WID_OFFS_REL_X_LO, r24
std Y+WID_OFFS_REL_X_HI, r25
pop r25
pop r24
wAlignChildrenHorizontally_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp wAlignChildrenHorizontally_loop
wAlignChildrenHorizontally_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wAlignHorizontally
;
; @param r25:r24 parent width minus lateral borders
; @return r25:r24 proposed X position relative to parent
; @clobbers r16, r17
wAlignHorizontally:
ldd r16, Y+WID_OFFS_OPTIONS1
sbrc r16, WID_OPTIONS1_BIT_STRETCH_X
rjmp wAlignHorizontally_stretch
andi r16, (WID_OPTIONS1_BIT_HALIGN0 | WID_OPTIONS1_BIT_HALIGN1)
cpi r16, (0<<WID_OPTIONS1_BIT_HALIGN1) | (0<<WID_OPTIONS1_BIT_HALIGN0)
breq wAlignHorizontally_left
cpi r16, (0<<WID_OPTIONS1_BIT_HALIGN1) | (1<<WID_OPTIONS1_BIT_HALIGN0)
breq wAlignHorizontally_right
wAlignHorizontally_center:
ldd r16, Y+WID_OFFS_WIDTH_LO
ldd r17, Y+WID_OFFS_WIDTH_HI
sub r24, r16
sbc r25, r17
lsr r25
ror r24
ret
wAlignHorizontally_left:
clr r24
clr r25
ret
wAlignHorizontally_right:
ldd r16, Y+WID_OFFS_WIDTH_LO
ldd r17, Y+WID_OFFS_WIDTH_HI
sub r24, r16
sbc r25, r17
wAlignHorizontally_stretch:
ret
; @end
; ---------------------------------------------------------------------------
; @routine wSetRelYFromHeightInVisibleChildren
;
; @param Y pointer to object SRAM
; @clobbers r17, r18, r19, r24, r25, X
wSetRelYFromHeightInVisibleChildren:
push yl
push yh
ldd r24, Y+WID_OFFS_BORDER_TOP
clr r25
rcall Tree_GetFirstChildObject ; (none)
wSetRelYFromHeightInVisibleChildren_loop:
mov r17, xl
or r17, xh
breq wSetRelYFromHeightInVisibleChildren_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wSetRelYFromHeightInVisibleChildren_loopNext
std Y+WID_OFFS_REL_Y_LO, r24
std Y+WID_OFFS_REL_Y_HI, r25
ldd r18, Y+WID_OFFS_WIDTH_LO
ldd r19, Y+WID_OFFS_WIDTH_HI
add r24, r18 ; TODO: handle carry later
adc r25, r19
adiw r25:r24, WID_WIDGET_INTER_BORDER
wSetRelYFromHeightInVisibleChildren_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp wSetRelYFromHeightInVisibleChildren_loop
wSetRelYFromHeightInVisibleChildren_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine widgetGetMinWidth
;
; @return r19:r18 minimum width of widget
; @clobbers any, !Y
widgetGetMinWidth:
ldi r16, WID_SIGNAL_GETMINWIDTH
rjmp widgetGetLargestChildMinSize
; @end
; ---------------------------------------------------------------------------
; @routine widgetGetMinHeight
;
; @return r19:r18 minimum height of widget
; @clobbers any, !Y
widgetGetMinHeight:
ldi r16, WID_SIGNAL_GETMINHEIGHT
rjmp widgetSumOfChildrenMinSize
; @end
; ---------------------------------------------------------------------------
; @routine widgetSumOfChildrenMinSize
;
; @param r16 signal to send (WID_SIGNAL_GETMINWIDTH, WID_SIGNAL_GETMINHEIGHT)
; @return r19:r18 minimum width or height of widget
; @clobbers any, !Y
widgetSumOfChildrenMinSize:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
clr r25
widgetSumOfChildrenMinSize_loop:
mov r17, xl
or r17, xh
breq widgetSumOfChildrenMinSize_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq widgetSumOfChildrenMinSize_loopNext
push r16
push r24
push r25
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
pop r25
pop r24
pop r16
add r24, r18 ; TODO: handle carry later
adc r25, r19
adiw r25:r24, WID_WIDGET_INTER_BORDER
widgetSumOfChildrenMinSize_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp widgetSumOfChildrenMinSize_loop
widgetSumOfChildrenMinSize_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine widgetGetLargestChildMinSize
;
; @param r16 signal to send (WID_SIGNAL_GETMINWIDTH, WID_SIGNAL_GETMINHEIGHT)
; @return r19:r18 minimum width or height of widget
; @clobbers any, !Y
widgetGetLargestChildMinSize:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
clr r25
widgetGetLargestChildMinSize_loop:
mov r17, xl
or r17, xh
breq widgetGetLargestChildMinSize_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq widgetGetLargestChildMinSize_loopNext
push r16
push r24
push r25
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
pop r25
pop r24
pop r16
sub r24, r18
sbc r25, r19
add r24, r18
adc r25, r19
brcc widgetGetLargestChildMinSize_loopNext
mov r24, r18
mov r25, r19
widgetGetLargestChildMinSize_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp widgetGetLargestChildMinSize_loop
widgetGetLargestChildMinSize_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine widgetCountVisibleChildrenWithOptions1
;
; Count visible direct children with a matching WID_OFFS_OPTIONS1 field.
;
; @param r16 option1 value combination wanted
; @param r17 option1 mask of bits to match
; @return r18 number of matching direct children
; @clobbers r18, r24, r25, X
widgetCountVisibleChildrenWithOptions1:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
widgetCountVisibleChildrenWithOptions1_loop:
mov r25, xl
or r25, xh
breq widgetCountVisibleChildrenWithOptions1_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq widgetCountVisibleChildrenWithOptions1_next
ldd r18, Y+WID_OFFS_OPTIONS1
eor r18, r17
and r18, r16
brne widgetCountVisibleChildrenWithOptions1_next
inc r24
widgetCountVisibleChildrenWithOptions1_next:
rcall Tree_GetNextSibling ; (none)
rjmp widgetSumOfChildrenMinSize_loop
widgetCountVisibleChildrenWithOptions1_loopEnd:
mov r18, r24
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wGetSumOfMatchingVisibleChildrenHeights
;
; Add heights of all matching visible children.
;
; @param r16 option1 value combination wanted
; @param r17 option1 mask of bits to match
; @return r19:r18 sum of widths of all visible direct children
; @clobbers r24, r25, X
wGetSumOfMatchingVisibleChildrenHeights:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
clr r25
wGetSumOfMatchingVisibleChildrenHeights_loop:
mov r18, xl
or r18, xh
breq wGetSumOfMatchingVisibleChildrenHeights_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wGetSumOfMatchingVisibleChildrenHeights_next
ldd r18, Y+WID_OFFS_OPTIONS1
eor r18, r17
and r18, r16
brne wGetSumOfMatchingVisibleChildrenHeights_next
ldd r18, Y+WID_OFFS_HEIGHT_LO
ldd r19, Y+WID_OFFS_HEIGHT_HI
add r24, r18
adc r25, r19
wGetSumOfMatchingVisibleChildrenHeights_next:
rcall Tree_GetNextSibling ; (none)
rjmp wGetSumOfMatchingVisibleChildrenHeights_loop
wGetSumOfMatchingVisibleChildrenHeights_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wAddToWidthsOfExpandableVisibleChildren
;
; @param Y = pointer to widget data in SRAM
; @param r17:r16 number to add to the widths of all visible X-expandable children
; @clobbers r18, r19, X
wAddToWidthsOfExpandableVisibleChildren:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
wAddToWidthsOfExpandableVisibleChildren_loop:
mov r18, xl
or r18, xh
breq wAddToWidthsOfExpandableVisibleChildren_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wAddToWidthsOfExpandableVisibleChildren_next
ldd r18, Y+WID_OFFS_OPTIONS1
andi r18, WID_OPTIONS1_BIT_STRETCH_X
breq wAddToWidthsOfExpandableVisibleChildren_next
ldd r18, Y+WID_OFFS_WIDTH_LO
ldd r19, Y+WID_OFFS_WIDTH_HI
add r18, r16
adc r19, r17
std Y+WID_OFFS_WIDTH_LO, r18
std Y+WID_OFFS_WIDTH_HI, r19
wAddToWidthsOfExpandableVisibleChildren_next:
rcall Tree_GetNextSibling ; (none)
rjmp wAddToWidthsOfExpandableVisibleChildren_loop
wAddToWidthsOfExpandableVisibleChildren_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wAddToHeightsOfExpandableVisibleChildren
;
; @param Y = pointer to widget data in SRAM
; @param r17:r16 number to add to the heights of all visible Y-expandable children
; @clobbers r18, r19, X
wAddToHeightsOfExpandableVisibleChildren:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
wAddToHeightsOfExpandableVisibleChildren_loop:
mov r18, xl
or r18, xh
breq wAddToHeightsOfExpandableVisibleChildren_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wAddToHeightsOfExpandableVisibleChildren_next
ldd r18, Y+WID_OFFS_OPTIONS1
andi r18, WID_OPTIONS1_BIT_STRETCH_Y
breq wAddToHeightsOfExpandableVisibleChildren_next
ldd r18, Y+WID_OFFS_HEIGHT_LO
ldd r19, Y+WID_OFFS_HEIGHT_HI
add r18, r16
adc r19, r17
std Y+WID_OFFS_HEIGHT_LO, r18
std Y+WID_OFFS_HEIGHT_HI, r19
wAddToHeightsOfExpandableVisibleChildren_next:
rcall Tree_GetNextSibling ; (none)
rjmp wAddToHeightsOfExpandableVisibleChildren_loop
wAddToHeightsOfExpandableVisibleChildren_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wSetChildrenWidthsFromMinWidths
;
; @clobbers any, !Y
wSetChildrenWidthsFromMinWidths:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
wSetChildrenWidthsFromMinWidths_loop:
mov r17, xl
or r17, xh
breq wSetChildrenWidthsFromMinWidths_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
sbrs r18, WID_OPTIONS0_BIT_VISIBLE
rjmp wSetChildrenWidthsFromMinWidths_loopNext ; jump if not visible
sbrc r18, WID_OPTIONS1_BIT_FIXED_WIDTH
rjmp wSetChildrenWidthsFromMinWidths_loopNext ; jump if fixed width
ldi r16, WID_SIGNAL_GETMINWIDTH
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
std Y+WID_OFFS_WIDTH_LO, r18
std Y+WID_OFFS_WIDTH_HI, r19
wSetChildrenWidthsFromMinWidths_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp wSetChildrenWidthsFromMinWidths_loop
wSetChildrenWidthsFromMinWidths_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wSetChildrenHeightsFromMinHeights
;
; @clobbers any, !Y
wSetChildrenHeightsFromMinHeights:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
wSetChildrenHeightsFromMinHeights_loop:
mov r17, xl
or r17, xh
breq wSetChildrenHeightsFromMinHeights_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
sbrs r18, WID_OPTIONS0_BIT_VISIBLE
rjmp wSetChildrenHeightsFromMinHeights_loopNext ; jump if not visible
sbrc r18, WID_OPTIONS1_BIT_FIXED_HEIGHT
rjmp wSetChildrenHeightsFromMinHeights_loopNext ; jump if fixed height
ldi r16, WID_SIGNAL_GETMINHEIGHT
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
std Y+WID_OFFS_HEIGHT_LO, r18
std Y+WID_OFFS_HEIGHT_HI, r19
wSetChildrenHeightsFromMinHeights_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp wSetChildrenHeightsFromMinHeights_loop
wSetChildrenHeightsFromMinHeights_loopEnd:
pop yh
pop yl
ret
; @end

View File

@@ -7,12 +7,14 @@
; * Please see toplevel file COPYING of that project for license details. * ; * Please see toplevel file COPYING of that project for license details. *
; *************************************************************************** ; ***************************************************************************
#ifndef AQH_AVR_WIN_WIDGET_H
#define AQH_AVR_WIN_WIDGET_H
; *************************************************************************** ; ***************************************************************************
; defs ; defs
.equ WID_WIDGET_INTER_BORDER = 2
; *************************************************************************** ; ***************************************************************************
@@ -23,31 +25,41 @@
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine WID_Widget_new @global ; @routine Widget_Init @global
; ;
; @param Y pointer to window SRAM ; @param Y pointer to window SRAM
; @param X pointer to parent ; @param X pointer to parent
; @param r18 WID_OFFS_OPTIONS1 ; @param r18 OBJ options
; @param r19 WID_OFFS_OPTIONS2 ; @param r19 WID_OFFS_OPTIONS1
; @param r20 WID_OFFS_OPTIONS2
; @clobbers r16, r17, X, Z
WID_Widget_Init: Widget_Init:
push r18 push r19
push r19 push r20
push xl push xl
push xh push xh
ldi zl, LOW(WID_Widget_Handler) ldi zl, LOW(Widget_Handler) ; handler
ldi zh, HIGH(WID_Widget_Handler) ldi zh, HIGH(Widget_Handler)
clr r17 rcall OBJ_Init ; (r16, r17, X)
rcall OBJ_Init
pop xh pop xh
pop xl pop xl
pop r19 pop r20
pop r18 pop r19
std Y+WID_OFFS_OPTIONS1, r18
std Y+WID_OFFS_OPTIONS2, r19 ; store options
std Y+WID_OFFS_OPTIONS1, r19
std Y+WID_OFFS_OPTIONS2, r20
; set basic handler
ldi zl, LOW(Widget_Handler) ; handler
ldi zh, HIGH(Widget_Handler)
rcall OBJ_SetHandler
mov r16, xl mov r16, xl
or r16, xh or r16, xh
breq WID_Widget_noParent breq Widget_noParent
; copy defaults from parent ; copy defaults from parent
adiw xh:xl, WID_OFFS_BG_COL_LO adiw xh:xl, WID_OFFS_BG_COL_LO
ld r16, X+ ; WID_OFFS_BG_COL_LO ld r16, X+ ; WID_OFFS_BG_COL_LO
@@ -62,8 +74,9 @@ WID_Widget_Init:
std Y+WID_OFFS_FONT_LO, r16 std Y+WID_OFFS_FONT_LO, r16
ld r16, X+ ; WID_OFFS_FONT_HI ld r16, X+ ; WID_OFFS_FONT_HI
std Y+WID_OFFS_FONT_HI, r16 std Y+WID_OFFS_FONT_HI, r16
rjmp WID_Widget_end rjmp Widget_end
WID_Widget_noParent: ; preset without parent
Widget_noParent: ; preset without parent
clr r16 clr r16
std Y+WID_OFFS_FONT_LO, r16 std Y+WID_OFFS_FONT_LO, r16
std Y+WID_OFFS_FONT_HI, r16 std Y+WID_OFFS_FONT_HI, r16
@@ -79,55 +92,56 @@ WID_Widget_noParent: ; preset without parent
std Y+WID_OFFS_BORDER_BOT, r16 std Y+WID_OFFS_BORDER_BOT, r16
std Y+WID_OFFS_BORDER_LEFT, r16 std Y+WID_OFFS_BORDER_LEFT, r16
std Y+WID_OFFS_BORDER_RIGHT, r16 std Y+WID_OFFS_BORDER_RIGHT, r16
WID_Widget_end: Widget_end:
ret ret
; @end ; @end
; --------------------------------------------------------------------------- ; ---------------------------------------------------------------------------
; @routine WID_Widget_Handler ; @routine Widget_Handler @global
; ;
; Signal handler for an object. A signal can have up to 3 parameters ; Signal handler for an object. A signal can have up to 3 parameters
; conveyed in registers R18, R19 and X. ; conveyed in registers R18, R19 and X.
; ;
; @param Y pointer to object SRAM ; @param Y pointer to object SRAM
; @param r16 signal ; @param r18 signal
; @param R18 1st param ; @param r19 srcIdForTarget
; @param R19 2nd param ; @param R20 1st param
; @param R21 2nd param
; @param X 3rd param ; @param X 3rd param
; @clobbers any, !Y ; @clobbers any, !Y
WID_Widget_Handler: Widget_Handler:
cpi r16, WID_SIGNAL_GETMINWIDTH cpi r18, OBJ_SIGNAL_DESTROY
breq WID_Widget_Handler_getMinWidth breq Widget_Handler_destroy
cpi r16, WID_SIGNAL_GETMINHEIGHT cpi r18, WID_SIGNAL_DRAW
breq WID_Widget_Handler_getMinHeight breq Widget_Handler_draw
cpi r16, WID_SIGNAL_LAYOUT clc
breq WID_Widget_Handler_layout rjmp Widget_Handler_ret
cpi r16, WID_SIGNAL_DRAW Widget_Handler_destroy:
breq WID_Widget_Handler_draw ; nothing to do here (for HEAP objects we would call Heap_Free)
; for now just forward signal to all children rjmp Widget_Handler_secRet
WID_Widget_Handler_forward: Widget_Handler_draw:
rcall OBJ_ForwardSignalToChildren rcall Widget_Draw
Widget_Handler_secRet:
sec
Widget_Handler_ret:
ret ret
WID_Widget_Handler_getMinWidth:
rjmp widgetGetMinWidth
WID_Widget_Handler_getMinHeight:
rjmp widgetGetMinHeight
WID_Widget_Handler_layout:
rjmp widgetLayout
WID_Widget_Handler_draw:
rjmp wDraw
; @end ; @end
; ---------------------------------------------------------------------------
; @routine Widget_Draw @global
;
; @param Y pointer to object SRAM
; @clobbers
wDraw: Widget_Draw:
ldd r16, Y+OBJ_OFFS_OPTIONS ldd r16, Y+OBJ_OFFS_OPTIONS
sbrs r16, WID_OPTIONS0_BIT_VISIBLE ; only draw visible widgets sbrs r16, WID_OPTIONS0_BIT_VISIBLE ; only draw visible widgets
rjmp wDraw_ret rjmp widgetDraw_ret
cbr r16, (1<<WID_OPTIONS0_BIT_DIRTY) cbr r16, (1<<WID_OPTIONS0_BIT_DIRTY)
std Y+OBJ_OFFS_OPTIONS, r16 std Y+OBJ_OFFS_OPTIONS, r16
@@ -142,74 +156,24 @@ wDraw:
ldd r9, Y+WID_OFFS_WIDTH_HI ldd r9, Y+WID_OFFS_WIDTH_HI
ldd r10, Y+WID_OFFS_HEIGHT_LO ldd r10, Y+WID_OFFS_HEIGHT_LO
ldd r11, Y+WID_OFFS_HEIGHT_HI ldd r11, Y+WID_OFFS_HEIGHT_HI
bigcall ILI9341_FillRect bigcall Display_FillRect
wDraw_ret: widgetDraw_ret:
ret ret
; @end ; @end
; ---------------------------------------------------------------------------
; @routine Widget_SetAbsoluteCoords @global
;
widgetLayout: Widget_SetAbsoluteCoords:
rjmp wVLayout
wVLayout:
rcall wSetChildrenWidthsFromMinWidths
rcall wSetChildrenHeightsFromMinHeights
; count number of expandable children
ldi r16, (1<<WID_OPTIONS1_BIT_STRETCH_Y) ; value
ldi r17, (1<<WID_OPTIONS1_BIT_STRETCH_Y) ; mask
rcall widgetCountVisibleChildrenWithOptions1 ; r18=number of matching visible children (r24, r25, X)
tst r18
breq wVLayout_Ydone ; no expandable children, nothing to distribute
; determine full height needed by all children
push r18 ; number of visible expandable child widgets
clr r17 ; mask=0 -> count all visible children
rcall wGetSumOfMatchingVisibleChildrenHeights ; r19:r18=sum of all children heights
pop r22
clr r23 ; r23:r22=number of visible expandable children
; calculate number of bytes to add to each expandable child widget
ldd r20, Y+WID_OFFS_HEIGHT_LO ; total height
ldd r21, Y+WID_OFFS_HEIGHT_HI
clr r16
ldd r17, Y+WID_OFFS_BORDER_TOP ; subtract top border
sub r20, r17
sbc r21, r16
brcs wVLayout_heightTooSmall ; jmp if too small
ldd r17, Y+WID_OFFS_BORDER_BOT ; subtract bottom border
sub r20, r17
sbc r21, r16
brcs wVLayout_heightTooSmall ; jmp if too small
sub r20, r18 ; r21:r20 = HEIGHT-SUM_OF_VIS_CHILDREN_HEIGHTS
sbc r21, r19
brcc wVLayout_heightTooSmall
breq wVLayout_yDone ; nothing to distribute
bigcall Utils_Divu16_16_16 ; r17:r16 = r21:r20 / r23:r22
; add additional pixel to heights of expandable child widgets
rcall wAddToHeightsOfExpandableVisibleChildren
wVLayout_yDone:
rcall wSetRelYFromHeightInVisibleChildren
rcall wAlignChildrenHorizontally
; rcall wSetAbsoluteCoords call in GUI loop after calling layout on all widgets
wVLayout_heightTooSmall:
; TODO: how to handle this case?
ret
; @end
wSetAbsoluteCoords:
push yl push yl
push yh push yh
wSetAbsoluteCoords_loop: Widget_SetAbsoluteCoords_loop:
ldd r18, Y+OBJ_OFFS_OPTIONS ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wSetAbsoluteCoords_nextSibling breq Widget_SetAbsoluteCoords_nextSibling
push yl push yl
push yh push yh
bigcall Tree_GetParentObject bigcall Tree_GetParentObject
@@ -219,14 +183,14 @@ wSetAbsoluteCoords_loop:
clr r21 clr r21
mov r17, xl mov r17, xl
or r17, xh or r17, xh
breq wSetAbsoluteCoords_r1820set breq Widget_SetAbsoluteCoords_r1820set
mov yl, xl mov yl, xl
mov yh, xh mov yh, xh
ldd r18, Y+WID_OFFS_ABS_X_LO ldd r18, Y+WID_OFFS_ABS_X_LO
ldd r19, Y+WID_OFFS_ABS_X_HI ldd r19, Y+WID_OFFS_ABS_X_HI
ldd r20, Y+WID_OFFS_ABS_Y_LO ldd r20, Y+WID_OFFS_ABS_Y_LO
ldd r21, Y+WID_OFFS_ABS_Y_HI ldd r21, Y+WID_OFFS_ABS_Y_HI
wSetAbsoluteCoords_r1820set: Widget_SetAbsoluteCoords_r1820set:
pop yh pop yh
pop yl pop yl
; handle X ; handle X
@@ -244,152 +208,17 @@ wSetAbsoluteCoords_r1820set:
std Y+WID_OFFS_ABS_Y_LO, r16 std Y+WID_OFFS_ABS_Y_LO, r16
std Y+WID_OFFS_ABS_Y_HI, r17 std Y+WID_OFFS_ABS_Y_HI, r17
bigcall Tree_GetObjectBelow bigcall Tree_GetObjectBelow
rjmp wSetAbsoluteCoords_loopEnd rjmp Widget_SetAbsoluteCoords_loopEnd
wSetAbsoluteCoords_nextSibling: Widget_SetAbsoluteCoords_nextSibling:
bigcall Tree_GetNextSibling bigcall Tree_GetNextSibling
wSetAbsoluteCoords_loopEnd: Widget_SetAbsoluteCoords_loopEnd:
mov r17, xl mov r17, xl
or r17, xh or r17, xh
breq wSetAbsoluteCoords_end breq Widget_SetAbsoluteCoords_end
mov yl, xl mov yl, xl
mov yh, xh mov yh, xh
rjmp wSetAbsoluteCoords_loop rjmp Widget_SetAbsoluteCoords_loop
wSetAbsoluteCoords_end: Widget_SetAbsoluteCoords_end:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wAlignChildrenHorizontally
;
; Horizontally align children within the width of the parent widget.
; Only changes Y+WID_OFFS_REL_X_LO/HI.
;
; @param Y pointer to object SRAM
; @clobbers r16, r17, r18, r19, r24, r25
wAlignChildrenHorizontally:
push yl
push yh
ldd r24, Y+WID_OFFS_WIDTH_LO ; parent width
ldd r25, Y+WID_OFFS_WIDTH_HI
ldd r19, Y+WID_OFFS_BORDER_LEFT ; subtract left border
mov r16, r19
clr r17
sub r24, r16
sbc r25, r17
ldd r16, Y+WID_OFFS_BORDER_RIGHT ; subtract right border
sub r24, r16
sbc r25, r17 ; r25:r24=parent width minus lateral borders, r19=left border
rcall Tree_GetFirstChildObject ; (none)
wAlignChildrenHorizontally_loop:
mov r17, xl
or r17, xh
breq wAlignChildrenHorizontally_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wAlignChildrenHorizontally_loopNext
push r24
push r25
push r19
rcall wAlignHorizontally
pop r19
add r24, r19
adc r25, r19
sub r25, r19
std Y+WID_OFFS_REL_X_LO, r24
std Y+WID_OFFS_REL_X_HI, r25
pop r25
pop r24
wAlignChildrenHorizontally_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp wAlignChildrenHorizontally_loop
wAlignChildrenHorizontally_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wAlignHorizontally
;
; @param r25:r24 parent width minus lateral borders
; @return r25:r24 proposed X position relative to parent
; @clobbers r16, r17
wAlignHorizontally:
ldd r16, Y+WID_OFFS_OPTIONS1
sbrc r16, WID_OPTIONS1_BIT_STRETCH_X
rjmp wAlignHorizontally_stretch
andi r16, (WID_OPTIONS1_BIT_HALIGN0 | WID_OPTIONS1_BIT_HALIGN1)
cpi r16, (0<<WID_OPTIONS1_BIT_HALIGN1) | (0<<WID_OPTIONS1_BIT_HALIGN0)
breq wAlignHorizontally_left
cpi r16, (0<<WID_OPTIONS1_BIT_HALIGN1) | (1<<WID_OPTIONS1_BIT_HALIGN0)
breq wAlignHorizontally_right
wAlignHorizontally_center:
ldd r16, Y+WID_OFFS_WIDTH_LO
ldd r17, Y+WID_OFFS_WIDTH_HI
sub r24, r16
sbc r25, r17
lsr r25
ror r24
ret
wAlignHorizontally_left:
clr r24
clr r25
ret
wAlignHorizontally_right:
ldd r16, Y+WID_OFFS_WIDTH_LO
ldd r17, Y+WID_OFFS_WIDTH_HI
sub r24, r16
sbc r25, r17
wAlignHorizontally_stretch:
ret
; @end
; ---------------------------------------------------------------------------
; @routine wSetRelYFromHeightInVisibleChildren
;
; @param Y pointer to object SRAM
; @clobbers r17, r18, r19, r24, r25, X
wSetRelYFromHeightInVisibleChildren:
push yl
push yh
ldd r24, Y+WID_OFFS_BORDER_TOP
clr r25
rcall Tree_GetFirstChildObject ; (none)
wSetRelYFromHeightInVisibleChildren_loop:
mov r17, xl
or r17, xh
breq wSetRelYFromHeightInVisibleChildren_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wSetRelYFromHeightInVisibleChildren_loopNext
std Y+WID_OFFS_REL_Y_LO, r24
std Y+WID_OFFS_REL_Y_HI, r25
ldd r18, Y+WID_OFFS_WIDTH_LO
ldd r19, Y+WID_OFFS_WIDTH_HI
add r24, r18 ; TODO: handle carry later
adc r25, r19
adiw r25:r24, WID_WIDGET_INTER_BORDER
wSetRelYFromHeightInVisibleChildren_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp wSetRelYFromHeightInVisibleChildren_loop
wSetRelYFromHeightInVisibleChildren_loopEnd:
mov r18, r24
mov r19, r25
pop yh pop yh
pop yl pop yl
ret ret
@@ -400,371 +229,6 @@ wSetRelYFromHeightInVisibleChildren_loopEnd:
#endif ; AQH_AVR_WIN_WIDGET_H
; ---------------------------------------------------------------------------
; @routine widgetGetMinWidth
;
; @return r19:r18 minimum width of widget
; @clobbers any, !Y
widgetGetMinWidth:
ldi r16, WID_SIGNAL_GETMINWIDTH
rjmp widgetGetLargestChildMinSize
; @end
; ---------------------------------------------------------------------------
; @routine widgetGetMinHeight
;
; @return r19:r18 minimum height of widget
; @clobbers any, !Y
widgetGetMinHeight:
ldi r16, WID_SIGNAL_GETMINHEIGHT
rjmp widgetSumOfChildrenMinSize
; @end
; ---------------------------------------------------------------------------
; @routine widgetSumOfChildrenMinSize
;
; @param r16 signal to send (WID_SIGNAL_GETMINWIDTH, WID_SIGNAL_GETMINHEIGHT)
; @return r19:r18 minimum width or height of widget
; @clobbers any, !Y
widgetSumOfChildrenMinSize:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
clr r25
widgetSumOfChildrenMinSize_loop:
mov r17, xl
or r17, xh
breq widgetSumOfChildrenMinSize_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq widgetSumOfChildrenMinSize_loopNext
push r16
push r24
push r25
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
pop r25
pop r24
pop r16
add r24, r18 ; TODO: handle carry later
adc r25, r19
adiw r25:r24, WID_WIDGET_INTER_BORDER
widgetSumOfChildrenMinSize_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp widgetSumOfChildrenMinSize_loop
widgetSumOfChildrenMinSize_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine widgetGetLargestChildMinSize
;
; @param r16 signal to send (WID_SIGNAL_GETMINWIDTH, WID_SIGNAL_GETMINHEIGHT)
; @return r19:r18 minimum width or height of widget
; @clobbers any, !Y
widgetGetLargestChildMinSize:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
clr r25
widgetGetLargestChildMinSize_loop:
mov r17, xl
or r17, xh
breq widgetGetLargestChildMinSize_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq widgetGetLargestChildMinSize_loopNext
push r16
push r24
push r25
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
pop r25
pop r24
pop r16
sub r24, r18
sbc r25, r19
add r24, r18
adc r25, r19
brcc widgetGetLargestChildMinSize_loopNext
mov r24, r18
mov r25, r19
widgetGetLargestChildMinSize_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp widgetGetLargestChildMinSize_loop
widgetGetLargestChildMinSize_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine widgetCountVisibleChildrenWithOptions1
;
; Count visible direct children with a matching WID_OFFS_OPTIONS1 field.
;
; @param r16 option1 value combination wanted
; @param r17 option1 mask of bits to match
; @return r18 number of matching direct children
; @clobbers r18, r24, r25, X
widgetCountVisibleChildrenWithOptions1:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
widgetCountVisibleChildrenWithOptions1_loop:
mov r25, xl
or r25, xh
breq widgetCountVisibleChildrenWithOptions1_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq widgetCountVisibleChildrenWithOptions1_next
ldd r18, Y+WID_OFFS_OPTIONS1
eor r18, r17
and r18, r16
brne widgetCountVisibleChildrenWithOptions1_next
inc r24
widgetCountVisibleChildrenWithOptions1_next:
rcall Tree_GetNextSibling ; (none)
rjmp widgetSumOfChildrenMinSize_loop
widgetCountVisibleChildrenWithOptions1_loopEnd:
mov r18, r24
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wGetSumOfMatchingVisibleChildrenHeights
;
; Add heights of all matching visible children.
;
; @param r16 option1 value combination wanted
; @param r17 option1 mask of bits to match
; @return r19:r18 sum of widths of all visible direct children
; @clobbers r24, r25, X
wGetSumOfMatchingVisibleChildrenHeights:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
clr r25
wGetSumOfMatchingVisibleChildrenHeights_loop:
mov r18, xl
or r18, xh
breq wGetSumOfMatchingVisibleChildrenHeights_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wGetSumOfMatchingVisibleChildrenHeights_next
ldd r18, Y+WID_OFFS_OPTIONS1
eor r18, r17
and r18, r16
brne wGetSumOfMatchingVisibleChildrenHeights_next
ldd r18, Y+WID_OFFS_HEIGHT_LO
ldd r19, Y+WID_OFFS_HEIGHT_HI
add r24, r18
adc r25, r19
wGetSumOfMatchingVisibleChildrenHeights_next:
rcall Tree_GetNextSibling ; (none)
rjmp wGetSumOfMatchingVisibleChildrenHeights_loop
wGetSumOfMatchingVisibleChildrenHeights_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wAddToWidthsOfExpandableVisibleChildren
;
; @param Y = pointer to widget data in SRAM
; @param r17:r16 number to add to the widths of all visible X-expandable children
; @clobbers r18, r19, X
wAddToWidthsOfExpandableVisibleChildren:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
wAddToWidthsOfExpandableVisibleChildren_loop:
mov r18, xl
or r18, xh
breq wAddToWidthsOfExpandableVisibleChildren_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wAddToWidthsOfExpandableVisibleChildren_next
ldd r18, Y+WID_OFFS_OPTIONS1
andi r18, WID_OPTIONS1_BIT_STRETCH_X
breq wAddToWidthsOfExpandableVisibleChildren_next
ldd r18, Y+WID_OFFS_WIDTH_LO
ldd r19, Y+WID_OFFS_WIDTH_HI
add r18, r16
adc r19, r17
std Y+WID_OFFS_WIDTH_LO, r18
std Y+WID_OFFS_WIDTH_HI, r19
wAddToWidthsOfExpandableVisibleChildren_next:
rcall Tree_GetNextSibling ; (none)
rjmp wAddToWidthsOfExpandableVisibleChildren_loop
wAddToWidthsOfExpandableVisibleChildren_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wAddToHeightsOfExpandableVisibleChildren
;
; @param Y = pointer to widget data in SRAM
; @param r17:r16 number to add to the heights of all visible Y-expandable children
; @clobbers r18, r19, X
wAddToHeightsOfExpandableVisibleChildren:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
wAddToHeightsOfExpandableVisibleChildren_loop:
mov r18, xl
or r18, xh
breq wAddToHeightsOfExpandableVisibleChildren_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
andi r18, WID_OPTIONS0_BIT_VISIBLE
breq wAddToHeightsOfExpandableVisibleChildren_next
ldd r18, Y+WID_OFFS_OPTIONS1
andi r18, WID_OPTIONS1_BIT_STRETCH_Y
breq wAddToHeightsOfExpandableVisibleChildren_next
ldd r18, Y+WID_OFFS_HEIGHT_LO
ldd r19, Y+WID_OFFS_HEIGHT_HI
add r18, r16
adc r19, r17
std Y+WID_OFFS_HEIGHT_LO, r18
std Y+WID_OFFS_HEIGHT_HI, r19
wAddToHeightsOfExpandableVisibleChildren_next:
rcall Tree_GetNextSibling ; (none)
rjmp wAddToHeightsOfExpandableVisibleChildren_loop
wAddToHeightsOfExpandableVisibleChildren_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wSetChildrenWidthsFromMinWidths
;
; @clobbers any, !Y
wSetChildrenWidthsFromMinWidths:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
wSetChildrenWidthsFromMinWidths_loop:
mov r17, xl
or r17, xh
breq wSetChildrenWidthsFromMinWidths_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
sbrs r18, WID_OPTIONS0_BIT_VISIBLE
rjmp wSetChildrenWidthsFromMinWidths_loopNext ; jump if not visible
sbrc r18, WID_OPTIONS1_BIT_FIXED_WIDTH
rjmp wSetChildrenWidthsFromMinWidths_loopNext ; jump if fixed width
ldi r16, WID_SIGNAL_GETMINWIDTH
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
std Y+WID_OFFS_WIDTH_LO, r18
std Y+WID_OFFS_WIDTH_HI, r19
wSetChildrenWidthsFromMinWidths_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp wSetChildrenWidthsFromMinWidths_loop
wSetChildrenWidthsFromMinWidths_loopEnd:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine wSetChildrenHeightsFromMinHeights
;
; @clobbers any, !Y
wSetChildrenHeightsFromMinHeights:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
wSetChildrenHeightsFromMinHeights_loop:
mov r17, xl
or r17, xh
breq wSetChildrenHeightsFromMinHeights_loopEnd
mov yl, xl
mov yh, yl
ldd r18, Y+OBJ_OFFS_OPTIONS
sbrs r18, WID_OPTIONS0_BIT_VISIBLE
rjmp wSetChildrenHeightsFromMinHeights_loopNext ; jump if not visible
sbrc r18, WID_OPTIONS1_BIT_FIXED_HEIGHT
rjmp wSetChildrenHeightsFromMinHeights_loopNext ; jump if fixed height
ldi r16, WID_SIGNAL_GETMINHEIGHT
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
std Y+WID_OFFS_HEIGHT_LO, r18
std Y+WID_OFFS_HEIGHT_HI, r19
wSetChildrenHeightsFromMinHeights_loopNext:
rcall Tree_GetNextSibling ; (none)
rjmp wSetChildrenHeightsFromMinHeights_loop
wSetChildrenHeightsFromMinHeights_loopEnd:
pop yh
pop yl
ret
; @end

View File

@@ -156,8 +156,8 @@ spiHwSelectDevice:
; @clobbers none ; @clobbers none
SPIHW_MasterTransfer: SPIHW_MasterTransfer:
rcall SPIHW_MasterSendByte rcall SPIHW_MasterSendByte ; (none)
rjmp SPIHW_WaitForTransferComplete rjmp SPIHW_WaitForTransferComplete ; (none)
; @end ; @end